From 27bb3801b2b994dc9d55855fd76ccb89a73463db Mon Sep 17 00:00:00 2001 From: mmdolze Date: Sun, 7 Apr 2013 11:50:29 +0000 Subject: [PATCH] Add new connection type 'piplate' to the hd44780 driver (by J. Brogdon). In the documentation replace the list of the connection types for hd44780 driver with the table also used in the configuration options description (use only a single place to list and link everyting). While there, remove the assembly code for lcdserializer. --- ChangeLog | 1 + acinclude.m4 | 1 + docs/lcdproc-user/drivers/hd44780.docbook | 555 ++++++++-------------- server/drivers/Makefile.am | 2 +- server/drivers/hd44780-drivers.h | 2 + server/drivers/hd44780-low.h | 1 + server/drivers/hd44780-piplate.c | 373 +++++++++++++++ server/drivers/hd44780-piplate.h | 9 + 8 files changed, 578 insertions(+), 366 deletions(-) create mode 100644 server/drivers/hd44780-piplate.c create mode 100644 server/drivers/hd44780-piplate.h diff --git a/ChangeLog b/ChangeLog index c3d9b33..03c427b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -13,6 +13,7 @@ v0.5dev (ongoing development) + hd44780: Added 'raspberrypi' connection type (P. Corner) * Build system: Rename configure.in to configure.ac + hd44780: Add support for FreeBSD's iic I2C framework + + hd44780: New connection type 'piplate' (J. Brogdon) v0.5.6 - Remove deprecated CFontz633 driver. Use CFontzPacket with Model=633 instead! diff --git a/acinclude.m4 b/acinclude.m4 index 3cc9b6c..3fe1325 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -227,6 +227,7 @@ dnl else fi if test "$x_ac_have_i2c" = yes; then HD44780_DRIVERS="$HD44780_DRIVERS hd44780-hd44780-i2c.o" + HD44780_DRIVERS="$HD44780_DRIVERS hd44780-hd44780-piplate.o" fi dnl The hd4470-rpi driver only works on a Raspberry Pi, dnl which is an ARM platform. Require people to compile on diff --git a/docs/lcdproc-user/drivers/hd44780.docbook b/docs/lcdproc-user/drivers/hd44780.docbook index 7d07ab5..881cf6a 100644 --- a/docs/lcdproc-user/drivers/hd44780.docbook +++ b/docs/lcdproc-user/drivers/hd44780.docbook @@ -24,165 +24,163 @@ Each of these different ways is called a connection type of the driver. - -On a parallel port, probably the first interface type HD44780 devices were -historically connected to, the driver supports the connection types: - - - - - 4bit: - 4bit Wiring - - - - 8bit: - 8bit Wiring ("lcdtime") - - - - winamp: - 8bit Wiring "winamp" Style - - - - serialLpt: - Serial LPT Wiring - - - - -For serial RS-232 ports you can choose among these connection types: - - - - - picanlcd: - PIC-an-LCD serial device - - - - lcdserializer: - LCD serializer - - - - los-panel: - LCD on Serial panel device () - - - - vdr-lcd: - VDR LCD serial device - - - - vdr-wakeup: - VDR-Wakeup module - - - - -In recent years, with with parallel ports and serial ports being declared legacy -and on the demise on modern computers, the USB connection types get -more important. Here are the USB connection types the HD44780 driver supports: - - - - - pertelian: - Pertelian X2040 LCD display () - - - - bwctusb: - BWCT USB LCD module () - - - - lcd2usb: - Till Harbaum's LCD2USB () - - - - usbtiny: - Dick Streefland's USBtiny () - - - - uss720: - Display connected to USS-720 USB-to-IEEE 1284 Bridge (Belkin F5U002) - - - - lis2: - LIS2 from VLSystem () - - - - mplay: - MPlay Blast from VLSystem () - - - - ftdi: - Display connected to a dual channel FTDI 2232D USB chip - - - - usblcd: - USBLCD from Adams IT Services () - - - - USB-4-all: - Display connected to USB-4-all controller () - - - - - -Last but not least, for special purposes, there are even more connection types: - - - - - i2c: - LCD driven by PCF8574(A)/PCA9554(A) connected via I2C - - - - ethlcd: - Display connected via TCP to PoE powered ethlcd device () - - - - raspberrypi: - LCD connected to the GPIO header of a Raspberry Pi - - - - - Depending on the connection type and the display connected, the driver supports various special features. Input keys - software controllable brightness / backlight - software controllable contrast + Software controllable brightness / backlight + Software controllable contrast multiple displays / multi-controller displays - + + Parallel port connection types: + + + 4bit + 4-bit wiring. This is the default. + + + 8bit + 8-bit wiring ("lcdtime" style) + + + winamp + 8-bit wiring ("winamp" style) + + + serialLpt + Serial LPT wiring + + + + Serial (RS-232) connection types: + + + picanlcd + PIC-an-LCD serial device "picanlcd" + + + lcdserializer + LCD serializer "lcdserializer" + + + los-panel + LCD on Serial panel device "los-panel" () + + + vdr-lcd + VDR LCD serial device "vdr-lcd" + + + vdr-wakeup + VDR-Wakeup module "vdr-wakeup" + + + + USB connection types: + + + pertelian + Pertelian X2040 LCD display () + + + lis2 + LIS2 from VLSystem () + + + mplay + MPlay Blast from VLSystem () + + + usblcd + USBLCD adapter from Adams IT Services () + + + bwctusb + BWCT USB device "bwctusb" () + + + lcd2usb + Till Harbaum's LCD2USB () + + + usbtiny + Dick Streefland's USBtiny () + + + uss720 + Belkin USS-720 USB-to-IEEE 1284 Bridge (Belkin F5U002) + + + USB-4-all + The USB-4-all controller board from Sprut () + + + ftdi + Display connected to a FTDI RS2232 (dual channel) or + FTDI RS232 (single channel) USB chip + + + + I2C connection types: + + + i2c + LCD driven by PCF8574(A)/PCA9554(A) connected via I2C + + + piplate + Adafruit RGB Positive 16x2 LCD+Keypad for Raspberry Pi + + + + Other connection types: + + + ethlcd + Display connected via TCP to PoE powered ethlcd device + () + + + raspberrypi + LCD connected to the GPIO header of a Raspberry Pi + + + + + + + + + If you suspect the table above to be outdated, you might want to have a look at + server/drivers/hd44780-drivers.h in LCDproc's + source directory which contains the actual translation code. + + ---> @@ -2229,105 +2227,6 @@ Device=/dev/ttyS0 Finally, start the daemon and relax watching lcdproc running. - - -Customizing startup message - - -If want to change the default startup message (OK.), you can edit the asm source -and write anything you want. -Open the asm source with your preferred editor and look for this: - - - - - - - - - -This piece of code sends three characters to the LCD. -The first line sets the value of w register (working register, aka accumulator) to 0x4F ('O' in ascii). The second line copies this -value to ARG1, then the value is sent to the LCD. The fourth line delays the execution. - - - -You don't have to write the ASCII values in your modification, gpasm does the translation for you, so -if you want to see Booting... at startup, change the code above to look like this: - - - - - - - - - -Refer to burning section in order to compile and reflash the new firmware. - - @@ -3121,9 +3020,46 @@ pin_BL=17 - + +Adafruit Pi Plate + + +The Adafruit RGB Positive 16x2 LCD+Keypad for Raspberry Pi (aka Pi Plate, +see ()) combines +a 16x2 Character LCD, up to 3 backlight pins AND 5 keypad pins using only +the two I2C pins on the Rasperry Pi. + + + +Note that this connection type drives all RGB pins of the backlight at the +same time, resulting in a white backlight. You will need to modify the +source code if you want to have some other color. + + + +HD44780: Configuration example for Pi Plate connection type + + + + + + @@ -3159,6 +3095,9 @@ This can be done by specifying or by inclu Common values for PORT are 0x278, 0x378 and 0x3BC. If not given, the default is 0x378. + + For I2C connection types this sets the slave + address. @@ -3201,130 +3140,16 @@ This can be done by specifying or by inclu usb4all | ftdi | i2c | + piplate | ethlcd | raspberrypi } - Select the type of the wiring / display connection. + Select the type of the wiring / display connection. See also + (). - - - - - ConnectionType - Wiring / Display Type - - - - - - 4bit - 4bit Wiring to parallel port(default) - - - 8bit - 8bit Wiring to parallel port ("lcdtime") - - - winamp - 8bit Wiring "winamp" Style to parallel port - - - serialLpt - Serial LPT Wiring - - - - picanlcd - PIC-an-LCD serial device "picanlcd" - - - lcdserializer - LCD serializer "lcdserializer" - - - los-panel - LCD on Serial panel device "los-panel" () - - - vdr-lcd - VDR LCD serial device "vdr-lcd" - - - vdr-wakeup - VDR-Wakeup module "vdr-wakeup" - - - pertelian - Pertelian X2040 LCD display () - - - - lis2 - LIS2 from VLSystem () - - - mplay - MPlay Blast from VLSystem () - - - usblcd - USBLCD adapter from Adams IT Services () - - - bwctusb - BWCT USB device "bwctusb" () - - - lcd2usb - Till Harbaum's LCD2USB () - - - usbtiny - Dick Streefland's USBtiny () - - - uss720 - Belkin USS-720 USB-to-IEEE 1284 Bridge - - - USB-4-all - The USB-4-all controller board from Sprut () - - - ftdi - Display connected to a dual channel FTDI 2232D USB chip - - - - i2c - LCD driven by PCF8574(A)/PCA9554(A) connected via I2C - - - - ethlcd - ethlcd device () - - - - raspberrypi - LCD connected to the GPIO header of a Raspberry Pi - - - - - - - - - If you suspect the table above to be outdated, you might want to have a look at - server/drivers/hd44780-drivers.h in LCDproc's - source directory which contains the actual translation code. - - - diff --git a/server/drivers/Makefile.am b/server/drivers/Makefile.am index 6a982cf..20c9db7 100644 --- a/server/drivers/Makefile.am +++ b/server/drivers/Makefile.am @@ -95,7 +95,7 @@ EXTRA_glcd_SOURCES = glcd-t6963.c t6963_low.c t6963_low.h glcd-png.c glcd-serdis glcdlib_SOURCES = lcd.h lcd_lib.h glcdlib.h glcdlib.c report.h glk_SOURCES = lcd.h glk.c glk.h glkproto.c glkproto.h report.h hd44780_SOURCES = lcd.h lcd_lib.h hd44780.h hd44780.c hd44780-drivers.h hd44780-low.h hd44780-charmap.h report.h adv_bignum.h -EXTRA_hd44780_SOURCES = hd44780-4bit.c hd44780-4bit.h hd44780-ext8bit.c hd44780-ext8bit.h lcd_sem.c lcd_sem.h hd44780-serialLpt.c hd44780-serialLpt.h hd44780-serial.c hd44780-serial.h hd44780-winamp.c hd44780-winamp.h hd44780-bwct-usb.c hd44780-bwct-usb.h hd44780-lcd2usb.c hd44780-lcd2usb.h hd44780-usbtiny.c hd44780-usbtiny.h hd44780-lis2.c hd44780-lis2.h hd44780-i2c.c hd44780-i2c.h hd44780-ftdi.c hd44780-ftdi.h hd44780-ethlcd.c hd44780-ethlcd.h hd44780-uss720.c hd44780-uss720.h hd44780-usblcd.c hd44780-usblcd.h hd44780-usb4all.c hd44780-usb4all.h port.h hd44780-rpi.c hd44780-rpi.h lpt-port.h timing.h +EXTRA_hd44780_SOURCES = port.h lpt-port.h timing.h lcd_sem.c lcd_sem.h hd44780-4bit.c hd44780-4bit.h hd44780-ext8bit.c hd44780-ext8bit.h hd44780-serialLpt.c hd44780-serialLpt.h hd44780-serial.c hd44780-serial.h hd44780-winamp.c hd44780-winamp.h hd44780-bwct-usb.c hd44780-bwct-usb.h hd44780-lcd2usb.c hd44780-lcd2usb.h hd44780-usbtiny.c hd44780-usbtiny.h hd44780-lis2.c hd44780-lis2.h hd44780-i2c.c hd44780-i2c.h hd44780-ftdi.c hd44780-ftdi.h hd44780-ethlcd.c hd44780-ethlcd.h hd44780-uss720.c hd44780-uss720.h hd44780-usblcd.c hd44780-usblcd.h hd44780-usb4all.c hd44780-usb4all.h hd44780-rpi.c hd44780-rpi.h hd44780-piplate.c hd44780-piplate.h i2500vfd_SOURCES = lcd.h i2500vfd.c i2500vfd.h glcd_font5x8.h report.h icp_a106_SOURCES = lcd.h lcd_lib.h icp_a106.c icp_a106.h report.h imon_SOURCES = lcd.h lcd_lib.h hd44780-charmap.h imon.h imon.c report.h adv_bignum.h diff --git a/server/drivers/hd44780-drivers.h b/server/drivers/hd44780-drivers.h index 9471dac..b155451 100644 --- a/server/drivers/hd44780-drivers.h +++ b/server/drivers/hd44780-drivers.h @@ -31,6 +31,7 @@ #endif #ifdef HAVE_I2C # include "hd44780-i2c.h" +# include "hd44780-piplate.h" #endif #ifdef WITH_ETHLCD # include "hd44780-ethlcd.h" @@ -80,6 +81,7 @@ static const ConnectionMapping connectionMapping[] = { /* I2C connection types */ #ifdef HAVE_I2C { "i2c", HD44780_CT_I2C, IF_TYPE_I2C, hd_init_i2c }, + { "piplate", HD44780_CT_PIPLATE, IF_TYPE_I2C, hd_init_i2c_piplate }, #endif /* TCP socket connection types */ #ifdef WITH_ETHLCD diff --git a/server/drivers/hd44780-low.h b/server/drivers/hd44780-low.h index 7c6bb22..4914dca 100644 --- a/server/drivers/hd44780-low.h +++ b/server/drivers/hd44780-low.h @@ -54,6 +54,7 @@ #define HD44780_CT_USBTINY 20 #define HD44780_CT_USB4ALL 21 #define HD44780_CT_RASPBERRYPI 22 +#define HD44780_CT_PIPLATE 23 /**@}*/ /** \name Symbolic names for interface types diff --git a/server/drivers/hd44780-piplate.c b/server/drivers/hd44780-piplate.c new file mode 100644 index 0000000..ab4f373 --- /dev/null +++ b/server/drivers/hd44780-piplate.c @@ -0,0 +1,373 @@ +/** \file server/drivers/hd44780-piplate.c + * + * \c I2C (via MCP23017) connection type of \c hd44780 driver for Hitachi + * HD44780 based LCD displays connected to the MCP23017 I2C I/O expander + * (Adafruit Pi Plate, see http://www.adafruit.com/products/1109). + * + * The LCD is operated in its 4 bit-mode to be connected to the 8 bit-port + * of a single MCP23017 that is accessed by the server via the I2C bus. + */ + +/*- + * Copyright (c) 2013 Jonathan Brogdon + * + * This file is released under the GNU General Public License. Refer to the + * COPYING file distributed with this package. + * + * Based mostly on the hd44780-i2c module, see there for a complete history. + */ + +/*- + * The connections are: + * MCP23017 LCD + * GPA7 Green LCD backlight + * GPA6 Red LCD backlight + * GPA4 Left key + * GPA3 Up key + * GPA2 Down key + * GPA1 Right key + * GPA0 Select key + * GPB7 RS (4) + * GPB6 RW (5) + * GPB5 EN (6) + * GPB4 D7 (14) + * GPB3 D6 (13) + * GPB2 D5 (12) + * GPB1 D4 (11) + * GPB0 Blue LCD backlight + * + * Configuration: + * device=/dev/i2c-1 # the device file of the i2c bus + * port=0x20 # the i2c address of the i2c port expander + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "hd44780-piplate.h" +#include "hd44780-low.h" +#include "report.h" + +#include +#include +#include +#include +#include +#include + +#ifdef HAVE_DEV_IICBUS_IIC_H +# include +# include +#else /* HAVE_LINUX_I2C_DEV_H */ +# include +#endif + +#define DEFAULT_DEVICE "/dev/i2c-1" + +void i2c_piplate_HD44780_senddata(PrivateData *p, + unsigned char displayID, unsigned char flags, unsigned char ch); +void i2c_piplate_HD44780_backlight(PrivateData *p, unsigned char state); +unsigned char i2c_piplate_HD44780_scankeypad(PrivateData *p); +void i2c_piplate_HD44780_close(PrivateData *p); + +/* MCP23017 registers */ +#define MCP23017_IODIRA 0x00 +#define MCP23017_IODIRB 0x01 +#define MCP23017_GPPUA 0x0C +#define MCP23017_GPPUB 0x0D +#define MCP23017_GPIOA 0x12 +#define MCP23017_GPIOB 0x13 + +/* GPIOA BITS */ +#define G_BIT (1 << 7) +#define R_BIT (1 << 6) +#define L_KEY_BIT (1 << 4) +#define U_KEY_BIT (1 << 3) +#define D_KEY_BIT (1 << 2) +#define R_KEY_BIT (1 << 1) +#define S_KEY_BIT (1 << 0) + +/* GPIOB BITS */ +#define RS_BIT (1 << 7) +#define RW_BIT (1 << 6) +#define EN_BIT (1 << 5) +#define D0_BIT (1 << 4) +#define D1_BIT (1 << 3) +#define D2_BIT (1 << 2) +#define D3_BIT (1 << 1) +#define B_BIT (1 << 0) + +/* Reverses the bits in a 4 bit word */ +#define SWIZZLE_4BITS(x) ((((x) & 0x01) << 3) | (((x) & 0x02) << 1) | (((x) & 0x04) >> 1) | (((x) & 0x08) >> 3)) + +/* Swizzle and offset bits correctly for the PiPlate wiring */ +#define DATA_BIT_START_OFFSET 1 +#define MAP_TO_DATA_PINS(x) (SWIZZLE_4BITS(x) << DATA_BIT_START_OFFSET) + +#define I2C_ADDR_MASK 0x7f + +/** + * Read one of the MCP23017 registers + * \param p Pointer to driver private data. + * \param reg Address of the register to read. + * \param val Pointer to the read buffer. + * \retval 0 Success. + * \retval -1 Error. + */ +static int +i2c_read_reg(PrivateData *p, unsigned char reg, unsigned char *val) +{ + /* Set the address to be read */ + if (write(p->fd, ®, 1) != 1) { + return -1; + } + + /* Read the value */ + if (read(p->fd, val, 1) != 1) { + return -1; + } + + return 0; +} + +/** + * Write one of the MCP23017 registers + * \param p Pointer to driver private data. + * \param reg Address of the register to write. + * \param val Value to be written. + * \retval 0 Success. + * \retval -1 Error. + */ +static int +i2c_write_reg(PrivateData *p, unsigned char reg, unsigned char val) +{ + unsigned char buf[2]; + + buf[0] = reg; + buf[1] = val; + if (write(p->fd, buf, sizeof(buf)) != sizeof(buf)) { + return -1; + } + return 0; +} + +/** + * Initialize the driver. + * \param drvthis Pointer to driver structure. + * \retval 0 Success. + * \retval -1 Error. + */ +int +hd_init_i2c_piplate(Driver *drvthis) +{ + PrivateData *p = (PrivateData *) drvthis->private_data; + HD44780_functions *hd44780_functions = p->hd44780_functions; + char device[256] = DEFAULT_DEVICE; +#ifdef HAVE_DEV_IICBUS_IIC_H + struct iiccmd cmd; + bzero(&cmd, sizeof(cmd)); +#endif + + /* Get serial device to use */ + strncpy(device, drvthis->config_get_string(drvthis->name, "Device", 0, DEFAULT_DEVICE), sizeof(device)); + device[sizeof(device) - 1] = '\0'; + report(RPT_INFO, "HD44780: piplate: Using device '%s' and address 0x%02X for a MCP23017", + device, p->port & I2C_ADDR_MASK); + + /* Open the I2C device */ + p->fd = open(device, O_RDWR); + if (p->fd < 0) { + report(RPT_ERR, "HD44780: piplate: open i2c device '%s' failed: %s", + device, strerror(errno)); + return -1; + } + + /* Set I2C address */ +#ifdef HAVE_DEV_IICBUS_IIC_H + cmd.slave = (p->port & I2C_ADDR_MASK) << 1; + cmd.last = 0; + cmd.count = 0; + if (ioctl(p->fd, I2CRSTCARD, &cmd) < 0) { + report(RPT_ERR, "HD44780: piplate: reset bus failed: %s", strerror(errno)); + return -1; + } + if (ioctl(p->fd, I2CSTART, &cmd) < 0) { + report(RPT_ERR, "HD44780: piplate: set address to 0x%02X: %s", + p->port & I2C_ADDR_MASK, strerror(errno)); + return -1; + } +#else /* HAVE_LINUX_I2C_DEV_H */ + if (ioctl(p->fd, I2C_SLAVE, p->port & I2C_ADDR_MASK) < 0) { + report(RPT_ERR, "HD44780: piplate: set address to 0x%02X: %s", + p->port & I2C_ADDR_MASK, strerror(errno)); + return -1; + } +#endif + + /* IODIRA - keys as input, all other as output */ + i2c_write_reg(p, MCP23017_IODIRA, + (unsigned char) (L_KEY_BIT | U_KEY_BIT | D_KEY_BIT | R_KEY_BIT | S_KEY_BIT) & ~(G_BIT | R_BIT)); + + /* IODIRB - LCD control/data bus signals as outputs */ + i2c_write_reg(p, MCP23017_IODIRB, + (unsigned char) ~(RS_BIT | RW_BIT | EN_BIT | D0_BIT | D1_BIT | D2_BIT | D3_BIT | B_BIT)); + + /* GPPUA - Pullups for key switch inputs */ + i2c_write_reg(p, MCP23017_GPPUA, + (unsigned char) (L_KEY_BIT | U_KEY_BIT | D_KEY_BIT | R_KEY_BIT | S_KEY_BIT) & ~(G_BIT | R_BIT)); + + /* GPPUB - Pullups disabled */ + i2c_write_reg(p, MCP23017_GPPUB, (unsigned char) 0x00); + + /* Set driver functions */ + hd44780_functions->senddata = i2c_piplate_HD44780_senddata; + hd44780_functions->backlight = i2c_piplate_HD44780_backlight; + hd44780_functions->scankeypad = i2c_piplate_HD44780_scankeypad; + hd44780_functions->close = i2c_piplate_HD44780_close; + + /* Initialize the LCD */ + hd44780_functions->senddata(p, 0, RS_INSTR, 0x33); + hd44780_functions->uPause(p, 1); + hd44780_functions->senddata(p, 0, RS_INSTR, 0x32); + hd44780_functions->uPause(p, 1); + common_init(p, IF_4BIT); + + report(RPT_INFO, "HD44780: piplate: initialized!"); + + return 0; +} + +/** + * Close the device. + * \param p Pointer to driver's private data structure. + */ +void +i2c_piplate_HD44780_close(PrivateData *p) +{ + if (p->fd >= 0) { + close(p->fd); + } +} + +/** + * Send data or commands to the display. + * \param p Pointer to driver's private data structure. + * \param displayID ID of the display (or 0 for all) to send data to. + * \param flags Defines whether to end a command or data. + * \param ch The value to send. + */ +void +i2c_piplate_HD44780_senddata(PrivateData *p, + unsigned char displayID, unsigned char flags, unsigned char ch) +{ + unsigned char nibble[2]; + unsigned char write_val = 0; + int nibble_idx = 0; + + /* Split the val byte into nibbles */ + nibble[0] = (ch >> 4); + nibble[1] = (ch & 0x0f); + + for (nibble_idx = 0; nibble_idx < 2; nibble_idx++) { + /* Adjust for 4-bit data pins */ + write_val = MAP_TO_DATA_PINS(nibble[nibble_idx]); + + /* Set the RS bit */ + if (flags == RS_INSTR) + write_val &= ~RS_BIT; + else + write_val |= RS_BIT; + + /* Set the blue backlight bit if backlight is on */ + if (p->backlightstate == BACKLIGHT_OFF) + write_val |= B_BIT; + + /* Set enable bit */ + i2c_write_reg(p, MCP23017_GPIOB, write_val | EN_BIT); + + p->hd44780_functions->uPause(p, 1); + + /* Clear enable bit */ + i2c_write_reg(p, MCP23017_GPIOB, write_val & ~EN_BIT); + + } /* for each nibble */ + + p->hd44780_functions->uPause(p, 1); +} + +/** + * Turn display backlight on or off. For the Pi Plate this means a read / + * modify / write cycle is required, as the bits are shared with other signals + * on the same byte. + * + * \param p Pointer to driver's private data structure. + * \param state New backlight status. + */ +void +i2c_piplate_HD44780_backlight(PrivateData *p, unsigned char state) +{ + unsigned char gpioa = 0; + unsigned char gpiob = 0; + + /* Read the RG bits */ + if (i2c_read_reg(p, MCP23017_GPIOA, &gpioa) != 0) { + return; + } + + /* Read the B bit */ + if (i2c_read_reg(p, MCP23017_GPIOB, &gpiob) != 0) { + return; + } + + /* Set or clear the RGB bits. Backlight is ON if the bits are CLEAR */ + if (state == BACKLIGHT_ON) { + gpioa &= ~(R_BIT | G_BIT); + gpiob &= ~(B_BIT); + } + else { + gpioa |= (R_BIT | G_BIT); + gpiob |= (B_BIT); + } + + /* Write the RGB bits */ + i2c_write_reg(p, MCP23017_GPIOA, gpioa); + i2c_write_reg(p, MCP23017_GPIOB, gpiob); +} + +/** + * Scan the LCD keys + * \param p Pointer to driver's private data structure. + * \retval key Key number + */ +unsigned char +i2c_piplate_HD44780_scankeypad(PrivateData *p) +{ + unsigned char gpioa = 0; + + /* Read the key bits */ + if (i2c_read_reg(p, MCP23017_GPIOA, &gpioa) != 0) + return 0; + + /* Select key */ + if ((gpioa & S_KEY_BIT) == 0) + return 1; + + /* Up key */ + if ((gpioa & U_KEY_BIT) == 0) + return 2; + + /* Down key */ + if ((gpioa & D_KEY_BIT) == 0) + return 3; + + /* Left key */ + if ((gpioa & L_KEY_BIT) == 0) + return 4; + + /* Right key */ + if ((gpioa & R_KEY_BIT) == 0) + return 5; + + return 0; +} diff --git a/server/drivers/hd44780-piplate.h b/server/drivers/hd44780-piplate.h new file mode 100644 index 0000000..3d41c33 --- /dev/null +++ b/server/drivers/hd44780-piplate.h @@ -0,0 +1,9 @@ +#ifndef HD_PIPLATE_H +#define HD_PIPLATE_H + +#include "lcd.h" /* for Driver */ + +/* initialise this particular driver */ +int hd_init_i2c_piplate(Driver *drvthis); + +#endif