aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drv_HD44780.c130
-rw-r--r--drv_generic_parport.h28
-rw-r--r--lcd4linux.conf.sample19
3 files changed, 155 insertions, 22 deletions
diff --git a/drv_HD44780.c b/drv_HD44780.c
index 5af3162..b3c6422 100644
--- a/drv_HD44780.c
+++ b/drv_HD44780.c
@@ -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
*
@@ -212,6 +215,13 @@
#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);
+}
/****************************************/
diff --git a/drv_generic_parport.h b/drv_generic_parport.h
index 2edf044..1eea335 100644
--- a/drv_generic_parport.h
+++ b/drv_generic_parport.h
@@ -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
*
@@ -107,16 +110,17 @@
#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
diff --git a/lcd4linux.conf.sample b/lcd4linux.conf.sample
index cabd335..06e84f6 100644
--- a/lcd4linux.conf.sample
+++ b/lcd4linux.conf.sample
@@ -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'