diff --git a/CREDITS b/CREDITS index 8b4e27c..0fe2659 100644 --- a/CREDITS +++ b/CREDITS @@ -239,6 +239,7 @@ Thien Vu Thomas Jarosch - support reporting in hd44780's ConnectionType functions - build-system clean up: use pkg-config for some libs + - HD44780 connection type for a USB connection via a FTDI FT2232D chip diff --git a/ChangeLog b/ChangeLog index 387f879..e08b597 100644 --- a/ChangeLog +++ b/ChangeLog @@ -40,6 +40,7 @@ v.0.5dev (ongoing development) + hd44780 driver: get/set contrast & brightness support for lcd2usb (M. Dolze) + hd44780 driver: reporting in ConnectionType functions (Thomas Jarosch) * clean up build system (T. Jarosch, with tests/fixes by M. Dolze) + + hd44780 driver: new ConnectionType ftdi (Thomas Jarosch) 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 349b48f..3a9047c 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -195,6 +195,9 @@ dnl else if test "$enable_libusb" = yes ; then HD44780_DRIVERS="$HD44780_DRIVERS hd44780-hd44780-bwct-usb.o hd44780-hd44780-lcd2usb.o" fi + if test "$enable_libftdi" = yes ; then + HD44780_DRIVERS="$HD44780_DRIVERS hd44780-ftdi.o" + fi AC_CHECK_HEADER(linux/i2c-dev.h, HD44780_DRIVERS="$HD44780_DRIVERS hd44780-i2c.o" AC_DEFINE(HAVE_I2C,[1],[Define to 1 if you have the i2c headers]) diff --git a/docs/LCDd.8.in b/docs/LCDd.8.in index 9329db6..ef2e3eb 100644 --- a/docs/LCDd.8.in +++ b/docs/LCDd.8.in @@ -163,6 +163,9 @@ Till Harbaum's open source/open hardware LCD2USB (http://www.harbaum.org/till/lc .TP .B i2c LCD in 4-bit mode driven by PCF8574(A) / PCA9554(A), connected via I2C bus +.TP +.B ftdi +USB connection via a FTDI FT2232D chip in bitbang mode .RE .TP .B icp_a106 diff --git a/docs/lcdproc-user/drivers/hd44780.docbook b/docs/lcdproc-user/drivers/hd44780.docbook index 8c78e3c..3685a91 100644 --- a/docs/lcdproc-user/drivers/hd44780.docbook +++ b/docs/lcdproc-user/drivers/hd44780.docbook @@ -26,6 +26,7 @@ It also supports the following connections: A PIC-an-LCD or LCD serializer connected to a serial port A I2C port expander connected to an I2C port + USB connection via a FTDI FT2232D chip in bitbang mode @@ -1587,6 +1588,133 @@ that. The BL output below should be connected to the BL input in the + +FTDI FT2232D USB chip "ftdi" + + +You can use a FTDI FT2232D dual channel USB <-> parallel FIFO chip +to connect a display via the USB bus. The chip is switched to bitbang mode +and drives both channels as outputs to control the display in 8bit mode. + + + +HD44780: 8bit FTDI + + + + + + + + + FTDI chip + <-> + LCD + + + name + pin + name + pin + + + + + ADBUS0 + 24 + + D0 + 7 + + + ADBUS1 + 23 + + D1 + 8 + + + ADBUS2 + 22 + + D2 + 9 + + + ADBUS3 + 21 + + D3 + 10 + + + ADBUS4 + 20 + + D4 + 11 + + + ADBUS5 + 19 + + D5 + 12 + + + ADBUS6 + 18 + + D6 + 13 + + + ADBUS7 + 17 + + D7 + 14 + + + BDBUS0 + 40 + + RS + 4 + + + BDBUS1 + 39 + + RW + 5 + + + BDBUS2 + 38 + + E + 6 + + + BDBUS3 + 37 + + BL + Backlight (optional) + + + +
+ + +You can configure the USB vendor/product ID in LCDd.conf. +The wiring of the control lines can optionally be reconfigured, +please look at the driver source if you really need that. + + +
+ LIS2 USB device "lis2" @@ -2162,6 +2290,7 @@ This can be done by specifying or by inclu lis2 mplay i2c + ftdi @@ -2238,6 +2367,10 @@ This can be done by specifying or by inclu i2c LCD driven by PCF8574(A)/PCA9554(A) connected via I2C + + ftdi + Display connected to a dual channel FTDI 2232D USB chip + @@ -2498,6 +2631,28 @@ This can be done by specifying or by inclu + + + VendorID= + VENDORID + + + USB vendor ID to look for a FTDI chip. + Default: 0x4003. + + + + + + ProductID= + PRODUCTID + + + USB product ID to look for a FTDI chip. + Default: 0x6001. + + + diff --git a/server/drivers/Makefile.am b/server/drivers/Makefile.am index 98b8e6d..c47cfdf 100644 --- a/server/drivers/Makefile.am +++ b/server/drivers/Makefile.am @@ -23,7 +23,7 @@ EXTRA_PROGRAMS = bayrad CFontz CFontz633 CFontzPacket curses CwLnx ea65 EyeboxOn noinst_LIBRARIES = libLCD.a libbignum.a IOWarrior_CFLAGS = @LIBUSB_CFLAGS@ $(AM_CFLAGS) -hd44780_CFLAGS = @LIBUSB_CFLAGS@ $(AM_CFLAGS) +hd44780_CFLAGS = @LIBUSB_CFLAGS@ @LIBFTDI_CFLAGS@ $(AM_CFLAGS) g15_CFLAGS = @LIBUSB_CFLAGS@ $(AM_CFLAGS) lis_CFLAGS = @LIBFTDI_CFLAGS@ $(AM_CFLAGS) picolcd_CFLAGS = @LIBUSB_CFLAGS@ $(AM_CFLAGS) @@ -37,7 +37,7 @@ curses_LDADD = @LIBCURSES@ CwLnx_LDADD = libLCD.a libbignum.a g15_LDADD = libLCD.a @LIBG15@ glcdlib_LDADD = libLCD.a @LIBGLCD@ -hd44780_LDADD = libLCD.a @HD44780_DRIVERS@ @LIBUSB_LIBS@ libbignum.a +hd44780_LDADD = libLCD.a @HD44780_DRIVERS@ @LIBUSB_LIBS@ @LIBFTDI_LIBS@ libbignum.a hd44780_DEPENDENCIES = @HD44780_DRIVERS@ icp_a106_LDADD = libLCD.a imon_LDADD = libLCD.a @@ -77,7 +77,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 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 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 53f5151..0fec9a1 100644 --- a/server/drivers/hd44780-drivers.h +++ b/server/drivers/hd44780-drivers.h @@ -23,6 +23,9 @@ # include "hd44780-bwct-usb.h" # include "hd44780-lcd2usb.h" #endif +#ifdef HAVE_LIBFTDI +# include "hd44780-ftdi.h" +#endif #ifdef HAVE_I2C # include "hd44780-i2c.h" #endif @@ -55,6 +58,9 @@ static const ConnectionMapping connectionMapping[] = { { "bwctusb", HD44780_CT_BWCTUSB, IF_TYPE_USB, hd_init_bwct_usb }, { "lcd2usb", HD44780_CT_I2C, IF_TYPE_USB, hd_init_lcd2usb }, #endif +#ifdef HAVE_LIBFTDI + { "ftdi", HD44780_CT_FTDI, IF_TYPE_USB, hd_init_ftdi }, +#endif #ifdef HAVE_I2C { "i2c", HD44780_CT_I2C, IF_TYPE_I2C, hd_init_i2c }, #endif diff --git a/server/drivers/hd44780-ftdi.c b/server/drivers/hd44780-ftdi.c new file mode 100644 index 0000000..378e5a6 --- /dev/null +++ b/server/drivers/hd44780-ftdi.c @@ -0,0 +1,158 @@ +/* + * FTDI/USB driver module for Hitachi HD44780 based LCD displays + * connected to a FT2232C/D chip in 8 bit mode. + * + * Copyright (c) 2007, Intra2net AG + * + * This file is released under the GNU General Public License. Refer to the + * COPYING file distributed with this package. + * + */ + +#include "hd44780-ftdi.h" + +#include "report.h" + +#include +#include +#include +#include + +#include +#include +#include + +#include + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +// initialize the driver +int +hd_init_ftdi(Driver *drvthis) +{ + int vendor_id, product_id; + int f; + + PrivateData *p = (PrivateData*) drvthis->private_data; + + p->hd44780_functions->senddata = ftdi_HD44780_senddata; + p->hd44780_functions->backlight = ftdi_HD44780_backlight; + p->hd44780_functions->scankeypad = ftdi_HD44780_scankeypad; + p->hd44780_functions->close = ftdi_HD44780_close; + + // Load config + vendor_id = drvthis->config_get_int(drvthis->name, "VendorID", 0, 0x0403); + product_id = drvthis->config_get_int(drvthis->name, "ProductID", 0, 0x6001); + + p->ftdi_line_RS = drvthis->config_get_int(drvthis->name, "ftdi_line_RS", 0, 0x01); + p->ftdi_line_RW = drvthis->config_get_int(drvthis->name, "ftdi_line_RW", 0, 0x02); + p->ftdi_line_E = drvthis->config_get_int(drvthis->name, "ftdi_line_E", 0, 0x04); + p->ftdi_line_backlight = drvthis->config_get_int(drvthis->name, "ftdi_line_backlight", 0, 0x08); + + // Init 1. channel: data + ftdi_init(&p->ftdic); + ftdi_set_interface(&p->ftdic, INTERFACE_A); + f = ftdi_usb_open(&p->ftdic, vendor_id, product_id); + if(f < 0 && f != -5) { + report(RPT_ERR, "unable to open ftdi device: %d (%s)", f, ftdi_get_error_string(&p->ftdic)); + return -1; + } + debug(RPT_DEBUG, "ftdi open succeeded(channel 1): %d", f); + + debug(RPT_DEBUG, "enabling bitbang mode(channel 1)\n"); + ftdi_enable_bitbang(&p->ftdic, 0xFF); + + // Init 2. channel: control + ftdi_init(&p->ftdic2); + ftdi_set_interface(&p->ftdic2, INTERFACE_B); + f = ftdi_usb_open(&p->ftdic2, vendor_id, product_id); + if(f < 0 && f != -5) { + report(RPT_ERR, "unable to open second ftdi device: %d (%s)", f, ftdi_get_error_string(&p->ftdic2)); + return -2; + } + debug(RPT_DEBUG, "ftdi open succeeded(channel 2): %d", f); + + debug(RPT_DEBUG, "enabling bitbang mode (channel 2)"); + ftdi_enable_bitbang(&p->ftdic2, 0xFF); + + // FTDI bug: Sometimes first write gets lost on kernel 2.6, needs investigation. + ftdi_HD44780_senddata (p, 0, RS_INSTR, FUNCSET | IF_8BIT); + usleep (4100); + + common_init(p, IF_8BIT); + + return 0; +} + +// ftdi_HD44780_senddata +void +ftdi_HD44780_senddata(PrivateData *p, unsigned char displayID, unsigned char flags, unsigned char ch) +{ + // Output data on first channel + int f = ftdi_write_data(&p->ftdic, &ch, 1); + if (f < 0) { + p->hd44780_functions->drv_report(RPT_ERR, "failed to write: %d (%s). Exiting", f, ftdi_get_error_string(&p->ftdic)); + exit (-1); + } + + // Setup RS and R/W and E + ch = p->ftdi_line_E | p->backlight_bit; + if (flags == RS_DATA) { + ch |= p->ftdi_line_RS; + } + f = ftdi_write_data(&p->ftdic2, &ch, 1); + if (f < 0) { + p->hd44780_functions->drv_report(RPT_ERR, "failed to write: %d (%s). Exiting", f, ftdi_get_error_string(&p->ftdic2)); + exit(-1); + } + + // Disable E + ch = 0x00 | p->backlight_bit; + if (flags == RS_DATA) { + ch |= p->ftdi_line_RS; + } + f = ftdi_write_data(&p->ftdic2, &ch, 1); + if (f < 0) { + p->hd44780_functions->drv_report(RPT_ERR, "failed to write: %d (%s). Exiting", f, ftdi_get_error_string(&p->ftdic2)); + exit(-1); + } +} + + +void +ftdi_HD44780_backlight(PrivateData *p, unsigned char state) +{ + int f; + + p->backlight_bit = state ? p->ftdi_line_backlight : 0; + + f = ftdi_write_data(&p->ftdic2, &state, 1); + if (f < 0) { + p->hd44780_functions->drv_report(RPT_ERR, "failed to write: %d (%s). Exiting", f, ftdi_get_error_string(&p->ftdic2)); + exit(-1); + } +} + + +unsigned char +ftdi_HD44780_scankeypad(PrivateData *p) +{ + return 0; +} + + +void +ftdi_HD44780_close(PrivateData *p) +{ + ftdi_disable_bitbang(&p->ftdic); + ftdi_usb_close(&p->ftdic); + ftdi_deinit(&p->ftdic); + + ftdi_disable_bitbang(&p->ftdic2); + ftdi_usb_close(&p->ftdic2); + ftdi_deinit(&p->ftdic2); +} + +/* EOF */ diff --git a/server/drivers/hd44780-ftdi.h b/server/drivers/hd44780-ftdi.h new file mode 100644 index 0000000..e35acea --- /dev/null +++ b/server/drivers/hd44780-ftdi.h @@ -0,0 +1,15 @@ +#ifndef HD_FTDI_H +#define HD_FTDI_H + +#include "lcd.h" /* for Driver */ +#include "hd44780-low.h" + +// initialise this particular driver +int hd_init_ftdi(Driver *drvthis); + +void ftdi_HD44780_senddata(PrivateData *p, unsigned char displayID, unsigned char flags, unsigned char ch); +void ftdi_HD44780_backlight(PrivateData *p, unsigned char state); +unsigned char ftdi_HD44780_scankeypad(PrivateData *p); +void ftdi_HD44780_close(PrivateData *p); + +#endif diff --git a/server/drivers/hd44780-low.h b/server/drivers/hd44780-low.h index aee4284..fe97c3f 100644 --- a/server/drivers/hd44780-low.h +++ b/server/drivers/hd44780-low.h @@ -25,6 +25,9 @@ # endif # endif +#ifdef HAVE_LIBFTDI +# include +#endif // symbolic names for connection types #define HD44780_CT_UNKNOWN 0 @@ -42,7 +45,8 @@ #define HD44780_CT_MPLAY 12 #define HD44780_CT_BWCTUSB 13 #define HD44780_CT_LCDUSB 14 -#define HD44780_CT_I2C 15 +#define HD44780_CT_FTDI 15 +#define HD44780_CT_I2C 16 // symbolic names for interface types #define IF_TYPE_UNKNOWN 0 @@ -103,6 +107,16 @@ typedef struct driver_private_data { int usbIndex; /* USB interface index */ #endif +#ifdef HAVE_LIBFTDI + // FTDI connection type + struct ftdi_context ftdic, ftdic2; + + int ftdi_line_RS; + int ftdi_line_RW; + int ftdi_line_E; + int ftdi_line_backlight; +#endif + int charmap; int width, height;