Changeset 888

Show
Ignore:
Timestamp:
08/27/08 05:30:06 (3 months ago)
Author:
michael
Message:

D4D updates by Sven

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • trunk/drv_D4D.c

    r887 r888  
    22 * $URL: https://ssl.bulix.org/svn/lcd4linux/trunk/drv_D4D.c $ 
    33 * 
    4  * lcd4linux driver for 4D Systems serial displays 
     4 * LCD4Linux driver for 4D Systems Display Graphics Modules 
    55 * 
    66 * Copyright (C) 2008 Sven Killig <sven@killig.de> 
     
    105105    if (fd < 0) 
    106106  return -1; 
    107     fcntl(fd, F_SETFL, 0); 
     107    fcntl(fd, F_SETFL, 0);  /* blocking read */ 
    108108    return 0; 
    109109} 
     
    120120{ 
    121121    char ret[1]; 
    122     while (drv_generic_serial_read(ret, sizeof(ret)) != 1) { 
    123   usleep(1); /* loop should be unneccessary */ 
    124     } 
    125     /* drv_generic_serial_poll(ret,1); */ 
     122    while (drv_generic_serial_read(ret, sizeof(ret)) != 1) 
     123  usleep(1);    /* loop should be unneccessary */ 
    126124    if (ret[0] == 0x15) { 
    127125  error("NAK!"); 
     
    144142static void drv_D4D_send_nowait_extra(const char *data, const unsigned int len, unsigned char pos1, unsigned char pos2) 
    145143{ 
     144    /* possibly leave out bytes at pos1 and pos2 for older protocol format */ 
    146145    if (EXTRA) { 
    147146  drv_D4D_send_nowait(data, len); 
     
    182181    int i, k = 0; 
    183182 
    184     if (!SECTOR) { 
     183    if (!SECTOR) {    /* font in ROM */ 
    185184 
    186185  for (i = 0; i < len; i++) { 
     
    206205  } 
    207206 
    208   char cmd[] = { 's', col, row, FONT, msb(FG_COLOR), lsb(FG_COLOR) }; 
     207  char cmd[] = { 's', col, row, FONT, msb(FG_COLOR), lsb(FG_COLOR) }; /* normal chars */ 
    209208  drv_D4D_send_nowait(cmd, sizeof(cmd)); 
    210209  if (len > 256) 
     
    215214  drv_D4D_send(cmdNull, 1); 
    216215 
    217   char cmd_user[] = { 'D', 0, 0, 0, 0, 0, msb(FG_COLOR), lsb(FG_COLOR) }; 
     216  char cmd_user[] = { 'D', 0, 0, 0, 0, 0, msb(FG_COLOR), lsb(FG_COLOR) }; /* user defined symbols */ 
    218217  for (i = 0; i < k; i++) { 
    219218      cmd_user[2] = user_char[i]; 
     
    223222      drv_D4D_send_extra(cmd_user, sizeof(cmd_user), 1, 4); 
    224223  } 
    225     } else { 
     224    } else {      /* font on SD card */ 
    226225  int sec; 
    227226  char cmd_sd[] = { '@', 'I', 0, msb(row * YRES), lsb(row * YRES), XRES, msb(YRES), lsb(YRES), 16, 0, 0, 0 }; 
     
    240239static void drv_D4D_defchar(const int ascii, const unsigned char *matrix) 
    241240{ 
    242     /* error("drv_D4D_defchar"); */ 
     241/* error("drv_D4D_defchar"); */ 
    243242    char cmd[11]; 
    244243    int i; 
     
    257256static void drv_D4D_blit(const int row, const int col, const int height, const int width) 
    258257{ 
    259     /* error("drv_D4D_blit(%i, %i, %i, %i)",row, col, height, width); */ 
     258/* error("drv_D4D_blit(%i, %i, %i, %i)",row, col, height, width); */ 
    260259    int r, c; 
    261260    RGBA rgb, pixel0_0, pixel; 
     
    264263 
    265264 
     265    /* optimization: single colour rectangle? */ 
    266266    pixel0_0 = drv_generic_graphic_rgb(0, 0); 
    267267    char unicolor = 1; 
     
    297297        color = RGB_24to16(rgb.R, rgb.G, rgb.B); 
    298298        colorArray[0] = msb(color); 
    299         drv_D4D_send_nowait(colorArray, 1); /* doesn't work if sent together (error: "partial write(/dev/tts/1): len=2 ret=1") */ 
     299        drv_D4D_send_nowait(colorArray, 1); /* doesn't werk if sent together (error: "partial write(/dev/tts/1): len=2 ret=1") */ 
    300300        /* colorArray[1]=lsb(color); */ 
    301301        colorArray[0] = lsb(color); 
    302302        drv_D4D_send_nowait(colorArray, 1); 
    303303    } 
    304     /* drv_D4D_send_nowait(colorArray, MODE/8); */ 
     304/*      drv_D4D_send_nowait(colorArray, MODE/8); */ 
    305305      } 
    306306  } 
     
    320320    drv_D4D_send(cmd, sizeof(cmd)); 
    321321 
    322     /* CONTRAST_ = contrast; */ 
     322    /* CONTRAST_=contrast; */ 
    323323    return contrast; 
    324324} 
     
    327327static int drv_D4D_start(const char *section) 
    328328{ 
    329     info("drv_D4D_start()"); 
     329    /* error("drv_D4D_start()"); */ 
    330330    int contrast; 
    331331    int xres_cfg = -1, yres_cfg = -1; 
     
    355355    int i; 
    356356    for (i = 0; i < 2; i++) { 
    357   switch (answer[3 + i]) { 
     357  switch ((unsigned char) answer[3 + i]) { 
    358358  case 0x22: 
    359359      res[i] = 220; 
     
    375375      res[i] = 176; 
    376376      break; 
    377   case 0x96: /* Fixme: case label value exceeds maximum value for type */ 
     377  case 0x96: 
    378378      res[i] = 96; 
    379379      break; 
    380380  case 0x24: 
    381       res[i] = 240; /* undocumented? */ 
    382       break; 
     381      res[i] = 240; 
     382      break;    /* undocumented? */ 
    383383  default: 
    384       error ("Fixme"); 
     384      error("Can't detect display dimensions!"); 
     385      return -1; 
    385386  } 
    386387    } 
     
    402403    } 
    403404 
    404     if (yres_cfg == -1) { 
     405    if (yres_cfg == -1) { /* font on SD card */ 
    405406  SECTOR = xres_cfg * 512; 
    406407  char setAddress[] = 
     
    442443  DCOLS = DCOLS / XRES; 
    443444  DROWS = DROWS / YRES; 
    444   switch (yres_cfg) { 
    445   case 8: 
    446       FONT = 1; 
     445  switch (yres_cfg) { /* font in ROM */ 
     446  case 8:   /* FONT=1; break; */ 
     447      switch (xres_cfg) { 
     448      case 6: 
     449    FONT = 0; 
     450    break; 
     451      case 8: 
     452    FONT = 1; 
     453    break; 
     454      default: 
     455    error("%s: unknown width in %s.Font '%s' from %s", Name, section, s, cfg_source()); 
     456    return -1; 
     457      }; 
    447458      break; 
    448459  case 12: 
     
    452463      FONT = 3; 
    453464      break; 
    454   } 
    455   if (xres_cfg == 5) 
    456       FONT = 0; 
    457     } 
    458  
    459     printf("XRES=%i; YRES=%i, DCOLS=%i; DROWS=%d; FONT=%d; SECTOR=%i; SECTOR_SIZE=%i\n", XRES, YRES, DCOLS, DROWS, FONT, 
    460      SECTOR, SECTOR_SIZE); 
     465  case -1: 
     466      break; 
     467  default: 
     468      error("%s: unknown height in %s.Font '%s' from %s", Name, section, s, cfg_source()); 
     469      return -1; 
     470  } 
     471  /* if(xres_cfg==6) FONT=0; */ 
     472    } 
     473 
     474    info("XRES=%i, YRES=%i;  DCOLS=%i, DROWS=%d;  FONT=%d, SECTOR=%i, SECTOR_SIZE=%i\n", XRES, YRES, DCOLS, DROWS, 
     475   FONT, SECTOR, SECTOR_SIZE); 
    461476 
    462477 
     
    467482  drv_D4D_send(powerOn, sizeof(powerOn)); 
    468483 
    469   /* char background[] = {'B', msb(BG_COLOR), lsb(BG_COLOR)}; 
     484  /*! */ 
     485  /*char background[] = {'B', msb(BG_COLOR), lsb(BG_COLOR)}; 
    470486     drv_D4D_send(background, sizeof(background)); */ 
    471487    } 
     
    479495 
    480496    if (!MODE) { 
    481   unsigned char buffer[] = { 0x18, 0x24, 0x24, 0x18, 0, 0, 0, 0 }; /* degree */ 
     497  unsigned char buffer[] = { 0x18, 0x24, 0x24, 0x18, 0, 0, 0, 0 };  /* degree */ 
    482498  drv_D4D_defchar(CHAR0, buffer); 
    483499  CHARS--; 
     
    511527 
    512528 
    513 int lastVal[48 * 40 * 2]; /* MAX_WIDGETS*2 */ 
     529int lastVal[48 * 40 * 2]; /* ToDo: MAX_WIDGETS*2 */ 
    514530int drv_D4D_bar_draw(WIDGET * W) 
    515531{ 
     532    /* optimizations: 
     533       - draw filled rectangles instead of user defined bar characters 
     534       - cache last values */ 
     535 
    516536    WIDGET_BAR *Bar = W->data; 
    517537    int row, col, len, res, max, val1, val2; 
     
    553573    val[1] = val2; 
    554574    int i, vals; 
    555     if (val1 == val2 && lastVal[row * DCOLS + col] == lastVal[row * DCOLS + col + DROWS * DCOLS]) 
     575    int lastValIndex0 = row * DCOLS + col; 
     576    int cells = DROWS * DCOLS; 
     577    if (val1 == val2 && lastVal[lastValIndex0] == lastVal[lastValIndex0 + cells]) 
    556578  vals = 1; 
    557579    else 
    558580  vals = 2; 
    559581    for (i = 0; i < vals; i++) { 
    560   int lastValIndex = row * DCOLS + col + DROWS * DCOLS * (i + 1); 
     582  int lastValIndex = lastValIndex0 + cells * (i /*+1 */ ); 
    561583  int y1 = row * YRES + (YRES / 2) * i; 
    562584  cmd[2] = msb(y1); 
    563585  cmd[3] = lsb(y1); 
    564   int y2 = y1 + (YRES) / vals - 1;  /* YRES-1 */ 
     586  int y2 = y1 + (YRES /*-1*/ ) / vals - 1; 
    565587  cmd[5] = msb(y2); 
    566588  cmd[6] = lsb(y2); 
     
    625647int drv_D4D_list(void) 
    626648{ 
    627     printf("4D Systems serial displays"); 
     649    printf("4D Systems Display Graphics Modules"); 
    628650    return 0; 
    629651} 
     
    690712 
    691713  drv_generic_text_bar_add_segment(0, 0, 255, 32); 
    692   /* drv_generic_text_bar_add_segment(255, 255, 255, 31); */  /* ASCII 255 = block */ 
    693714 
    694715 
     
    715736int drv_D4D_quit(const int quiet) 
    716737{ 
    717     error("drv_D4D_quit()"); 
     738    /* error("drv_D4D_quit()"); */ 
    718739 
    719740    info("%s: shutting down.", Name); 
     
    734755    } 
    735756 
     757    /* fade */ 
    736758    /*int i; 
    737759       for(i=CONTRAST_;i>=0;i--) {