diff options
Diffstat (limited to 'drv_LCDLinux.c')
-rw-r--r-- | drv_LCDLinux.c | 437 |
1 files changed, 219 insertions, 218 deletions
diff --git a/drv_LCDLinux.c b/drv_LCDLinux.c index 29731fb..50688b0 100644 --- a/drv_LCDLinux.c +++ b/drv_LCDLinux.c @@ -1,4 +1,4 @@ -/* $Id: drv_LCDLinux.c,v 1.7 2005/05/02 05:15:46 reinelt Exp $ +/* $Id: drv_LCDLinux.c,v 1.8 2005/05/08 04:32:44 reinelt Exp $ * * driver for the LCD-Linux HD44780 kernel driver * http://lcd-linux.sourceforge.net @@ -24,6 +24,9 @@ * * * $Log: drv_LCDLinux.c,v $ + * Revision 1.8 2005/05/08 04:32:44 reinelt + * CodingStyle added and applied + * * Revision 1.7 2005/05/02 05:15:46 reinelt * make busy-flag checking configurable for LCD-Linux driver * @@ -81,8 +84,8 @@ #include "drv_LCDLinux.h" -static char Name[] = "LCD-Linux"; -static char Device[] = "/dev/lcd"; +static char Name[] = "LCD-Linux"; +static char Device[] = "/dev/lcd"; static int lcdlinux_fd = -1; @@ -90,159 +93,159 @@ static int lcdlinux_fd = -1; /*** hardware dependant functions ***/ /****************************************/ -static void drv_LL_send (const char *string, const int len) +static void drv_LL_send(const char *string, const int len) { - int run, ret; - - for (run = 0; run < 10; run++) { - ret = write (lcdlinux_fd, string, len); - if (ret >= 0 || errno != EAGAIN) break; - if (run > 0) info ("%s: write(%s): EAGAIN #%d", Name, Device, run); - usleep(1000); - } - - if (ret < 0) { - error ("%s: write(%s) failed: %s", Name, Device, strerror(errno)); - } else if (ret != len) { - error ("%s: partial write(%s): len=%d ret=%d", Name, Device, len, ret); - } - - return; + int run, ret; + + for (run = 0; run < 10; run++) { + ret = write(lcdlinux_fd, string, len); + if (ret >= 0 || errno != EAGAIN) + break; + if (run > 0) + info("%s: write(%s): EAGAIN #%d", Name, Device, run); + usleep(1000); + } + + if (ret < 0) { + error("%s: write(%s) failed: %s", Name, Device, strerror(errno)); + } else if (ret != len) { + error("%s: partial write(%s): len=%d ret=%d", Name, Device, len, ret); + } + + return; } -static void drv_LL_clear (void) +static void drv_LL_clear(void) { - /* Fixme: is there no otherway to clear the display? */ - drv_LL_send ("\14", 1); /* Form Feed */ + /* Fixme: is there no otherway to clear the display? */ + drv_LL_send("\14", 1); /* Form Feed */ } -static void drv_LL_write (const int row, const int col, const char *data, int len) +static void drv_LL_write(const int row, const int col, const char *data, int len) { - int pos = row * DCOLS + col; - - if (lseek(lcdlinux_fd, pos, SEEK_SET) == (off_t)-1) { - error ("%s: lseek(%s) failed: %s", Name, Device, strerror(errno)); - } - drv_LL_send (data, len); + int pos = row * DCOLS + col; + + if (lseek(lcdlinux_fd, pos, SEEK_SET) == (off_t) - 1) { + error("%s: lseek(%s) failed: %s", Name, Device, strerror(errno)); + } + drv_LL_send(data, len); } -static void drv_LL_defchar (const int ascii, const unsigned char *matrix) +static void drv_LL_defchar(const int ascii, const unsigned char *matrix) { - char buffer[8]; - int pos = 1024 + ascii; - int i; - - for (i = 0; i < 8; i++) { - buffer[i] = *matrix++ & 0x1f; - } + char buffer[8]; + int pos = 1024 + ascii; + int i; - if (lseek(lcdlinux_fd, pos, SEEK_SET) == (off_t)-1) { - error ("%s: lseek(%s) failed: %s", Name, Device, strerror(errno)); - } + for (i = 0; i < 8; i++) { + buffer[i] = *matrix++ & 0x1f; + } + + if (lseek(lcdlinux_fd, pos, SEEK_SET) == (off_t) - 1) { + error("%s: lseek(%s) failed: %s", Name, Device, strerror(errno)); + } - drv_LL_send (buffer, 8); + drv_LL_send(buffer, 8); } -static int drv_LL_start (const char *section, const int quiet) +static int drv_LL_start(const char *section, const int quiet) { - char *s; - int rows = -1, cols = -1; - int use_busy = 0; - struct lcd_driver buf; - - /* emit version information */ - info ("%s: Version %s", Name, LCD_LINUX_VERSION); - - /* get size from config file */ - s=cfg_get(section, "Size", NULL); - if (s != NULL || *s != '\0') { - if (sscanf(s, "%dx%d",&cols,&rows) != 2 || rows < 1 || cols < 1) { - error ("%s: bad %s.Size '%s' from %s", Name, section, s, cfg_source()); - free (s); - return -1; + char *s; + int rows = -1, cols = -1; + int use_busy = 0; + struct lcd_driver buf; + + /* emit version information */ + info("%s: Version %s", Name, LCD_LINUX_VERSION); + + /* get size from config file */ + s = cfg_get(section, "Size", NULL); + if (s != NULL || *s != '\0') { + if (sscanf(s, "%dx%d", &cols, &rows) != 2 || rows < 1 || cols < 1) { + error("%s: bad %s.Size '%s' from %s", Name, section, s, cfg_source()); + free(s); + return -1; + } } - } - free (s); - - /* open device */ - lcdlinux_fd = open(Device, O_WRONLY); - if (lcdlinux_fd == -1) { - error ("%s: open(%s) failed: %s", Name, Device, strerror(errno)); - return -1; - } - - /* get display size */ - memset(&buf, 0, sizeof(buf)); - if (ioctl(lcdlinux_fd, IOCTL_GET_PARAM, &buf) != 0) { - error ("%s: ioctl(IOCTL_GET_PARAM) failed: %s", Name, strerror(errno)); - error ("%s: Could not query display information!", Name); - return -1; - } - info("%s: %dx%d display at 0x%x, %d controllers, flags=0x%02x:", - Name, buf.disp_cols, buf.cntr_rows, buf.io, buf.num_cntr, buf.flags); - - info("%s: /proc support %sabled", Name, buf.flags & LCD_PROC_ON ? "en" : "dis"); - info("%s: tty support %sabled", Name, buf.flags & LCD_ETTY_ON ? "en" : "dis"); - info("%s: console support %sabled", Name, buf.flags & LCD_CONSOLE ? "en" : "dis"); - info("%s: bus width %d bits", Name, buf.flags & LCD_4BITS_BUS ? 4 : 8); - info("%s: font size %s", Name, buf.flags & LCD_5X10_FONT ? "5x10" : "5x8"); - info("%s: busy-flag checking %sabled", Name, buf.flags & LCD_CHECK_BF ? "en" : "dis"); - - - /* overwrite with size from lcd4linux.conf */ - if ((rows > 0 && rows != buf.cntr_rows) || (cols > 0 && cols != buf.disp_cols)) { - info("%s: changing size to %dx%d", Name, cols, rows); - buf.cntr_rows = rows; - buf.disp_cols = cols; - if (ioctl(lcdlinux_fd, IOCTL_SET_PARAM, &buf) != 0) { - error ("%s: ioctl(IOCTL_SET_PARAM) failed: %s", Name, strerror(errno)); - error ("%s: Could not set display geometry!", Name); - return -1; + free(s); + + /* open device */ + lcdlinux_fd = open(Device, O_WRONLY); + if (lcdlinux_fd == -1) { + error("%s: open(%s) failed: %s", Name, Device, strerror(errno)); + return -1; } - } - - DROWS = buf.cntr_rows; - DCOLS = buf.disp_cols; - - /* overwrite busy-flag checking from lcd4linux.conf */ - cfg_number(section, "UseBusy", 0, 0, 1, &use_busy); - if (use_busy && !(buf.flags & LCD_CHECK_BF)) { - info ("%s: activating busy-flag checking", Name); - buf.flags |= LCD_CHECK_BF; - if (ioctl(lcdlinux_fd, IOCTL_SET_PARAM, &buf) != 0) { - error ("%s: ioctl(IOCTL_SET_PARAM) failed: %s", Name, strerror(errno)); - error ("%s: Could not activate busy-flag checking!", Name); - return -1; + + /* get display size */ + memset(&buf, 0, sizeof(buf)); + if (ioctl(lcdlinux_fd, IOCTL_GET_PARAM, &buf) != 0) { + error("%s: ioctl(IOCTL_GET_PARAM) failed: %s", Name, strerror(errno)); + error("%s: Could not query display information!", Name); + return -1; } - } - else if (!use_busy && (buf.flags & LCD_CHECK_BF)) { - info ("%s: deactivating busy-flag checking", Name); - buf.flags &= ~LCD_CHECK_BF; - if (ioctl(lcdlinux_fd, IOCTL_SET_PARAM, &buf) != 0) { - error ("%s: ioctl(IOCTL_SET_PARAM) failed: %s", Name, strerror(errno)); - error ("%s: Could not deactivate busy-flag checking!", Name); - return -1; + info("%s: %dx%d display at 0x%x, %d controllers, flags=0x%02x:", Name, buf.disp_cols, buf.cntr_rows, buf.io, buf.num_cntr, buf.flags); + + info("%s: /proc support %sabled", Name, buf.flags & LCD_PROC_ON ? "en" : "dis"); + info("%s: tty support %sabled", Name, buf.flags & LCD_ETTY_ON ? "en" : "dis"); + info("%s: console support %sabled", Name, buf.flags & LCD_CONSOLE ? "en" : "dis"); + info("%s: bus width %d bits", Name, buf.flags & LCD_4BITS_BUS ? 4 : 8); + info("%s: font size %s", Name, buf.flags & LCD_5X10_FONT ? "5x10" : "5x8"); + info("%s: busy-flag checking %sabled", Name, buf.flags & LCD_CHECK_BF ? "en" : "dis"); + + + /* overwrite with size from lcd4linux.conf */ + if ((rows > 0 && rows != buf.cntr_rows) || (cols > 0 && cols != buf.disp_cols)) { + info("%s: changing size to %dx%d", Name, cols, rows); + buf.cntr_rows = rows; + buf.disp_cols = cols; + if (ioctl(lcdlinux_fd, IOCTL_SET_PARAM, &buf) != 0) { + error("%s: ioctl(IOCTL_SET_PARAM) failed: %s", Name, strerror(errno)); + error("%s: Could not set display geometry!", Name); + return -1; + } } - } - - /* initialize display */ - drv_LL_clear(); /* clear display */ - - if (!quiet) { - char buffer[40]; - qprintf(buffer, sizeof(buffer), "%s %dx%d", Name, DCOLS, DROWS); - if (drv_generic_text_greet (buffer, "lcd-linux.sf.net")) { - sleep (3); - drv_LL_clear(); + + DROWS = buf.cntr_rows; + DCOLS = buf.disp_cols; + + /* overwrite busy-flag checking from lcd4linux.conf */ + cfg_number(section, "UseBusy", 0, 0, 1, &use_busy); + if (use_busy && !(buf.flags & LCD_CHECK_BF)) { + info("%s: activating busy-flag checking", Name); + buf.flags |= LCD_CHECK_BF; + if (ioctl(lcdlinux_fd, IOCTL_SET_PARAM, &buf) != 0) { + error("%s: ioctl(IOCTL_SET_PARAM) failed: %s", Name, strerror(errno)); + error("%s: Could not activate busy-flag checking!", Name); + return -1; + } + } else if (!use_busy && (buf.flags & LCD_CHECK_BF)) { + info("%s: deactivating busy-flag checking", Name); + buf.flags &= ~LCD_CHECK_BF; + if (ioctl(lcdlinux_fd, IOCTL_SET_PARAM, &buf) != 0) { + error("%s: ioctl(IOCTL_SET_PARAM) failed: %s", Name, strerror(errno)); + error("%s: Could not deactivate busy-flag checking!", Name); + return -1; + } } - } - - return 0; + + /* initialize display */ + drv_LL_clear(); /* clear display */ + + if (!quiet) { + char buffer[40]; + qprintf(buffer, sizeof(buffer), "%s %dx%d", Name, DCOLS, DROWS); + if (drv_generic_text_greet(buffer, "lcd-linux.sf.net")) { + sleep(3); + drv_LL_clear(); + } + } + + return 0; } @@ -269,107 +272,105 @@ static int drv_LL_start (const char *section, const int quiet) /* list models */ -int drv_LL_list (void) +int drv_LL_list(void) { - printf ("generic"); - return 0; + printf("generic"); + return 0; } /* initialize driver & display */ -int drv_LL_init (const char *section, const int quiet) +int drv_LL_init(const char *section, const int quiet) { - WIDGET_CLASS wc; - int asc255bug; - int ret; - - /* display preferences */ - XRES = 5; /* pixel width of one char */ - YRES = 8; /* pixel height of one char */ - CHARS = 8; /* number of user-defineable characters */ - CHAR0 = 0; /* ASCII of first user-defineable char */ - GOTO_COST = -1; /* number of bytes a goto command requires */ - - /* real worker functions */ - drv_generic_text_real_write = drv_LL_write; - drv_generic_text_real_defchar = drv_LL_defchar; - - - /* start display */ - if ((ret=drv_LL_start (section, quiet))!=0) - return ret; - - /* initialize generic text driver */ - if ((ret=drv_generic_text_init(section, Name))!=0) - return ret; - - /* initialize generic icon driver */ - if ((ret=drv_generic_text_icon_init())!=0) - return ret; - - /* initialize generic bar driver */ - if ((ret=drv_generic_text_bar_init(0))!=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 */ - /* char will not be used, but rendered by the bar driver */ - cfg_number(section, "asc255bug", 0, 0, 1, &asc255bug); - drv_generic_text_bar_add_segment ( 0, 0,255, 32); /* ASCII 32 = blank */ - if (!asc255bug) - drv_generic_text_bar_add_segment (255,255,255,255); /* ASCII 255 = block */ - - /* register text widget */ - wc=Widget_Text; - wc.draw=drv_generic_text_draw; - widget_register(&wc); - - /* register icon widget */ - wc=Widget_Icon; - wc.draw=drv_generic_text_icon_draw; - widget_register(&wc); - - /* register bar widget */ - wc=Widget_Bar; - wc.draw=drv_generic_text_bar_draw; - widget_register(&wc); - - /* register plugins */ - /* none */ - - return 0; + WIDGET_CLASS wc; + int asc255bug; + int ret; + + /* display preferences */ + XRES = 5; /* pixel width of one char */ + YRES = 8; /* pixel height of one char */ + CHARS = 8; /* number of user-defineable characters */ + CHAR0 = 0; /* ASCII of first user-defineable char */ + GOTO_COST = -1; /* number of bytes a goto command requires */ + + /* real worker functions */ + drv_generic_text_real_write = drv_LL_write; + drv_generic_text_real_defchar = drv_LL_defchar; + + + /* start display */ + if ((ret = drv_LL_start(section, quiet)) != 0) + return ret; + + /* initialize generic text driver */ + if ((ret = drv_generic_text_init(section, Name)) != 0) + return ret; + + /* initialize generic icon driver */ + if ((ret = drv_generic_text_icon_init()) != 0) + return ret; + + /* initialize generic bar driver */ + if ((ret = drv_generic_text_bar_init(0)) != 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 */ + /* char will not be used, but rendered by the bar driver */ + cfg_number(section, "asc255bug", 0, 0, 1, &asc255bug); + drv_generic_text_bar_add_segment(0, 0, 255, 32); /* ASCII 32 = blank */ + if (!asc255bug) + drv_generic_text_bar_add_segment(255, 255, 255, 255); /* ASCII 255 = block */ + + /* register text widget */ + wc = Widget_Text; + wc.draw = drv_generic_text_draw; + widget_register(&wc); + + /* register icon widget */ + wc = Widget_Icon; + wc.draw = drv_generic_text_icon_draw; + widget_register(&wc); + + /* register bar widget */ + wc = Widget_Bar; + wc.draw = drv_generic_text_bar_draw; + widget_register(&wc); + + /* register plugins */ + /* none */ + + return 0; } /* close driver & display */ -int drv_LL_quit (const int quiet) +int drv_LL_quit(const int quiet) { - info("%s: shutting down.", Name); - - drv_generic_text_quit(); - - /* clear display */ - drv_LL_clear(); - - /* say goodbye... */ - if (!quiet) { - drv_generic_text_greet ("goodbye!", NULL); - } - - /* close device */ - close (lcdlinux_fd); - - return (0); + info("%s: shutting down.", Name); + + drv_generic_text_quit(); + + /* clear display */ + drv_LL_clear(); + + /* say goodbye... */ + if (!quiet) { + drv_generic_text_greet("goodbye!", NULL); + } + + /* close device */ + close(lcdlinux_fd); + + return (0); } DRIVER drv_LCDLinux = { - name: Name, - list: drv_LL_list, - init: drv_LL_init, - quit: drv_LL_quit, + name:Name, + list:drv_LL_list, + init:drv_LL_init, + quit:drv_LL_quit, }; - - |