diff --git a/ChangeLog b/ChangeLog index 987e87e..24028d7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -48,6 +48,7 @@ v.0.5dev (ongoing development) * CwLnx driver: support for CW12832 + new driver mx5000 for Logitech MX5000 keyboards (Christian Jodar) * update debian inits scripts to allow multiple instances of clients + + serialVFD driver: support for 4 more display types (Stefan Herdler) v.0.5.2 * fix switching on/off the Load screen in lcdproc client using the menu diff --git a/LCDd.conf b/LCDd.conf index 73e37d2..ec92641 100644 --- a/LCDd.conf +++ b/LCDd.conf @@ -863,6 +863,10 @@ Speed=9600 # 1 KD Rev 2.1. # 2 Noritake VFDs (*). # 3 Futaba VFDs +# 4 IEE S03601-95B +# 5 IEE S03601-96-080 (*) +# 6 Futaba NA202SD08FA (allmost IEE compatible) +# 7 Samsung 20S207DA4 and 20S207DA6 # (* most should work, not testet yet.) Type=0 @@ -875,6 +879,9 @@ use_parallel=no # Portaddress where the LPT is. Used in parallelmode only. Usual values are 0x278, 0x378 and 0x3BC Port=0x378 +# Set parallel port timingdelay (us). Used in parallelmode only. [default: 2; legal: 0 - 255] +#PortWait=2 + # Device to use in serial mode. Usual values are /dev/ttyS0 and /dev/ttyS1 Device=/dev/ttyS1 diff --git a/docs/LCDd.8.in b/docs/LCDd.8.in index 3d3bcdb..4b4c7f0 100644 --- a/docs/LCDd.8.in +++ b/docs/LCDd.8.in @@ -229,7 +229,7 @@ SED1330/SED1335 (aka S1D13300/S1D13305) based graphical displays 122x32 pixel graphic displays based on SED1520 controllers .TP .B serialVFD -NEC (FIPC8367 based) and FUTABA VFDs +Text VFDs of various manufacturers, see LCDproc user-documentation for further details. .TP .B shuttleVFD Shuttle VFD (USB-based) diff --git a/docs/lcdproc-user/drivers/serialVFD.docbook b/docs/lcdproc-user/drivers/serialVFD.docbook index bc33b26..25a131d 100644 --- a/docs/lcdproc-user/drivers/serialVFD.docbook +++ b/docs/lcdproc-user/drivers/serialVFD.docbook @@ -28,6 +28,7 @@ Feedback is welcome. Serial Parallel Display tested + Type Remark @@ -38,22 +39,25 @@ Feedback is welcome. Ok Ok Yes + 0 NEC FC20X2JA NEC FIPC8367 - (Ok) - (Ok) + (Ok) Should work, but feature not tested yet. + (Ok) No + 0 Same Controller as on FM20X2KB-AB NEC FC20X1SA-AB/AA NEC FIPC8367 - (Ok) - (Ok) + (Ok) + (Ok) No + 0 Same Controller as on FM20X2KB-AB @@ -62,59 +66,109 @@ Feedback is welcome. Ok Ok Yes + 1, 0 + + Custom-Characters are not supported with this Type, set Custom-Characters=0 + in LCDd.conf. + + FUTABA M402SD06GJ ? - (?)* + (?) Ok Yes - (* perhaps no compatible baudrate, not tested) - The display has no user-characters: set Custom-Characters=0 - in LCDd.conf. + 3 + The display has no user-characters. + Serial interface with PC compatible baudrate is optional only, feature not tested. FUTABA M204SD01AA FUTABA 5P00A016 - (Ok) - (Ok) + (Ok) + (Ok) No + 3 - - Samsung 20S204DA2 + + Futaba NA202SD08FA ? Ok Ok Yes - The display is FUTABA compatible (hard- and software). Set Custom-Characters=0 - in LCDd.conf. + 6 + allmost IEE compatible, no Custom-Characters + + + Samsung 20S204DA2 and 20S207DA1 + ? + Ok + Ok + Yes + 3, 7 + The display is FUTABA compatible (hard- and software). Custom-Characters not supported(?). + + + Samsung 20S207DA4 and 20S207DA6 + ? + Ok + Ok + Yes + 7, 3 + allmost Futaba compatible - Noritake CU20026SCPB-T microcontroller - (Ok) - (Ok) + (Ok) + (Ok) No + 2 - Noritake CU20045SCPB-T28A ? - (Ok) - (Ok) + (Ok) + (Ok) No + 2 + + IEE 36657 + + IEE 36657-01 (= 02S-93290-VFD 36657-01) + ? + Ok + Ok + Yes + 4 + + + + IEE S03601-95B + ? + (Ok) + (Ok) + No + 4 + + + + IEE S03601-96-080 + ? + (Ok) + (Ok) + No + 5 - -(): Feature not tested. @@ -379,6 +433,16 @@ optional + + + PortWait = + DELAY + + + Set parallel port timingdelay (us). Used in parallelmode only. [default: 2; legal: 0 - 255]. + + + Device = @@ -450,6 +514,22 @@ Number of Custom-Characters [default: Display-Type dependent] 3 Futaba VFDs + + 4 + IEE S03601-95B + + + 5 + IEE S03601-96-080 + + + 6 + Futaba NA202SD08FA (allmost IEE compatible) + + + 7 + Samsung 20S207DA? + diff --git a/server/drivers/serialVFD.c b/server/drivers/serialVFD.c index a37b00c..6c08bb8 100644 --- a/server/drivers/serialVFD.c +++ b/server/drivers/serialVFD.c @@ -128,6 +128,8 @@ serialVFD_init (Driver *drvthis) p->ISO_8859_1 = 1; p->refresh_timer = 480; p->hw_brightness = 0; + p->para_wait = DEFAULT_PARA_WAIT; + debug(RPT_INFO, "%s(%p)", __FUNCTION__, drvthis); @@ -197,14 +199,8 @@ serialVFD_init (Driver *drvthis) p->ISO_8859_1 = drvthis->config_get_bool(drvthis->name, "ISO_8859_1", 0, 1); /* Which displaytype */ - tmp = drvthis->config_get_int(drvthis->name, "Type", 0, DEFAULT_DISPLAYTYPE); - if ((tmp < 0) || (tmp > 3)) { - report(RPT_WARNING, "%s: Type must be between 0 and 3; using default %d", - drvthis->name, DEFAULT_DISPLAYTYPE); - tmp = DEFAULT_DISPLAYTYPE; - } - p->display_type = tmp; - + p->display_type = drvthis->config_get_int(drvthis->name, "Type", 0, DEFAULT_DISPLAYTYPE); + /* Number of custom characters */ tmp = drvthis->config_get_int(drvthis->name, "Custom-Characters", 0, -83); if ((tmp < 0) || (tmp > 99)) { @@ -241,7 +237,26 @@ serialVFD_init (Driver *drvthis) memset(p->backingstore, 0, p->width * p->height); //setup displayspecific data - serialVFD_load_display_data(drvthis); + memset(p->usr_chr_mapping, 0, 31); + memset(p->usr_chr_load_mapping, 0, 31); + if (serialVFD_load_display_data(drvthis) != 0) { + report(RPT_WARNING, "%s: Type %d not defined; using default %d", + drvthis->name, p->display_type, DEFAULT_DISPLAYTYPE); + p->display_type = DEFAULT_DISPLAYTYPE; + if (serialVFD_load_display_data(drvthis) != 0) { + report(RPT_ERR, "%s: unable to load display_data", drvthis->name); + return -1; + } + } + + /* parallel port wait */ + tmp = p->para_wait; + p->para_wait = drvthis->config_get_int(drvthis->name, "PortWait", 0, p->para_wait); + + if ((p->usr_chr_load_mapping[0] == 0) && (p->usr_chr_load_mapping[1] == 0)){ //this should not happen if usr_chr_load_mapping had been set + memcpy(p->usr_chr_load_mapping, p->usr_chr_mapping, 31); + } + // report(RPT_ERR, "%s: Port: %X", drvthis->name, p->port, strerror(errno)); @@ -393,7 +408,7 @@ serialVFD_put_char (Driver *drvthis, int n) Port_Function[p->use_parallel].write_fkt(drvthis, &p->hw_cmd[set_user_char][1],\ p->hw_cmd[set_user_char][0]);// substitute and select Character to overwrite - Port_Function[p->use_parallel].write_fkt(drvthis, (unsigned char *) &p->usr_chr_mapping[n], 1); + Port_Function[p->use_parallel].write_fkt(drvthis, (unsigned char *) &p->usr_chr_load_mapping[n], 1); Port_Function[p->use_parallel].write_fkt(drvthis, &p->custom_char[n][0], p->usr_chr_dot_assignment[0]);// overwrite selected Character } @@ -447,6 +462,11 @@ serialVFD_flush (Driver *drvthis) if (custom_char_changed[p->last_custom]) p->last_custom = -10; + if (p->hw_cmd[mv_cursor][0] == 0) { // Workaround for Displays that doesn't support mv_cursor command + Port_Function[p->use_parallel].write_fkt(drvthis, &p->hw_cmd[pos1_cursor][1], p->hw_cmd[pos1_cursor][0]); + last_chr = -1; + } + for (i = 0; i < (p->height * p->width); i++) { /* Backing-store implementation. If it's already @@ -454,16 +474,18 @@ serialVFD_flush (Driver *drvthis) */ if ((p->framebuf[i] != p->backingstore[i]) || - ((p->framebuf[i] <= 30) && (custom_char_changed[(int)p->framebuf[i]]))) { + ((p->framebuf[i] <= 30) && (custom_char_changed[(int)p->framebuf[i]] != 0))) { if (last_chr < i-1) { // if not last char written cursor has to be moved. - if (last_chr < i-2-p->hw_cmd[mv_cursor][0]) { + if (((p->hw_cmd[hor_tab][0] * (i-1-last_chr)) > (p->hw_cmd[mv_cursor][0]+1)) && (p->hw_cmd[mv_cursor][0] != 0)) { Port_Function[p->use_parallel].write_fkt(drvthis, &p->hw_cmd[mv_cursor][1], p->hw_cmd[mv_cursor][0]); Port_Function[p->use_parallel].write_fkt(drvthis, (unsigned char *) &i, 1); +//report(RPT_WARNING, "%s: move %d", drvthis->name, i); } else { for (j = last_chr; j < (i-1); j++) Port_Function[p->use_parallel].write_fkt(drvthis, &p->hw_cmd[hor_tab][1], p->hw_cmd[hor_tab][0]); +//report(RPT_WARNING, "%s: TAB %d", drvthis->name, j-last_chr); } } @@ -482,8 +504,8 @@ serialVFD_flush (Driver *drvthis) Port_Function[p->use_parallel].write_fkt(drvthis, (unsigned char *) &p->usr_chr_mapping[(int)p->framebuf[i]], 1); } } - else if ((p->framebuf[i] > 127) && (p->ISO_8859_1 != 0)) { // ISO_8859_1 translation for 129 ... 255 - Port_Function[p->use_parallel].write_fkt(drvthis, &p->charmap[p->framebuf[i] - 128], 1); + else if ((p->framebuf[i] == 127) || ((p->framebuf[i] > 127) && (p->ISO_8859_1 != 0))) { // ISO_8859_1 translation for 129 ... 255 + Port_Function[p->use_parallel].write_fkt(drvthis, &p->charmap[p->framebuf[i] - 127], 1); } else { Port_Function[p->use_parallel].write_fkt(drvthis, &p->framebuf[i], 1); @@ -493,8 +515,11 @@ serialVFD_flush (Driver *drvthis) } } - if (last_chr != -10) // update backingstore if something changed + if (last_chr >= 0) { // update backingstore if something changed memcpy(p->backingstore, p->framebuf, p->height * p->width); +//report(RPT_WARNING, "%s: memcpy", drvthis->name); + } + } diff --git a/server/drivers/serialVFD.h b/server/drivers/serialVFD.h index 5792eca..57b6821 100644 --- a/server/drivers/serialVFD.h +++ b/server/drivers/serialVFD.h @@ -44,6 +44,7 @@ #define DEFAULT_BRIGHTNESS 140 #define DEFAULT_SIZE "20x2" #define DEFAULT_DISPLAYTYPE 0 +#define DEFAULT_PARA_WAIT 2 MODULE_EXPORT int serialVFD_init (Driver *drvthis); @@ -93,7 +94,8 @@ typedef struct driver_private_data { int predefined_vbar; int ISO_8859_1; unsigned int refresh_timer; - unsigned char charmap[128]; + unsigned int para_wait; + unsigned char charmap[129]; int display_type; // display type int last_custom; // last custom character written unsigned char custom_char[31][7]; // stored custom characters @@ -101,6 +103,7 @@ typedef struct driver_private_data { unsigned char hw_cmd[10][4]; // hardwarespecific commands int usr_chr_dot_assignment[57]; // how to setup usercharacters unsigned int usr_chr_mapping[31];// where to place the usercharacters (0..30) in the asciicode + unsigned int usr_chr_load_mapping[31];// needed for displays with different read and write mapping int hbar_cc_offset; // character offset of the bars int vbar_cc_offset; // character offset of the bars char info[255]; diff --git a/server/drivers/serialVFD_displays.c b/server/drivers/serialVFD_displays.c index 9e882fc..cb55369 100644 --- a/server/drivers/serialVFD_displays.c +++ b/server/drivers/serialVFD_displays.c @@ -36,9 +36,13 @@ void serialVFD_load_NEC_FIPC (Driver *drvthis); void serialVFD_load_KD (Driver *drvthis); void serialVFD_load_Noritake (Driver *drvthis); void serialVFD_load_Futaba (Driver *drvthis); +void serialVFD_load_IEE_95B (Driver *drvthis); +void serialVFD_load_IEE_96 (Driver *drvthis); +void serialVFD_load_Futaba_NA202SD08FA(Driver *drvthis); +void serialVFD_load_Samsung (Driver *drvthis); -void serialVFD_load_display_data(Driver *drvthis) +int serialVFD_load_display_data(Driver *drvthis) { PrivateData *p = (PrivateData*) drvthis->private_data; switch (p->display_type) { @@ -54,7 +58,23 @@ void serialVFD_load_display_data(Driver *drvthis) case 3: serialVFD_load_Futaba(drvthis); break; + case 4: + serialVFD_load_IEE_95B(drvthis); + break; + case 5: + serialVFD_load_IEE_96(drvthis); + break; + case 6: + serialVFD_load_Futaba_NA202SD08FA(drvthis); + break; + case 7: + serialVFD_load_Samsung(drvthis); + break; + default: + return -1; + break; } + return 0; } @@ -80,7 +100,7 @@ serialVFD_load_NEC_FIPC (Driver *drvthis) {1 ,0x02}, {1 ,0x01}, // bright {1 ,0x0D}, // pos1 - {1 ,0x1B}, // move cursor + {1 ,0x1B}, // move cursor (set to 0 if not supported) {1 ,0x0C}, // reset {2 ,0x14, 0x11}, // init {1 ,0x1A}, // set user char @@ -91,6 +111,7 @@ serialVFD_load_NEC_FIPC (Driver *drvthis) // Translates ISO 8859-1 to display charset. const unsigned char charmap[] = { + 127, // the "filled-block"-character usually 127 /* #128 = 0x80 */ 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, @@ -111,7 +132,7 @@ serialVFD_load_NEC_FIPC (Driver *drvthis) 'e', 'e', 'e', 'e', 'i', 'i', 'i', 'i', 'o', 'n', 'o', 'o', 'o', 'o', 0xA6, 0x8E, '0', 'u', 'u', 'u', 0xA7, 'y', 'p', 'y' }; - for (tmp = 0; tmp < 128; tmp++) + for (tmp = 0; tmp < 129; tmp++) p->charmap[tmp] = charmap[tmp]; // {bytes to send, icon bit mapped to bit 0, icon bit mapped to bit 1, ...} @@ -158,7 +179,7 @@ serialVFD_load_KD (Driver *drvthis) {1 ,0x02}, {1 ,0x01}, // bright {1 ,0x0D}, // pos1 - {1 ,0x1B}, // move cursor + {1 ,0x1B}, // move cursor (set to 0 if not supported) {1 ,0x0C}, // reset {2 ,0x14, 0x11}, // init {1 ,0x1A}, // set user char @@ -168,6 +189,7 @@ serialVFD_load_KD (Driver *drvthis) p->hw_cmd[tmp][w] = hw_cmd[tmp][w]; const unsigned char charmap[] = { + 127, // the "filled-block"-character usually 127 /* #128 = 0x80 */ 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, @@ -188,7 +210,7 @@ serialVFD_load_KD (Driver *drvthis) 0xC7, 0xC6, 0xC8, 0xD4, 0xCC, 0xCB, 0xCD, 0xCA, 'o', 0xCF, 0xD1, 0xD0, 0xCE, 'o', 0xA6, 0xBB, 0xD0, 0xD7, 0xD6, 0xD8, 0xA7, 'y', 'p', 'y' }; - for (tmp = 0; tmp < 128; tmp++) + for (tmp = 0; tmp < 129; tmp++) p->charmap[tmp] = charmap[tmp]; // {bytes to send, icon bit mapped to bit 0, icon bit mapped to bit 1, ...} @@ -235,7 +257,7 @@ serialVFD_load_Noritake (Driver *drvthis) {3 ,0x1B, 0x4C, 0x90}, {3 ,0x1B, 0x4C, 0xFF}, // bright {1 ,0x0C}, // pos1 - {2 ,0x1B, 0x48}, // move cursor + {2 ,0x1B, 0x48}, // move cursor (set to 0 if not supported) {2 ,0x1B, 0x49}, // reset {2 ,0x14, 0x11}, // init {2 ,0x1B, 0x43}, // set user char @@ -245,8 +267,8 @@ serialVFD_load_Noritake (Driver *drvthis) p->hw_cmd[tmp][w] = hw_cmd[tmp][w]; // no charmap needed - for (tmp = 128; tmp <= 255; tmp++) - p->charmap[tmp] = tmp; + for (tmp = 0; tmp < 129; tmp++) + p->charmap[tmp] = tmp+127; // {bytes to send, icon bit mapped to bit 0, icon bit mapped to bit 1, ...} const int usr_chr_dot_assignment[57] = { 5, @@ -291,7 +313,7 @@ serialVFD_load_Futaba (Driver *drvthis) {2 ,0x04, 0x60}, {2 ,0x04, 0xFF}, // bright {2 ,0x10, 0x00}, // pos1 - {1 ,0x10,}, // move cursor + {1 ,0x10}, // move cursor (set to 0 if not supported) {1 ,0x1F}, // reset {2 ,0x11,0x14}, // init {1 ,0x03}, // set user char @@ -302,6 +324,7 @@ serialVFD_load_Futaba (Driver *drvthis) // Translates ISO 8859-1 to display charset. const unsigned char charmap[] = { + 127, // the "filled-block"-character usually 127 /* #128 = 0x80 */ 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, @@ -322,7 +345,7 @@ serialVFD_load_Futaba (Driver *drvthis) 0x8A, 0x82, 0x88, 0x89, 0x8D, 0xA1, 0x8C, 0x8B, 'o', 0xA4, 0x95, 0xA9, 0x93, 'o', 0x94, '/', '0', 0x97, 0xA3, 0x96, 0x81, 'y', 'p', 0x89 }; - for (tmp = 0; tmp < 128; tmp++) + for (tmp = 0; tmp < 129; tmp++) p->charmap[tmp] = charmap[tmp]; // {bytes to send, icon bit mapped to bit 0, icon bit mapped to bit 1, ...} @@ -342,3 +365,335 @@ serialVFD_load_Futaba (Driver *drvthis) for (tmp = 0; tmp < 31; tmp++) p->usr_chr_mapping[tmp] = usr_chr_mapping[tmp]; } + + +void +serialVFD_load_IEE_95B (Driver *drvthis) +{ //IEE_03601-95B_2x40_VFD + PrivateData *p = (PrivateData*) drvthis->private_data; + int tmp, w; + + if (p->customchars == -83) + p->customchars = 10; // number of custom characters the display provides + p->vbar_cc_offset = 0; // character offset of the bars + p->hbar_cc_offset = 0; // character offset of the bars + p->predefined_hbar = 0; // the display has predefined hbar-characters + p->predefined_vbar = 0; // the display has predefined vbar-characters + p->para_wait = 60; // the display needs more delay in the parallelport mode + + // hardwarespecific commands: + // hw_cmd[Command][data] = {{commandlength , command 1}, + // ..... + // {commandlength , command N}} + const char hw_cmd[10][4] = {{1 ,0x1C}, // dark + {1 ,0x1D}, + {1 ,0x1E}, + {1 ,0x1F}, // bright + {1 ,0x16}, // pos1 + {1 ,0x1B}, // move cursor (set to 0 if not supported) + {1 ,0x15}, // reset + {2 ,0x0E, 0x11}, // init + {1 ,0x18}, // set user char + {1 ,0x09}}; // tab + for (tmp = 0; tmp < 10; tmp++) + for (w = 0; w < 4; w++) + p->hw_cmd[tmp][w] = hw_cmd[tmp][w]; + + + const unsigned char charmap[] = { + 0xEF, // the "filled-block"-character usually 127 + /* #128 = 0x80 */ + 0x7F, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, + 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, + 0xE8, 0xE9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, + 152, 153, 154, 155, 156, 157, 158, 159, + /* #160 = 0xA0 */ + 160, '!', 0xD3, '?', '?', 0x5C, 0x7C, '?', + '"', '?', '?', '?', '?', '-', '?', '?', + 0xB9, 0xBA, '?', '?', 0x27, '?', '?', '.', + ',', '?', '?', '?', '?', '?', '?', '?', + /* #192 = 0xC0 */ + 0xB2, 0xA2, 0xA4, 'A', 0xA0, 0xA1, 0xA5, 0xA3, + 0xA7, 0xA6, 0xA8, 0xB4, 0xAB, 0xAA, 0xAC, 0xA9, + 'D', 0xAE, 0xB1, 0xB0, 0xBF, 'O', 0xAD, 'x', + 0xAF, 0xB7, 0xB6, 0xB8, 0xB5, 'Y', 'p', 0xB3, + /* #224 = 0xE0 */ + 0xD2, 0xC2, 0xC4, 'a', 0xC0, 0xC1, 0xC5, 0xC3, + 0xC7, 0xC6, 0xC8, 0xD4, 0xCB, 0xCA, 0xCC, 0xC9, + 'o', 0xCE, 0xD1, 0xD0, 0xDF, 'o', 0xAD, 0xBB, + 0xCF, 0xD7, 0xD6, 0xD8, 0xD5, 'y', 'p', 'y' }; + for (tmp = 0; tmp < 129; tmp++) + p->charmap[tmp] = charmap[tmp]; + + + // {bytes to send, icon bit mapped to bit 0, icon bit mapped to bit 1, ...} + const int usr_chr_dot_assignment[57] = { 6, + 0, 0, 0, 0,34,17, 3, 0, + 33,14, 4,23,30,13, 7, 0, + 29,10, 8,27,26, 9,11, 0, + 25, 6,12,31,22, 5,15, 0, + 21, 2,16,35,18, 1,19, 0, + 20,24,28,32, 0, 0, 0, 0 }; + for (tmp = 0; tmp < 57; tmp++) + p->usr_chr_dot_assignment[tmp] = usr_chr_dot_assignment[tmp]; + + // Where to place the usercharacters (0..30) in the asciicode. + // Also used to map standardcharacters in the usercharacterspace(0..30) + // (useful for displays with less then 30 usercharacters and predefined bars) + const unsigned int usr_chr_mapping[31]= + {0xFF, 0xFE, 0xFD, 0xFC, 0xFB, 0xFA, 0xF9, 0xF8, 0xF7, 0xF6}; + for (tmp = 0; tmp < 31; tmp++) + p->usr_chr_mapping[tmp] = usr_chr_mapping[tmp]; + + // The following is only needet to set if the display needs a different setting + // for loading the usercharacters. + // Example: The character loaded to 0x00 will be shown at 0xFD. + // usr_chr_load_mapping[0] or usr_chr_load_mapping[1] has to be != 0 + const unsigned int usr_chr_load_mapping[31]= + {0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00}; + for (tmp = 0; tmp < 31; tmp++) + p->usr_chr_load_mapping[tmp] = usr_chr_load_mapping[tmp]; + +} + +void +serialVFD_load_IEE_96 (Driver *drvthis) +{ //IEE_03601-96_2x40_VFD + PrivateData *p = (PrivateData*) drvthis->private_data; + int tmp, w; + + if (p->customchars == -83) + p->customchars = 3; // number of custom characters the display provides + p->vbar_cc_offset = 0; // character offset of the bars + p->hbar_cc_offset = 0; // character offset of the bars + p->predefined_hbar = 0; // the display has predefined hbar-characters + p->predefined_vbar = 0; // the display has predefined vbar-characters + p->para_wait = 60; // the display needs more delay in the parallelport mode + + // hardwarespecific commands: + // hw_cmd[Command][data] = {{commandlength , command 1}, + // ..... + // {commandlength , command N}} + const char hw_cmd[10][4] = {{1 ,0x1C}, // dark + {1 ,0x1D}, + {1 ,0x1E}, + {1 ,0x1F}, // bright + {1 ,0x16}, // pos1 + {0 }, // move cursor (set to 0 if not supported) + {1 ,0x15}, // reset + {2 ,0x0E, 0x11}, // init + {1 ,0x18}, // set user char + {1 ,0x09}}; // tab + for (tmp = 0; tmp < 10; tmp++) + for (w = 0; w < 4; w++) + p->hw_cmd[tmp][w] = hw_cmd[tmp][w]; + + + const unsigned char charmap[] = { + 0xEF, // the "filled-block"-character usually 127 + /* #128 = 0x80 */ + 0x7F, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, + 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, + 0xE8, 0xE9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, + 152, 153, 154, 155, 156, 157, 158, 159, + /* #160 = 0xA0 */ + 160, '!', 0xD3, '?', '?', 0x5C, 0x7C, '?', + '"', '?', '?', '?', '?', '-', '?', '?', + 0xB9, 0xBA, '?', '?', 0x27, '?', '?', '.', + ',', '?', '?', '?', '?', '?', '?', '?', + /* #192 = 0xC0 */ + 0xB2, 0xA2, 0xA4, 'A', 0xA0, 0xA1, 0xA5, 0xA3, + 0xA7, 0xA6, 0xA8, 0xB4, 0xAB, 0xAA, 0xAC, 0xA9, + 'D', 0xAE, 0xB1, 0xB0, 0xBF, 'O', 0xAD, 'x', + 0xAF, 0xB7, 0xB6, 0xB8, 0xB5, 'Y', 'p', 0xB3, + /* #224 = 0xE0 */ + 0xD2, 0xC2, 0xC4, 'a', 0xC0, 0xC1, 0xC5, 0xC3, + 0xC7, 0xC6, 0xC8, 0xD4, 0xCB, 0xCA, 0xCC, 0xC9, + 'o', 0xCE, 0xD1, 0xD0, 0xDF, 'o', 0xAD, 0xBB, + 0xCF, 0xD7, 0xD6, 0xD8, 0xD5, 'y', 'p', 'y' }; + for (tmp = 0; tmp < 129; tmp++) + p->charmap[tmp] = charmap[tmp]; + + + // {bytes to send, icon bit mapped to bit 0, icon bit mapped to bit 1, ...} + const int usr_chr_dot_assignment[57] = { 6, + 0, 7, 0,26, 0, 8,17, 0, + 0, 9,18,28, 0,10,19, 0, + 1,11,20,30, 2,12,21, 0, + 3,13,22,32, 4,14,23, 0, + 5,15,24,34, 6,16,25, 0, + 27,29,31,33,35, 0, 0, 0 }; + for (tmp = 0; tmp < 57; tmp++) + p->usr_chr_dot_assignment[tmp] = usr_chr_dot_assignment[tmp]; + + // Where to place the usercharacters (0..30) in the asciicode. + // Also used to map standardcharacters in the usercharacterspace(0..30) + // (useful for displays with less then 30 usercharacters and predefined bars) + const unsigned int usr_chr_mapping[31]= + {0xFF, 0xFE, 0xFD}; + for (tmp = 0; tmp < 31; tmp++) + p->usr_chr_mapping[tmp] = usr_chr_mapping[tmp]; + + // The following is only needet to set if the display needs a different setting + // for loading the usercharacters. + // Example: The character loaded to 0x00 will be shown at 0xFD. + // usr_chr_load_mapping[0] or usr_chr_load_mapping[1] has to be != 0 + const unsigned int usr_chr_load_mapping[31]= + { 0x02, 0x01, 0x00}; + for (tmp = 0; tmp < 31; tmp++) + p->usr_chr_load_mapping[tmp] = usr_chr_load_mapping[tmp]; + +} + +void +serialVFD_load_Futaba_NA202SD08FA (Driver *drvthis) +{ //IEE_03601-96_2x40_VFD + PrivateData *p = (PrivateData*) drvthis->private_data; + int tmp, w; + + //if (p->customchars == -83) // display doesn't support custom characters + p->customchars = 0; // number of custom characters the display provides + p->vbar_cc_offset = 5; // character offset of the bars + p->hbar_cc_offset = 12; // character offset of the bars + p->predefined_hbar = 1; // the display has predefined hbar-characters + p->predefined_vbar = 1; // the display has predefined vbar-characters + p->para_wait = 25; // the display needs more delay in the parallelport mode + + // hardwarespecific commands: + // hw_cmd[Command][data] = {{commandlength , command 1}, + // ..... + // {commandlength , command N}} + const char hw_cmd[10][4] ={{2 ,0x04, 0x20}, // dark + {2 ,0x04, 0x40}, + {2 ,0x04, 0x60}, + {2 ,0x04, 0xFF}, // bright + {1 ,0x16}, // pos1 + {1 ,0x1B}, // move cursor (set to 0 if not supported) + {1 ,0x15}, // reset + {2 ,0x0E, 0x11}, // init + {1 ,0x18}, // set user char + {1 ,0x09}}; // tab + for (tmp = 0; tmp < 10; tmp++) + for (w = 0; w < 4; w++) + p->hw_cmd[tmp][w] = hw_cmd[tmp][w]; + + + const unsigned char charmap[] = { + 127, // the "filled-block"-character usually 127 + /* #128 = 0x80 */ + 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, + /* #160 = 0xA0 */ + 160, '!', 0xD3, 0x90, 0x9A, 'Y', 0x7C, 0x91, + '"', '?', '?', '?', '?', '-', '?', '?', + 0xB9, 0xBA, 0x98, 0x99, 0x27, 0x88, '?', '.', + ',', '?', '?', '?', '?', 0x9B, '?', '?', + /* #192 = 0xC0 */ + 0xB2, 0xA2, 0xA4, 'A', 0xA0, 0xA1, 0xA5, 0xA3, + 0xA7, 0xA6, 0xA8, 0xB4, 0xAB, 0xAA, 0xAC, 0xA9, + 'D', 0xAE, 0xB1, 0xB0, 0xBF, 'O', 0xAD, 'x', + 0xAF, 0xB7, 0xB6, 0xB8, 0xA5, 'Y', 'p', 0xB3, + /* #224 = 0xE0 */ + 0xD2, 0xC2, 0xC4, 'a', 0xC0, 0xC1, 0xC5, 0xC3, + 0xC7, 0xC6, 0xC8, 0xD4, 0xCB, 0xCA, 0xCC, 0xC9, + 'o', 0xCE, 0xD1, 0xD0, 0xDF, 'o', 0xAD, 0xBB, + 0xCF, 0xD7, 0xD6, 0xD8, 0xD5, 'y', 'p', 'y' }; + for (tmp = 0; tmp < 129; tmp++) + p->charmap[tmp] = charmap[tmp]; + + + // {bytes to send, icon bit mapped to bit 0, icon bit mapped to bit 1, ...} + const int usr_chr_dot_assignment[57] = { 0, 0 }; // no usercharacters + for (tmp = 0; tmp < 57; tmp++) + p->usr_chr_dot_assignment[tmp] = usr_chr_dot_assignment[tmp]; + + // Where to place the usercharacters (0..30) in the asciicode. + // Also used to map standardcharacters in the usercharacterspace(0..30) + // (useful for displays with less then 30 usercharacters and predefined bars) + const unsigned int usr_chr_mapping[31]= + {0,0,0,0,0,0, 0xF4, 0xF4, 0xF5, 0xF6, 0xF6, 0xF7, 0, 0xF0, 0xF1, 0xF2, 0xF3}; + for (tmp = 0; tmp < 31; tmp++) + p->usr_chr_mapping[tmp] = usr_chr_mapping[tmp]; + + +} + +void +serialVFD_load_Samsung (Driver *drvthis) +{ //Samsung 20S207DA4 & 20S207DA6 + PrivateData *p = (PrivateData*) drvthis->private_data; + int tmp, w; + + if (p->customchars == -83) + p->customchars = 16; // number of custom characters the display provides + p->vbar_cc_offset = 0; // character offset of the bars + p->hbar_cc_offset = 0; // character offset of the bars + p->predefined_hbar = 0; // the display has predefined hbar-characters + p->predefined_vbar = 0; // the display has predefined vbar-characters + + // hardwarespecific commands: + // hw_cmd[Command][data] = {{commandlength , command 1}, + // ..... + // {commandlength , command N}} + const char hw_cmd[10][4] = {{2 ,0x04, 0x20}, // dark + {2 ,0x04, 0x40}, + {2 ,0x04, 0x60}, + {2 ,0x04, 0xFF}, // bright + {2 ,0x10, 0x00}, // pos1 + {1 ,0x10,}, // move cursor + {1 ,0x1F}, // reset + {2 ,0x11,0x14}, // init + {1 ,0x1B}, // set user char + {1 ,0x09}}; // tab + for (tmp = 0; tmp < 10; tmp++) + for (w = 0; w < 4; w++) + p->hw_cmd[tmp][w] = hw_cmd[tmp][w]; + + // Translates ISO 8859-1 to display charset. + const unsigned char charmap[] = { + 127, // the "filled-block"-character usually 127 + /* #128 = 0x80 */ + 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, + /* #160 = 0xA0 */ + 160, 0xAD, 0x9B, 0x9C, 0xC8, 0x9D, 0x7C, 0xC0, + '"', '?', 0xA6, 0xAE, 0xAA, '-', '?', '?', + 0xEF, 0xCA, 0xC6, 0xC7, 0x27, 0xB8, '?', '.', + ',', '?', 0xA7, 0xAF, 0xAC, 0xAB, '?', 0xA8, + /* #192 = 0xC0 */ + 0xD0, 'A', 0xD5, 'A', 0x8E, 0x8F, 0x92, 0x80, + 0xD1, 0x90, 0xD6, 0xD3, 'I', 'I', 0xD7, 0xD4, + 'D', 0xA5, 'O', 'O', 0xD8, 'O', 0x99, 'x', + '0', 0xD2, 'U', 0xD9, 0x9A, 'Y', 'p', 0xB1, + /* #224 = 0xE0 */ + 0x85, 0xA0, 0x83, 'a', 0x84, 0x86, 0x91, 0x87, + 0x8A, 0x82, 0x88, 0x89, 0x8D, 0xA1, 0x8C, 0x8B, + 'o', 0xA4, 0x95, 0xA9, 0x93, 'o', 0x94, '/', + '0', 0x97, 0xA3, 0x96, 0x81, 'y', 'p', 0x89 }; + for (tmp = 0; tmp < 129; tmp++) + p->charmap[tmp] = charmap[tmp]; + + // {bytes to send, icon bit mapped to bit 0, icon bit mapped to bit 1, ...} + const int usr_chr_dot_assignment[57] = { 5, + 8, 7, 6, 5, 4, 3, 2, 1, + 16,15,14,13,12,11,10, 9, + 24,23,22,21,20,19,18,17, + 32,31,30,29,28,27,26,25, + 0, 0, 0, 0, 0,35,34,33 }; + for (tmp = 0; tmp < 57; tmp++) + p->usr_chr_dot_assignment[tmp] = usr_chr_dot_assignment[tmp]; + + // Where to place the usercharacters (0..30) in the asciicode. + // Also used to map standardcharacters in the usercharacterspace(0..30) + // (useful for displays with less then 30 usercharacters and predefined bars) + const unsigned int usr_chr_mapping[31] = { 0xCD, 0xCE, 0xCF, 0xEE, + 0xFF, 0x05, 0x06, 0x07, + 0x0B, 0x0C, 0x0E, 0x0F, + 0x17, 0x1A, 0x1C, 0x1D }; + for (tmp = 0; tmp < 31; tmp++) + p->usr_chr_mapping[tmp] = usr_chr_mapping[tmp]; +} diff --git a/server/drivers/serialVFD_displays.h b/server/drivers/serialVFD_displays.h index bbd0eb7..bf39ec0 100644 --- a/server/drivers/serialVFD_displays.h +++ b/server/drivers/serialVFD_displays.h @@ -24,5 +24,5 @@ #include "lcd.h" #include "serialVFD.h" -void serialVFD_load_display_data(Driver *drvthis); +int serialVFD_load_display_data(Driver *drvthis); #endif diff --git a/server/drivers/serialVFD_io.c b/server/drivers/serialVFD_io.c index 62a30c6..0ef57e9 100644 --- a/server/drivers/serialVFD_io.c +++ b/server/drivers/serialVFD_io.c @@ -57,15 +57,28 @@ serialVFD_write_parallel (Driver *drvthis, unsigned char *dat, size_t length) for (i_para = 0; i_para < length; i_para++) { port_out(p->port, dat[i_para]); -// port_in(p->port+1); + + if (p->para_wait > 2) // some displays need a little time to rest + port_in(p->port+1); + port_out(p->port+2, WR_on); - port_in(p->port+1); + + if (p->para_wait > 1) // some displays need a little time to rest + port_in(p->port+1); + port_out(p->port+2, WR_off); - port_in(p->port+1); + + if (p->para_wait > 0) // some displays need a little time to rest + port_in(p->port+1); + for (j_para = 0; j_para < MAXBUSY; j_para++) { if ((port_in(p->port+1)) & Busy) break; } + + for (j_para = 3; j_para < p->para_wait; j_para++) // some displays need a little longer time to rest + port_in(p->port+1); + } #endif }