diff --git a/ChangeLog b/ChangeLog index 2b784f7..27f3d93 100644 --- a/ChangeLog +++ b/ChangeLog @@ -68,6 +68,7 @@ v.0.5dev (ongoing development) + lcdproc: Retrieve per CPU usage statistics on FreeBSD (M. Dolze) * Change drivers to start in background by default: bayrad, CFontz, ea65, glk * imon driver: Change hbars to make last char in-/decrease vertically + + hd44780 driver: port usblcd connection type from 0.4.5 to 0.5 (M. Dolze) v.0.5.2 * fix switching on/off the Load screen in lcdproc client using the menu diff --git a/acinclude.m4 b/acinclude.m4 index 587b338..0145e3c 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -188,7 +188,7 @@ dnl else 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 diff --git a/docs/LCDd.8.in b/docs/LCDd.8.in index f6a7f73..5b1e985 100644 --- a/docs/LCDd.8.in +++ b/docs/LCDd.8.in @@ -172,6 +172,9 @@ USB connection via a FTDI FT2232D chip in bitbang mode .TP .B ethlcd TCP connection using open source/open hardware ethlcd (http://manio.skyboo.net/ethlcd/) +.TP +.B usblcd +LCD device from Adams IT Services (http://www.usblcd.de/) .RE .TP .B i2500vfd diff --git a/docs/lcdproc-user/drivers/hd44780.docbook b/docs/lcdproc-user/drivers/hd44780.docbook index 872e67e..4cbbee0 100644 --- a/docs/lcdproc-user/drivers/hd44780.docbook +++ b/docs/lcdproc-user/drivers/hd44780.docbook @@ -123,6 +123,11 @@ more important. Here are the USB connection types the HD44780 driver supports: ftdi: Display connected to a dual channel FTDI 2232D USB chip + + + usblcd: + USBLCD from Adams IT Services () + @@ -2480,6 +2485,32 @@ The default is ethlcd. + +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 @@ This can be done by specifying or by inclu mplay i2c ftdi + usblcd @@ -2631,6 +2663,10 @@ This can be done by specifying or by inclu ftdi Display connected to a dual channel FTDI 2232D USB chip + + usblcd + USBLCD adapter from Adams IT Services () + i2c diff --git a/server/drivers/Makefile.am b/server/drivers/Makefile.am index bc5839c..423981f 100644 --- a/server/drivers/Makefile.am +++ b/server/drivers/Makefile.am @@ -80,7 +80,7 @@ g15_SOURCES = lcd.h lcd_lib.h g15.h g15-num.c g15.c report.h 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 diff --git a/server/drivers/hd44780-drivers.h b/server/drivers/hd44780-drivers.h index 8657d0c..75f60c6 100644 --- a/server/drivers/hd44780-drivers.h +++ b/server/drivers/hd44780-drivers.h @@ -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 @@ static const ConnectionMapping connectionMapping[] = { #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) diff --git a/server/drivers/hd44780-low.h b/server/drivers/hd44780-low.h index 4659fdb..b649a2e 100644 --- a/server/drivers/hd44780-low.h +++ b/server/drivers/hd44780-low.h @@ -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 diff --git a/server/drivers/hd44780-usblcd.c b/server/drivers/hd44780-usblcd.c new file mode 100644 index 0000000..36e7cb1 --- /dev/null +++ b/server/drivers/hd44780-usblcd.c @@ -0,0 +1,174 @@ +/** \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. + * + * Modified February 2009 by Markus Dolze to use API v0.5. + */ + +#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"); + return -2; + } + report(RPT_INFO, "Driver Version: %s", buf); + + if (sscanf(buf, "USBLCD Driver Version %d.%d", &major, &minor) != 2) { + report(RPT_ERR, "Could not read Driver Version"); + return -2; + } + if (major != 1) { + report(RPT_ERR, "Driver Version not supported"); + 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"); + return -3; + }; + report(RPT_INFO, "Hardware Version: %s", buf); + if (sscanf(buf, "%d.%d", &major, &minor) != 2) { + report(RPT_ERR, "Could not read Hardware Version"); + return -3; + }; + if (major != 1) { + report(RPT_ERR, "Hardware Version not supported"); + 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 */ diff --git a/server/drivers/hd44780-usblcd.h b/server/drivers/hd44780-usblcd.h new file mode 100644 index 0000000..4918af7 --- /dev/null +++ b/server/drivers/hd44780-usblcd.h @@ -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