]> git.webhop.me Git - lcd4linux.git/commitdiff
[lcd4linux @ 2005-12-20 07:07:43 by reinelt]
authorreinelt <reinelt@3ae390bd-cb1e-0410-b409-cd5a39f66f1f>
Tue, 20 Dec 2005 07:07:44 +0000 (07:07 +0000)
committerreinelt <reinelt@3ae390bd-cb1e-0410-b409-cd5a39f66f1f>
Tue, 20 Dec 2005 07:07:44 +0000 (07:07 +0000)
further work on GPO's, HD44780 GPO support

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

configure
drivers.m4
drv_HD44780.c
drv_LPH7508.c
drv_generic_gpio.c
lcd4linux.conf.sample

index 896b484fa281d588d78b3efb031d9bc7641f0a04..22afbd3304fec6b8b759d77bd4f682348d2917a3 100755 (executable)
--- a/configure
+++ b/configure
@@ -6226,6 +6226,7 @@ if test "$HD44780" = "yes"; then
    TEXT="yes"
    PARPORT="yes"
    I2C="yes"
+   GPIO="yes"
    DRIVERS="$DRIVERS drv_HD44780.o"
 
 cat >>confdefs.h <<\_ACEOF
@@ -6370,8 +6371,8 @@ if test "$SAMPLE" = "yes"; then
    # select either text or graphics mode
    TEXT="yes"
    GRAPHIC="yes"
-   # support for GPO's
-   GPO="yes"
+   # support for GPIO's
+   GPIO="yes"
    # select bus: serial (including USB), parallel or i2c
    SERIAL="yes"
    PARPORT="yes"
index c100f455e226c7885f90ab59341f556537c11bf4..cdab74637f8ed76f3c927f2fd970a5b8060463e5 100644 (file)
@@ -223,6 +223,7 @@ if test "$HD44780" = "yes"; then
    TEXT="yes"
    PARPORT="yes"
    I2C="yes"
+   GPIO="yes"
    DRIVERS="$DRIVERS drv_HD44780.o"
    AC_DEFINE(WITH_HD44780,1,[HD44780 driver])
 fi
@@ -317,8 +318,8 @@ if test "$SAMPLE" = "yes"; then
    # select either text or graphics mode
    TEXT="yes"
    GRAPHIC="yes"
-   # support for GPO's
-   GPO="yes"
+   # support for GPIO's
+   GPIO="yes"
    # select bus: serial (including USB), parallel or i2c
    SERIAL="yes"
    PARPORT="yes"
index 6d66903def772da40b26a4d9f59575ec7c1a23f4..4ad177d005c200f882308b3fbc1f1b38f5fd4d67 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: drv_HD44780.c,v 1.57 2005/12/12 09:08:08 reinelt Exp $
+/* $Id: drv_HD44780.c,v 1.58 2005/12/20 07:07:44 reinelt Exp $
  *
  * new style driver for HD44780-based displays
  *
@@ -32,6 +32,9 @@
  *
  *
  * $Log: drv_HD44780.c,v $
+ * Revision 1.58  2005/12/20 07:07:44  reinelt
+ * further work on GPO's, HD44780 GPO support
+ *
  * Revision 1.57  2005/12/12 09:08:08  reinelt
  * finally removed old udelay code path; read timing values from config
  *
 #include "widget_bar.h"
 #include "drv.h"
 #include "drv_generic_text.h"
+#include "drv_generic_gpio.h"
 #include "drv_generic_parport.h"
 
 #ifdef WITH_I2C
@@ -333,10 +337,8 @@ static unsigned char SIGNAL_GPO;
 /* flag for busy-waiting vs. busy flag checking */
 static int UseBusy = 0;
 
-
-/* Fixme: GPO's not yet implemented */
-static int GPOS;
-/* static int GPO=0; */
+/* buffer holding the GPO state */
+static unsigned char GPO = 0;
 
 
 typedef struct {
@@ -1115,24 +1117,32 @@ static int drv_HD_brightness(int brightness)
 }
 
 
-/* Fixme: GPO's */
-#if 0
-static void drv_HD_setGPO(const int bits)
+static int drv_HD_GPO(const int num, const int val)
 {
-    if (Lcd.gpos > 0) {
-
-       /* put data on DB1..DB8 */
-       drv_generic_parport_data(bits);
-
-       /* 74HCT573 set-up time */
-       ndelay(20);
-
-       /* send data */
-       /* 74HCT573 enable pulse width = 24ns */
-       drv_generic_parport_toggle(SIGNAL_GPO, 1, 230);
+    int v;
+    
+    if (val > 0) {
+       /* set bit */
+       v = 1;
+       GPO |= 1 << num;
+    } else {
+       /* clear bit */
+       v = 0;
+       GPO &= ~(1 << num);
     }
+
+    /* put data on DB1..DB8 */
+    drv_generic_parport_data(GPO);
+    
+    /* 74HCT573 set-up time */
+    ndelay(20);
+    
+    /* send data */
+    /* 74HCT573 enable pulse width = 24ns */
+    drv_generic_parport_toggle(SIGNAL_GPO, 1, 230);
+
+    return v;
 }
-#endif
 
 
 static void drv_HD_LCM162_timer(void __attribute__ ((unused)) * notused)
@@ -1400,6 +1410,7 @@ static void plugin_brightness(RESULT * result, RESULT * arg1)
 /* using drv_generic_text_draw(W) */
 /* using drv_generic_text_icon_draw(W) */
 /* using drv_generic_text_bar_draw(W) */
+/* using drv_generic_gpio_draw(W) */
 
 
 /****************************************/
@@ -1436,6 +1447,7 @@ int drv_HD_init(const char *section, const int quiet)
     /* real worker functions */
     drv_generic_text_real_write = drv_HD_write;
     drv_generic_text_real_defchar = drv_HD_defchar;
+    drv_generic_gpio_real_set = drv_HD_GPO;
 
 
     /* start display */
@@ -1454,6 +1466,12 @@ int drv_HD_init(const char *section, const int quiet)
     if ((ret = drv_generic_text_bar_init(0)) != 0)
        return ret;
 
+    /* initialize generic GPIO driver */
+    if (GPOS > 0) {
+       if ((ret = drv_generic_gpio_init(section, Name)) != 0)
+           return ret;
+    }
+    
     /* add fixed chars to the bar driver */
     /* most displays have a full block on ascii 255, but some have kind of  */
     /* an 'inverted P'. If you specify 'asc255bug 1 in the config, this */
@@ -1497,6 +1515,7 @@ int drv_HD_quit(const int quiet)
     info("%s: shutting down.", Name);
 
     drv_generic_text_quit();
+    drv_generic_gpio_quit();
 
     /* clear display */
     drv_HD_clear();
index cf731d0fb9efd3d442c6703574a24405534ce94c..b57cdb8ff75a3b76a39e9322a68d55cd859a383a 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: drv_LPH7508.c,v 1.3 2005/12/18 16:18:36 reinelt Exp $
+/* $Id: drv_LPH7508.c,v 1.4 2005/12/20 07:07:44 reinelt Exp $
  *
  * driver for Pollin LPH7508
  *
@@ -23,6 +23,9 @@
  *
  *
  * $Log: drv_LPH7508.c,v $
+ * Revision 1.4  2005/12/20 07:07:44  reinelt
+ * further work on GPO's, HD44780 GPO support
+ *
  * Revision 1.3  2005/12/18 16:18:36  reinelt
  * GPO's added again
  *
@@ -243,66 +246,78 @@ static void drv_L7_blit(const int row, const int col, const int height, const in
 
 static int drv_L7_GPO(const int num, const int val)
 {
+    int v = 0;
+    
     switch (num) {
     case 0:
        /* battery symbol */
-       drv_L7_put(32, (val > 0) ? 1 : 0);
+       v = (val > 0) ? 1 : 0;
+       drv_L7_put(32, v);
        break;
     case 1:
        /* battery level */
        if (val < 0) {
-           drv_L7_put(46, 0);
-           drv_L7_put(47, 0);
-           drv_L7_put(48, 0);
-           drv_L7_put(49, 0);
+           v = 0;
+           drv_L7_put(46, v);
+           drv_L7_put(47, v);
+           drv_L7_put(48, v);
+           drv_L7_put(49, v);
        } else {
-           drv_L7_put(46, (val & 1) ? 1 : 0);
-           drv_L7_put(47, (val & 2) ? 1 : 0);
-           drv_L7_put(48, (val & 4) ? 1 : 0);
-           drv_L7_put(49, (val & 8) ? 1 : 0);
+           v = val & 0x0f;
+           drv_L7_put(46, (v & 1) ? 1 : 0);
+           drv_L7_put(47, (v & 2) ? 1 : 0);
+           drv_L7_put(48, (v & 4) ? 1 : 0);
+           drv_L7_put(49, (v & 8) ? 1 : 0);
        }
        break;
     case 2:
        /* earpiece */
-       drv_L7_put(59, (val > 0) ? 1 : 0);
+       v = (val > 0) ? 1 : 0;
+       drv_L7_put(59, v);
        break;
     case 3:
        /* triangle */
-       drv_L7_put(69, (val > 0) ? 1 : 0);
+       v = (val > 0) ? 1 : 0;
+       drv_L7_put(69, v);
        Buffer1[8 * SCOLS + 69 - 32] = (val > 0);
        break;
     case 4:
        /* head */
-       drv_L7_put(83, (val > 0) ? 1 : 0);
+       v = (val > 0) ? 1 : 0;
+       drv_L7_put(83, v);
        Buffer1[8 * SCOLS + 83 - 32] = (val > 0);
        break;
     case 5:
        /* message */
-       drv_L7_put(98, (val > 0) ? 1 : 0);
+       v = (val > 0) ? 1 : 0;
+       drv_L7_put(98, v);
        Buffer1[8 * SCOLS + 98 - 32] = (val > 0);
        break;
     case 6:
        /* antenna */
-       drv_L7_put(117, (val > 0) ? 1 : 0);
+       v = (val > 0) ? 1 : 0;
+       drv_L7_put(117, v);
        Buffer1[8 * SCOLS + 117 - 32] = (val > 0);
        break;
     case 7:
        /* signal level */
        if (val < 0) {
-           drv_L7_put(112, 0);
-           drv_L7_put(113, 0);
-           drv_L7_put(114, 0);
-           drv_L7_put(115, 0);
+           v = 0;
+           drv_L7_put(112, v);
+           drv_L7_put(113, v);
+           drv_L7_put(114, v);
+           drv_L7_put(115, v);
        } else {
-           drv_L7_put(112, (val & 1) ? 1 : 0);
-           drv_L7_put(113, (val & 2) ? 1 : 0);
-           drv_L7_put(114, (val & 4) ? 1 : 0);
-           drv_L7_put(115, (val & 8) ? 1 : 0);
+           v = val & 0x0f;
+           drv_L7_put(112, (v & 1) ? 1 : 0);
+           drv_L7_put(113, (v & 2) ? 1 : 0);
+           drv_L7_put(114, (v & 4) ? 1 : 0);
+           drv_L7_put(115, (v & 8) ? 1 : 0);
        }
        break;
     }
 
-    return 0;
+    return v;
 }
 
 
@@ -432,9 +447,7 @@ static int drv_L7_start(const char *section)
 
 static void plugin_contrast(RESULT * result, RESULT * arg1)
 {
-    double contrast;
-
-    contrast = drv_L7_contrast(R2N(arg1));
+    double contrast = drv_L7_contrast(R2N(arg1));
     SetResult(&result, R_NUMBER, &contrast);
 }
 
index 4e3a81173355c105ec405dc072711360162a98f5..c4bf69b092258565859887090ff8834f92ae5d79 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: drv_generic_gpio.c,v 1.1 2005/12/18 16:18:36 reinelt Exp $
+/* $Id: drv_generic_gpio.c,v 1.2 2005/12/20 07:07:44 reinelt Exp $
  *
  * generic driver helper for GPO's
  *
@@ -23,6 +23,9 @@
  *
  *
  * $Log: drv_generic_gpio.c,v $
+ * Revision 1.2  2005/12/20 07:07:44  reinelt
+ * further work on GPO's, HD44780 GPO support
+ *
  * Revision 1.1  2005/12/18 16:18:36  reinelt
  * GPO's added again
  *
@@ -37,8 +40,8 @@
  *
  * these functions must be implemented by the real driver:
  *
- * void (*drv_generic_gpio_real_set) (const int num, const int val);
- *   sets GPO num to val
+ * int (*drv_generic_gpio_real_set) (const int num, const int val);
+ *   sets GPO num to val, returns the actal value
  *
  * int (*drv_generic_gpio_real_get) (const int num);
  *   reads GPI num
@@ -88,6 +91,43 @@ int GPOS = 0;
 int GPIS = 0;
 
 
+static void drv_generic_gpio_plugin_gpo(RESULT * result, const int argc, RESULT * argv[])
+{
+    int num, val;
+    double gpo;
+
+    switch (argc) {
+    case 1:
+       num = R2N(argv[0]);
+       if (num <= 0 || num > GPOS) {
+           error("%s::GPO(%d): GPO out of range (1..%d)", Driver, num, GPOS);
+           SetResult(&result, R_STRING, "");
+           return;
+       }
+       gpo = GPO[num-1];
+       SetResult(&result, R_NUMBER, &gpo);
+       break;
+    case 2:
+       num = R2N(argv[0]);
+       val = R2N(argv[1]);
+       if (num <= 0 || num > GPOS) {
+           error("%s::GPO(%d): GPO out of range (1..%d)", Driver, num, GPOS);
+           SetResult(&result, R_STRING, "");
+           return;
+       }
+       if (GPO[num-1] != val) {
+           GPO[num-1] = drv_generic_gpio_real_set(num-1, val);
+       }
+       gpo = GPO[num-1];
+       SetResult(&result, R_NUMBER, &gpo);
+       break;
+    default:
+       error("%s::GPO(): wrong number of parameters", Driver);
+       SetResult(&result, R_STRING, "");
+    }
+}
+
+
 int drv_generic_gpio_init(const char *section, const char *driver)
 {
     WIDGET_CLASS wc;
@@ -109,7 +149,7 @@ int drv_generic_gpio_init(const char *section, const char *driver)
 
 
     /* register plugins */
-    /* Fixme */
+    AddFunction("LCD::GPO", -1, drv_generic_gpio_plugin_gpo);
 
     return 0;
 }
@@ -126,7 +166,7 @@ int drv_generic_gpio_clear(void)
 
     /* really clear GPO's */
     for (i = 0; i < GPOS; i++) {
-       drv_generic_gpio_real_set(i, 0);
+       GPO[i] = drv_generic_gpio_real_set(i, 0);
     }
 
     return 0;
@@ -145,8 +185,7 @@ int drv_generic_gpio_draw(WIDGET * W)
     }
 
     if (GPO[num] != val) {
-       drv_generic_gpio_real_set(num, val);
-       GPO[num] = val;
+       GPO[num] = drv_generic_gpio_real_set(num, val);
     }
 
     return 0;
index 2b45f1cad18f70d2dcd2604ed446cafb684a3179..c3a508c6b58d48307bb0c82c72676b16be8507f4 100644 (file)
@@ -95,6 +95,7 @@ Display HD44780-generic {
     Port '/dev/parports/0'     
     Size '8x2'
     asc255bug 0
+    GPOs 8
     Wire {
        RW      'GND'
        RS      'AUTOFD'
@@ -863,7 +864,7 @@ Layout testMySQL {
 #Display 'LK204'
 #Display 'MI240'
 #Display 'CW12232'
-#Display 'HD44780-generic'
+Display 'HD44780-generic'
 #Display 'HD44780-WinAmp'
 #Display 'WDC2704M'
 #Display 'SC1602D'
@@ -884,7 +885,7 @@ Layout testMySQL {
 #Display 'Image'
 #Display 'Trefon'
 #Display 'LPH7508-serdisplib'
-Display 'LPH7508'
+#Display 'LPH7508'
 
 #Layout 'Default'
 #Layout 'L8x2'