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