]> git.webhop.me Git - lcd4linux.git/commitdiff
[lcd4linux @ 2003-09-21 06:43:02 by reinelt]
authorreinelt <reinelt@3ae390bd-cb1e-0410-b409-cd5a39f66f1f>
Sun, 21 Sep 2003 06:43:02 +0000 (06:43 +0000)
committerreinelt <reinelt@3ae390bd-cb1e-0410-b409-cd5a39f66f1f>
Sun, 21 Sep 2003 06:43:02 +0000 (06:43 +0000)
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

HD44780.c
MatrixOrbital.c

index d26ebde7aeccd6839f824f94a22b44c7649f0607..df8dce9bdc8ce07ce217686d4c25e5863b477a76 100644 (file)
--- a/HD44780.c
+++ b/HD44780.c
@@ -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
  *
  *
  *
  * $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);
     }
index 1ce3b2b80a59b5699bdf595ab57058491a836bfe..b25bc376878749853f9bfcf9a18af880c84f8b4a 100644 (file)
@@ -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
  *
  *
  *
  * $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;
 }