diff options
author | reinelt <reinelt@3ae390bd-cb1e-0410-b409-cd5a39f66f1f> | 2003-09-21 06:43:02 +0000 |
---|---|---|
committer | reinelt <reinelt@3ae390bd-cb1e-0410-b409-cd5a39f66f1f> | 2003-09-21 06:43:02 +0000 |
commit | 6ad29537e9b46548040a6fa222e19abe9b5d4447 (patch) | |
tree | d4550f35553196940961255c2dacca72974e7e21 | |
parent | a47170396bc75a5e1f0414cd878b82249e07386d (diff) | |
download | lcd4linux-6ad29537e9b46548040a6fa222e19abe9b5d4447.tar.gz |
[lcd4linux @ 2003-09-21 06:43:02 by reinelt]
MatrixOrbital: bidirectional communication
HD44780: special handling for 16x1 displays (thanks to anonymous bug report on sf.net)
git-svn-id: https://ssl.bulix.org/svn/lcd4linux/trunk@247 3ae390bd-cb1e-0410-b409-cd5a39f66f1f
-rw-r--r-- | HD44780.c | 21 | ||||
-rw-r--r-- | MatrixOrbital.c | 52 |
2 files changed, 71 insertions, 2 deletions
@@ -1,4 +1,4 @@ -/* $Id: HD44780.c,v 1.41 2003/09/13 06:20:39 reinelt Exp $ +/* $Id: HD44780.c,v 1.42 2003/09/21 06:43:02 reinelt Exp $ * * driver for display modules based on the HD44780 chip * @@ -27,6 +27,12 @@ * * * $Log: HD44780.c,v $ + * Revision 1.42 2003/09/21 06:43:02 reinelt + * + * + * MatrixOrbital: bidirectional communication + * HD44780: special handling for 16x1 displays (thanks to anonymous bug report on sf.net) + * * Revision 1.41 2003/09/13 06:20:39 reinelt * HD44780 timings changed; deactivated libtool * @@ -342,6 +348,9 @@ static void HD_write (unsigned char controller, char *string, int len, int delay { unsigned char enable; + // sanity check + if (len<=0) return; + if (Bits==8) { // enable signal: 'controller' is a bitmask @@ -549,6 +558,12 @@ void HD_goto (int row, int col) Controller = 1; } + // 16x1 Displays are organized as 8x2 :-( + if (Lcd.rows==1 && Lcd.cols==16 && col>7) { + row++; + col-=8; + } + pos=(row%2)*64+(row/2)*20+col; HD_command (Controller, (0x80|pos), T_EXEC); } @@ -619,6 +634,10 @@ int HD_flush (void) pos2=col; equal=0; } + // special handling of 16x1 displays + if (Lcd.rows==1 && Lcd.cols==16 && col==7) { + break; + } } HD_write (Controller, FrameBuffer1+row*Lcd.cols+pos1, pos2-pos1+1, T_EXEC); } diff --git a/MatrixOrbital.c b/MatrixOrbital.c index 1ce3b2b..b25bc37 100644 --- a/MatrixOrbital.c +++ b/MatrixOrbital.c @@ -1,4 +1,4 @@ -/* $Id: MatrixOrbital.c,v 1.41 2003/09/13 06:45:43 reinelt Exp $ +/* $Id: MatrixOrbital.c,v 1.42 2003/09/21 06:43:02 reinelt Exp $ * * driver for Matrix Orbital serial display modules * @@ -20,6 +20,12 @@ * * * $Log: MatrixOrbital.c,v $ + * Revision 1.42 2003/09/21 06:43:02 reinelt + * + * + * MatrixOrbital: bidirectional communication + * HD44780: special handling for 16x1 displays (thanks to anonymous bug report on sf.net) + * * Revision 1.41 2003/09/13 06:45:43 reinelt * icons for all remaining drivers * @@ -252,6 +258,28 @@ static int MO_open (void) } +#if 1 +static int MO_read (char *string, int len) +{ + int ret; + + if (Device==-1) return -1; + ret=read (Device, string, len); + if (ret<0 && errno==EAGAIN) { + debug ("read(): EAGAIN"); + usleep(10000); + ret=read (Device, string, len); + } + + if (ret<0) { + error("Cwlinux: read() failed: %s", strerror(errno)); + } + + return ret; +} +#endif + + static void MO_write (char *string, int len) { if (Device==-1) return; @@ -331,6 +359,9 @@ int MO_clear2 (int full) static int MO_init (LCD *Self, int protocol) { + // Fixme + char buffer[256]; + char *port; int speed; @@ -401,6 +432,25 @@ static int MO_init (LCD *Self, int protocol) MO_write ("\376D", 2); // line wrapping off MO_write ("\376R", 2); // auto scroll off + #if 1 + MO_write ("\3767", 2); // read module type + usleep(100000); + MO_read (buffer, 1); + debug ("Read module type=<0x%x>", *buffer); + + MO_write ("\3765", 2); // read serial number + usleep(100000); + MO_read (buffer, 2); + debug ("Serial Number=<0x%x>", *(short*)buffer); + + MO_write ("\3766", 2); // read version number + usleep(100000); + MO_read (buffer, 1); + debug ("Version number=<0x%x>", *buffer); + + + #endif + return 0; } |