Index: acinclude.m4 =================================================================== RCS file: /cvsroot/lcdproc/lcdproc/acinclude.m4,v retrieving revision 1.99 diff -u -r1.99 acinclude.m4 --- acinclude.m4 26 Oct 2008 21:33:09 -0000 1.99 +++ acinclude.m4 7 Feb 2009 10:32:38 -0000 @@ -188,7 +188,7 @@ actdrivers=["$actdrivers glk"] ;; hd44780) - HD44780_DRIVERS="hd44780-hd44780-serial.o hd44780-hd44780-lis2.o" + HD44780_DRIVERS="hd44780-hd44780-serial.o hd44780-hd44780-lis2.o hd44780-hd44780-usblcd.o" if test "$ac_cv_port_have_lpt" = yes ; then HD44780_DRIVERS="$HD44780_DRIVERS hd44780-hd44780-4bit.o hd44780-hd44780-ext8bit.o hd44780-lcd_sem.o hd44780-hd44780-winamp.o hd44780-hd44780-serialLpt.o" fi Index: server/drivers/hd44780-usblcd.c =================================================================== RCS file: server/drivers/hd44780-usblcd.c diff -N server/drivers/hd44780-usblcd.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ server/drivers/hd44780-usblcd.c 7 Feb 2009 10:32:39 -0000 @@ -0,0 +1,171 @@ +/** \file server/drivers/hd44780-usblcd.c + * \c ucdlcd connection type of \c hd44780 driver for Hitachi HD44780 based LCD + * displays. This driver does only work with Linux and requires a kernel driver + * available since 2.4.20-pre7. + * + * See http://www.usblcd.de for hardware and documentation. + */ + +/* Copyright (C) 2002 Adams IT Services + * + * This driver is based on pic-an-lcd driver. See file hd44780-serial.c + * for additional Copyrights. + * + * This file is released under the GNU General Public License. Refer to the + * COPYING file distributed with this package. + */ + +#include "hd44780-usblcd.h" +#include "shared/report.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#define DEFAULT_DEVICE "/dev/usb/lcd" + +#define IOCTL_GET_HARD_VERSION 1 +#define IOCTL_GET_DRV_VERSION 2 + +void usblcd_HD44780_senddata(PrivateData *p, unsigned char displayID, unsigned char flags, unsigned char ch); +void usblcd_HD44780_backlight(PrivateData *p, unsigned char state); +void usblcd_HD44780_close(PrivateData *p); + +/** + * Initialize the driver. + * \param drvthis Pointer to driver structure. + * \retval 0 Success. + * \retval -1 Error opening device. + * \retval -2 Error reading or unsupported driver version. + * \retval -3 Error reading or unsupported hardware version. + */ +int +hd_init_usblcd(Driver *drvthis) +{ + PrivateData *p = (PrivateData*) drvthis->private_data; + + char device[256] = DEFAULT_DEVICE; + char buf[128]; + int major,minor; + + /* Get 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: USBLCD: 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: USBLCD: could not open device %s (%s)", device, strerror(errno)); + return -1; + } + + /* Read and check kernel driver version */ + memset(buf, 0, 128); + if (ioctl(p->fd, IOCTL_GET_DRV_VERSION, buf) != 0) { + report(RPT_ERR, "IOCTL failed, could not get Driver Version!\n"); + return -2; + } + report(RPT_INFO,"Driver Version: %s\n",buf); + + if (sscanf(buf,"USBLCD Driver Version %d.%d",&major,&minor) != 2) { + report(RPT_ERR,"Could not read Driver Version!\n"); + return -2; + } + if (major != 1) { + report(RPT_ERR,"Driver Version not supported!\n"); + return -2; + } + + /* Read and check hardware version */ + memset(buf, 0, 128); + if (ioctl(p->fd, IOCTL_GET_HARD_VERSION, buf) != 0) { + report(RPT_ERR,"IOCTL failed, could not get Hardware Version!\n"); + return -3; + }; + report(RPT_INFO,"Hardware Version: %s\n",buf); + + if (sscanf(buf,"%d.%d",&major,&minor) != 2) { + report(RPT_ERR,"Could not read Hardware Version!\n"); + return -3; + }; + if (major != 1) { + report(RPT_ERR,"Hardware Version not supported!\n"); + return -3; + } + + /* Set local functions */ + p->hd44780_functions->senddata = usblcd_HD44780_senddata; + p->hd44780_functions->backlight = usblcd_HD44780_backlight; + p->hd44780_functions->close = usblcd_HD44780_close; + + common_init(p, IF_8BIT); + return 0; +} + +/** + * Send data or commands to the display. + * \param p Pointer to driver's private data structure. + * \param displayID ID of the display (or 0 for all) to send data to. + * \param flags Defines whether to end a command or data. + * \param ch The value to send. + */ +void +usblcd_HD44780_senddata(PrivateData *p, unsigned char displayID, unsigned char flags, unsigned char ch) +{ + static const char instr_byte = 0; + + if (flags == RS_DATA) { + // Escape data byte 0x00 by sending it twice + // because it is used as instruction byte + if (ch == '\0') + write(p->fd, &ch, 1); + write(p->fd, &ch, 1); + } else { + // Instructions are sent prepending 0x00 as escape sequence + write(p->fd, &instr_byte, 1); + write(p->fd, &ch, 1); + } +} + +/** + * Turn display backlight on or off. + * \param p Pointer to driver's private data structure. + * \param state New backlight status. + */ +void +usblcd_HD44780_backlight(PrivateData *p, unsigned char state) +{ + static const char instr_byte = 0; + static const char bl_on = 0x21; + static const char bl_off = 0x20; + + write(p->fd, &instr_byte, 1); + + if (state == BACKLIGHT_OFF) { + write(p->fd, &bl_off, 1); + } else { + write(p->fd, &bl_on , 1); + } +} + +/** + * Close the driver (do necessary clean-up). + * \param p Pointer to driver's private data structure. + */ +void +usblcd_HD44780_close(PrivateData *p) +{ + close(p->fd); +} + +/* EOF */ Index: server/drivers/hd44780-usblcd.h =================================================================== RCS file: server/drivers/hd44780-usblcd.h diff -N server/drivers/hd44780-usblcd.h --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ server/drivers/hd44780-usblcd.h 7 Feb 2009 10:32:39 -0000 @@ -0,0 +1,11 @@ +#ifndef HD_USBLCD_H +#define HD_USBLCD_H + +#include "lcd.h" /* for lcd_logical_driver */ +#include "hd44780-low.h" /* for HD44780_functions */ + +// initialise this particular driver, args is probably not used but keep +// for consistency +int hd_init_usblcd(Driver *drvthis); + +#endif Index: server/drivers/hd44780-low.h =================================================================== RCS file: /cvsroot/lcdproc/lcdproc/server/drivers/hd44780-low.h,v retrieving revision 1.37 diff -u -r1.37 hd44780-low.h --- server/drivers/hd44780-low.h 7 Dec 2008 19:41:36 -0000 1.37 +++ server/drivers/hd44780-low.h 8 Feb 2009 09:45:29 -0000 @@ -49,6 +49,7 @@ #define HD44780_CT_I2C 16 #define HD44780_CT_ETHLCD 17 #define HD44780_CT_USS720 18 +#define HD44780_CT_USBLCD 19 // symbolic names for interface types #define IF_TYPE_UNKNOWN 0 Index: server/drivers/hd44780-drivers.h =================================================================== RCS file: /cvsroot/lcdproc/lcdproc/server/drivers/hd44780-drivers.h,v retrieving revision 1.24 diff -u -r1.24 hd44780-drivers.h --- server/drivers/hd44780-drivers.h 30 Nov 2008 22:34:31 -0000 1.24 +++ server/drivers/hd44780-drivers.h 7 Feb 2009 10:32:40 -0000 @@ -31,6 +31,7 @@ # include "hd44780-i2c.h" #endif # include "hd44780-ethlcd.h" +# include "hd44780-usblcd.h" // add new connection type header files here @@ -72,6 +73,7 @@ #endif /* TCP socket connection types */ { "ethlcd", HD44780_CT_ETHLCD, IF_TYPE_TCP, hd_init_ethlcd }, + { "usblcd", HD44780_CT_USBLCD, IF_TYPE_USB, hd_init_usblcd }, // add new connection types here // .... // default, end of structure element (do not delete) Index: server/drivers/Makefile.am =================================================================== RCS file: /cvsroot/lcdproc/lcdproc/server/drivers/Makefile.am,v retrieving revision 1.83 diff -u -r1.83 Makefile.am --- server/drivers/Makefile.am 21 Dec 2008 11:17:39 -0000 1.83 +++ server/drivers/Makefile.am 7 Feb 2009 10:32:41 -0000 @@ -80,7 +80,7 @@ glcdlib_SOURCES = lcd.h lcd_lib.h glcdlib.h glcdlib.c report.h glk_SOURCES = lcd.h glk.c glk.h glkproto.c glkproto.h report.h hd44780_SOURCES = lcd.h lcd_lib.h hd44780.h hd44780.c hd44780-drivers.h hd44780-low.h hd44780-charmap.h report.h adv_bignum.h -EXTRA_hd44780_SOURCES = hd44780-4bit.c hd44780-4bit.h hd44780-ext8bit.c hd44780-ext8bit.h lcd_sem.c lcd_sem.h hd44780-serialLpt.c hd44780-serialLpt.h hd44780-serial.c hd44780-serial.h hd44780-winamp.c hd44780-winamp.h hd44780-bwct-usb.c hd44780-bwct-usb.h hd44780-lcd2usb.c hd44780-lcd2usb.h hd44780-lis2.c hd44780-lis2.h hd44780-i2c.c hd44780-i2c.h hd44780-ftdi.c hd44780-ftdi.h hd44780-ethlcd.c hd44780-ethlcd.h hd44780-uss720.c hd44780-uss720.h port.h lpt-port.h timing.h +EXTRA_hd44780_SOURCES = hd44780-4bit.c hd44780-4bit.h hd44780-ext8bit.c hd44780-ext8bit.h lcd_sem.c lcd_sem.h hd44780-serialLpt.c hd44780-serialLpt.h hd44780-serial.c hd44780-serial.h hd44780-winamp.c hd44780-winamp.h hd44780-bwct-usb.c hd44780-bwct-usb.h hd44780-lcd2usb.c hd44780-lcd2usb.h hd44780-lis2.c hd44780-lis2.h hd44780-i2c.c hd44780-i2c.h hd44780-ftdi.c hd44780-ftdi.h hd44780-ethlcd.c hd44780-ethlcd.h hd44780-uss720.c hd44780-uss720.h hd44780-usblcd.c hd44780-usblcd.h port.h lpt-port.h timing.h icp_a106_SOURCES = lcd.h lcd_lib.h icp_a106.c icp_a106.h report.h imon_SOURCES = lcd.h lcd_lib.h imon.h imon.c report.h Index: docs/lcdproc-user/drivers/hd44780.docbook =================================================================== RCS file: /cvsroot/lcdproc/lcdproc/docs/lcdproc-user/drivers/hd44780.docbook,v retrieving revision 1.55 diff -u -r1.55 hd44780.docbook --- docs/lcdproc-user/drivers/hd44780.docbook 28 Dec 2008 11:21:41 -0000 1.55 +++ docs/lcdproc-user/drivers/hd44780.docbook 8 Feb 2009 09:39:53 -0000 @@ -123,6 +123,11 @@ ftdi: Display connected to a dual channel FTDI 2232D USB chip + + + usblcd: + USBLCD from Adams IT Services () + @@ -2480,6 +2485,32 @@ + +USBLCD adapter + + +The USBLCD adapter from Adams IT Services () +is a small interface board which allows you to connect an alphanumerical display +module based on the HD44780 or compatible controller to the USB. The display +will be powered by the USB. It features a switchable backlight (on or off) and +can be used with 16x2, 16x4 or 20x4 displays. + + + +The usblcd connection type communicates with a kernel +driver by using a device file /dev/usb/lcdx. +The kernel driver providing this device currently only exists for Linux kernels +newer than 2.4.20-pre7. + + + + +As of 2007 these device are not sold anymore. This driver has been ported from +lcdproc 0.4.5 to support existing users. + + + + @@ -2552,6 +2583,7 @@ mplay i2c ftdi + usblcd @@ -2631,6 +2663,10 @@ ftdi Display connected to a dual channel FTDI 2232D USB chip + + usblcd + USBLCD adapter from Adams IT Services () + i2c