This bug was fixed upstream, so lcdproc can again build from source in ppc(64).
Nevertheless, I won't reopen the bug, as removing ppc from supported arches is a fix, too. If you want to try, a patch against vanilla 0.5.1 is included. Regards, Robert Buchholz
This patch fixes compilation errors with hardware that does not have a parallel port. It was proposed by serialVFD driver author Stefan Herdler and accepted upstream for the next release. See Gentoo bug #151308 and http://thread.gmane.org/gmane.comp.sysutils.lcdproc/11184/focus=11184 --- ../cvs/lcdproc/server/drivers/serialVFD.c 2006-11-11 18:03:47.000000000 +0100 +++ ./server/drivers/serialVFD.c 2006-11-11 17:07:38.000000000 +0100 @@ -126,7 +126,7 @@ serialVFD_init (Driver *drvthis) p->cellheight = DEFAULT_CELL_HEIGHT; p->ccmode = CCMODE_STANDARD; p->ISO_8859_1 = 1; - p->refresh_timer = 0; + p->refresh_timer = 480; p->hw_brightness = 0; debug(RPT_INFO, "%s(%p)", __FUNCTION__, drvthis ); @@ -134,15 +134,17 @@ serialVFD_init (Driver *drvthis) /* Read config file */ p->use_parallel = drvthis->config_get_bool( drvthis->name, "use_parallel", 0, 0 ); - if (p->use_parallel) { - p->port = drvthis->config_get_int( drvthis->name, "port", 0, LPTPORT ); - } - else { + /* Which device should be used */ strncpy(p->device, drvthis->config_get_string(drvthis->name, "Device", 0, DEFAULT_DEVICE), sizeof(p->device)); p->device[sizeof(p->device)-1] = '\0'; report(RPT_INFO, "%s: using Device %s", drvthis->name, p->device); + if (p->use_parallel) { + p->port = drvthis->config_get_int( drvthis->name, "port", 0, LPTPORT ); + } + else { + /* Which speed */ tmp = drvthis->config_get_int (drvthis->name, "Speed", 0, DEFAULT_SPEED); if ((tmp != 1200) && (tmp != 2400) && (tmp != 9600) && (tmp != 19200) && (tmp != 115200)) { @@ -236,7 +238,7 @@ serialVFD_init (Driver *drvthis) report(RPT_ERR, "%s: unable to create framebuffer backing store.", drvthis->name); return -1; } - memset(p->backingstore, ' ', p->width * p->height); + memset(p->backingstore, 0, p->width * p->height); //setup displayspecific data serialVFD_load_display_data(drvthis); @@ -427,8 +429,7 @@ serialVFD_flush (Driver *drvthis) Port_Function[p->use_parallel].write_fkt (drvthis, &p->hw_cmd[p->hw_brightness][1],\ p->hw_cmd[p->hw_brightness][0]); // restore brightness - for (i = 0; i < (p->height * p->width); i++) - p->backingstore[i]=0; // clear Backing-store + memset(p->backingstore, 0, p->width * p->height); // clear Backing-store for(i=0;i<p->customchars;i++) // refresh all customcharacters custom_char_changed[i]=1; @@ -659,8 +660,7 @@ serialVFD_close (Driver *drvthis) { PrivateData *p = drvthis->private_data; if (p != NULL) { - if (p->fd >= 0) - close(p->fd); + Port_Function[p->use_parallel].close_fkt (drvthis); if (p->framebuf) free(p->framebuf); if (p->backingstore) --- ../cvs/lcdproc/server/drivers/serialVFD.h 2006-10-02 19:48:08.000000000 +0200 +++ ./server/drivers/serialVFD.h 2006-11-12 17:17:04.000000000 +0100 @@ -73,7 +73,7 @@ MODULE_EXPORT const char * serialVFD_get typedef struct driver_private_data { int use_parallel; // use parallel? - unsigned int port; // Port in parallel mode + unsigned short port; // Port in parallel mode char device[200]; // Device in serial mode int fd; int speed; // Speed in serial mode @@ -96,9 +96,9 @@ typedef struct driver_private_data { unsigned char charmap[128]; int display_type; // display type int last_custom; // last custom character written - char custom_char[31][7]; // stored custom characters - char custom_char_store[31][7]; // custom characters backingstore - char hw_cmd[10][4]; // hardwarespecific commands + unsigned char custom_char[31][7]; // stored custom characters + unsigned char custom_char_store[31][7]; // custom characters backingstore + 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 int hbar_cc_offset; // character offset of the bars --- ../cvs/lcdproc/server/drivers/serialVFD_io.c 2006-10-02 19:48:08.000000000 +0200 +++ ./server/drivers/serialVFD_io.c 2006-11-12 19:34:25.000000000 +0100 @@ -33,6 +33,7 @@ #include "serialVFD_io.h" #include "serialVFD.h" #include "lcd.h" + #define WR_on 0x10 #define WR_off 0x11 #define Busy 0x80 @@ -41,30 +42,32 @@ #define MAXBUSY 300 void -serialVFD_write_serial (Driver *drvthis, char *dat, size_t length) +serialVFD_write_serial (Driver *drvthis, unsigned char *dat, size_t length) { PrivateData *p = drvthis->private_data; write (p->fd,dat,length); } void -serialVFD_write_parallel (Driver *drvthis, char *dat, size_t length) +serialVFD_write_parallel (Driver *drvthis, unsigned char *dat, size_t length) { +#ifdef HAVE_PCSTYLE_LPT_CONTROL PrivateData *p = drvthis->private_data; int i_para, j_para; for(i_para = 0; i_para < length; i_para++) { port_out(p->port, dat[i_para]); - port_in(p->port+1); +// port_in(p->port+1); port_out(p->port+2, WR_on); port_in(p->port+1); port_out(p->port+2, WR_off); - + port_in(p->port+1); for(j_para=0; j_para < MAXBUSY; j_para++) { if((port_in(p->port+1)) & Busy) break; } } +#endif } int @@ -110,18 +113,37 @@ serialVFD_init_serial (Driver *drvthis) int serialVFD_init_parallel (Driver *drvthis) { - int ret=0; PrivateData *p = drvthis->private_data; +#ifdef HAVE_PCSTYLE_LPT_CONTROL debug( RPT_DEBUG, "%s: Opening parallelport at: 0x%X", __FUNCTION__, p->port); -// if(port_access_multiple(p->port,3)) return -1; - if(port_access(p->port) != 0) ret=-1; - if(port_access(p->port+1) != 0) ret=-1; - if(port_access(p->port+2) != 0) ret=-1; - if(ret == -1) { - report (RPT_ERR, "%s: port_access() of 0x%X failed (%s)\n", __FUNCTION__, p->port, strerror (errno)); + if(port_access_multiple(p->port,3)) { + report (RPT_ERR, "%s: port_access_multiple() of 0x%X failed (%s)\n", __FUNCTION__, p->port, strerror (errno)); return -1; } return 0; +#else + report (RPT_ERR, "%s: LCDproc was compiled without PCstyle LPT support\n", __FUNCTION__); + return -1; +#endif +} + +void +serialVFD_close_serial (Driver *drvthis) +{ + PrivateData *p = drvthis->private_data; + if (p->fd >= 0) + close(p->fd); } +void +serialVFD_close_parallel (Driver *drvthis) +{ +#ifdef HAVE_PCSTYLE_LPT_CONTROL + PrivateData *p = drvthis->private_data; + debug( RPT_DEBUG, "%s: Closing parallelport at: 0x%X", __FUNCTION__, p->port); + if(port_deny_multiple(p->port,3)) { + report (RPT_ERR, "%s: port_deny_multiple() of 0x%X failed (%s)\n", __FUNCTION__, p->port, strerror (errno)); + } +#endif +} --- ../cvs/lcdproc/server/drivers/serialVFD_io.h 2006-10-02 19:48:08.000000000 +0200 +++ ./server/drivers/serialVFD_io.h 2006-11-11 16:47:29.000000000 +0100 @@ -44,12 +44,15 @@ int serialVFD_init_serial (Driver *drvthis); int serialVFD_init_parallel (Driver *drvthis); -void serialVFD_write_serial (Driver *drvthis, char *dat, size_t length); -void serialVFD_write_parallel (Driver *drvthis, char *dat, size_t length); +void serialVFD_write_serial (Driver *drvthis, unsigned char *dat, size_t length); +void serialVFD_write_parallel (Driver *drvthis, unsigned char *dat, size_t length); +void serialVFD_close_serial (Driver *drvthis); +void serialVFD_close_parallel (Driver *drvthis); typedef struct Port_fkt { - void (*write_fkt) (Driver *drvthis, char *dat, size_t length); + void (*write_fkt) (Driver *drvthis, unsigned char *dat, size_t length); int (*init_fkt) (Driver *drvthis); + void (*close_fkt) (Driver *drvthis); } Port_fkt; @@ -57,8 +60,8 @@ static const Port_fkt Port_Function[] = // initialisation function // write function - {serialVFD_write_serial, serialVFD_init_serial}, - {serialVFD_write_parallel, serialVFD_init_parallel} + {serialVFD_write_serial, serialVFD_init_serial, serialVFD_close_serial}, + {serialVFD_write_parallel, serialVFD_init_parallel, serialVFD_close_parallel} }; --- ../cvs/lcdproc/docs/lcdproc-user/drivers/serialVFD.docbook 2006-11-11 18:03:14.000000000 +0100 +++ ./docs/lcdproc-user/drivers/serialVFD.docbook 2006-10-02 19:48:01.000000000 +0200 @@ -394,7 +394,7 @@ optional <arg choice="plain"><replaceable>CUSTOM-CHARACTERS</replaceable></arg> </term> <listitem><para> - Number of Custom-Characters [default: Display-<command>Type</command> dependent]. +Number of Custom-Characters [default: Display-<command>Type</command> dependent]. </para></listitem> </varlistentry> @@ -420,7 +420,7 @@ optional </term> <listitem> <para> - Specifies the display type.[default: <literal>0</literal>] + Specifies the display type.[default: 0] The following type codes are available: </para> <informaltable> @@ -463,7 +463,7 @@ optional <arg choice="plain"><replaceable>BRIGHTNESS</replaceable></arg> </term> <listitem><para> -Set the initial brightness [default: <literal>1000</literal>; legal: <literal>0</literal> - <literal>1000</literal>] +Set the initial brightness [default: 1000; legal: 0 - 1000] (4 steps 0-250, 251-500, 501-750, 751-1000) </para></listitem> </varlistentry> @@ -474,7 +474,7 @@ Set the initial brightness [default: <li <arg choice="plain"><replaceable>OFFBRIGHTNESS</replaceable></arg> </term> <listitem><para> -Set the initial off-brightness [default: <literal>0</literal>; legal: <literal>0</literal> - <literal>1000</literal>]. +Set the initial off-brightness [default: 0; legal: 0 - 1000]. This value is used when the display is normally switched off in case LCDd is inactive. (4 steps 0-250, 251-500, 501-750, 751-1000)
signature.asc
Description: OpenPGP digital signature