From 62c2b871ae20d093190f7a64b1f13661c7a42222 Mon Sep 17 00:00:00 2001 From: reinelt Date: Sun, 24 Apr 2005 04:33:46 +0000 Subject: [lcd4linux @ 2005-04-24 04:33:46 by reinelt] driver for TREFON USB LCD's added git-svn-id: https://ssl.bulix.org/svn/lcd4linux/trunk@531 3ae390bd-cb1e-0410-b409-cd5a39f66f1f --- Makefile.am | 1 + Makefile.in | 4 +- config.h.in | 3 + configure | 22 ++- drivers.m4 | 17 ++- drv.c | 9 +- drv_Trefon.c | 378 ++++++++++++++++++++++++++++++++++++++++++++++++++ drv_USBLCD.c | 7 +- lcd4linux.conf.sample | 13 +- 9 files changed, 444 insertions(+), 10 deletions(-) create mode 100644 drv_Trefon.c diff --git a/Makefile.am b/Makefile.am index 477e4ac..3014f56 100644 --- a/Makefile.am +++ b/Makefile.am @@ -75,6 +75,7 @@ drv_NULL.c \ drv_RouterBoard.c \ drv_SimpleLCD.c \ drv_T6963.c \ +drv_Trefon.c \ drv_USBLCD.c \ drv_X11.c \ \ diff --git a/Makefile.in b/Makefile.in index 9259628..4c5d4ae 100644 --- a/Makefile.in +++ b/Makefile.in @@ -100,7 +100,7 @@ lcd4linux_SOURCES = lcd4linux.c cfg.c cfg.h deb #liblcd4linux_la_SOURCES = -EXTRA_lcd4linux_SOURCES = drv_generic_text.c drv_generic_text.h drv_generic_graphic.c drv_generic_graphic.h drv_generic_serial.c drv_generic_serial.h drv_generic_parport.c drv_generic_parport.h drv_generic_i2c.c drv_generic_i2c.h drv_BeckmannEgle.c drv_BWCT.c drv_Crystalfontz.c drv_Curses.c drv_Cwlinux.c drv_HD44780.c drv_Image.c drv_LCDLinux.c drv_LCDTerm.c drv_M50530.c drv_MatrixOrbital.c drv_MilfordInstruments.c drv_NULL.c drv_RouterBoard.c drv_SimpleLCD.c drv_T6963.c drv_USBLCD.c drv_X11.c font_6x8.h plugin_apm.c plugin_cpuinfo.c plugin_diskstats.c plugin_dvb.c plugin_exec.c plugin_i2c_sensors.c plugin_imon.c plugin_isdn.c plugin_loadavg.c plugin_meminfo.c plugin_mysql.c plugin_netdev.c plugin_pop3.c plugin_ppp.c plugin_proc_stat.c plugin_seti.c plugin_statfs.c plugin_uname.c plugin_uptime.c plugin_wireless.c plugin_xmms.c +EXTRA_lcd4linux_SOURCES = drv_generic_text.c drv_generic_text.h drv_generic_graphic.c drv_generic_graphic.h drv_generic_serial.c drv_generic_serial.h drv_generic_parport.c drv_generic_parport.h drv_generic_i2c.c drv_generic_i2c.h drv_BeckmannEgle.c drv_BWCT.c drv_Crystalfontz.c drv_Curses.c drv_Cwlinux.c drv_HD44780.c drv_Image.c drv_LCDLinux.c drv_LCDTerm.c drv_M50530.c drv_MatrixOrbital.c drv_MilfordInstruments.c drv_NULL.c drv_RouterBoard.c drv_SimpleLCD.c drv_T6963.c drv_Trefon.c drv_USBLCD.c drv_X11.c font_6x8.h plugin_apm.c plugin_cpuinfo.c plugin_diskstats.c plugin_dvb.c plugin_exec.c plugin_i2c_sensors.c plugin_imon.c plugin_isdn.c plugin_loadavg.c plugin_meminfo.c plugin_mysql.c plugin_netdev.c plugin_pop3.c plugin_ppp.c plugin_proc_stat.c plugin_seti.c plugin_statfs.c plugin_uname.c plugin_uptime.c plugin_wireless.c plugin_xmms.c EXTRA_DIST = lcd4linux.conf.sample lcd4kde.conf lcd4linux.kdelnk lcd4linux.xpm lcd4linux.lsm curses.m4 AUTHORS CREDITS FAQ NEWS TODO README README.Drivers README.Plugins README.KDE plugin_sample.c @@ -144,7 +144,7 @@ DEP_FILES = .deps/cfg.P .deps/debug.P .deps/drv.P .deps/drv_BWCT.P \ .deps/drv_LCDLinux.P .deps/drv_LCDTerm.P .deps/drv_M50530.P \ .deps/drv_MatrixOrbital.P .deps/drv_MilfordInstruments.P \ .deps/drv_NULL.P .deps/drv_RouterBoard.P .deps/drv_SimpleLCD.P \ -.deps/drv_T6963.P .deps/drv_USBLCD.P .deps/drv_X11.P \ +.deps/drv_T6963.P .deps/drv_Trefon.P .deps/drv_USBLCD.P .deps/drv_X11.P \ .deps/drv_generic_graphic.P .deps/drv_generic_i2c.P \ .deps/drv_generic_parport.P .deps/drv_generic_serial.P \ .deps/drv_generic_text.P .deps/evaluator.P .deps/hash.P .deps/layout.P \ diff --git a/config.h.in b/config.h.in index 3fcaba1..4dc4309 100644 --- a/config.h.in +++ b/config.h.in @@ -383,6 +383,9 @@ /* T6963 driver */ #undef WITH_T6963 +/* TREFON driver */ +#undef WITH_TREFON + /* USBLCD driver */ #undef WITH_USBLCD diff --git a/configure b/configure index 88adb74..392c77f 100755 --- a/configure +++ b/configure @@ -870,7 +870,7 @@ Optional Packages: BeckmannEgle, BWCT, CrystalFontz, Curses, Cwlinux, HD44780, LCDLinux, LCDTerm, M50530, MatrixOrbital, MilfordInstruments, NULL, PNG, PPM, RouterBoard, - SimpleLCD, T6963, USBLCD, X11 + SimpleLCD, T6963, Trefon, USBLCD, X11 --with-plugins= choose which plugins to compile. type --with-plugins=list for a list of avaible plugins @@ -5569,6 +5569,7 @@ for driver in $drivers; do PPM="yes" ROUTERBOARD="yes" T6963="yes" + Trefon="yes" USBLCD="yes" X11="yes" SIMPLELCD="yes" @@ -5624,6 +5625,9 @@ for driver in $drivers; do T6963) T6963=$val ;; + Trefon) + Trefon=$val + ;; USBLCD) USBLCD=$val ;; @@ -5852,6 +5856,22 @@ _ACEOF fi +if test "$Trefon" = "yes"; then + if test "$has_usb" = "true"; then + TEXT="yes" + DRIVERS="$DRIVERS drv_Trefon.o" + +cat >>confdefs.h <<\_ACEOF +#define WITH_TREFON 1 +_ACEOF + + DRVLIBS="$DRVLIBS -lusb" + else + { echo "$as_me:$LINENO: WARNING: usb.h not found: Trefon driver disabled" >&5 +echo "$as_me: WARNING: usb.h not found: Trefon driver disabled" >&2;} + fi +fi + if test "$USBLCD" = "yes"; then TEXT="yes" SERIAL="yes" diff --git a/drivers.m4 b/drivers.m4 index 708cb4f..5b44db6 100644 --- a/drivers.m4 +++ b/drivers.m4 @@ -31,7 +31,7 @@ AC_ARG_WITH( [ BeckmannEgle, BWCT, CrystalFontz, Curses, Cwlinux,] [ HD44780, LCDLinux, LCDTerm, M50530, MatrixOrbital,] [ MilfordInstruments, NULL, PNG, PPM, RouterBoard,] - [ SimpleLCD, T6963, USBLCD, X11], + [ SimpleLCD, T6963, Trefon, USBLCD, X11], drivers=$withval, drivers=all ) @@ -68,6 +68,7 @@ for driver in $drivers; do PPM="yes" ROUTERBOARD="yes" T6963="yes" + Trefon="yes" USBLCD="yes" X11="yes" SIMPLELCD="yes" @@ -123,6 +124,9 @@ for driver in $drivers; do T6963) T6963=$val ;; + Trefon) + Trefon=$val + ;; USBLCD) USBLCD=$val ;; @@ -277,6 +281,17 @@ if test "$T6963" = "yes"; then AC_DEFINE(WITH_T6963,1,[T6963 driver]) fi +if test "$Trefon" = "yes"; then + if test "$has_usb" = "true"; then + TEXT="yes" + DRIVERS="$DRIVERS drv_Trefon.o" + AC_DEFINE(WITH_TREFON,1,[TREFON driver]) + DRVLIBS="$DRVLIBS -lusb" + else + AC_MSG_WARN(usb.h not found: Trefon driver disabled) + fi +fi + if test "$USBLCD" = "yes"; then TEXT="yes" SERIAL="yes" diff --git a/drv.c b/drv.c index dcb85a8..ba32b10 100644 --- a/drv.c +++ b/drv.c @@ -1,4 +1,4 @@ -/* $Id: drv.c,v 1.28 2005/02/24 07:06:48 reinelt Exp $ +/* $Id: drv.c,v 1.29 2005/04/24 04:33:46 reinelt Exp $ * * new framework for display drivers * @@ -23,6 +23,9 @@ * * * $Log: drv.c,v $ + * Revision 1.29 2005/04/24 04:33:46 reinelt + * driver for TREFON USB LCD's added + * * Revision 1.28 2005/02/24 07:06:48 reinelt * SimpleLCD driver added * @@ -201,6 +204,7 @@ extern DRIVER drv_NULL; extern DRIVER drv_RouterBoard; extern DRIVER drv_SimpleLCD; extern DRIVER drv_T6963; +extern DRIVER drv_Trefon; extern DRIVER drv_USBLCD; extern DRIVER drv_X11; @@ -259,6 +263,9 @@ DRIVER *Driver[] = { #ifdef WITH_T6963 &drv_T6963, #endif +#ifdef WITH_TREFON + &drv_Trefon, +#endif #ifdef WITH_USBLCD &drv_USBLCD, #endif diff --git a/drv_Trefon.c b/drv_Trefon.c new file mode 100644 index 0000000..f303509 --- /dev/null +++ b/drv_Trefon.c @@ -0,0 +1,378 @@ +/* $Id: drv_Trefon.c,v 1.1 2005/04/24 04:33:46 reinelt Exp $ + * + * driver for TREFON USB LCD displays + * + * Copyright (C) 2005 Michael Reinelt + * Copyright (C) 2005 The LCD4Linux Team + * + * This file is part of LCD4Linux. + * + * LCD4Linux is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * LCD4Linux is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * + * $Log: drv_Trefon.c,v $ + * Revision 1.1 2005/04/24 04:33:46 reinelt + * driver for TREFON USB LCD's added + * + */ + +/* + * + * exported fuctions: + * + * struct DRIVER drv_Trefon + * + */ + +#include "config.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "debug.h" +#include "cfg.h" +#include "qprintf.h" +#include "plugin.h" +#include "widget.h" +#include "widget_text.h" +#include "widget_icon.h" +#include "widget_bar.h" +#include "drv.h" +#include "drv_generic_text.h" + + +#define LCD_USB_VENDOR 0xfff0 +#define LCD_USB_DEVICE 0xfffe + +#define PKT_START 0x02 +#define PKT_DATA 0x02 +#define PKT_CTRL 0x06 +#define PKT_END 0xff + +static char Name[]="TREFON"; + +static usb_dev_handle *lcd; +static int interface; + +extern int usb_debug; +extern int got_signal; + + +/****************************************/ +/*** hardware dependant functions ***/ +/****************************************/ + +static int drv_TF_open (void) +{ + struct usb_bus *busses, *bus; + struct usb_device *dev; + + lcd = NULL; + + info ("%s: scanning USB for TREFON LCD...", Name); + + usb_debug = 0; + + usb_init(); + usb_find_busses(); + usb_find_devices(); + busses = usb_get_busses(); + + for (bus = busses; bus; bus = bus->next) { + for (dev = bus->devices; dev; dev = dev->next) { + if ((dev->descriptor.idVendor == LCD_USB_VENDOR) && + (dev->descriptor.idProduct == LCD_USB_DEVICE)) { + info ("%s: found TREFON USB LCD on bus %s device %s", Name, bus->dirname, dev->filename); + lcd = usb_open(dev); + if (usb_set_configuration(lcd, 1) < 0) { + error ("%s: usb_set_configuration() failed!", Name); + return -1; + } + interface = 0; + if (usb_claim_interface(lcd, interface) < 0) { + error ("%s: usb_claim_interface() failed!", Name); + return -1; + } + return 0; + } + } + } + return -1; +} + + +static int drv_TF_close (void) +{ + usb_release_interface(lcd, interface); + usb_close(lcd); + + return 0; +} + + +static void drv_TF_send (char *data, int size) +{ + char buffer[64]; + + /* the controller always wants a 64-byte packet */ + memset (buffer, 0, 64); + memcpy (buffer, data, size); + + // Endpoint hardcoded to 2 + usb_bulk_write(lcd, 2, buffer, 64, 2000); +} + + +static void drv_TF_command (const unsigned char cmd) +{ + char buffer[4] = { PKT_START, PKT_CTRL, 0, PKT_END }; + buffer[2] = cmd; + drv_TF_send(buffer, 4); +} + + +static void drv_TF_clear (void) +{ + drv_TF_command (0x01); +} + + +static void drv_TF_write (const int row, const int col, const char *data, const int len) +{ + char buffer[64]; + char *p; + int pos; + + /* 16x4 Displays use a slightly different layout */ + if (DCOLS==16 && DROWS==4) { + pos = (row%2)*64+(row/2)*16+col; + } else { + pos = (row%2)*64+(row/2)*20+col; + } + + /* I'd like to combine the GOTO and the data into one packet, + * unfortunately the Trefon doesn't like it :-( + */ + + drv_TF_command (0x80|pos); + + p = buffer; + *p++ = PKT_START; + *p++ = PKT_DATA; + *p++ = (char) len; + for (pos = 0; pos < len; pos++) { + *p++ = *data++; + } + *p++ = PKT_END; + + drv_TF_send(buffer, len+3); +} + +static void drv_TF_defchar (const int ascii, const unsigned char *matrix) +{ + + char buffer[14] = "\002\006x\002x01234567\377"; + char *p; + int i; + + p = buffer; + *p++ = PKT_START; + *p++ = PKT_CTRL; + *p++ = 0x40|8*ascii; + *p++ = PKT_DATA; + *p++ = 8; /* data length */ + for (i = 0; i < 8; i++) { + *p++ = *matrix++ & 0x1f; + } + *p++ = PKT_END; + + drv_TF_send(buffer, 14); +} + + +static int drv_TF_start (const char *section, const int quiet) +{ + int rows=-1, cols=-1; + char *s; + + s=cfg_get(section, "Size", NULL); + if (s==NULL || *s=='\0') { + error ("%s: no '%s.Size' entry from %s", Name, section, cfg_source()); + return -1; + } + if (sscanf(s,"%dx%d",&cols,&rows)!=2 || rows<1 || cols<1) { + error ("%s: bad %s.Size '%s' from %s", Name, section, s, cfg_source()); + free (s); + return -1; + } + + DROWS = rows; + DCOLS = cols; + + if (drv_TF_open() < 0) { + error ("%s: could not find a TREFON USB LCD", Name); + return -1; + } + + drv_TF_clear(); /* clear display */ + + if (!quiet) { + char buffer[40]; + qprintf(buffer, sizeof(buffer), "%s %dx%d", Name, DCOLS, DROWS); + if (drv_generic_text_greet (buffer, "www.trefon.de")) { + sleep (3); + drv_TF_clear(); + } + } + + return 0; +} + + +/****************************************/ +/*** plugins ***/ +/****************************************/ + +/* none */ + + +/****************************************/ +/*** widget callbacks ***/ +/****************************************/ + + +/* using drv_generic_text_draw(W) */ +/* using drv_generic_text_icon_draw(W) */ +/* using drv_generic_text_bar_draw(W) */ + + +/****************************************/ +/*** exported functions ***/ +/****************************************/ + + +/* list models */ +int drv_TF_list (void) +{ + printf ("generic"); + return 0; +} + + +/* initialize driver & display */ +int drv_TF_init (const char *section, const int quiet) +{ + WIDGET_CLASS wc; + int asc255bug; + int ret; + + /* display preferences */ + XRES = 5; /* pixel width of one char */ + YRES = 8; /* pixel height of one char */ + CHARS = 8; /* number of user-defineable characters */ + CHAR0 = 1; /* ASCII of first user-defineable char */ + GOTO_COST = 64; /* number of bytes a goto command requires */ + + /* real worker functions */ + drv_generic_text_real_write = drv_TF_write; + drv_generic_text_real_defchar = drv_TF_defchar; + + + /* start display */ + if ((ret=drv_TF_start (section, quiet))!=0) + return ret; + + /* initialize generic text driver */ + if ((ret=drv_generic_text_init(section, Name))!=0) + return ret; + + /* initialize generic icon driver */ + if ((ret=drv_generic_text_icon_init())!=0) + return ret; + + /* initialize generic bar driver */ + if ((ret=drv_generic_text_bar_init(0))!=0) + return ret; + + /* add fixed chars to the bar driver */ + /* most displays have a full block on ascii 255, but some have kind of */ + /* an 'inverted P'. If you specify 'asc255bug 1 in the config, this */ + /* char will not be used, but rendered by the bar driver */ + cfg_number(section, "asc255bug", 0, 0, 1, &asc255bug); + drv_generic_text_bar_add_segment ( 0, 0,255, 32); /* ASCII 32 = blank */ + if (!asc255bug) + drv_generic_text_bar_add_segment (255,255,255,255); /* ASCII 255 = block */ + + /* register text widget */ + wc=Widget_Text; + wc.draw=drv_generic_text_draw; + widget_register(&wc); + + /* register icon widget */ + wc=Widget_Icon; + wc.draw=drv_generic_text_icon_draw; + widget_register(&wc); + + /* register bar widget */ + wc=Widget_Bar; + wc.draw=drv_generic_text_bar_draw; + widget_register(&wc); + + /* register plugins */ + /* none */ + + return 0; +} + + +/* close driver & display */ +int drv_TF_quit (const int quiet) +{ + + info("%s: shutting down.", Name); + + drv_generic_text_quit(); + + /* clear display */ + drv_TF_clear(); + + /* say goodbye... */ + if (!quiet) { + drv_generic_text_greet ("goodbye!", NULL); + } + + debug ("closing USB connection"); + drv_TF_close(); + + return (0); +} + + +DRIVER drv_Trefon = { + name: Name, + list: drv_TF_list, + init: drv_TF_init, + quit: drv_TF_quit, +}; + diff --git a/drv_USBLCD.c b/drv_USBLCD.c index a1e8eba..aa5b927 100644 --- a/drv_USBLCD.c +++ b/drv_USBLCD.c @@ -1,4 +1,4 @@ -/* $Id: drv_USBLCD.c,v 1.21 2005/04/02 05:28:58 reinelt Exp $ +/* $Id: drv_USBLCD.c,v 1.22 2005/04/24 04:33:46 reinelt Exp $ * * new style driver for USBLCD displays * @@ -26,6 +26,9 @@ * * * $Log: drv_USBLCD.c,v $ + * Revision 1.22 2005/04/24 04:33:46 reinelt + * driver for TREFON USB LCD's added + * * Revision 1.21 2005/04/02 05:28:58 reinelt * fixed gcc4 warnings about signed/unsigned mismatches * @@ -246,7 +249,7 @@ static int drv_UL_close (void) #endif -static void drv_UL_send () +static void drv_UL_send (void) { #if 0 diff --git a/lcd4linux.conf.sample b/lcd4linux.conf.sample index e248b93..d1c10a0 100644 --- a/lcd4linux.conf.sample +++ b/lcd4linux.conf.sample @@ -1,3 +1,9 @@ +Display Trefon { + Driver 'TREFON' + Size '16x2' +} + + Display LCD-Linux { Driver 'LCD-Linux' } @@ -744,13 +750,14 @@ Layout testMySQL { #Display 'LCDTerm' #Display 'CT20x4' #Display 'T6963-240x64' -Display 'XWindow' +#Display 'XWindow' #Display 'USBLCD' #Display 'BWCT' #Display 'Image' +Display 'Trefon' -Layout 'Default' -#Layout 'L16x2' +#Layout 'Default' +Layout 'L16x2' #Layout 'L20x2' #Layout 'Test' -- cgit v1.2.3