diff --git a/acinclude.m4 b/acinclude.m4 index e81c993..048d5db 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -132,9 +132,9 @@ dnl else ;; hd44780) if test "$ac_cv_port_have_lpt" = yes ; then - HD44780_DRIVERS="hd44780-4bit.o hd44780-ext8bit.o lcd_sem.o hd44780-winamp.o hd44780-serialLpt.o hd44780-picanlcd.o" + HD44780_DRIVERS="hd44780-4bit.o hd44780-ext8bit.o lcd_sem.o hd44780-winamp.o hd44780-serialLpt.o hd44780-picanlcd.o hd44780-lcdserializer.o" else - HD44780_DRIVERS="hd44780-picanlcd.o" + HD44780_DRIVERS="hd44780-picanlcd.o hd44780-lcdserializer.o" fi if test "$enable_libusb" = yes ; then HD44780_DRIVERS="$HD44780_DRIVERS hd44780-bwct-usb.o" diff --git a/docs/lcdproc-user/drivers/hd44780.docbook b/docs/lcdproc-user/drivers/hd44780.docbook index f0e8753..ba3198f 100644 --- a/docs/lcdproc-user/drivers/hd44780.docbook +++ b/docs/lcdproc-user/drivers/hd44780.docbook @@ -1032,6 +1032,65 @@ It does not support a keypad nor backlight switching. + +LCD serializer device "lcdserializer" + + +LCD serializer connection is technically the same of PIC-an-LCD with the same advantages, +it uses the serial making things really simple. +LCD serializer +is not a commercial product like PIC-an-LCD, it's just a project found digging on the net freely available. +You have all the tools and the code to build it yourself and to customize the behaviour of the device. + + + +What you need + + + +Some electronic knowledge and familiarity with the soldering iron +A PIC16F84 (I used PIC16F84A) or PIC16C54 +JDM PIC programmer +gputils and picprog installed on your GNU/Linux box + + + + + +Burning the PIC + + +First, you need to download the asm source for your pic and then make the hex: + + wget http://www.mindspring.com/~tcoonan/lcd18f84.asm + gpasm lcd18f84_custom.asm + +Now the binary is ready to be flashed to the PIC. +Connect the programmer with the PIC installed and issue the following command to see it burning ;-): + + picprog --erase --burn --input lcd16f84.hex --pic /dev/ttyS0 + + + + + + +Running lcdproc + + +It's time to build the operating circuit and to power on your new toy. +You should see OK. on the LCD screen, otherwise, double-check all the connections. +Now change LCDd.conf to include the following statments in the hd44780 section: + + ConnectionType=lcdserializer + Device=/dev/ttyS0 + +Start the daemon and relax watching lcdproc running. + + + + + BWCT USB device "bwctusb" @@ -1040,7 +1099,7 @@ The BWCT USB LCD module is also supported. It is not connected to an LPT port but to an USB port, which saves you from a lot of potential problems. To use it, set the connection type in the config file with the ConnectionType= setting to "bwctusb" (without the quotes). -It does neithert support a keypad nor backlight switching but it supports setting +It does neither support a keypad nor backlight switching but it supports setting the display's contrast using the "Contrast" configuration parameter as well as specifying which one (of multiple BWCT LCD devices) is wanted using the "SerialNumber" configuration parameter. diff --git a/server/drivers/hd44780-drivers.h b/server/drivers/hd44780-drivers.h index 6939701..cd43dce 100644 --- a/server/drivers/hd44780-drivers.h +++ b/server/drivers/hd44780-drivers.h @@ -21,6 +21,7 @@ # include "hd44780-bwct-usb.h" #endif #include "hd44780-picanlcd.h" +#include "hd44780-lcdserializer.h" // add new connection type header files here static const ConnectionMapping connectionMapping[] = { @@ -35,6 +36,7 @@ static const ConnectionMapping connectionMapping[] = { {"winamp", hd_init_winamp, "\tnone\n"}, #endif {"picanlcd", hd_init_picanlcd, "\tnone\n"}, + {"lcdserializer", hd_init_lcdserializer, "\tnone\n"}, #ifdef HAVE_LIBUSB {"bwctusb", hd_init_bwct_usb, "\tnone\n"}, #endif diff --git a/server/drivers/hd44780-lcdserializer.c b/server/drivers/hd44780-lcdserializer.c new file mode 100644 index 0000000..014c3d5 --- /dev/null +++ b/server/drivers/hd44780-lcdserializer.c @@ -0,0 +1,133 @@ +/* + * LCD Serializer driver + * Modification of the code of the PIC-an-LCD driver + * + * Copyright (c) 1997, Matthias Prinke + * 1998, Richard Rognlie + * 1999, Ethan Dicks + * 1999-2000, Benjamin Tse + * 2001, Rene Wagner + * 2001-2002, Joris Robijn + * 2005, Pillon Matteo + * + * This file is released under the GNU General Public License. Refer to the + * COPYING file distributed with this package. + * + * LCD Serializer code and documentation: + * http://www.mindspring.com/~tcoonan/lcd.html + * + */ + +#include "hd44780-lcdserializer.h" +#include "hd44780-low.h" + +#include "report.h" + +#include +#include +#include + +#include +#include +#include +#include + +#include + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +// Generally, any function that accesses the LCD control lines needs to be +// implemented separately for each HW design. This is typically (but not +// restricted to): +// HD44780_senddata +// HD44780_readkeypad + +void lcdserializer_HD44780_senddata (PrivateData *p, unsigned char displayID, unsigned char flags, unsigned char ch); +void lcdserializer_HD44780_backlight (PrivateData *p, unsigned char state); +unsigned char lcdserializer_HD44780_scankeypad (PrivateData *p); + +#define LCDSERIALIZER_LCDI '\xFE' + +#define DEFAULT_DEVICE "/dev/lcd" + +// initialise the driver +int +hd_init_lcdserializer (Driver *drvthis) +{ + PrivateData *p = (PrivateData*) drvthis->private_data; + + struct termios portset; + char device[256] = DEFAULT_DEVICE; + + /* READ CONFIG FILE */ + + /* Get serial device to use */ + strncpy(device, drvthis->config_get_string ( drvthis->name , "device" , 0 , DEFAULT_DEVICE),sizeof(device)); + device[sizeof(device)-1]=0; + report (RPT_INFO,"HD44780: LCD Serializer: Using device: %s", device); + + // Set up io port correctly, and open it... + p->fd = open(device, O_RDWR | O_NOCTTY | O_NDELAY); + if (p->fd == -1) { + report(RPT_ERR, "HD44780: LCD Serializer: could not open device %s (%s)\n", device, strerror(errno)); + return -1; + } + + /* Get serial device parameters */ + tcgetattr(p->fd, &portset); + + /* We use RAW mode */ +#ifdef HAVE_CFMAKERAW + /* The easy way */ + cfmakeraw( &portset ); +#else + /* The hard way */ + portset.c_iflag &= ~( IGNBRK | BRKINT | PARMRK | ISTRIP + | INLCR | IGNCR | ICRNL | IXON ); + portset.c_oflag &= ~OPOST; + portset.c_lflag &= ~( ECHO | ECHONL | ICANON | ISIG | IEXTEN ); + portset.c_cflag &= ~( CSIZE | PARENB | CRTSCTS ); + portset.c_cflag |= CS8 | CREAD | CLOCAL ; +#endif + /* Set port speed to 9600 baud */ + cfsetospeed(&portset, B9600); + + /* Set TCSANOW mode of serial device */ + tcsetattr(p->fd, TCSANOW, &portset); + + p->hd44780_functions->senddata = lcdserializer_HD44780_senddata; + p->hd44780_functions->backlight = lcdserializer_HD44780_backlight; + p->hd44780_functions->scankeypad = lcdserializer_HD44780_scankeypad; + + common_init (p, IF_8BIT); + + return 0; +} + +void +lcdserializer_HD44780_senddata (PrivateData *p, unsigned char displayID, unsigned char flags, unsigned char ch) +{ + static const char instr_byte = LCDSERIALIZER_LCDI; + + if (flags == RS_DATA) { + write( p->fd, &ch, 1 ); + } + else { + write( p->fd, &instr_byte, 1 ); + write( p->fd, &ch, 1 ); + } +} + +void +lcdserializer_HD44780_backlight (PrivateData *p, unsigned char state) +{ + /* No backlight control */ +} + +unsigned char +lcdserializer_HD44780_scankeypad (PrivateData *p) +{ + return 0; +} diff --git a/server/drivers/hd44780-lcdserializer.h b/server/drivers/hd44780-lcdserializer.h new file mode 100644 index 0000000..ba40653 --- /dev/null +++ b/server/drivers/hd44780-lcdserializer.h @@ -0,0 +1,9 @@ +#ifndef HD_LCDSERIALIZER_H +#define HD_LCDSERIALIZER_H + +#include "lcd.h" /* for Driver */ + +// initialise this particular driver +int hd_init_lcdserializer (Driver *drvthis); + +#endif