From 81bc865f1e651c245009049562be0f25f2fa7bac Mon Sep 17 00:00:00 2001 From: marschap Date: Sun, 4 Nov 2007 16:58:00 +0000 Subject: [PATCH] clean interface for sub-drivers wrt backlight, contrast and brightness --- server/drivers/hd44780-bwct-usb.c | 31 ++++++-------- server/drivers/hd44780-bwct-usb.h | 4 -- server/drivers/hd44780-ftdi.c | 20 +++++++-- server/drivers/hd44780-ftdi.h | 4 -- server/drivers/hd44780-lcd2usb.c | 32 ++++++-------- server/drivers/hd44780-lcd2usb.h | 8 ---- server/drivers/hd44780-low.h | 6 +-- server/drivers/hd44780.c | 71 ++++++++++++++++++++++++++++--- server/drivers/hd44780.h | 4 +- 9 files changed, 109 insertions(+), 71 deletions(-) diff --git a/server/drivers/hd44780-bwct-usb.c b/server/drivers/hd44780-bwct-usb.c index 7d5c640..3c5652d 100644 --- a/server/drivers/hd44780-bwct-usb.c +++ b/server/drivers/hd44780-bwct-usb.c @@ -6,7 +6,7 @@ /* Copyright (c) 2004, Bernd Walter * Contributions: - * Copyright (c) 2004, Peter Marschall + * Copyright (c) 2004-7, Peter Marschall * * This file is released under the GNU General Public License. Refer to the * COPYING file distributed with this package. @@ -33,6 +33,12 @@ #endif +// connection type specific functions to be exposed using pointers in init() +void bwct_usb_HD44780_senddata(PrivateData *p, unsigned char displayID, unsigned char flags, unsigned char ch); +void bwct_usb_HD44780_set_contrast(PrivateData *p, unsigned char value); +void bwct_usb_HD44780_close(PrivateData *p); + + /** * Initialize the driver. * \param drvthis Pointer to driver structure. @@ -51,7 +57,7 @@ hd_init_bwct_usb(Driver *drvthis) p->hd44780_functions->senddata = bwct_usb_HD44780_senddata; p->hd44780_functions->close = bwct_usb_HD44780_close; - drvthis->set_contrast = bwct_usb_set_contrast; + p->hd44780_functions->set_contrast = bwct_usb_HD44780_set_contrast; /* Read config file's contents: serial number and contrast */ @@ -164,9 +170,6 @@ hd_init_bwct_usb(Driver *drvthis) common_init(p, IF_4BIT); - /* set contrast: value comes from global init */ - bwct_usb_set_contrast(drvthis, p->contrast); - return 0; } @@ -200,24 +203,14 @@ bwct_usb_HD44780_close(PrivateData *p) /** * Change LCD contrast. * \param drvthis Pointer to driver structure. - * \param promille New contrast value in promille. + * \param value New contrast value (one byte). */ void -bwct_usb_set_contrast(Driver *drvthis, int promille) +bwct_usb_HD44780_set_contrast(PrivateData *p, unsigned char value) { - PrivateData *p = drvthis->private_data; - - // Check if value within range - if ((promille < 0) || (promille > 1000)) - return; - - // And set it (converted from [0,1000] -> [0,255]). - // If successful, update the local value. if (usb_control_msg(p->usbHandle, USB_TYPE_VENDOR, BWCT_LCD_SET_CONTRAST, - (promille * 255) / 1000, p->usbIndex, NULL, 0, 1000) < 0) - report(RPT_WARNING, "hd_init_lcd2usb: setting contrast failed"); - else - p->contrast = promille; + value, p->usbIndex, NULL, 0, 1000) < 0) + p->hd44780_functions->drv_report(RPT_WARNING, "bwct_usb_HD44780_set_contrast: setting contrast failed"); } diff --git a/server/drivers/hd44780-bwct-usb.h b/server/drivers/hd44780-bwct-usb.h index 3859876..4a75daa 100644 --- a/server/drivers/hd44780-bwct-usb.h +++ b/server/drivers/hd44780-bwct-usb.h @@ -18,8 +18,4 @@ // initialise this particular driver int hd_init_bwct_usb(Driver *drvthis); -void bwct_usb_HD44780_senddata(PrivateData *p, unsigned char displayID, unsigned char flags, unsigned char ch); -void bwct_usb_set_contrast(Driver *drvthis, int promille); -void bwct_usb_HD44780_close(PrivateData *p); - #endif diff --git a/server/drivers/hd44780-ftdi.c b/server/drivers/hd44780-ftdi.c index dcd030f..65534d3 100644 --- a/server/drivers/hd44780-ftdi.c +++ b/server/drivers/hd44780-ftdi.c @@ -32,7 +32,19 @@ # include "config.h" #endif -// initialize the driver + +// connection type specific functions to be exposed using pointers in init() +void ftdi_HD44780_senddata(PrivateData *p, unsigned char displayID, unsigned char flags, unsigned char ch); +void ftdi_HD44780_backlight(PrivateData *p, unsigned char state); +void ftdi_HD44780_close(PrivateData *p); + + +/** + * Initialize the driver. + * \param drvthis Pointer to driver structure. + * \retval 0 Success. + * \retval -1 Error. + */ int hd_init_ftdi(Driver *drvthis) { @@ -49,6 +61,7 @@ hd_init_ftdi(Driver *drvthis) vendor_id = drvthis->config_get_int(drvthis->name, "VendorID", 0, 0x0403); product_id = drvthis->config_get_int(drvthis->name, "ProductID", 0, 0x6001); + // these config settings are not documented intentionally p->ftdi_line_RS = drvthis->config_get_int(drvthis->name, "ftdi_line_RS", 0, 0x01); p->ftdi_line_RW = drvthis->config_get_int(drvthis->name, "ftdi_line_RW", 0, 0x02); p->ftdi_line_EN = drvthis->config_get_int(drvthis->name, "ftdi_line_EN", 0, 0x04); @@ -58,7 +71,7 @@ hd_init_ftdi(Driver *drvthis) ftdi_init(&p->ftdic); ftdi_set_interface(&p->ftdic, INTERFACE_A); f = ftdi_usb_open(&p->ftdic, vendor_id, product_id); - if(f < 0 && f != -5) { + if (f < 0 && f != -5) { report(RPT_ERR, "unable to open ftdi device: %d (%s)", f, ftdi_get_error_string(&p->ftdic)); return -1; } @@ -71,7 +84,7 @@ hd_init_ftdi(Driver *drvthis) ftdi_init(&p->ftdic2); ftdi_set_interface(&p->ftdic2, INTERFACE_B); f = ftdi_usb_open(&p->ftdic2, vendor_id, product_id); - if(f < 0 && f != -5) { + if (f < 0 && f != -5) { report(RPT_ERR, "unable to open second ftdi device: %d (%s)", f, ftdi_get_error_string(&p->ftdic2)); return -2; } @@ -89,6 +102,7 @@ hd_init_ftdi(Driver *drvthis) return 0; } + // ftdi_HD44780_senddata void ftdi_HD44780_senddata(PrivateData *p, unsigned char displayID, unsigned char flags, unsigned char ch) diff --git a/server/drivers/hd44780-ftdi.h b/server/drivers/hd44780-ftdi.h index 4bb15bd..786dec5 100644 --- a/server/drivers/hd44780-ftdi.h +++ b/server/drivers/hd44780-ftdi.h @@ -7,8 +7,4 @@ // initialise this particular driver int hd_init_ftdi(Driver *drvthis); -void ftdi_HD44780_senddata(PrivateData *p, unsigned char displayID, unsigned char flags, unsigned char ch); -void ftdi_HD44780_backlight(PrivateData *p, unsigned char state); -void ftdi_HD44780_close(PrivateData *p); - #endif diff --git a/server/drivers/hd44780-lcd2usb.c b/server/drivers/hd44780-lcd2usb.c index c15121a..c45ff11 100644 --- a/server/drivers/hd44780-lcd2usb.c +++ b/server/drivers/hd44780-lcd2usb.c @@ -25,6 +25,14 @@ #endif +// connection type specific functions to be exposed using pointers in init() +void lcd2usb_HD44780_senddata(PrivateData *p, unsigned char displayID, unsigned char flags, unsigned char ch); +void lcd2usb_HD44780_backlight(PrivateData *p, unsigned char state); +unsigned char lcd2usb_HD44780_scankeypad(PrivateData *p); +void lcd2usb_HD44780_close(PrivateData *p); +void lcd2usb_HD44780_set_contrast(PrivateData *p, unsigned char value); + + /** * Initialize the driver. * \param drvthis Pointer to driver structure. @@ -42,8 +50,7 @@ hd_init_lcd2usb(Driver *drvthis) p->hd44780_functions->backlight = lcd2usb_HD44780_backlight; p->hd44780_functions->scankeypad = lcd2usb_HD44780_scankeypad; p->hd44780_functions->close = lcd2usb_HD44780_close; - drvthis->set_contrast = lcd2usb_set_contrast; - drvthis->set_brightness = lcd2usb_set_brightness; + p->hd44780_functions->set_contrast = lcd2usb_HD44780_set_contrast; /* try to find USB device */ #if 0 @@ -91,9 +98,6 @@ hd_init_lcd2usb(Driver *drvthis) common_init(p, IF_4BIT); - /* set contrast: value comes from global hd44780 init */ - lcd2usb_set_contrast(drvthis, p->contrast); - return 0; } @@ -136,24 +140,14 @@ lcd2usb_HD44780_backlight(PrivateData *p, unsigned char state) /** * Change LCD contrast. * \param drvthis Pointer to driver structure. - * \param promille New contrast value in promille. + * \param value New contrast value (one byte). */ void -lcd2usb_set_contrast(Driver *drvthis, int promille) +lcd2usb_HD44780_set_contrast(PrivateData *p, unsigned char value) { - PrivateData *p = drvthis->private_data; - - // Check if value within range - if ((promille < 0) || (promille > 1000)) - return; - - // And set it (converted from [0,1000] -> [0,255]). - // If successful, update the local value. if (usb_control_msg(p->usbHandle, USB_TYPE_VENDOR, LCD2USB_SET_CONTRAST, - (promille * 255) / 1000, 0, NULL, 0, 1000) < 0) - report(RPT_WARNING, "hd_init_lcd2usb: setting contrast failed"); - else - p->contrast = promille; + value, 0, NULL, 0, 1000) < 0) + p->hd44780_functions->drv_report(RPT_WARNING, "lcd2usb_HD44780_set_contrast: setting contrast failed"); } diff --git a/server/drivers/hd44780-lcd2usb.h b/server/drivers/hd44780-lcd2usb.h index bf5e3ad..3e4548e 100644 --- a/server/drivers/hd44780-lcd2usb.h +++ b/server/drivers/hd44780-lcd2usb.h @@ -34,12 +34,4 @@ // initialise this particular driver int hd_init_lcd2usb(Driver *drvthis); -void lcd2usb_HD44780_senddata(PrivateData *p, unsigned char displayID, unsigned char flags, unsigned char ch); -void lcd2usb_HD44780_backlight(PrivateData *p, unsigned char state); -unsigned char lcd2usb_HD44780_scankeypad(PrivateData *p); -void lcd2usb_HD44780_close(PrivateData *p); -void lcd2usb_set_contrast(Driver *drvthis, int promille); -void lcd2usb_set_brightness(Driver *drvthis, int state, int promille); - - #endif diff --git a/server/drivers/hd44780-low.h b/server/drivers/hd44780-low.h index 01c83cb..3c7d75f 100644 --- a/server/drivers/hd44780-low.h +++ b/server/drivers/hd44780-low.h @@ -195,6 +195,7 @@ typedef struct driver_private_data { typedef struct hwDependentFns { // microsec pauses void (*uPause)(PrivateData *p, int usecs); + // report and debug helper: set by global hd44780 init void (*drv_report)(const int level, const char *format, .../*args*/); void (*drv_debug)(const int level, const char *format, .../*args*/); @@ -213,11 +214,6 @@ typedef struct hwDependentFns { // value - new value to be set void (*set_contrast)(PrivateData *p, unsigned char value); - // Switch the backlight on or off - // state - backlight state to set the new value for - // value - new value to be set - void (*set_brightness)(PrivateData *p, int backlight, unsigned char value); - // Read the keypad // Ydata - the up to 11 bits that should be put on the Y side of the matrix // return - the up to 5 bits that are read out on the X side of the matrix diff --git a/server/drivers/hd44780.c b/server/drivers/hd44780.c index 83deb8e..09c0d32 100644 --- a/server/drivers/hd44780.c +++ b/server/drivers/hd44780.c @@ -37,13 +37,16 @@ * This file is released under the GNU General Public License. Refer to the * COPYING file distributed with this package. * - * Copyright (c) 2000, 1999, 1995 Benjamin Tse - * 2001 Joris Robijn - * 2001 Mark Haemmerling - * 2000 Charles Steinkuehler - * 1999 Andrew McMeikan - * 1998 Richard Rognlie + * Copyright (c) 1995,1999,2000 Benjamin Tse * 1997 Matthias Prinke + * 1998 Richard Rognlie + * 1999 Andrew McMeikan + * 2000 Charles Steinkuehler + * 2001 Joris Robijn + * 2001 Guillaume Filion + * 2001 Mark Haemmerling + * 2006 Matteo Pillon + * 2007 Peter Marschall */ @@ -374,7 +377,6 @@ HD44780_init(Driver *drvthis) p->hd44780_functions->senddata = NULL; p->hd44780_functions->backlight = NULL; p->hd44780_functions->set_contrast = NULL; - p->hd44780_functions->set_brightness = NULL; p->hd44780_functions->readkeypad = NULL; p->hd44780_functions->scankeypad = NULL; p->hd44780_functions->output = NULL; @@ -408,6 +410,8 @@ HD44780_init(Driver *drvthis) if (p->hd44780_functions->output == NULL) p->have_output = 0; + // set contrast + HD44780_set_contrast(drvthis, p->contrast); // Display startup parameters on the LCD HD44780_clear(drvthis); @@ -759,6 +763,33 @@ HD44780_get_contrast(Driver *drvthis) } +/** + * Change LCD contrast. + * \param drvthis Pointer to driver structure. + * \param promille New contrast value in promille. + */ +MODULE_EXPORT void +HD44780_set_contrast (Driver *drvthis, int promille) +{ + PrivateData *p = drvthis->private_data; + unsigned char contrast_byte; + + /* Check it */ + if (promille < 0 || promille > 1000) + return; + + /* store the software value since there is not get */ + p->contrast = promille; + + /* map range [0, 1000] -> [0, 255] (for one byte)) */ + contrast_byte = (255 * promille) / 1000; + + /* call local function */ + if (p->hd44780_functions->set_contrast != NULL) + p->hd44780_functions->set_contrast(p, contrast_byte); +} + + /** * Retrieve brightness. * \param drvthis Pointer to driver structure. @@ -774,6 +805,32 @@ HD44780_get_brightness(Driver *drvthis, int state) } +/** + * Set on/off brightness. + * \param drvthis Pointer to driver structure. + * \param state Brightness state (on/off) for which we want to store the value. + * \param promille New brightness in promille. + */ +MODULE_EXPORT void +HD44780_set_brightness(Driver *drvthis, int state, int promille) +{ + PrivateData *p = drvthis->private_data; + + /* Check it */ + if (promille < 0 || promille > 1000) + return; + + /* store the software value since there is not get */ + if (state == BACKLIGHT_ON) { + p->brightness = promille; + } + else { + p->offbrightness = promille; + } + //HD44780_backlight(drvthis, state); +} + + /** * Turn the LCD backlight on or off. * \param drvthis Pointer to driver structure. diff --git a/server/drivers/hd44780.h b/server/drivers/hd44780.h index da9e8e0..c4a7d59 100644 --- a/server/drivers/hd44780.h +++ b/server/drivers/hd44780.h @@ -39,9 +39,9 @@ MODULE_EXPORT void HD44780_set_char(Driver *drvthis, int n, unsigned char *dat); MODULE_EXPORT int HD44780_get_free_chars(Driver *drvthis); MODULE_EXPORT int HD44780_get_contrast(Driver *drvthis); -//MODULE_EXPORT void HD44780_set_contrast(Driver *drvthis, int promille); +MODULE_EXPORT void HD44780_set_contrast(Driver *drvthis, int promille); MODULE_EXPORT int HD44780_get_brightness(Driver *drvthis, int state); -//MODULE_EXPORT void HD44780_set_brightness(Driver *drvthis, int state, int promille); +MODULE_EXPORT void HD44780_set_brightness(Driver *drvthis, int state, int promille); MODULE_EXPORT void HD44780_backlight(Driver *drvthis, int on); MODULE_EXPORT void HD44780_output(Driver *drvthis, int state);