Diff for /qemu/hw/jazz_led.c between versions 1.1.1.1 and 1.1.1.5

version 1.1.1.1, 2018/04/24 16:48:23 version 1.1.1.5, 2018/04/24 18:37:25
Line 29 Line 29
   
 //#define DEBUG_LED  //#define DEBUG_LED
   
   #ifdef DEBUG_LED
   #define DPRINTF(fmt, ...) \
   do { printf("jazz led: " fmt , ## __VA_ARGS__); } while (0)
   #else
   #define DPRINTF(fmt, ...) do {} while (0)
   #endif
   #define BADF(fmt, ...) \
   do { fprintf(stderr, "jazz led ERROR: " fmt , ## __VA_ARGS__);} while (0)
   
 typedef enum {  typedef enum {
     REDRAW_NONE = 0, REDRAW_SEGMENTS = 1, REDRAW_BACKGROUND = 2,      REDRAW_NONE = 0, REDRAW_SEGMENTS = 1, REDRAW_BACKGROUND = 2,
 } screen_state_t;  } screen_state_t;
   
 typedef struct LedState {  typedef struct LedState {
     target_phys_addr_t base;  
     uint8_t segments;      uint8_t segments;
     DisplayState *ds;      DisplayState *ds;
     screen_state_t state;      screen_state_t state;
Line 43  typedef struct LedState { Line 51  typedef struct LedState {
 static uint32_t led_readb(void *opaque, target_phys_addr_t addr)  static uint32_t led_readb(void *opaque, target_phys_addr_t addr)
 {  {
     LedState *s = opaque;      LedState *s = opaque;
     int relative_addr = addr - s->base;  
     uint32_t val;      uint32_t val;
   
     switch (relative_addr) {      switch (addr) {
         case 0:          case 0:
             val = s->segments;              val = s->segments;
             break;              break;
         default:          default:
 #ifdef DEBUG_LED              BADF("invalid read at [" TARGET_FMT_plx "]\n", addr);
             printf("jazz led: invalid read [0x%x]\n", relative_addr);  
 #endif  
             val = 0;              val = 0;
     }      }
   
       DPRINTF("read addr=" TARGET_FMT_plx " val=0x%02x\n", addr, val);
   
     return val;      return val;
 }  }
   
Line 93  static uint32_t led_readl(void *opaque,  Line 100  static uint32_t led_readl(void *opaque, 
 static void led_writeb(void *opaque, target_phys_addr_t addr, uint32_t val)  static void led_writeb(void *opaque, target_phys_addr_t addr, uint32_t val)
 {  {
     LedState *s = opaque;      LedState *s = opaque;
     int relative_addr = addr - s->base;  
   
     switch (relative_addr) {      DPRINTF("write addr=" TARGET_FMT_plx " val=0x%02x\n", addr, val);
   
       switch (addr) {
         case 0:          case 0:
             s->segments = val;              s->segments = val;
             s->state |= REDRAW_SEGMENTS;              s->state |= REDRAW_SEGMENTS;
             break;              break;
         default:          default:
 #ifdef DEBUG_LED              BADF("invalid write of 0x%08x at [" TARGET_FMT_plx "]\n", val, addr);
             printf("jazz led: invalid write of 0x%02x at [0x%x]\n", val, relative_addr);  
 #endif  
             break;              break;
     }      }
 }  }
Line 134  static void led_writel(void *opaque, tar Line 140  static void led_writel(void *opaque, tar
 #endif  #endif
 }  }
   
 static CPUReadMemoryFunc *led_read[3] = {  static CPUReadMemoryFunc * const led_read[3] = {
     led_readb,      led_readb,
     led_readw,      led_readw,
     led_readl,      led_readl,
 };  };
   
 static CPUWriteMemoryFunc *led_write[3] = {  static CPUWriteMemoryFunc * const led_write[3] = {
     led_writeb,      led_writeb,
     led_writew,      led_writew,
     led_writel,      led_writel,
Line 154  static void draw_horizontal_line(Display Line 160  static void draw_horizontal_line(Display
     uint8_t *d;      uint8_t *d;
     int x, bpp;      int x, bpp;
   
     bpp = (ds->depth + 7) >> 3;      bpp = (ds_get_bits_per_pixel(ds) + 7) >> 3;
     d = ds->data + ds->linesize * posy + bpp * posx1;      d = ds_get_data(ds) + ds_get_linesize(ds) * posy + bpp * posx1;
     switch(bpp) {      switch(bpp) {
         case 1:          case 1:
             for (x = posx1; x <= posx2; x++) {              for (x = posx1; x <= posx2; x++) {
Line 183  static void draw_vertical_line(DisplaySt Line 189  static void draw_vertical_line(DisplaySt
     uint8_t *d;      uint8_t *d;
     int y, bpp;      int y, bpp;
   
     bpp = (ds->depth + 7) >> 3;      bpp = (ds_get_bits_per_pixel(ds) + 7) >> 3;
     d = ds->data + ds->linesize * posy1 + bpp * posx;      d = ds_get_data(ds) + ds_get_linesize(ds) * posy1 + bpp * posx;
     switch(bpp) {      switch(bpp) {
         case 1:          case 1:
             for (y = posy1; y <= posy2; y++) {              for (y = posy1; y <= posy2; y++) {
                 *((uint8_t *)d) = color;                  *((uint8_t *)d) = color;
                 d += ds->linesize;                  d += ds_get_linesize(ds);
             }              }
             break;              break;
         case 2:          case 2:
             for (y = posy1; y <= posy2; y++) {              for (y = posy1; y <= posy2; y++) {
                 *((uint16_t *)d) = color;                  *((uint16_t *)d) = color;
                 d += ds->linesize;                  d += ds_get_linesize(ds);
             }              }
             break;              break;
         case 4:          case 4:
             for (y = posy1; y <= posy2; y++) {              for (y = posy1; y <= posy2; y++) {
                 *((uint32_t *)d) = color;                  *((uint32_t *)d) = color;
                 d += ds->linesize;                  d += ds_get_linesize(ds);
             }              }
             break;              break;
     }      }
Line 217  static void jazz_led_update_display(void Line 223  static void jazz_led_update_display(void
   
     if (s->state & REDRAW_BACKGROUND) {      if (s->state & REDRAW_BACKGROUND) {
         /* clear screen */          /* clear screen */
         bpp = (ds->depth + 7) >> 3;          bpp = (ds_get_bits_per_pixel(ds) + 7) >> 3;
         d1 = ds->data;          d1 = ds_get_data(ds);
         for (y = 0; y < ds->height; y++) {          for (y = 0; y < ds_get_height(ds); y++) {
             memset(d1, 0x00, ds->width * bpp);              memset(d1, 0x00, ds_get_width(ds) * bpp);
             d1 += ds->linesize;              d1 += ds_get_linesize(ds);
         }          }
     }      }
   
     if (s->state & REDRAW_SEGMENTS) {      if (s->state & REDRAW_SEGMENTS) {
         /* set colors according to bpp */          /* set colors according to bpp */
         switch (ds->depth) {          switch (ds_get_bits_per_pixel(ds)) {
             case 8:              case 8:
                 color_segment = rgb_to_pixel8(0xaa, 0xaa, 0xaa);                  color_segment = rgb_to_pixel8(0xaa, 0xaa, 0xaa);
                 color_led = rgb_to_pixel8(0x00, 0xff, 0x00);                  color_led = rgb_to_pixel8(0x00, 0xff, 0x00);
Line 271  static void jazz_led_update_display(void Line 277  static void jazz_led_update_display(void
     }      }
   
     s->state = REDRAW_NONE;      s->state = REDRAW_NONE;
     dpy_update(ds, 0, 0, ds->width, ds->height);      dpy_update(ds, 0, 0, ds_get_width(ds), ds_get_height(ds));
 }  }
   
 static void jazz_led_invalidate_display(void *opaque)  static void jazz_led_invalidate_display(void *opaque)
Line 285  static void jazz_led_screen_dump(void *o Line 291  static void jazz_led_screen_dump(void *o
     printf("jazz_led_screen_dump() not implemented\n");      printf("jazz_led_screen_dump() not implemented\n");
 }  }
   
 void jazz_led_init(DisplayState *ds, target_phys_addr_t base)  static void jazz_led_text_update(void *opaque, console_ch_t *chardata)
   {
       LedState *s = opaque;
       char buf[2];
   
       dpy_cursor(s->ds, -1, -1);
       qemu_console_resize(s->ds, 2, 1);
   
       /* TODO: draw the segments */
       snprintf(buf, 2, "%02hhx\n", s->segments);
       console_write_ch(chardata++, 0x00200100 | buf[0]);
       console_write_ch(chardata++, 0x00200100 | buf[1]);
   
       dpy_update(s->ds, 0, 0, 2, 1);
   }
   
   void jazz_led_init(target_phys_addr_t base)
 {  {
     LedState *s;      LedState *s;
     int io;      int io;
   
     s = qemu_mallocz(sizeof(LedState));      s = qemu_mallocz(sizeof(LedState));
     if (!s)  
         return;  
   
     s->base = base;  
     s->ds = ds;  
     s->state = REDRAW_SEGMENTS | REDRAW_BACKGROUND;      s->state = REDRAW_SEGMENTS | REDRAW_BACKGROUND;
   
     io = cpu_register_io_memory(0, led_read, led_write, s);      io = cpu_register_io_memory(led_read, led_write, s,
     cpu_register_physical_memory(s->base, 1, io);                                  DEVICE_NATIVE_ENDIAN);
       cpu_register_physical_memory(base, 1, io);
     graphic_console_init(ds, jazz_led_update_display, jazz_led_invalidate_display, jazz_led_screen_dump, s);  
       s->ds = graphic_console_init(jazz_led_update_display,
                                    jazz_led_invalidate_display,
                                    jazz_led_screen_dump,
                                    jazz_led_text_update, s);
       qemu_console_resize(s->ds, 60, 80);
 }  }

Removed from v.1.1.1.1  
changed lines
  Added in v.1.1.1.5


unix.superglobalmegacorp.com