]> git.webhop.me Git - lcd4linux.git/commitdiff
picoLCD driver bugs fixed
authormichael <michael@3ae390bd-cb1e-0410-b409-cd5a39f66f1f>
Sun, 4 Feb 2007 05:55:58 +0000 (05:55 +0000)
committermichael <michael@3ae390bd-cb1e-0410-b409-cd5a39f66f1f>
Sun, 4 Feb 2007 05:55:58 +0000 (05:55 +0000)
git-svn-id: https://ssl.bulix.org/svn/lcd4linux/trunk@759 3ae390bd-cb1e-0410-b409-cd5a39f66f1f

drv_picoLCD.c
lcd4linux.conf.sample

index a50b235fb563e153d1e8a9370883e5e5075bf531..3bfc906cc1d232af5a8abdb136d877183f0340ff 100644 (file)
@@ -46,9 +46,7 @@
 #include <sys/ioctl.h>
 #include <sys/time.h>
 
-#ifdef HAVE_USB_H
 #include <usb.h>
-#endif
 
 #include "debug.h"
 #include "cfg.h"
 
 static char Name[] = "picoLCD";
 
-static int use_libusb = 1;
 static unsigned int gpo = 0;
 
 static char *Buffer;
 static char *BufPtr;
 
-#ifdef HAVE_USB_H
-
 static usb_dev_handle *lcd;
-static int interface;
-
 extern int usb_debug;
 
-#endif
-
 
 
 /****************************************/
 /***  hardware dependant functions    ***/
 /****************************************/
 
-#ifdef HAVE_USB_H
-
 static int drv_pL_open(void)
 {
     struct usb_bus *busses, *bus;
     struct usb_device *dev;
-    char buf[1024];
+    char driver[1024];
+    char product[1024];
+    char manufacturer[1024];
+    char serialnumber[1024];
     int ret;
 
     lcd = NULL;
@@ -118,21 +110,35 @@ static int drv_pL_open(void)
 
                info("%s: found picoLCD on bus %s device %s", Name, bus->dirname, dev->filename);
 
-               interface = 0;
                lcd = usb_open(dev);
 
-               ret = usb_get_driver_np(lcd, 0, buf, sizeof(buf));
+               ret = usb_get_driver_np(lcd, 0, driver, sizeof(driver));
 
                if (ret == 0) {
-                   info("interface 0 already claimed attempting to detach it\n");
-                   ret = usb_detach_kernel_driver_np(lcd, 0);
-                   printf("usb_detach_kernel_driver_np returned %d\n", ret);
+                   info("%s: interface 0 already claimed by '%s'", Name, driver);
+                   info("%s: attempting to detach driver...", Name);
+                   if (usb_detach_kernel_driver_np(lcd, 0) < 0) {
+                       error("%s: usb_detach_kernel_driver_np() failed!", Name);
+                       return -1;
+                   }
                }
 
-               if (usb_claim_interface(lcd, interface) < 0) {
+               usb_set_configuration(lcd, 1);
+               usleep(100);
+
+               if (usb_claim_interface(lcd, 0) < 0) {
                    error("%s: usb_claim_interface() failed!", Name);
                    return -1;
                }
+
+               usb_set_altinterface(lcd, 0);
+
+               usb_get_string_simple(lcd, dev->descriptor.iProduct, product, sizeof(product));
+               usb_get_string_simple(lcd, dev->descriptor.iManufacturer, manufacturer, sizeof(manufacturer));
+               usb_get_string_simple(lcd, dev->descriptor.iSerialNumber, serialnumber, sizeof(serialnumber));
+
+               info("%s: Manufacturer='%s' Product='%s' SerialNumber='%s'", Name, manufacturer, product, serialnumber);
+
                return 0;
            }
        }
@@ -144,63 +150,36 @@ static int drv_pL_open(void)
 
 static int drv_pL_close(void)
 {
-    usb_release_interface(lcd, interface);
+    usb_release_interface(lcd, 0);
     usb_close(lcd);
 
     return 0;
 }
 
-#endif
-
 
-static void drv_pL_send(void)
+static void drv_pL_send(unsigned char *data, int size)
 {
-
-#if 0
-    struct timeval now, end;
-    gettimeofday(&now, NULL);
-#endif
-
-    if (use_libusb) {
-#ifdef HAVE_USB_H
-       usb_bulk_write(lcd, USB_ENDPOINT_OUT + 1, Buffer, BufPtr - Buffer, 1000);
-#endif
-    }
-#if 0
-    gettimeofday(&end, NULL);
-    debug("send %d bytes in %d usec (%d usec/byte)", BufPtr - Buffer,
-         (1000000 * (end.tv_sec - now.tv_sec) + end.tv_usec - now.tv_usec),
-         (1000000 * (end.tv_sec - now.tv_sec) + end.tv_usec - now.tv_usec) / (BufPtr - Buffer));
-#endif
-
-    BufPtr = Buffer;
-}
-
-
-static void drv_pL_command(const unsigned char cmd)
-{
-    *BufPtr++ = cmd;
+    usb_interrupt_write(lcd, USB_ENDPOINT_OUT + 1, (char *) data, size, 1000);
 }
 
 
 static void drv_pL_clear(void)
 {
-    drv_pL_command(0x94);      /* clear display */
-    drv_pL_send();             /* flush buffer */
+    unsigned char cmd[1] = { 0x94 };   /* clear display */
+    drv_pL_send(cmd, 1);
 }
 
 static int drv_pL_contrast(int contrast)
 {
+    unsigned char cmd[2] = { 0x92 };   /* set contrast */
 
     if (contrast < 0)
        contrast = 0;
     if (contrast > 255)
        contrast = 255;
 
-    drv_pL_command(0x92);
-    drv_pL_command(contrast);
-
-    drv_pL_send();
+    cmd[1] = contrast;
+    drv_pL_send(cmd, 2);
 
     return contrast;
 }
@@ -208,21 +187,23 @@ static int drv_pL_contrast(int contrast)
 
 static int drv_pL_backlight(int backlight)
 {
+    unsigned char cmd[2] = { 0x91 };   /* set backlight */
+
     if (backlight < 0)
        backlight = 0;
     if (backlight > 1)
        backlight = 1;
 
-    drv_pL_command(0x91);
-    drv_pL_command(backlight);
-
-    drv_pL_send();
+    cmd[1] = backlight;
+    drv_pL_send(cmd, 2);
 
     return backlight;
 }
 
 static int drv_pL_gpo(int num, int val)
 {
+    unsigned char cmd[2] = { 0x81 };   /* set GPO */
+
     if (num < 0)
        num = 0;
     if (num > 7)
@@ -239,8 +220,8 @@ static int drv_pL_gpo(int num, int val)
     else
        gpo &= ~(1 << num);
 
-    drv_pL_command(0x81);
-    drv_pL_command(gpo);
+    cmd[1] = gpo;
+    drv_pL_send(cmd, 2);
 
     return val;
 }
@@ -248,35 +229,33 @@ static int drv_pL_gpo(int num, int val)
 
 static void drv_pL_write(const int row, const int col, const char *data, int len)
 {
+    unsigned char cmd[64];
+    int i;
 
-    drv_pL_command(0x98);
-    drv_pL_command(row);
-    drv_pL_command(col);
-    drv_pL_command(len);
+    cmd[0] = 0x98;             /* goto/write */
+    cmd[1] = row;
+    cmd[2] = col;
+    cmd[3] = len;
 
+    i = 4;
     while (len--) {
-       if (*data == 0)
-           *BufPtr++ = 0;
-       *BufPtr++ = *data++;
+       cmd[i++] = *data++;
     }
 
-    drv_pL_send();
+    drv_pL_send(cmd, i);
 }
 
 static void drv_pL_defchar(const int ascii, const unsigned char *matrix)
 {
+    unsigned char cmd[10] = { 0x9c };  /* define character */
     int i;
 
-    drv_pL_command(0x9c);
-    drv_pL_command(ascii);
-
+    cmd[1] = ascii;
     for (i = 0; i < 8; i++) {
-       if ((*matrix & 0x1f) == 0)
-           *BufPtr++ = 0;
-       *BufPtr++ = *matrix++ & 0x1f;
+       cmd[i + 2] = *matrix++ & 0x1f;
     }
 
-    drv_pL_send();
+    drv_pL_send(cmd, 10);
 }
 
 
@@ -286,14 +265,6 @@ static int drv_pL_start(const char *section, const int quiet)
     int value;
     char *s;
 
-#ifdef HAVE_USB_H
-    use_libusb = 1;
-    debug("using libusb");
-#else
-    error("%s: lcd4linux was compiled without libusb support!", Name);
-    return -1;
-#endif
-
     s = cfg_get(section, "Size", NULL);
     if (s == NULL || *s == '\0') {
        error("%s: no '%s.Size' entry from %s", Name, section, cfg_source());
@@ -308,13 +279,9 @@ static int drv_pL_start(const char *section, const int quiet)
     DROWS = rows;
     DCOLS = cols;
 
-
-#ifdef HAVE_USB_H
     if (drv_pL_open() < 0) {
        return -1;
     }
-#endif
-
 
     /* Init the command buffer */
     Buffer = (char *) malloc(1024);
@@ -325,12 +292,12 @@ static int drv_pL_start(const char *section, const int quiet)
     BufPtr = Buffer;
 
     if (cfg_number(section, "Contrast", 0, 0, 255, &value) > 0) {
-       info("Setting contrast to %d\n", value);
+       info("Setting contrast to %d", value);
        drv_pL_contrast(value);
     }
 
     if (cfg_number(section, "Backlight", 0, 0, 1, &value) > 0) {
-       info("Setting backlight to %d\n", value);
+       info("Setting backlight to %d", value);
        drv_pL_backlight(value);
     }
 
@@ -474,9 +441,6 @@ int drv_pL_quit(const int quiet)
 
     info("%s: shutting down.", Name);
 
-    /* flush buffer */
-    drv_pL_send();
-
     drv_generic_text_quit();
 
     /* clear display */
@@ -487,11 +451,7 @@ int drv_pL_quit(const int quiet)
        drv_generic_text_greet("goodbye!", NULL);
     }
 
-    if (use_libusb) {
-#ifdef HAVE_USB_H
-       drv_pL_close();
-#endif
-    }
+    drv_pL_close();
 
     if (Buffer) {
        free(Buffer);
index e27981d5a03a48c3bddddb6f3b45803780d8b3db..79fb2c2537e8e415b050a273b04682390a7ea0ee 100644 (file)
@@ -251,7 +251,7 @@ Display picoLCD {
     Size     '20x2'
     Contrast  0
     Backlight 1
-    Icons     4
+    Icons     1
 }
 
 Display SC1602D {
@@ -863,6 +863,23 @@ Widget Rain {
     }
 }
 
+Widget Timer {
+    class 'Icon'
+    speed 50
+    Bitmap {
+       Row1 '.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|'
+       Row2 '.***.|.*+*.|.*++.|.*++.|.*++.|.*++.|.*++.|.*++.|.*++.|.*++.|.*++.|.*++.|.+++.|.+*+.|.+**.|.+**.|.+**.|.+**.|.+**.|.+**.|.+**.|.+**.|.+**.|.+**.|'
+       Row3 '*****|**+**|**++*|**+++|**++.|**++.|**+++|**+++|**+++|**+++|**+++|+++++|+++++|++*++|++**+|++***|++**.|++**.|++***|++***|++***|++***|++***|*****|'
+       Row4 '*****|**+**|**+**|**+**|**+++|**+++|**+++|**+++|**+++|**+++|+++++|+++++|+++++|++*++|++*++|++*++|++***|++***|++***|++***|++***|++***|*****|*****|'
+       Row5 '*****|*****|*****|*****|*****|***++|***++|**+++|*++++|+++++|+++++|+++++|+++++|+++++|+++++|+++++|+++++|+++**|+++**|++***|+****|*****|*****|*****|'
+       Row6 '.***.|.***.|.***.|.***.|.***.|.***.|.**+.|.*++.|.+++.|.+++.|.+++.|.+++.|.+++.|.+++.|.+++.|.+++.|.+++.|.+++.|.++*.|.+**.|.***.|.***.|.***.|.***.|'
+       Row7 '.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|'
+       Row8 '.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|'
+
+
+    }
+}
+
 Widget Test {
     class 'Text'
     expression '1234567890123456789012345678901234567890'
@@ -1129,6 +1146,17 @@ Layout TestGPO {
     GPO4       'GPO_Test1'
 }
 
+Layout TestIcons {
+    Row1.Col1 'Timer'
+    Row1.Col2 'Rain'
+    Row1.Col3 'Squirrel'
+    Row1.Col4 'Wave'
+    Row1.Col5 'Blob'
+    Row1.Col6 'Heart'
+    Row1.Col7 'Karo'
+    Row1.Col8 'EKG'
+}
+
 Layout testMySQL {
        Row1 {
                Col1 'MySQLtest1'
@@ -1175,10 +1203,11 @@ Layout Debug {
 #Display 'BWCT'
 #Display 'Image'
 #Display 'Trefon'
-Display 'LCD2USB'
+#Display 'LCD2USB'
 #Display 'LPH7508-serdisplib'
 #Display 'LPH7508'
 #Display 'ctinclud'
+Display 'picoLCD'
 
 #Layout 'Default'
 #Layout 'TestLayer'
@@ -1186,10 +1215,10 @@ Display 'LCD2USB'
 #Layout 'L8x2'
 #Layout 'L16x1'
 #Layout 'L16x2'
-#Layout 'L20x2'
+Layout 'L20x2'
 #Layout 'L40x2'
-Layout 'Test'
+#Layout 'Test'
 #Layout 'Test2'
 #Layout 'TestGPO'
 #Layout 'Debug'
-
+#Layout 'TestIcons'