]> git.webhop.me Git - lcd4linux.git/commitdiff
[lcd4linux @ 2004-10-17 09:24:31 by reinelt]
authorreinelt <reinelt@3ae390bd-cb1e-0410-b409-cd5a39f66f1f>
Sun, 17 Oct 2004 09:24:31 +0000 (09:24 +0000)
committerreinelt <reinelt@3ae390bd-cb1e-0410-b409-cd5a39f66f1f>
Sun, 17 Oct 2004 09:24:31 +0000 (09:24 +0000)
I2C support for HD44780 displays by Luis (does not work by now)

git-svn-id: https://ssl.bulix.org/svn/lcd4linux/trunk@494 3ae390bd-cb1e-0410-b409-cd5a39f66f1f

drv_HD44780.c
drv_generic_parport.h
lcd4linux.conf.sample

index 5af3162dfde352ef896b139d6a55d78db555a2c7..b3c6422efc46d2f56bdad32edc1b82fc352cdaf2 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: drv_HD44780.c,v 1.38 2004/09/19 09:31:19 reinelt Exp $
+/* $Id: drv_HD44780.c,v 1.39 2004/10/17 09:24:31 reinelt Exp $
  *
  * new style driver for HD44780-based displays
  *
@@ -29,6 +29,9 @@
  *
  *
  * $Log: drv_HD44780.c,v $
+ * Revision 1.39  2004/10/17 09:24:31  reinelt
+ * I2C support for HD44780 displays by Luis (does not work by now)
+ *
  * Revision 1.38  2004/09/19 09:31:19  reinelt
  * HD44780 busy flag checking improved: fall back to busy-waiting if too many errors occur
  *
 #include <termios.h>
 #include <fcntl.h>
 #include <sys/time.h>
+#include <sys/ioctl.h>
+
+// I2C support does not compile
+#if 0
+#include <linux/i2c.h>
+#include <linux/i2c-dev.h>
+#endif
 
 #include "debug.h"
 #include "cfg.h"
@@ -312,6 +322,10 @@ static MODEL Models[] = {
 };
 
 
+/* handle for I2C device */
+static int i2c_device;
+
+
 
 /****************************************/
 /***  generic functions               ***/
@@ -701,42 +715,138 @@ static void drv_HD_PP_stop (void)
 /****************************************/
 
 
-static void drv_HD_I2C_command (const unsigned char controller, const unsigned char cmd, const int delay)
+static void drv_HD_I2C_nibble (const unsigned char controller, const unsigned char nibble)
+{
+// I2C support does not compile
+#if 0
+  /* clear ENABLE */
+  /* put data on DB1..DB4 */
+  /* nibble already contains RS bit! */
+  i2c_smbus_write_byte_data(i2c_device, 0, nibble);
+  
+  /* Address set-up time */
+  ndelay(T_AS);
+  
+  /* rise ENABLE */
+  i2c_smbus_write_byte_data(i2c_device, 0, nibble | SIGNAL_ENABLE);
+  
+  /* Enable pulse width */
+  ndelay(T_PW);
+  
+  /* lower ENABLE */
+  i2c_smbus_write_byte_data(i2c_device, 0, nibble);
+  
+  /* Address hold time */
+  ndelay(T_H);
+#endif
+}
+
+
+static void drv_HD_I2C_byte (const unsigned char controller, const unsigned char data)
 {
   /* send data with RS disabled */
-  // drv_HD_I2C_byte (controller, cmd, 0);
+  /* send high nibble of the data */
+  drv_HD_I2C_nibble (controller, ((data>>4)&0x0f)|SIGNAL_RS);
+
+  /* Make sure we honour T_CYCLE */
+  ndelay(T_CYCLE-T_AS-T_PW);
+
+  /* send low nibble of the data */
+  drv_HD_I2C_nibble(controller, (data&0x0f)|SIGNAL_RS);
 }
 
 
+static void drv_HD_I2C_command (const unsigned char controller, const unsigned char cmd, const int delay)
+{
+  /* send data with RS disabled */
+  drv_HD_I2C_byte (controller, cmd);
+  /* wait for command completion */
+  udelay(delay);
+}
+
 static void drv_HD_I2C_data (const unsigned char controller, const char *string, const int len, const int delay)
 {
   int l = len;
-  unsigned char enable;
-  
   /* sanity check */
   if (len<=0) return;
-  
   while (l--) {
     /* send data with RS enabled */
-    // drv_HD_I2C_byte (controller, *(string++), SIGNAL_RS);
+    drv_HD_I2C_byte (controller, *(string++));
+     
+    /* wait for command completion */
+    udelay(delay);
   }
 }
 
 
 static int drv_HD_I2C_load (const char *section)
 {
+  int dev;
+  char *bus,*device;
+
+  bus    = cfg_get(section, "Port", NULL);   
+  device = cfg_get(section, "Device", NULL);   
+  dev    = 0x70;
+
+  info("%s: initializing I2C bus %s",Name,bus);
+  if ((i2c_device = open(bus,O_RDWR)) < 0) {
+    error("%s: I2C bus %s open failed !\n",Name,bus);
+    return -1;
+  }
+  
+  info("%s: initializing I2C slave device 0x%x",Name,dev);
+// I2C support does not compile
+#if 0
+  if (ioctl(i2c_device,I2C_SLAVE, (dev>>1) ) < 0) {
+    error("%s: error initializing device 0x%x\n",Name,dev);
+    close(i2c_device);
+    return -1;
+  }
+#endif
+
+  info("%s: detecting I2C device 0x%x on bus %s ",Name,dev,bus);
+// I2C support does not compile
+#if 0
+  if (i2c_smbus_write_quick(i2c_device,I2C_SMBUS_WRITE) < 0) {
+    error("%s: i2c slave-device 0x%x not found!\n",Name,dev);
+    close(i2c_device);
+    return -1;
+  }
+#endif
+  
+  if (cfg_number(section, "Bits", 8, 4, 8, &Bits)<0) return -1;
+  if (Bits!=4) {
+    error ("%s: bad %s.Bits '%d' from %s, should be '4' ", Name, section, Bits, cfg_source());
+    return -1;
+  }   
+  
+  info ("%s: using %d bit mode", Name, Bits);
+  
+  /* initialize *both* displays */
+  drv_HD_I2C_nibble  (allControllers, 0x03); udelay(T_INIT1); /* 4 Bit mode, wait 4.1 ms */
+  drv_HD_I2C_nibble  (allControllers, 0x03); udelay(T_INIT2); /* 4 Bit mode, wait 100 us */
+  drv_HD_I2C_nibble  (allControllers, 0x03); udelay(T_INIT1); /* 4 Bit mode, wait 4.1 ms */
+  drv_HD_I2C_nibble  (allControllers, 0x02); udelay(T_INIT2); /* 4 Bit mode, wait 100 us */
+  drv_HD_I2C_command (allControllers, 0x28, T_EXEC);          /* 4 Bit mode, 1/16 duty cycle, 5x8 font */
+
+  info("%s: I2C initialization done", Name);
+
   return 0;
 }
 
 
-static void drv_HD_I2C_stop (void) 
+static void drv_HD_I2C_stop (void)
 {
   /* clear all signals */
   // drv_generic_i2c_data (0);
-  /* slose port */
+  /* close port */
   // drv_generic_i2c_close();
-}
 
+  close(i2c_device);
+}
 
 
 /****************************************/
index 2edf044cfb5622934b318d5788ee61e7fe49c490..1eea335806d3e5a12f02f13aa792562484bf2c2c 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: drv_generic_parport.h,v 1.7 2004/09/18 15:58:57 reinelt Exp $
+/* $Id: drv_generic_parport.h,v 1.8 2004/10/17 09:24:31 reinelt Exp $
  *
  * generic driver helper for parallel port displays
  *
@@ -23,6 +23,9 @@
  *
  *
  * $Log: drv_generic_parport.h,v $
+ * Revision 1.8  2004/10/17 09:24:31  reinelt
+ * I2C support for HD44780 displays by Luis (does not work by now)
+ *
  * Revision 1.7  2004/09/18 15:58:57  reinelt
  * even more HD44780 cleanups, hardwiring for LCM-162
  *
 #ifndef _DRV_GENERIC_PARPORT_H_
 #define _DRV_GENERIC_PARPORT_H_
 
-int           drv_generic_parport_open       (const char *section, const char *driver);
-int           drv_generic_parport_close      (void);
-unsigned char drv_generic_parport_wire_ctrl  (const char *name, const char *deflt);
-unsigned char drv_generic_parport_wire_data  (const char *name, const char *deflt);
-void          drv_generic_parport_direction  (const int direction);
-unsigned char drv_generic_parport_status     (void);
-void          drv_generic_parport_control    (const unsigned char mask, const unsigned char value);
-void          drv_generic_parport_toggle     (const unsigned char bit, const int level, const int delay);
-void          drv_generic_parport_data       (const unsigned char data);
-unsigned char drv_generic_parport_read       (void);
-void          drv_generic_parport_debug      (void);
+int           drv_generic_parport_open          (const char *section, const char *driver);
+int           drv_generic_parport_close         (void);
+unsigned char drv_generic_parport_wire_ctrl     (const char *name, const char *deflt);
+unsigned char drv_generic_parport_hardwire_ctrl (const char *name, const char *deflt);
+unsigned char drv_generic_parport_wire_data     (const char *name, const char *deflt);
+void          drv_generic_parport_direction     (const int direction);
+unsigned char drv_generic_parport_status        (void);
+void          drv_generic_parport_control       (const unsigned char mask, const unsigned char value);
+void          drv_generic_parport_toggle        (const unsigned char bit, const int level, const int delay);
+void          drv_generic_parport_data          (const unsigned char data);
+unsigned char drv_generic_parport_read          (void);
+void          drv_generic_parport_debug         (void);
 
 #endif
index cabd3350a774c7736d1542c3189ee5e0d2bb96e3..06e84f6f0cc37e514e492ffc0a1fb0e20460ca68 100644 (file)
@@ -105,6 +105,25 @@ Display LCM-162 {
 }
 
 
+Display HD44780-I2C {
+    Driver 'HD44780'
+    Model 'WRAP1C-PCF8574'
+    Bus 'i2c'
+    Port '/dev/i2c-0'
+    Device '70'
+    Bits '4'
+    Size '20x4'
+    asc255bug 0
+    Icons 1
+    Wire {
+        RW     'DB5'
+        RS     'DB4'
+        ENABLE 'DB6'
+        GPO    'GND'
+    }
+}
+
+
 Display M50530-24x8 {
     Driver 'M50530'
     Port '/dev/parports/0'