new ConnectionType ethlcd for hd44780 (Mariusz Bialonczyk)

This commit is contained in:
marschap
2008-09-17 13:28:17 +00:00
parent 8c8e12364d
commit 0497178706
12 changed files with 240 additions and 1 deletions
+3
View File
@@ -245,6 +245,9 @@ Thomas Jarosch
Christian Jodar
- mx5000 driver
Mariusz Bialonczyk
- ethlcd connection type for HD44780
Further developers in the sourceforge lcdproc team:
+1
View File
@@ -53,6 +53,7 @@ v.0.5dev (ongoing development)
+ IOWarrior driver: add ExtendedMode option
* lcdproc: unbreak compilation on OS X 1.5 and higher (Topher Fangio)
* server: fix interpretation of numeric priorities (Andrew M. Bishop)
+ hd44780 driver: new ConnectionType ethlcd (Mariusz Bialonczyk)
v.0.5.2
* fix switching on/off the Load screen in lcdproc client using the menu
+3
View File
@@ -198,6 +198,9 @@ dnl else
if test "$enable_libftdi" = yes ; then
HD44780_DRIVERS="$HD44780_DRIVERS hd44780-hd44780-ftdi.o"
fi
if test "$enable_ethlcd" = yes ; then
HD44780_DRIVERS="$HD44780_DRIVERS hd44780-hd44780-ethlcd.o"
fi
AC_CHECK_HEADER(linux/i2c-dev.h,
HD44780_DRIVERS="$HD44780_DRIVERS hd44780-hd44780-i2c.o"
AC_DEFINE(HAVE_I2C,[1],[Define to 1 if you have the i2c headers])
+15
View File
@@ -269,6 +269,21 @@ fi
AC_SUBST(LIBFTDI_LIBS)
AC_SUBST(LIBFTDI_CFLAGS)
dnl ######################################################################
dnl ethlcd support
dnl ######################################################################
AC_MSG_CHECKING([if ethlcd support has been enabled]);
AC_ARG_ENABLE(ethlcd,
[AS_HELP_STRING([--disable-ethlcd],[disable ethlcd connection type for HD44780])],
[ if test "$enableval" != "no"; then
enable_ethlcd=yes
fi ],
[ enable_ethlcd=yes ]
)
AC_MSG_RESULT($enable_ethlcd)
dnl Select drivers to build
LCD_DRIVERS_SELECT
+3
View File
@@ -166,6 +166,9 @@ LCD in 4-bit mode driven by PCF8574(A) / PCA9554(A), connected via I2C bus
.TP
.B ftdi
USB connection via a FTDI FT2232D chip in bitbang mode
.TP
.B ethlcd
TCP connection using open source/open hardware ethlcd (http://manio.skyboo.net/ethlcd/)
.RE
.TP
.B icp_a106
+19
View File
@@ -118,6 +118,11 @@ more important. Here are the USB connection types the HD44780 driver supports:
<link linkend="hd44780-ftdi">ftdi</link>:
Display connected to a dual channel FTDI 2232D USB chip
</listitem>
<listitem>
<link linkend="hd44780-ethlcd">ethlcd</link>:
Display connected via TCP to PoE powered ethlcd device (<ulink url="http://manio.skyboo.net/ethlcd/"></ulink>)
</listitem>
</itemizedlist>
<para>
@@ -1849,6 +1854,20 @@ please look at the driver source if you really need that.
</sect3>
<sect3 id="hd44780-ethlcd">
<title>ethlcd device</title>
<para>
ethlcd (<ulink url="http://manio.skyboo.net/ethlcd"></ulink>)
is a PoE powered device controlled via TCP. It has a 3-state (ON, HALF, OFF) backlight
control, 6 buttons and a beeper. The hardware and software are open source.
To use it, specify the device IP address or hostname, on which the ethlcd device is
accessible by setting in config file the <command>Device</command> value.
The default is <filename>ethlcd</filename>.
</para>
</sect3>
<sect3 id="hd44780-lis2">
<title>LIS2 USB device "lis2"</title>
+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 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 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
+3
View File
@@ -29,6 +29,7 @@
#ifdef HAVE_I2C
# include "hd44780-i2c.h"
#endif
# include "hd44780-ethlcd.h"
// add new connection type header files here
@@ -67,6 +68,8 @@ static const ConnectionMapping connectionMapping[] = {
#ifdef HAVE_I2C
{ "i2c", HD44780_CT_I2C, IF_TYPE_I2C, hd_init_i2c },
#endif
/* TCP socket connection types */
{ "ethlcd", HD44780_CT_ETHLCD, IF_TYPE_TCP, hd_init_ethlcd },
// add new connection types here
// ....
// default, end of structure element (do not delete)
+154
View File
@@ -0,0 +1,154 @@
/** \file hd44780-ethlcd.c
* \c ethlcd connection type of \c hd44780 driver for Hitachi HD44780 based LCD displays.
*/
/*
* ethlcd ethernet driver module for Hitachi HD44780 based LCD displays
* ethlcd is an opensource project based on atmel's atmega microcontroller
* and enc28j60 ethernet device. The device is connected via ethernet, has own
* IP address and is available via TCP protocol. More info at project homepage:
* http://manio.skyboo.net/ethlcd/
*
* Copyright (c) 2008 Mariusz Bialonczyk <manio@skyboo.net>
*
* This file is released under the GNU General Public License. Refer to the
* COPYING file distributed with this package.
*
*/
#include "hd44780-ethlcd.h"
#include "hd44780-low.h"
#include "../../shared/sockets.h"
#include "report.h"
#include <stdio.h>
#include <string.h>
#include <bits/local_lim.h>
#include <fcntl.h>
void ethlcd_HD44780_senddata(PrivateData *p, unsigned char displayID, unsigned char flags, unsigned char ch);
unsigned char ethlcd_HD44780_scankeypad(PrivateData *p);
void ethlcd_HD44780_backlight(PrivateData *p, unsigned char state);
void ethlcd_HD44780_close(PrivateData *p);
// fake pause function (pausing is handled by ethlcd device itself)
void ethlcd_HD44780_uPause(PrivateData *p, int usecs) {}
// initialisation function
int hd_init_ethlcd(Driver *drvthis)
{
char hostname[HOST_NAME_MAX];
long flags;
PrivateData *p = (PrivateData*) drvthis->private_data;
HD44780_functions *hd44780_functions = p->hd44780_functions;
hd44780_functions->senddata = ethlcd_HD44780_senddata;
hd44780_functions->backlight = ethlcd_HD44780_backlight;
hd44780_functions->scankeypad = ethlcd_HD44780_scankeypad;
hd44780_functions->uPause = ethlcd_HD44780_uPause;
hd44780_functions->close = ethlcd_HD44780_close;
//reading configuration file
strncpy(hostname, drvthis->config_get_string(drvthis->name, "Device", 0, "ethlcd"), sizeof(hostname));
p->sock = sock_connect(hostname, DEFAULT_ETHLCD_PORT);
if (p->sock < 0) {
report(RPT_ERR, "Connecting to %s:%d failed", hostname, DEFAULT_ETHLCD_PORT);
return -1;
}
//we need to have a blocking read back again:
if (fcntl(p->sock, F_GETFL, &flags) < 0)
{
report(RPT_ERR, "Cannot set the socket to blocking mode");
return -1;
}
flags &= ~O_NONBLOCK;
fcntl(p->sock, F_SETFL, flags);
// Set up two-line, small character (5x8) mode
hd44780_functions->senddata(p, 0, RS_INSTR, FUNCSET | IF_4BIT | TWOLINE | SMALLCHAR);
common_init(p, IF_4BIT);
if (p->have_keypad) {
// Remember which input lines are stuck
p->stuckinputs = 0;
}
return 0;
}
// ethlcd_HD44780_senddata
void ethlcd_HD44780_senddata(PrivateData *p, unsigned char displayID, unsigned char flags, unsigned char ch)
{
static char buff[2];
if (flags == RS_INSTR)
buff[0] = ETHLCD_SEND_INSTR;
else //if (flags == RS_DATA)
buff[0] = ETHLCD_SEND_DATA;
buff[1] = ch;
sock_send(p->sock, buff, 2); //send data to device
sock_recv(p->sock, &buff, 1); //wait for reply
}
unsigned char ethlcd_HD44780_scankeypad(PrivateData *p)
{
unsigned char readval;
static char buff[2];
buff[0] = ETHLCD_GET_BUTTONS;
sock_send(p->sock, buff, 1); //send data to device
sock_recv(p->sock, &buff, 2); //wait for answer
if (buff[0] != ETHLCD_GET_BUTTONS) //check if this is true reply for our packet
return 0;
//answer should be in second byte on bits 0-6 in negative logic:
readval = buff[1];
readval = ~readval & 0x3F; //reverse logic
switch (readval)
{
case 1: return(0x34); //C
case 2: return(0x24); //B
case 4: return(0x14); //A
case 8: return(0x25); //F
case 16: return(0x15); //E
case 32: return(0x44); //D
default: return('\0');
}
}
void ethlcd_HD44780_backlight(PrivateData *p, unsigned char state)
{
static char buff[2];
buff[0] = ETHLCD_SET_BACKLIGHT;
if (state == BACKLIGHT_ON)
{
if (p->brightness >= 500)
buff[1] = ETHLCD_BACKLIGHT_ON;
else
buff[1] = ETHLCD_BACKLIGHT_HALF;
}
else
buff[1] = ETHLCD_BACKLIGHT_OFF;
sock_send(p->sock, buff, 2); //send data to device
sock_recv(p->sock, &buff, 1); //wait for reply
}
void ethlcd_HD44780_close(PrivateData *p)
{
sock_close(p->sock);
}
+27
View File
@@ -0,0 +1,27 @@
#ifndef HD_ETHLCD_H
#define HD_ETHLCD_H
#include "lcd.h" /* for Driver */
// initialise this particular driver
int hd_init_ethlcd(Driver *drvthis);
#define DEFAULT_ETHLCD_PORT 2425
// ethlcd protocol constants:
#define ETHLCD_SEND_INSTR 0x01
#define ETHLCD_SEND_DATA 0x02
#define ETHLCD_GET_BUTTONS 0x03
#define ETHLCD_SET_BACKLIGHT 0x04
#define ETHLCD_SET_BEEP 0x05
#define ETHLCD_GET_FIRMWARE_VERSION 0x06
#define ETHLCD_GET_PROTOCOL_VERSION 0x07
#define ETHLCD_GET_ENC_REVISION 0x08
#define ETHLCD_CLOSE_CONN 0x09
#define ETHLCD_UNRECOGNIZED_COMMAND 0x0A
#define ETHLCD_BACKLIGHT_ON 0x01
#define ETHLCD_BACKLIGHT_HALF 0x02
#define ETHLCD_BACKLIGHT_OFF 0x03
#endif
+4
View File
@@ -47,6 +47,7 @@
#define HD44780_CT_LCDUSB 14
#define HD44780_CT_FTDI 15
#define HD44780_CT_I2C 16
#define HD44780_CT_ETHLCD 17
// symbolic names for interface types
#define IF_TYPE_UNKNOWN 0
@@ -54,6 +55,7 @@
#define IF_TYPE_SERIAL 2
#define IF_TYPE_USB 3
#define IF_TYPE_I2C 4
#define IF_TYPE_TCP 5
// symbolic default values
#define DEFAULT_CONTRAST 800
@@ -118,6 +120,8 @@ typedef struct driver_private_data {
int ftdi_line_backlight;
#endif
int sock; /* socket for TCP devices */
int charmap;
int width, height;
+7
View File
@@ -439,6 +439,13 @@ HD44780_init(Driver *drvthis)
(p->have_output?" out":"")
);
break;
case IF_TYPE_TCP:
sprintf(buf, "TCP %s%s%s",
(p->have_backlight?" bl":""),
(p->have_keypad?" key":""),
(p->have_output?" out":"")
);
break;
case IF_TYPE_PARPORT:
default:
sprintf(buf, "LPT 0x%x%s%s%s", p->port,