From 3a86e6f409ad2d6094aacf4b2c0f991d52fc4108 Mon Sep 17 00:00:00 2001 From: reinelt <> Date: Tue, 12 Aug 2003 05:10:31 +0000 Subject: [lcd4linux @ 2003-08-12 05:10:31 by reinelt] first version of HD44780 4Bit-Mode patch --- HD44780.c | 65 ++++++++++++++++-- config.h.in | 7 -- configure | 220 +----------------------------------------------------------- 3 files changed, 63 insertions(+), 229 deletions(-) diff --git a/HD44780.c b/HD44780.c index a35d7b5..3aedffb 100644 --- a/HD44780.c +++ b/HD44780.c @@ -1,9 +1,13 @@ -/* $Id: HD44780.c,v 1.29 2003/07/24 04:48:09 reinelt Exp $ +/* $Id: HD44780.c,v 1.30 2003/08/12 05:10:31 reinelt Exp $ * * driver for display modules based on the HD44780 chip * * Copyright 1999, 2000 by Michael Reinelt (reinelt@eunet.at) * + * Modification for 4-Bit mode + * 2003 Martin Hejl (martin@hejl.de) + * + * * This program 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) @@ -20,6 +24,9 @@ * * * $Log: HD44780.c,v $ + * Revision 1.30 2003/08/12 05:10:31 reinelt + * first version of HD44780 4Bit-Mode patch + * * Revision 1.29 2003/07/24 04:48:09 reinelt * 'soft clear' needed for virtual rows * @@ -158,7 +165,6 @@ #include #include -#include #include "debug.h" #include "cfg.h" @@ -171,6 +177,20 @@ #define YRES 8 #define CHARS 8 + + +/* low level communication timings [nanoseconds] + * as these values differ from spec to spec, + * we use the worst-case values. + */ + +#define T_CYCLE 600 // Enable cycle time +#define T_PW 400 // Enable pulse width +#define T_AS 20 // Address setup time +#define T_H 40 // Data hold time +// Fixme: hejl: genau verdreht?? + + static LCD Lcd; static char Txt[4][40]; @@ -182,6 +202,41 @@ static unsigned char SIGNAL_ENABLE; static unsigned char SIGNAL_GPO; +static void HD_nibble(unsigned char nibble) +{ + + // clear ENABLE + // put data on DB1..DB4 + // nibble already contains RS bit! + parport_data(nibble); + + // Address set-up time + ndelay(T_AS); + + // rise ENABLE + parport_data(nibble | SIGNAL_ENABLE); + + // Enable pulse width + ndelay(T_PW); + + // lower ENABLE + parport_data(nibble); +} + + +static void HD_byte (unsigned char data, unsigned char RS) +{ + // send high nibble of the data + HD_nibble (((data>>4)&0x0f)|RS); + + // Make sure we honour T_CYCLE + ndelay(T_CYCLE-T_AS-T_PW); + + // send low nibble of the data + HD_nibble((data&0x0f)|RS); +} + + static void HD_command (unsigned char cmd, int delay) { @@ -192,11 +247,10 @@ static void HD_command (unsigned char cmd, int delay) parport_control (SIGNAL_RW | SIGNAL_RS, 0); // Address set-up time - ndelay(40); + ndelay(T_AS); // send command - // Enable cycle time = 230ns - parport_toggle (SIGNAL_ENABLE, 1, 230); + parport_toggle (SIGNAL_ENABLE, 1, T_PW); // wait for command completion udelay(delay); @@ -413,6 +467,7 @@ int HD_flush (void) int HD_quit (void) { + info("HD44780: shutting down."); return parport_close(); } diff --git a/config.h.in b/config.h.in index df489ba..98a6759 100644 --- a/config.h.in +++ b/config.h.in @@ -69,10 +69,6 @@ /* Define to 1 if you have the `putenv' function. */ #undef HAVE_PUTENV -/* Define to 1 if your system has a GNU libc compatible `realloc' function, - and to 0 otherwise. */ -#undef HAVE_REALLOC - /* Define to 1 if you have the `select' function. */ #undef HAVE_SELECT @@ -292,9 +288,6 @@ /* Define to `int' if does not define. */ #undef pid_t -/* Define to rpl_realloc if the replacement function should be used. */ -#undef realloc - /* Define to `unsigned' if does not define. */ #undef size_t diff --git a/configure b/configure index dd9a1c6..2135784 100755 --- a/configure +++ b/configure @@ -7144,8 +7144,11 @@ echo "${ECHO_T}$ac_cv_prog_gcc_traditional" >&6 fi fi + #removed for uClibc compatibility #AC_FUNC_MALLOC +#AC_FUNC_REALLOC + echo "$as_me:$LINENO: checking for working memcmp" >&5 echo $ECHO_N "checking for working memcmp... $ECHO_C" >&6 if test "${ac_cv_func_memcmp_working+set}" = set; then @@ -7222,223 +7225,6 @@ echo "${ECHO_T}$ac_cv_func_memcmp_working" >&6 test $ac_cv_func_memcmp_working = no && LIBOBJS="$LIBOBJS memcmp.$ac_objext" -for ac_header in stdlib.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 -#line $LINENO "configure" -/* 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>&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.$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 -#line $LINENO "configure" -/* 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 - 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 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 preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - ( - cat <<\_ASBOX -## ------------------------------------ ## -## Report this to bug-autoconf@gnu.org. ## -## ------------------------------------ ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 - ;; - 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: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - ( - cat <<\_ASBOX -## ------------------------------------ ## -## Report this to bug-autoconf@gnu.org. ## -## ------------------------------------ ## -_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 - -fi - -done - -echo "$as_me:$LINENO: checking for GNU libc compatible realloc" >&5 -echo $ECHO_N "checking for GNU libc compatible realloc... $ECHO_C" >&6 -if test "${ac_cv_func_realloc_0_nonnull+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test "$cross_compiling" = yes; then - ac_cv_func_realloc_0_nonnull=no -else - cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#if STDC_HEADERS || HAVE_STDLIB_H -# include -#else -char *realloc (); -#endif - -int -main () -{ -exit (realloc (0, 0) ? 0 : 1); - ; - return 0; -} -_ACEOF -rm -f conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (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_cv_func_realloc_0_nonnull=yes -else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -( exit $ac_status ) -ac_cv_func_realloc_0_nonnull=no -fi -rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi -fi -echo "$as_me:$LINENO: result: $ac_cv_func_realloc_0_nonnull" >&5 -echo "${ECHO_T}$ac_cv_func_realloc_0_nonnull" >&6 -if test $ac_cv_func_realloc_0_nonnull = yes; then - -cat >>confdefs.h <<\_ACEOF -#define HAVE_REALLOC 1 -_ACEOF - -else - cat >>confdefs.h <<\_ACEOF -#define HAVE_REALLOC 0 -_ACEOF - - LIBOBJS="$LIBOBJS realloc.$ac_objext" - -cat >>confdefs.h <<\_ACEOF -#define realloc rpl_realloc -_ACEOF - -fi - - - - for ac_header in sys/select.h sys/socket.h do -- cgit v1.2.3