update & fix serialVFD driver (Stefan Herdler)

This commit is contained in:
marschap
2006-12-08 18:06:59 +00:00
parent 9cfa7c0a66
commit d54bc76d32
6 changed files with 60 additions and 34 deletions
+1
View File
@@ -23,6 +23,7 @@ v.0.5dev (ongoing development)
* make MtxOrb use Brightness and OffBrightness like CFontzPacket * make MtxOrb use Brightness and OffBrightness like CFontzPacket
* make Brightness & OffBrightness run-time configurable in CFontz & MtxOrb * make Brightness & OffBrightness run-time configurable in CFontz & MtxOrb
* add support for Iface and ProcSize screens for OS X / Darwin (Eric Pooch) * add support for Iface and ProcSize screens for OS X / Darwin (Eric Pooch)
* update & fix serialVFD driver (Stefan Herdler)
v.0.5.1 v.0.5.1
+ config file support in lcdproc client (Andrew Foss) + config file support in lcdproc client (Andrew Foss)
+4 -4
View File
@@ -394,7 +394,7 @@ optional
<arg choice="plain"><replaceable>CUSTOM-CHARACTERS</replaceable></arg> <arg choice="plain"><replaceable>CUSTOM-CHARACTERS</replaceable></arg>
</term> </term>
<listitem><para> <listitem><para>
Number of Custom-Characters [default: Display-<command>Type</command> dependent]. Number of Custom-Characters [default: Display-<command>Type</command> dependent].
</para></listitem> </para></listitem>
</varlistentry> </varlistentry>
@@ -420,7 +420,7 @@ optional
</term> </term>
<listitem> <listitem>
<para> <para>
Specifies the display type.[default: <literal>0</literal>] Specifies the display type.[default: 0]
The following type codes are available: The following type codes are available:
</para> </para>
<informaltable> <informaltable>
@@ -463,7 +463,7 @@ optional
<arg choice="plain"><replaceable>BRIGHTNESS</replaceable></arg> <arg choice="plain"><replaceable>BRIGHTNESS</replaceable></arg>
</term> </term>
<listitem><para> <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) (4 steps 0-250, 251-500, 501-750, 751-1000)
</para></listitem> </para></listitem>
</varlistentry> </varlistentry>
@@ -474,7 +474,7 @@ Set the initial brightness [default: <literal>1000</literal>; legal: <literal>0<
<arg choice="plain"><replaceable>OFFBRIGHTNESS</replaceable></arg> <arg choice="plain"><replaceable>OFFBRIGHTNESS</replaceable></arg>
</term> </term>
<listitem><para> <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 This value is used when the display is normally
switched off in case LCDd is inactive. switched off in case LCDd is inactive.
(4 steps 0-250, 251-500, 501-750, 751-1000) (4 steps 0-250, 251-500, 501-750, 751-1000)
+10 -10
View File
@@ -126,7 +126,7 @@ serialVFD_init (Driver *drvthis)
p->cellheight = DEFAULT_CELL_HEIGHT; p->cellheight = DEFAULT_CELL_HEIGHT;
p->ccmode = CCMODE_STANDARD; p->ccmode = CCMODE_STANDARD;
p->ISO_8859_1 = 1; p->ISO_8859_1 = 1;
p->refresh_timer = 0; p->refresh_timer = 480;
p->hw_brightness = 0; p->hw_brightness = 0;
debug(RPT_INFO, "%s(%p)", __FUNCTION__, drvthis ); debug(RPT_INFO, "%s(%p)", __FUNCTION__, drvthis );
@@ -134,15 +134,17 @@ serialVFD_init (Driver *drvthis)
/* Read config file */ /* Read config file */
p->use_parallel = drvthis->config_get_bool( drvthis->name, "use_parallel", 0, 0 ); 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 */ /* Which device should be used */
strncpy(p->device, drvthis->config_get_string(drvthis->name, "Device", 0, DEFAULT_DEVICE), sizeof(p->device)); strncpy(p->device, drvthis->config_get_string(drvthis->name, "Device", 0, DEFAULT_DEVICE), sizeof(p->device));
p->device[sizeof(p->device)-1] = '\0'; p->device[sizeof(p->device)-1] = '\0';
report(RPT_INFO, "%s: using Device %s", drvthis->name, p->device); 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 */ /* Which speed */
tmp = drvthis->config_get_int (drvthis->name, "Speed", 0, DEFAULT_SPEED); tmp = drvthis->config_get_int (drvthis->name, "Speed", 0, DEFAULT_SPEED);
if ((tmp != 1200) && (tmp != 2400) && (tmp != 9600) && (tmp != 19200) && (tmp != 115200)) { 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); report(RPT_ERR, "%s: unable to create framebuffer backing store.", drvthis->name);
return -1; return -1;
} }
memset(p->backingstore, ' ', p->width * p->height); memset(p->backingstore, 0, p->width * p->height);
//setup displayspecific data //setup displayspecific data
serialVFD_load_display_data(drvthis); 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],\ Port_Function[p->use_parallel].write_fkt (drvthis, &p->hw_cmd[p->hw_brightness][1],\
p->hw_cmd[p->hw_brightness][0]); // restore brightness p->hw_cmd[p->hw_brightness][0]); // restore brightness
for (i = 0; i < (p->height * p->width); i++) memset(p->backingstore, 0, p->width * p->height); // clear Backing-store
p->backingstore[i]=0; // clear Backing-store
for(i=0;i<p->customchars;i++) // refresh all customcharacters for(i=0;i<p->customchars;i++) // refresh all customcharacters
custom_char_changed[i]=1; custom_char_changed[i]=1;
@@ -659,8 +660,7 @@ serialVFD_close (Driver *drvthis)
{ {
PrivateData *p = drvthis->private_data; PrivateData *p = drvthis->private_data;
if (p != NULL) { if (p != NULL) {
if (p->fd >= 0) Port_Function[p->use_parallel].close_fkt (drvthis);
close(p->fd);
if (p->framebuf) if (p->framebuf)
free(p->framebuf); free(p->framebuf);
if (p->backingstore) if (p->backingstore)
+4 -4
View File
@@ -73,7 +73,7 @@ MODULE_EXPORT const char * serialVFD_get_info( Driver *drvthis );
typedef struct driver_private_data { typedef struct driver_private_data {
int use_parallel; // use parallel? 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 char device[200]; // Device in serial mode
int fd; int fd;
int speed; // Speed in serial mode int speed; // Speed in serial mode
@@ -96,9 +96,9 @@ typedef struct driver_private_data {
unsigned char charmap[128]; unsigned char charmap[128];
int display_type; // display type int display_type; // display type
int last_custom; // last custom character written int last_custom; // last custom character written
char custom_char[31][7]; // stored custom characters unsigned char custom_char[31][7]; // stored custom characters
char custom_char_store[31][7]; // custom characters backingstore unsigned char custom_char_store[31][7]; // custom characters backingstore
char hw_cmd[10][4]; // hardwarespecific commands unsigned char hw_cmd[10][4]; // hardwarespecific commands
int usr_chr_dot_assignment[57]; // how to setup usercharacters 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_mapping[31];// where to place the usercharacters (0..30) in the asciicode
int hbar_cc_offset; // character offset of the bars int hbar_cc_offset; // character offset of the bars
+33 -11
View File
@@ -33,6 +33,7 @@
#include "serialVFD_io.h" #include "serialVFD_io.h"
#include "serialVFD.h" #include "serialVFD.h"
#include "lcd.h" #include "lcd.h"
#define WR_on 0x10 #define WR_on 0x10
#define WR_off 0x11 #define WR_off 0x11
#define Busy 0x80 #define Busy 0x80
@@ -41,30 +42,32 @@
#define MAXBUSY 300 #define MAXBUSY 300
void 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; PrivateData *p = drvthis->private_data;
write (p->fd,dat,length); write (p->fd,dat,length);
} }
void 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; PrivateData *p = drvthis->private_data;
int i_para, j_para; int i_para, j_para;
for(i_para = 0; i_para < length; i_para++) { for(i_para = 0; i_para < length; i_para++) {
port_out(p->port, dat[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_out(p->port+2, WR_on);
port_in(p->port+1); port_in(p->port+1);
port_out(p->port+2, WR_off); port_out(p->port+2, WR_off);
port_in(p->port+1);
for(j_para=0; j_para < MAXBUSY; j_para++) { for(j_para=0; j_para < MAXBUSY; j_para++) {
if((port_in(p->port+1)) & Busy) if((port_in(p->port+1)) & Busy)
break; break;
} }
} }
#endif
} }
int int
@@ -110,18 +113,37 @@ serialVFD_init_serial (Driver *drvthis)
int int
serialVFD_init_parallel (Driver *drvthis) serialVFD_init_parallel (Driver *drvthis)
{ {
int ret=0;
PrivateData *p = drvthis->private_data; PrivateData *p = drvthis->private_data;
#ifdef HAVE_PCSTYLE_LPT_CONTROL
debug( RPT_DEBUG, "%s: Opening parallelport at: 0x%X", __FUNCTION__, p->port); debug( RPT_DEBUG, "%s: Opening parallelport at: 0x%X", __FUNCTION__, p->port);
// if(port_access_multiple(p->port,3)) return -1; if(port_access_multiple(p->port,3)) {
if(port_access(p->port) != 0) ret=-1; report (RPT_ERR, "%s: port_access_multiple() of 0x%X failed (%s)\n", __FUNCTION__, p->port, strerror (errno));
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));
return -1; return -1;
} }
return 0; 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
}
+8 -5
View File
@@ -44,12 +44,15 @@
int serialVFD_init_serial (Driver *drvthis); int serialVFD_init_serial (Driver *drvthis);
int serialVFD_init_parallel (Driver *drvthis); int serialVFD_init_parallel (Driver *drvthis);
void serialVFD_write_serial (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, 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 { 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); int (*init_fkt) (Driver *drvthis);
void (*close_fkt) (Driver *drvthis);
} Port_fkt; } Port_fkt;
@@ -57,8 +60,8 @@ static const Port_fkt Port_Function[] = {
// initialisation function // initialisation function
// write function // write function
{serialVFD_write_serial, serialVFD_init_serial}, {serialVFD_write_serial, serialVFD_init_serial, serialVFD_close_serial},
{serialVFD_write_parallel, serialVFD_init_parallel} {serialVFD_write_parallel, serialVFD_init_parallel, serialVFD_close_parallel}
}; };