From c38464bf6e096534075716a2eb98b05bdc31ee22 Mon Sep 17 00:00:00 2001 From: reinelt <> Date: Sat, 27 Aug 2005 07:02:25 +0000 Subject: [lcd4linux @ 2005-08-27 07:02:25 by reinelt] LCD-Linux updated to 0.9.0 --- config.h.in | 3 + configure | 162 +++++++++++++++++++++++++++++++++++++++++++++++++- configure.in | 3 + drivers.m4 | 10 +++- drv_LCDLinux.c | 82 ++++++++++++------------- drv_LCDLinux.h | 118 ++++++++++++++++-------------------- lcd4linux.conf.sample | 4 +- 7 files changed, 268 insertions(+), 114 deletions(-) diff --git a/config.h.in b/config.h.in index 63afa45..580654e 100644 --- a/config.h.in +++ b/config.h.in @@ -55,6 +55,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_LINUX_ISDN_H +/* Define to 1 if you have the header file. */ +#undef HAVE_LINUX_LCD_LINUX_H + /* Define to 1 if you have the header file. */ #undef HAVE_LINUX_PARPORT_H diff --git a/configure b/configure index f81a361..a54cf32 100755 --- a/configure +++ b/configure @@ -5766,6 +5766,159 @@ fi done +# check for LCD-Linux + +for ac_header in linux/lcd-linux.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +else + # Is the header compilable? +echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_header_compiler=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6 + +# Is the header present? +echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi +rm -f conftest.err conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6 + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( + cat <<\_ASBOX +## ---------------------------------------------------- ## +## Report this to lcd4linux-users@lists.sourceforge.net ## +## ---------------------------------------------------- ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 + +fi +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + has_lcd_linux="true" +else + has_lcd_linux="false" +fi + +done + + # check for python echo "$as_me:$LINENO: checking if python support is wanted" >&5 echo $ECHO_N "checking if python support is wanted... $ECHO_C" >&6 @@ -6072,13 +6225,18 @@ _ACEOF fi if test "$LCDLINUX" = "yes"; then - TEXT="yes" - DRIVERS="$DRIVERS drv_LCDLinux.o" + if test "$has_lcd_linux" = true; then + TEXT="yes" + DRIVERS="$DRIVERS drv_LCDLinux.o" cat >>confdefs.h <<\_ACEOF #define WITH_LCDLINUX 1 _ACEOF + else + { echo "$as_me:$LINENO: WARNING: lcd-linux.h not found: LCD-Linux driver disabled" >&5 +echo "$as_me: WARNING: lcd-linux.h not found: LCD-Linux driver disabled" >&2;} + fi fi if test "$LCDTERM" = "yes"; then diff --git a/configure.in b/configure.in index 60a4e14..87a0981 100644 --- a/configure.in +++ b/configure.in @@ -65,6 +65,9 @@ AC_CHECK_HEADERS(usb.h, [has_usb="true"], [has_usb="false"]) # check for serdisplib AC_CHECK_HEADERS(serdisplib/serdisp.h, [has_serdisplib="true"], [has_serdisplib="false"]) +# check for LCD-Linux +AC_CHECK_HEADERS(linux/lcd-linux.h, [has_lcd_linux="true"], [has_lcd_linux="false"]) + # check for python AC_MSG_CHECKING(if python support is wanted) AC_ARG_WITH(python, diff --git a/drivers.m4 b/drivers.m4 index 1421787..45e4727 100644 --- a/drivers.m4 +++ b/drivers.m4 @@ -218,9 +218,13 @@ if test "$HD44780" = "yes"; then fi if test "$LCDLINUX" = "yes"; then - TEXT="yes" - DRIVERS="$DRIVERS drv_LCDLinux.o" - AC_DEFINE(WITH_LCDLINUX,1,[LCD-Linux driver]) + if test "$has_lcd_linux" = true; then + TEXT="yes" + DRIVERS="$DRIVERS drv_LCDLinux.o" + AC_DEFINE(WITH_LCDLINUX,1,[LCD-Linux driver]) + else + AC_MSG_WARN(lcd-linux.h not found: LCD-Linux driver disabled) + fi fi if test "$LCDTERM" = "yes"; then diff --git a/drv_LCDLinux.c b/drv_LCDLinux.c index 526c82d..1703cee 100644 --- a/drv_LCDLinux.c +++ b/drv_LCDLinux.c @@ -1,4 +1,4 @@ -/* $Id: drv_LCDLinux.c,v 1.9 2005/06/15 05:24:35 reinelt Exp $ +/* $Id: drv_LCDLinux.c,v 1.10 2005/08/27 07:02:25 reinelt Exp $ * * driver for the LCD-Linux HD44780 kernel driver * http://lcd-linux.sourceforge.net @@ -24,6 +24,9 @@ * * * $Log: drv_LCDLinux.c,v $ + * Revision 1.10 2005/08/27 07:02:25 reinelt + * LCD-Linux updated to 0.9.0 + * * Revision 1.9 2005/06/15 05:24:35 reinelt * updated LCD-Linux driver to version 0.8.9 * @@ -84,13 +87,14 @@ #include "drv.h" #include "drv_generic_text.h" -#define HD44780_MAIN +#define LCD_LINUX_MAIN #include "drv_LCDLinux.h" static char Name[] = "LCD-Linux"; static char Device[] = "/dev/lcd"; static int lcdlinux_fd = -1; +static int raw_mode = 0; /****************************************/ @@ -122,8 +126,8 @@ static void drv_LL_send(const char *string, const int len) static void drv_LL_clear(void) { - /* Fixme: is there no otherway to clear the display? */ - drv_LL_send("\14", 1); /* Form Feed */ + /* No return value check since this ioctl cannot fail */ + ioctl(lcdlinux_fd, IOCTL_CLEAR_DISP); } @@ -161,8 +165,8 @@ static int drv_LL_start(const char *section, const int quiet) { char *s; int rows = -1, cols = -1; - int use_busy = 0; - struct lcd_driver buf; + int use_busy = 0, commit = 0; + struct lcd_parameters buf; /* emit version information */ info("%s: Version %s", Name, LCD_LINUX_VERSION); @@ -192,58 +196,51 @@ static int drv_LL_start(const char *section, const int quiet) error("%s: Could not query display information!", Name); return -1; } - info("%s: %dx%d display at 0x%x, %d controllers, flags=0x%02x:", Name, buf.disp_cols, buf.cntr_rows, buf.io, buf.num_cntr, buf.flags); - + info("%s: %dx%d display with %d controllers, flags=0x%02x:", + Name, buf.cntr_cols, buf.cntr_rows, buf.num_cntr, buf.flags); -#if 0 - /* these two flags vanished with release 0.8.9 */ - info("%s: /proc support %sabled", Name, buf.flags & LCD_PROC_ON ? "en" : "dis"); - info("%s: tty support %sabled", Name, buf.flags & LCD_ETTY_ON ? "en" : "dis"); -#endif - info("%s: console support %sabled", Name, buf.flags & LCD_CONSOLE ? "en" : "dis"); - info("%s: bus width %d bits", Name, buf.flags & LCD_4BITS_BUS ? 4 : 8); - info("%s: font size %s", Name, buf.flags & LCD_5X10_FONT ? "5x10" : "5x8"); - info("%s: busy-flag checking %sabled", Name, buf.flags & LCD_CHECK_BF ? "en" : "dis"); + info("%s: busy-flag checking %sabled", Name, buf.flags & HD44780_CHECK_BF ? "en" : "dis"); + info("%s: bus width %d bits", Name, buf.flags & HD44780_4BITS_BUS ? 4 : 8); + info("%s: font size %s", Name, buf.flags & HD44780_5X10_FONT ? "5x10" : "5x8"); + /* overwrite with size from lcd4linux.conf */ - if ((rows > 0 && rows != buf.cntr_rows) || (cols > 0 && cols != buf.disp_cols)) { + if ((rows > 0 && rows != buf.cntr_rows) || (cols > 0 && cols != buf.cntr_cols)) { info("%s: changing size to %dx%d", Name, cols, rows); buf.cntr_rows = rows; - buf.disp_cols = cols; - if (ioctl(lcdlinux_fd, IOCTL_SET_PARAM, &buf) != 0) { - error("%s: ioctl(IOCTL_SET_PARAM) failed: %s", Name, strerror(errno)); - error("%s: Could not set display geometry!", Name); - return -1; - } + buf.cntr_cols = cols; + commit = 1; } DROWS = buf.cntr_rows; - DCOLS = buf.disp_cols; + DCOLS = buf.cntr_cols; /* overwrite busy-flag checking from lcd4linux.conf */ cfg_number(section, "UseBusy", 0, 0, 1, &use_busy); - if (use_busy && !(buf.flags & LCD_CHECK_BF)) { + if (use_busy && !(buf.flags & HD44780_CHECK_BF)) { info("%s: activating busy-flag checking", Name); - buf.flags |= LCD_CHECK_BF; - if (ioctl(lcdlinux_fd, IOCTL_SET_PARAM, &buf) != 0) { - error("%s: ioctl(IOCTL_SET_PARAM) failed: %s", Name, strerror(errno)); - error("%s: Could not activate busy-flag checking!", Name); - return -1; - } - } else if (!use_busy && (buf.flags & LCD_CHECK_BF)) { + buf.flags |= HD44780_CHECK_BF; + commit = 1; + } else if (!use_busy && (buf.flags & HD44780_CHECK_BF)) { info("%s: deactivating busy-flag checking", Name); - buf.flags &= ~LCD_CHECK_BF; - if (ioctl(lcdlinux_fd, IOCTL_SET_PARAM, &buf) != 0) { - error("%s: ioctl(IOCTL_SET_PARAM) failed: %s", Name, strerror(errno)); - error("%s: Could not deactivate busy-flag checking!", Name); - return -1; - } + buf.flags &= ~HD44780_CHECK_BF; + commit = 1; } + if (commit && ioctl(lcdlinux_fd, IOCTL_SET_PARAM, &buf) != 0) { + error("%s: ioctl(IOCTL_SET_PARAM) failed: %s", Name, strerror(errno)); + return -1; + } + /* initialize display */ drv_LL_clear(); /* clear display */ + /* Disable control characters interpretation. */ + /* No return value check since this ioctl cannot fail */ + raw_mode = 1; + ioctl(lcdlinux_fd, IOCTL_RAW_MODE, &raw_mode); + if (!quiet) { char buffer[40]; qprintf(buffer, sizeof(buffer), "%s %dx%d", Name, DCOLS, DROWS); @@ -368,7 +365,12 @@ int drv_LL_quit(const int quiet) if (!quiet) { drv_generic_text_greet("goodbye!", NULL); } - + + /* Enable control characters interpretation. */ + /* No return value check since this ioctl cannot fail */ + raw_mode = 0; + ioctl(lcdlinux_fd, IOCTL_RAW_MODE, &raw_mode); + /* close device */ close(lcdlinux_fd); diff --git a/drv_LCDLinux.h b/drv_LCDLinux.h index 1a36454..c7c7e71 100644 --- a/drv_LCDLinux.h +++ b/drv_LCDLinux.h @@ -1,10 +1,11 @@ -/* lcd.h +/* hd44780.h * - * $Id: drv_LCDLinux.h,v 1.5 2005/06/15 05:24:35 reinelt Exp $ + * $Id: drv_LCDLinux.h,v 1.6 2005/08/27 07:02:25 reinelt Exp $ * - * LCD driver for HD44780 compatible displays connected to the parallel port. + * LCD-Linux: + * Driver for HD44780 compatible displays connected to the parallel port. * - * External interface header file. + * HD44780 header file. * * Copyright (C) 2004, 2005 Mattia Jona-Lasinio (mjona@users.sourceforge.net) * @@ -24,83 +25,66 @@ * */ -#ifndef LCD_LINUX_H -#define LCD_LINUX_H +#ifndef HD44780_H +#define HD44780_H -#ifndef HD44780_MAIN -#warning -#warning LCD-Linux is still in development stage and -#warning aims at speed and optimization. For these -#warning reasons there is no guarantee of backward -#warning compatibility between different LCD-Linux -#warning versions. Be sure to use the lcd-linux.h -#warning file of the same version as the module. -#warning -#endif +#include -#define LCD_LINUX_VERSION "0.8.9-CVS" /* Version number */ +#define HD44780_VERSION "0.9.0" /* Version number */ +#define HD44780_STRING "hd44780" -#define LCD_MAJOR 120 /* Major number for this device - * Set this to 0 for dynamic allocation - */ -#include - -struct lcd_driver { - /* Hardware */ - unsigned short io; /* Parport base address */ - unsigned short flags; /* Flags (see Documentation) */ +/* IOCTLs */ +#include +#define IOCTL_RAW_CMD _IOW(LCD_MAJOR, 0, unsigned char *) - /* Display geometry */ - unsigned short num_cntr; /* Number of available controllers */ - unsigned short cntr_rows; /* Rows per controller */ - unsigned short disp_cols; /* Columns */ - unsigned short frames; /* Framebuffer frames */ +/* flags */ +#define HD44780_CHECK_BF 0x0001 /* Do busy flag checking */ +#define HD44780_4BITS_BUS 0x0002 /* Set the bus length to 4 bits */ +#define HD44780_5X10_FONT 0x0004 /* Use 5x10 dots fonts */ - unsigned short tabstop; /* Length of tab character */ -}; -/* IOCTLs */ -#include -#define IOCTL_SET_PARAM _IOW(LCD_MAJOR, 0, struct lcd_driver *) -#define IOCTL_GET_PARAM _IOR(LCD_MAJOR, 1, struct lcd_driver *) -#define IOCTL_RAW_CMD _IOW(LCD_MAJOR, 2, unsigned char *) -#define IOCTL_RESET_CHARMAP _IOW(LCD_MAJOR, 3, void *) -#define IOCTL_SAVE_CHARMAP _IOW(LCD_MAJOR, 4, void *) -#define IOCTL_RESTORE_CHARMAP _IOW(LCD_MAJOR, 5, void *) -#define IOCTL_SWAP_CHARMAP _IOW(LCD_MAJOR, 6, void *) -#define LCD_CHECK_BF 0x0001 /* Do busy flag checking */ -#define LCD_CONSOLE 0x0002 /* Enable the console support */ -#define LCD_4BITS_BUS 0x0004 /* Set the bus length to 4 bits */ -#define LCD_5X10_FONT 0x0008 /* Use 5x10 dots fonts */ +/*** HD44780 Command Set ***/ +/* Clear Display*/ +#define CLR_DISP 0x01 /* Clear entire display; cursor at row 0, column 0 */ +/* Return Home */ +#define RET_HOME 0x02 /* Cursor at row 0, column 0; display content doesn't change */ -#ifdef __KERNEL__ /* The rest is for kernel only */ +/* Entry Mode Set */ +#define DISP_SHIFT_ON 0x05 /* Shift display, not cursor after data write */ +#define DISP_SHIFT_OFF 0x04 /* Shift cursor, not display after data write */ +#define CURS_INC 0x06 /* Shift on the right after data read/write */ +#define CURS_DEC 0x04 /* Shift on the left after data read/write */ -#include +/* Display on/off Control */ +#define BLINK_ON 0x09 /* Cursor blinking on */ +#define BLINK_OFF 0x08 /* Cursor blinking off */ +#define CURS_ON 0x0a /* Display Cursor */ +#define CURS_OFF 0x08 /* Hide Cursor */ +#define DISP_ON 0x0c /* Turn on display updating */ +#define DISP_OFF 0x08 /* Freeze display content */ -#ifndef KERNEL_VERSION -#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c)) -#endif +/* Cursor or Display Shift */ +#define SHIFT_RIGHT 0x14 /* Shift on the right */ +#define SHIFT_LEFT 0x10 /* Shift on the left */ +#define SHIFT_DISP 0x18 /* Shift display */ +#define SHIFT_CURS 0x10 /* Shift cursor */ -#ifndef LINUX_VERSION_CODE -#error - LINUX_VERSION_CODE undefined. -#endif +/* Function Set */ +#define FONT_5X10 0x24 /* Select 5x10 dots font */ +#define FONT_5X8 0x20 /* Select 5x8 dots font */ +#define DISP_2_LINES 0x28 /* Select 2 lines display (only 5x8 font allowed) */ +#define DISP_1_LINE 0x20 /* Select 1 line display */ +#define BUS_8_BITS 0x30 /* Set 8 data bits */ +#define BUS_4_BITS 0x20 /* Set 4 data bits */ -/* External interface */ -int lcd_init(struct lcd_driver *); -void lcd_exit(void); -int lcd_ioctl(unsigned int, void *); -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0) -ssize_t lcd_write(const char *, size_t, unsigned int); -ssize_t lcd_read(char *, size_t, unsigned int); -#else -int lcd_write(const char *, int, unsigned int); -int lcd_read(char *, int, unsigned int); -#endif +/* Set CGRAM Address */ +#define CGRAM_IO 0x40 /* Access the CGRAM */ -#endif /* __KERNEL__ */ +/* Set DDRAM Address */ +#define DDRAM_IO 0x80 /* Access the DDRAM */ -#endif /* External interface included */ +#endif /* HD44780 included */ diff --git a/lcd4linux.conf.sample b/lcd4linux.conf.sample index d303f63..47cff2d 100644 --- a/lcd4linux.conf.sample +++ b/lcd4linux.conf.sample @@ -803,7 +803,7 @@ Layout testMySQL { #Display 'SerDispLib' -#Display 'LCD-Linux' +Display 'LCD-Linux' #Display 'LK204' #Display 'MI240' #Display 'CW12232' @@ -819,7 +819,7 @@ Layout testMySQL { #Display 'M50530-24x8' #Display 'LCDTerm' #Display 'SimpleLCD' -Display 'BA63' +#Display 'BA63' #Display 'CT20x4' #Display 'T6963-240x64' #Display 'XWindow' -- cgit v1.2.3