new ConnectionType ethlcd for hd44780 (Mariusz Bialonczyk)
This commit is contained in:
@@ -245,6 +245,9 @@ Thomas Jarosch
|
||||
Christian Jodar
|
||||
- mx5000 driver
|
||||
|
||||
Mariusz Bialonczyk
|
||||
- ethlcd connection type for HD44780
|
||||
|
||||
|
||||
|
||||
Further developers in the sourceforge lcdproc team:
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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])
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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
|
||||
@@ -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;
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user