Re-add hd44780-usblcd connection type for devices made by Adams IT Services.

This driver has been part of v0.4.5 but was never ported to v0.5.x.
This commit is contained in:
mmdolze
2009-05-11 06:23:39 +00:00
parent 85a2e68c23
commit adfe557115
9 changed files with 230 additions and 2 deletions
+1 -1
View File
@@ -80,7 +80,7 @@ g15_SOURCES = lcd.h lcd_lib.h g15.h g15-num.c g15.c report.h
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-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 port.h lpt-port.h timing.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-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 port.h lpt-port.h timing.h
icp_a106_SOURCES = lcd.h lcd_lib.h icp_a106.c icp_a106.h report.h
imon_SOURCES = lcd.h lcd_lib.h imon.h imon.c report.h
+2
View File
@@ -31,6 +31,7 @@
# include "hd44780-i2c.h"
#endif
# include "hd44780-ethlcd.h"
# include "hd44780-usblcd.h"
// add new connection type header files here
@@ -72,6 +73,7 @@ static const ConnectionMapping connectionMapping[] = {
#endif
/* TCP socket connection types */
{ "ethlcd", HD44780_CT_ETHLCD, IF_TYPE_TCP, hd_init_ethlcd },
{ "usblcd", HD44780_CT_USBLCD, IF_TYPE_USB, hd_init_usblcd },
// add new connection types here
// ....
// default, end of structure element (do not delete)
+1
View File
@@ -49,6 +49,7 @@
#define HD44780_CT_I2C 16
#define HD44780_CT_ETHLCD 17
#define HD44780_CT_USS720 18
#define HD44780_CT_USBLCD 19
// symbolic names for interface types
#define IF_TYPE_UNKNOWN 0
+174
View File
@@ -0,0 +1,174 @@
/** \file server/drivers/hd44780-usblcd.c
* \c ucdlcd connection type of \c hd44780 driver for Hitachi HD44780 based LCD
* displays. This driver does only work with Linux and requires a kernel driver
* available since 2.4.20-pre7.
*
* See http://www.usblcd.de for hardware and documentation.
*/
/*
* Copyright (C) 2002 Adams IT Services <info@usblcd.de>
*
* This driver is based on pic-an-lcd driver. See file hd44780-serial.c for
* additional Copyrights.
*
* This file is released under the GNU General Public License. Refer to the
* COPYING file distributed with this package.
*
* Modified February 2009 by Markus Dolze to use API v0.5.
*/
#include "hd44780-usblcd.h"
#include "shared/report.h"
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <string.h>
#include <fcntl.h>
#include <errno.h>
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#define DEFAULT_DEVICE "/dev/usb/lcd"
#define IOCTL_GET_HARD_VERSION 1
#define IOCTL_GET_DRV_VERSION 2
void usblcd_HD44780_senddata(PrivateData *p, unsigned char displayID, unsigned char flags, unsigned char ch);
void usblcd_HD44780_backlight(PrivateData *p, unsigned char state);
void usblcd_HD44780_close(PrivateData *p);
/**
* Initialize the driver.
* \param drvthis Pointer to driver structure.
* \retval 0 Success.
* \retval -1 Error opening device.
* \retval -2 Error reading or unsupported driver version.
* \retval -3 Error reading or unsupported hardware version.
*/
int
hd_init_usblcd(Driver *drvthis)
{
PrivateData *p = (PrivateData *) drvthis->private_data;
char device[256] = DEFAULT_DEVICE;
char buf[128];
int major, minor;
/* Get 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: USBLCD: using device: %s", device);
/* Set up io port correctly, and open it... */
p->fd = open(device, O_RDWR | O_NOCTTY | O_NDELAY);
if (p->fd == -1) {
report(RPT_ERR, "HD44780: USBLCD: could not open device %s (%s)", device, strerror(errno));
return -1;
}
/* Read and check kernel driver version */
memset(buf, 0, 128);
if (ioctl(p->fd, IOCTL_GET_DRV_VERSION, buf) != 0) {
report(RPT_ERR, "IOCTL failed, could not get Driver Version");
return -2;
}
report(RPT_INFO, "Driver Version: %s", buf);
if (sscanf(buf, "USBLCD Driver Version %d.%d", &major, &minor) != 2) {
report(RPT_ERR, "Could not read Driver Version");
return -2;
}
if (major != 1) {
report(RPT_ERR, "Driver Version not supported");
return -2;
}
/* Read and check hardware version */
memset(buf, 0, 128);
if (ioctl(p->fd, IOCTL_GET_HARD_VERSION, buf) != 0) {
report(RPT_ERR, "IOCTL failed, could not get Hardware Version");
return -3;
};
report(RPT_INFO, "Hardware Version: %s", buf);
if (sscanf(buf, "%d.%d", &major, &minor) != 2) {
report(RPT_ERR, "Could not read Hardware Version");
return -3;
};
if (major != 1) {
report(RPT_ERR, "Hardware Version not supported");
return -3;
}
/* Set local functions */
p->hd44780_functions->senddata = usblcd_HD44780_senddata;
p->hd44780_functions->backlight = usblcd_HD44780_backlight;
p->hd44780_functions->close = usblcd_HD44780_close;
common_init(p, IF_8BIT);
return 0;
}
/**
* 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
usblcd_HD44780_senddata(PrivateData *p, unsigned char displayID, unsigned char flags, unsigned char ch)
{
static const char instr_byte = 0;
if (flags == RS_DATA) {
/*
* Escape data byte 0x00 by sending it twice because it is
* used as instruction byte
*/
if (ch == '\0')
write(p->fd, &ch, 1);
write(p->fd, &ch, 1);
} else {
/* Instructions are sent prepending 0x00 as escape sequence */
write(p->fd, &instr_byte, 1);
write(p->fd, &ch, 1);
}
}
/**
* Turn display backlight on or off.
* \param p Pointer to driver's private data structure.
* \param state New backlight status.
*/
void
usblcd_HD44780_backlight(PrivateData *p, unsigned char state)
{
static const char instr_byte = 0;
static const char bl_on = 0x21;
static const char bl_off = 0x20;
write(p->fd, &instr_byte, 1);
if (state == BACKLIGHT_OFF)
write(p->fd, &bl_off, 1);
else
write(p->fd, &bl_on, 1);
}
/**
* Close the driver (do necessary clean-up).
* \param p Pointer to driver's private data structure.
*/
void
usblcd_HD44780_close(PrivateData *p)
{
close(p->fd);
}
/* EOF */
+11
View File
@@ -0,0 +1,11 @@
#ifndef HD_USBLCD_H
#define HD_USBLCD_H
#include "lcd.h" /* for lcd_logical_driver */
#include "hd44780-low.h" /* for HD44780_functions */
// initialise this particular driver, args is probably not used but keep
// for consistency
int hd_init_usblcd(Driver *drvthis);
#endif