add new driver CFontzPacket for CrystalFontz CFA631, CFA633 & CFA635;

add new connection type 'i2c' for for the hd44780 contributed by
Matthias Goebl <matthias.goebl@goebl.net>;
harmonize spelling of driver names in configure script and LCDd.conf
This commit is contained in:
marschap
2006-01-14 19:14:44 +00:00
parent 67a0d2c965
commit a0cd7a51e8
9 changed files with 504 additions and 168 deletions
+2
View File
@@ -165,6 +165,8 @@ Peter Marschall:
Markus Dolze:
- various fixes (especially for *BSD)
Matthias Goebl <matthias.goebl@goebl.net>:
- HD44780 I2C driver
Further developers in the sourceforge lcdproc team:
Mindaugas Idzelis aim4min
+29
View File
@@ -182,6 +182,35 @@ Speed=19200
Reboot=yes
## CrystalFontz packet driver (for CF631, CF633 & CF635) ##
[CFontzPacket]
# Select the LCD model [default: 633; legal: 631, 633, 635]
Model=633
# Select the output device to use [default: /dev/lcd]
Device=/dev/ttyS0
# Select the LCD size [default: depending on model: 635: 20x4, 631 & 633: 16x2]
Size=16x2
# Set the initial contrast [default: 140; legal: 0 - 1000]
Contrast=140
# Set the initial brightness [default: 1000; legal: 0 - 1000]
Brightness=1000
# Set the initial off-brightness [default: 0; legal: 0 - 1000]
# This value is used when the display is normally
# switched off in case LCDd is inactive
OffBrightness=50
# Set the communication speed [default: 9600; legal: 1200, 2400, 9600, 19200, 115200]
Speed=19200
# Set the firmware version (New means >= 2.0) [default: no; legal: yes, no]
# Currently this flag is not in use, there is no such thing as NewFirmware. ;=)
#NewFirmware=no
# Reinitialize the LCD's BIOS [default: no; legal: yes, no]
# I want to reboot the LCD to make sure we start from a known state
Reboot=yes
## Curses driver ##
[curses]
+33 -20
View File
@@ -5,17 +5,17 @@ AC_ARG_ENABLE(drivers,
[ --enable-drivers=<list> compile driver for LCDs in <list>.]
[ drivers may be separated with commas.]
[ Possible choices are:]
[ bayrad,cfontz,cfontz633,curses,cwlnx,glcdlib,glk,]
[ hd44780,icp_a106,imon,iowarrior,irman,joy,lb216,]
[ lcdm001,lcterm,lirc,ms6931,mtc_s16209x,mtxorb,]
[ noritakevfd,pylcd,sed1330,sed1520,sli,stv5730,svga,]
[ t6963,text,tyan,xosd]
[ bayrad,CFontz,CFontz633,CFontzPacket,curses,CwLnx,]
[ glcdlib,glk,hd44780,icp_a106,imon,IOWarrior,irman,]
[ joy,lb216,lcdm001,lcterm,lirc,ms6931,mtc_s16209x,]
[ MtxOrb,noritakevfd,pylcd,sed1330,sed1520,sli,stv5730,]
[ isvga,t6963,text,tyan,xosd]
[ \"all\" compiles all drivers],
drivers="$enableval",
drivers=[bayrad,cfontz,cfontz633,curses,cwlnx,glk,lb216,lcdm001,mtxorb,pylcd,text])
drivers=[bayrad,CFontz,CFontz633,curses,CwLnx,glk,lb216,lcdm001,MtxOrb,pylcd,text])
if test "$drivers" = "all"; then
drivers=[bayrad,cfontz,cfontz633,curses,cwlnx,glcdlib,glk,hd44780,icp_a106,imon,iowarrior,irman,joy,lb216,lcdm001,lcterm,lirc,ms6931,mtc_s16209x,mtxorb,noritakevfd,pylcd,sed1330,sed1520,sli,stv5730,svga,t6963,text,tyan,xosd]
drivers=[bayrad,CFontz,CFontz633,CFontzPacket,curses,CwLnx,glcdlib,glk,hd44780,icp_a106,imon,IOWarrior,irman,joy,lb216,lcdm001,lcterm,lirc,ms6931,mtc_s16209x,MtxOrb,NoritakeVFD,pylcd,sed1330,sed1520,sli,stv5730,svga,t6963,text,tyan,xosd]
fi
drivers=`echo $drivers | sed 's/,/ /g'`
@@ -27,19 +27,28 @@ AC_ARG_ENABLE(drivers,
DRIVERS="$DRIVERS bayrad${SO}"
actdrivers=["$actdrivers bayrad"]
;;
cfontz)
CFontz)
DRIVERS="$DRIVERS CFontz${SO}"
actdrivers=["$actdrivers cfontz"]
actdrivers=["$actdrivers CFontz"]
;;
cfontz633)
CFontz633)
DRIVERS="$DRIVERS CFontz633${SO}"
actdrivers=["$actdrivers cfontz633"]
actdrivers=["$actdrivers CFontz633"]
AC_CHECK_FUNCS(select, [
AC_CHECK_HEADERS(sys/select.h)
],[
AC_MSG_WARN([The CFontz633 driver needs the select() function])
])
;;
CFontzPacket)
DRIVERS="$DRIVERS CFontzPacket${SO}"
actdrivers=["$actdrivers CFontzPacket"]
AC_CHECK_FUNCS(select, [
AC_CHECK_HEADERS(sys/select.h)
],[
AC_MSG_WARN([The CFontzPacket driver needs the select() function])
])
;;
curses)
AC_CHECK_HEADERS(ncurses.h curses.h)
AC_CHECK_LIB(ncurses, main, [
@@ -92,9 +101,9 @@ dnl else
AC_DEFINE(CURSES_HAS_WCOLOR_SET,[1],[Define to 1 if you have the wcolor_set function in the curses library])
fi
;;
cwlnx)
CwLnx)
DRIVERS="$DRIVERS CwLnx${SO}"
actdrivers=["$actdrivers cwlnx"]
actdrivers=["$actdrivers CwLnx"]
;;
glcdlib)
AC_CHECK_HEADERS([glcdproclib/glcdprocdriver.h],[
@@ -125,6 +134,10 @@ dnl else
if test "$enable_libusb" = yes ; then
HD44780_DRIVERS="$HD44780_DRIVERS hd44780-hd44780-bwct-usb.o"
fi
AC_CHECK_HEADER(linux/i2c-dev.h,
HD44780_DRIVERS="$HD44780_DRIVERS hd44780-i2c.o"
AC_DEFINE(HAVE_I2C,[1],[Define to 1 if you have the i2c headers])
)
DRIVERS="$DRIVERS hd44780${SO}"
actdrivers=["$actdrivers hd44780"]
;;
@@ -136,12 +149,12 @@ dnl else
DRIVERS="$DRIVERS imon${SO}"
actdrivers=["$actdrivers imon"]
;;
iowarrior)
IOWarrior)
if test "$enable_libusb" = yes ; then
DRIVERS="$DRIVERS IOWarrior${SO}"
actdrivers=["$actdrivers iowarrior"]
actdrivers=["$actdrivers IOWarrior"]
else
AC_MSG_WARN([The iowarrior driver needs the libusb library.])
AC_MSG_WARN([The IOWarrior driver needs the libusb library.])
fi
;;
irman)
@@ -193,13 +206,13 @@ dnl else
DRIVERS="$DRIVERS mtc_s16209x${SO}"
actdrivers=["$actdrivers mtc_s16209x"]
;;
mtxorb)
MtxOrb)
DRIVERS="$DRIVERS MtxOrb${SO}"
actdrivers=["$actdrivers mtxorb"]
actdrivers=["$actdrivers MtxOrb"]
;;
noritakevfd)
NoritakeVFD)
DRIVERS="$DRIVERS NoritakeVFD${SO}"
actdrivers=["$actdrivers noritakevfd"]
actdrivers=["$actdrivers NoritakeVFD"]
;;
pylcd)
DRIVERS="$DRIVERS pylcd${SO}"
+138 -146
View File
@@ -1,11 +1,3 @@
/*
* This file driver is going to replace CFontz633.c in order to support
* CF631, CF633 and CF635 simultaniously under a new driver name...
* Currently, to use this version do: "cp CFontzPacket.c CFontz633.c"
* Be carefull when using CVS, do not overwrite CFontz633.c !!!
*
* -- David GLAUDE
*/
/*
* This is the LCDproc driver for CrystalFontz LCD using Packet protocol.
* It support the CrystalFontz 633 USB/Serial, the 631 USB and the 635 USB
@@ -79,32 +71,32 @@
#endif
#include "lcd.h"
#include "CFontz633.h"
#include "CFontzPacket.h"
#include "CFontz633io.h"
#include "report.h"
#include "lcd_lib.h"
#include "CFontz-charmap.h"
#define CF633_KEY_UP 1
#define CF633_KEY_DOWN 2
#define CF633_KEY_LEFT 3
#define CF633_KEY_RIGHT 4
#define CF633_KEY_ENTER 5
#define CF633_KEY_ESCAPE 6
#define CF633_KEY_UP_RELEASE 7
#define CF633_KEY_DOWN_RELEASE 8
#define CF633_KEY_LEFT_RELEASE 9
#define CF633_KEY_RIGHT_RELEASE 10
#define CF633_KEY_ENTER_RELEASE 11
#define CF633_KEY_ESCAPE_RELEASE 12
#define CF631_KEY_UL_PRESS 13
#define CF631_KEY_UR_PRESS 14
#define CF631_KEY_LL_PRESS 15
#define CF631_KEY_LR_PRESS 16
#define CF631_KEY_UL_RELEASE 17
#define CF631_KEY_UR_RELEASE 18
#define CF631_KEY_LL_RELEASE 19
#define CF631_KEY_LR_RELEASE 20
#define CFP_KEY_UP 1
#define CFP_KEY_DOWN 2
#define CFP_KEY_LEFT 3
#define CFP_KEY_RIGHT 4
#define CFP_KEY_ENTER 5
#define CFP_KEY_ESCAPE 6
#define CFP_KEY_UP_RELEASE 7
#define CFP_KEY_DOWN_RELEASE 8
#define CFP_KEY_LEFT_RELEASE 9
#define CFP_KEY_RIGHT_RELEASE 10
#define CFP_KEY_ENTER_RELEASE 11
#define CFP_KEY_ESCAPE_RELEASE 12
#define CFP_KEY_UL_PRESS 13
#define CFP_KEY_UR_PRESS 14
#define CFP_KEY_LL_PRESS 15
#define CFP_KEY_LR_PRESS 16
#define CFP_KEY_UL_RELEASE 17
#define CFP_KEY_UR_RELEASE 18
#define CFP_KEY_LL_RELEASE 19
#define CFP_KEY_LR_RELEASE 20
#define CELLWIDTH DEFAULT_CELL_WIDTH
#define CELLHEIGHT DEFAULT_CELL_HEIGHT
@@ -164,24 +156,24 @@ typedef struct driver_private_data {
MODULE_EXPORT char *api_version = API_VERSION;
MODULE_EXPORT int stay_in_foreground = 0;
MODULE_EXPORT int supports_multiple = 0;
MODULE_EXPORT char *symbol_prefix = "CFontz633_";
MODULE_EXPORT char *symbol_prefix = "CFontzPacket_";
/* Internal functions */
/* static void CFontz633_linewrap (int on); */
/* static void CFontz633_autoscroll (int on); */
static void CFontz633_hidecursor (Driver *drvthis);
static void CFontz633_reboot (Driver *drvthis);
static void CFontz633_init_vbar (Driver *drvthis);
static void CFontz633_init_hbar (Driver *drvthis);
static void CFontz633_no_live_report (Driver *drvthis);
static void CFontz633_hardware_clear (Driver *drvthis);
/* static void CFontzPacket_linewrap (int on); */
/* static void CFontzPacket_autoscroll (int on); */
static void CFontzPacket_hidecursor (Driver *drvthis);
static void CFontzPacket_reboot (Driver *drvthis);
static void CFontzPacket_init_vbar (Driver *drvthis);
static void CFontzPacket_init_hbar (Driver *drvthis);
static void CFontzPacket_no_live_report (Driver *drvthis);
static void CFontzPacket_hardware_clear (Driver *drvthis);
/*
* Opens com port and sets baud correctly...
*/
MODULE_EXPORT int
CFontz633_init (Driver *drvthis)
CFontzPacket_init (Driver *drvthis)
{
struct termios portset;
int tmp, w, h;
@@ -369,19 +361,19 @@ CFontz633_init (Driver *drvthis)
/* Set display-specific stuff.. */
if (reboot) {
debug(RPT_INFO, "CFontzPacket: reboot requested\n" );
CFontz633_reboot (drvthis);
CFontzPacket_reboot (drvthis);
reboot = 0;
debug(RPT_INFO, "CFontzPacket: reboot done" );
}
CFontz633_hidecursor (drvthis);
CFontzPacket_hidecursor (drvthis);
CFontz633_set_contrast (drvthis, p->contrast);
CFontz633_no_live_report (drvthis);
CFontz633_hardware_clear (drvthis);
CFontzPacket_set_contrast (drvthis, p->contrast);
CFontzPacket_no_live_report (drvthis);
CFontzPacket_hardware_clear (drvthis);
/* turn LEDs off on a CF635 */
CFontz633_output(drvthis, 0);
CFontzPacket_output(drvthis, 0);
report (RPT_DEBUG, "%s: done\n", __FUNCTION__);
@@ -393,7 +385,7 @@ CFontz633_init (Driver *drvthis)
* Clean-up
*/
MODULE_EXPORT void
CFontz633_close (Driver *drvthis)
CFontzPacket_close (Driver *drvthis)
{
PrivateData *p = drvthis->private_data;
@@ -418,7 +410,7 @@ CFontz633_close (Driver *drvthis)
* Returns the display width in characters
*/
MODULE_EXPORT int
CFontz633_width (Driver *drvthis)
CFontzPacket_width (Driver *drvthis)
{
PrivateData *p = drvthis->private_data;
@@ -430,7 +422,7 @@ CFontz633_width (Driver *drvthis)
* Returns the display height in characters
*/
MODULE_EXPORT int
CFontz633_height (Driver *drvthis)
CFontzPacket_height (Driver *drvthis)
{
PrivateData *p = drvthis->private_data;
@@ -442,7 +434,7 @@ CFontz633_height (Driver *drvthis)
* Returns the width of a character in pixels
*/
MODULE_EXPORT int
CFontz633_cellwidth (Driver *drvthis)
CFontzPacket_cellwidth (Driver *drvthis)
{
PrivateData *p = drvthis->private_data;
@@ -454,7 +446,7 @@ CFontz633_cellwidth (Driver *drvthis)
* Returns the height of a character in pixels
*/
MODULE_EXPORT int
CFontz633_cellheight (Driver *drvthis)
CFontzPacket_cellheight (Driver *drvthis)
{
PrivateData *p = drvthis->private_data;
@@ -466,7 +458,7 @@ CFontz633_cellheight (Driver *drvthis)
* Flushes all output to the lcd...
*/
MODULE_EXPORT void
CFontz633_flush (Driver *drvthis)
CFontzPacket_flush (Driver *drvthis)
{
PrivateData *p = drvthis->private_data;
int i,j;
@@ -588,7 +580,7 @@ CFontz633_flush (Driver *drvthis)
* Return one char from the KeyRing
*/
MODULE_EXPORT char *
CFontz633_get_key (Driver *drvthis)
CFontzPacket_get_key (Driver *drvthis)
{
PrivateData *p = drvthis->private_data;
unsigned char key;
@@ -596,52 +588,52 @@ CFontz633_get_key (Driver *drvthis)
key = GetKeyFromKeyRing(&keyring);
switch (key) {
case CF633_KEY_LEFT:
case CFP_KEY_LEFT:
return "Left";
break;
case CF633_KEY_UP:
case CFP_KEY_UP:
return "Up";
break;
case CF633_KEY_DOWN:
case CFP_KEY_DOWN:
return "Down";
break;
case CF633_KEY_RIGHT:
case CFP_KEY_RIGHT:
return "Right";
break;
case CF633_KEY_ENTER:
case CFP_KEY_ENTER:
return "Enter";
break;
case CF633_KEY_ESCAPE:
case CFP_KEY_ESCAPE:
return "Escape";
break;
case CF631_KEY_UL_PRESS:
case CFP_KEY_UL_PRESS:
return "Up";
break;
case CF631_KEY_UR_PRESS:
case CFP_KEY_UR_PRESS:
return "Enter";
break;
case CF631_KEY_LL_PRESS:
case CFP_KEY_LL_PRESS:
return "Down";
break;
case CF631_KEY_LR_PRESS:
case CFP_KEY_LR_PRESS:
return "Escape";
break;
case CF633_KEY_UP_RELEASE:
case CF633_KEY_DOWN_RELEASE:
case CF633_KEY_LEFT_RELEASE:
case CF633_KEY_RIGHT_RELEASE:
case CF633_KEY_ENTER_RELEASE:
case CF633_KEY_ESCAPE_RELEASE:
case CF631_KEY_UL_RELEASE:
case CF631_KEY_UR_RELEASE:
case CF631_KEY_LL_RELEASE:
case CF631_KEY_LR_RELEASE:
// report( RPT_INFO, "cfontz633: Returning key release 0x%2x", key);
case CFP_KEY_UP_RELEASE:
case CFP_KEY_DOWN_RELEASE:
case CFP_KEY_LEFT_RELEASE:
case CFP_KEY_RIGHT_RELEASE:
case CFP_KEY_ENTER_RELEASE:
case CFP_KEY_ESCAPE_RELEASE:
case CFP_KEY_UL_RELEASE:
case CFP_KEY_UR_RELEASE:
case CFP_KEY_LL_RELEASE:
case CFP_KEY_LR_RELEASE:
// report( RPT_INFO, "CFontzPacket: Returning key release 0x%2x", key);
return NULL;
break;
default:
if (key != '\0')
report( RPT_INFO, "cfontz633: Untreated unknown key 0x%2x", key);
report( RPT_INFO, "CFontzPacket: Untreated unknown key 0x%2x", key);
return NULL;
break;
}
@@ -654,7 +646,7 @@ CFontz633_get_key (Driver *drvthis)
* The upper-left is (1,1), and the lower right should be (16,2).
*/
MODULE_EXPORT void
CFontz633_chr (Driver *drvthis, int x, int y, char c)
CFontzPacket_chr (Driver *drvthis, int x, int y, char c)
{
PrivateData *p = drvthis->private_data;
@@ -672,7 +664,7 @@ CFontz633_chr (Driver *drvthis, int x, int y, char c)
* The upper-left is (1,1), and the lower right should be (16,2).
*/
static void
CFontz633_raw_chr (Driver *drvthis, int x, int y, unsigned char c)
CFontzPacket_raw_chr (Driver *drvthis, int x, int y, unsigned char c)
{
PrivateData *p = drvthis->private_data;
@@ -689,7 +681,7 @@ CFontz633_raw_chr (Driver *drvthis, int x, int y, unsigned char c)
* cannot be retrieved from the LCD.
*/
MODULE_EXPORT int
CFontz633_get_contrast (Driver *drvthis)
CFontzPacket_get_contrast (Driver *drvthis)
{
PrivateData *p = drvthis->private_data;
@@ -701,7 +693,7 @@ CFontz633_get_contrast (Driver *drvthis)
* Changes screen contrast (in promille)
*/
MODULE_EXPORT void
CFontz633_set_contrast (Driver *drvthis, int promille)
CFontzPacket_set_contrast (Driver *drvthis, int promille)
{
PrivateData *p = drvthis->private_data;
int hardware_contrast;
@@ -727,7 +719,7 @@ CFontz633_set_contrast (Driver *drvthis, int promille)
* Retrieves brightness (in promille)
*/
MODULE_EXPORT int
CFontz633_get_brightness(Driver *drvthis, int state)
CFontzPacket_get_brightness(Driver *drvthis, int state)
{
PrivateData *p = drvthis->private_data;
@@ -739,7 +731,7 @@ CFontz633_get_brightness(Driver *drvthis, int state)
* Sets on/off brightness (in promille)
*/
MODULE_EXPORT void
CFontz633_set_brightness(Driver *drvthis, int state, int promille)
CFontzPacket_set_brightness(Driver *drvthis, int state, int promille)
{
PrivateData *p = drvthis->private_data;
@@ -750,11 +742,11 @@ CFontz633_set_brightness(Driver *drvthis, int state, int promille)
/* store the software value since there is not get */
if (state == BACKLIGHT_ON) {
p->brightness = promille;
//CFontz633_backlight(drvthis, BACKLIGHT_ON);
//CFontzPacket_backlight(drvthis, BACKLIGHT_ON);
}
else {
p->offbrightness = promille;
//CFontz633_backlight(drvthis, BACKLIGHT_OFF);
//CFontzPacket_backlight(drvthis, BACKLIGHT_OFF);
}
}
@@ -764,7 +756,7 @@ CFontz633_set_brightness(Driver *drvthis, int state, int promille)
* The hardware support any value between 0 and 100.
*/
MODULE_EXPORT void
CFontz633_backlight (Driver *drvthis, int on)
CFontzPacket_backlight (Driver *drvthis, int on)
{
PrivateData *p = drvthis->private_data;
int hardware_value = (on == BACKLIGHT_ON)
@@ -781,7 +773,7 @@ CFontz633_backlight (Driver *drvthis, int on)
* Get rid of the blinking cursor
*/
static void
CFontz633_hidecursor (Driver *drvthis)
CFontzPacket_hidecursor (Driver *drvthis)
{
PrivateData *p = drvthis->private_data;
@@ -793,7 +785,7 @@ CFontz633_hidecursor (Driver *drvthis)
* Stop live reporting of temperature.
*/
static void
CFontz633_no_live_report (Driver *drvthis)
CFontzPacket_no_live_report (Driver *drvthis)
{
PrivateData *p = drvthis->private_data;
unsigned char out[2] = { 0, 0 };
@@ -809,7 +801,7 @@ CFontz633_no_live_report (Driver *drvthis)
* Stop the reporting of any fan.
*/
static void
CFontz633_no_fan_report (Driver *drvthis)
CFontzPacket_no_fan_report (Driver *drvthis)
{
PrivateData *p = drvthis->private_data;
@@ -822,7 +814,7 @@ CFontz633_no_fan_report (Driver *drvthis)
* Stop the reporting of any temperature.
*/
static void
CFontz633_no_temp_report (Driver *drvthis)
CFontzPacket_no_temp_report (Driver *drvthis)
{
PrivateData *p = drvthis->private_data;
unsigned char out[4] = { 0, 0, 0, 0 };
@@ -836,7 +828,7 @@ CFontz633_no_temp_report (Driver *drvthis)
* Reset the display bios
*/
static void
CFontz633_reboot (Driver *drvthis)
CFontzPacket_reboot (Driver *drvthis)
{
PrivateData *p = drvthis->private_data;
unsigned char out[3] = { 8, 18, 99 };
@@ -850,7 +842,7 @@ CFontz633_reboot (Driver *drvthis)
* Sets up for vertical bars.
*/
static void
CFontz633_init_vbar (Driver *drvthis)
CFontzPacket_init_vbar (Driver *drvthis)
{
PrivateData *p = drvthis->private_data;
char a[] = {
@@ -927,18 +919,18 @@ CFontz633_init_vbar (Driver *drvthis)
if (p->ccmode != vbar) {
if (p->ccmode != standard) {
/* Not supported(yet) */
report(RPT_WARNING, "CFontz633_init_vbar: Cannot combine two modes using user defined characters");
report(RPT_WARNING, "CFontzPacket_init_vbar: Cannot combine two modes using user defined characters");
return;
}
p->ccmode = vbar;
CFontz633_set_char (drvthis, 1, a);
CFontz633_set_char (drvthis, 2, b);
CFontz633_set_char (drvthis, 3, c);
CFontz633_set_char (drvthis, 4, d);
CFontz633_set_char (drvthis, 5, e);
CFontz633_set_char (drvthis, 6, f);
CFontz633_set_char (drvthis, 7, g);
CFontzPacket_set_char (drvthis, 1, a);
CFontzPacket_set_char (drvthis, 2, b);
CFontzPacket_set_char (drvthis, 3, c);
CFontzPacket_set_char (drvthis, 4, d);
CFontzPacket_set_char (drvthis, 5, e);
CFontzPacket_set_char (drvthis, 6, f);
CFontzPacket_set_char (drvthis, 7, g);
}
}
@@ -947,7 +939,7 @@ CFontz633_init_vbar (Driver *drvthis)
* Inits horizontal bars...
*/
static void
CFontz633_init_hbar (Driver *drvthis)
CFontzPacket_init_hbar (Driver *drvthis)
{
PrivateData *p = drvthis->private_data;
char a[] = {
@@ -1014,17 +1006,17 @@ CFontz633_init_hbar (Driver *drvthis)
if (p->ccmode != hbar) {
if (p->ccmode != standard) {
/* Not supported(yet) */
report(RPT_WARNING, "CFontz633_init_hbar: Cannot combine two modes using user defined characters");
report(RPT_WARNING, "CFontzPacket_init_hbar: Cannot combine two modes using user defined characters");
return;
}
p->ccmode = hbar;
CFontz633_set_char (drvthis, 1, a);
CFontz633_set_char (drvthis, 2, b);
CFontz633_set_char (drvthis, 3, c);
CFontz633_set_char (drvthis, 4, d);
CFontz633_set_char (drvthis, 5, e);
CFontz633_set_char (drvthis, 6, f);
CFontzPacket_set_char (drvthis, 1, a);
CFontzPacket_set_char (drvthis, 2, b);
CFontzPacket_set_char (drvthis, 3, c);
CFontzPacket_set_char (drvthis, 4, d);
CFontzPacket_set_char (drvthis, 5, e);
CFontzPacket_set_char (drvthis, 6, f);
}
}
@@ -1033,7 +1025,7 @@ CFontz633_init_hbar (Driver *drvthis)
* Draws a vertical bar...
*/
MODULE_EXPORT void
CFontz633_vbar (Driver *drvthis, int x, int y, int len, int promille, int options)
CFontzPacket_vbar (Driver *drvthis, int x, int y, int len, int promille, int options)
{
/* x and y are the start position of the bar.
* The bar by default grows in the 'up' direction
@@ -1043,7 +1035,7 @@ CFontz633_vbar (Driver *drvthis, int x, int y, int len, int promille, int option
*/
PrivateData *p = drvthis->private_data;
CFontz633_init_vbar(drvthis);
CFontzPacket_init_vbar(drvthis);
lib_vbar_static(drvthis, x, y, len, promille, options, p->cellheight, 0);
}
@@ -1052,7 +1044,7 @@ CFontz633_vbar (Driver *drvthis, int x, int y, int len, int promille, int option
* Draws a horizontal bar to the right.
*/
MODULE_EXPORT void
CFontz633_hbar (Driver *drvthis, int x, int y, int len, int promille, int options)
CFontzPacket_hbar (Driver *drvthis, int x, int y, int len, int promille, int options)
{
/* x and y are the start position of the bar.
* The bar by default grows in the 'right' direction
@@ -1062,7 +1054,7 @@ CFontz633_hbar (Driver *drvthis, int x, int y, int len, int promille, int option
*/
PrivateData *p = drvthis->private_data;
CFontz633_init_hbar(drvthis);
CFontzPacket_init_hbar(drvthis);
lib_hbar_static(drvthis, x, y, len, promille, options, p->cellwidth, 0);
}
@@ -1071,7 +1063,7 @@ CFontz633_hbar (Driver *drvthis, int x, int y, int len, int promille, int option
* Inits big numbers
*/
void
CFontz633_init_num(Driver *drvthis)
CFontzPacket_init_num(Driver *drvthis)
{
PrivateData *p = drvthis->private_data;
@@ -1154,14 +1146,14 @@ char bignum_ccs[8][CELLWIDTH*CELLHEIGHT] = {
if (p->ccmode != standard) {
/* Not supported (yet) */
report(RPT_WARNING, "CFontz633_init_num: Cannot combine two modes using user defined characters");
report(RPT_WARNING, "CFontzPacket_init_num: Cannot combine two modes using user defined characters");
return;
}
p->ccmode = bignum;
for (i = 0; i < NUM_CCs; i++)
CFontz633_set_char(drvthis, i, bignum_ccs[i]);
CFontzPacket_set_char(drvthis, i, bignum_ccs[i]);
}
}
@@ -1171,7 +1163,7 @@ char bignum_ccs[8][CELLWIDTH*CELLHEIGHT] = {
* Only works on 4-line displays
*/
MODULE_EXPORT void
CFontz633_num(Driver *drvthis, int x, int num)
CFontzPacket_num(Driver *drvthis, int x, int num)
{
PrivateData *p = drvthis->private_data;
@@ -1246,18 +1238,18 @@ char bignum_map[11][4][3] = {
int y = (p->height - 2) / 2; /* center vertically */
int x2, y2;
CFontz633_init_num(drvthis);
CFontzPacket_init_num(drvthis);
for (x2 = 0; x2 < 3; x2++) {
for (y2 = 0; y2 < 4; y2++) {
CFontz633_chr(drvthis, x+x2, y+y2, bignum_map[num][y2][x2]);
CFontzPacket_chr(drvthis, x+x2, y+y2, bignum_map[num][y2][x2]);
}
if (num == 10)
x2 = 2; /* = break, for colon only */
}
}
else {
CFontz633_chr(drvthis, x, 1 + (p->height - 1) / 2,
CFontzPacket_chr(drvthis, x, 1 + (p->height - 1) / 2,
(num == 10) ? ':' : (num + '0'));
}
}
@@ -1271,7 +1263,7 @@ char bignum_map[11][4][3] = {
* The input is just an array of characters...
*/
MODULE_EXPORT void
CFontz633_set_char (Driver *drvthis, int n, char *dat)
CFontzPacket_set_char (Driver *drvthis, int n, char *dat)
{
PrivateData *p = drvthis->private_data;
unsigned char out[9];
@@ -1301,7 +1293,7 @@ CFontz633_set_char (Driver *drvthis, int n, char *dat)
* Places an icon on screen
*/
MODULE_EXPORT int
CFontz633_icon (Driver *drvthis, int x, int y, int icon)
CFontzPacket_icon (Driver *drvthis, int x, int y, int icon)
{
PrivateData *p = drvthis->private_data;
char icons[8][6 * 8] = {
@@ -1399,67 +1391,67 @@ CFontz633_icon (Driver *drvthis, int x, int y, int icon)
switch (icon) {
case ICON_BLOCK_FILLED:
if (p->model == 633)
CFontz633_chr(drvthis, x, y, 255);
CFontzPacket_chr(drvthis, x, y, 255);
else
CFontz633_raw_chr(drvthis, x, y, 31);
CFontzPacket_raw_chr(drvthis, x, y, 31);
break;
case ICON_HEART_FILLED:
CFontz633_set_char(drvthis, 0, icons[1]);
CFontz633_chr(drvthis, x, y, 0);
CFontzPacket_set_char(drvthis, 0, icons[1]);
CFontzPacket_chr(drvthis, x, y, 0);
break;
case ICON_HEART_OPEN:
CFontz633_set_char(drvthis, 0, icons[0]);
CFontz633_chr(drvthis, x, y, 0);
CFontzPacket_set_char(drvthis, 0, icons[0]);
CFontzPacket_chr(drvthis, x, y, 0);
break;
case ICON_ARROW_UP:
if (p->model == 633) {
CFontz633_set_char(drvthis, 1, icons[2]);
CFontz633_chr(drvthis, x, y, 1);
CFontzPacket_set_char(drvthis, 1, icons[2]);
CFontzPacket_chr(drvthis, x, y, 1);
}
else
CFontz633_raw_chr(drvthis, x, y, 0xDE);
CFontzPacket_raw_chr(drvthis, x, y, 0xDE);
break;
case ICON_ARROW_DOWN:
if (p->model == 633) {
CFontz633_set_char(drvthis, 2, icons[3]);
CFontz633_chr(drvthis, x, y, 2);
CFontzPacket_set_char(drvthis, 2, icons[3]);
CFontzPacket_chr(drvthis, x, y, 2);
}
else
CFontz633_raw_chr(drvthis, x, y, 0xE0);
CFontzPacket_raw_chr(drvthis, x, y, 0xE0);
break;
case ICON_ARROW_LEFT:
if (p->model == 633)
CFontz633_raw_chr(drvthis, x, y, 0x7F);
CFontzPacket_raw_chr(drvthis, x, y, 0x7F);
else
CFontz633_raw_chr(drvthis, x, y, 0xE1);
CFontzPacket_raw_chr(drvthis, x, y, 0xE1);
break;
case ICON_ARROW_RIGHT:
if (p->model == 633)
CFontz633_raw_chr(drvthis, x, y, 0x7E);
CFontzPacket_raw_chr(drvthis, x, y, 0x7E);
else
CFontz633_raw_chr(drvthis, x, y, 0xDF);
CFontzPacket_raw_chr(drvthis, x, y, 0xDF);
break;
case ICON_CHECKBOX_OFF:
CFontz633_set_char(drvthis, 3, icons[4]);
CFontz633_chr(drvthis, x, y, 3);
CFontzPacket_set_char(drvthis, 3, icons[4]);
CFontzPacket_chr(drvthis, x, y, 3);
break;
case ICON_CHECKBOX_ON:
CFontz633_set_char(drvthis, 4, icons[5]);
CFontz633_chr(drvthis, x, y, 4);
CFontzPacket_set_char(drvthis, 4, icons[5]);
CFontzPacket_chr(drvthis, x, y, 4);
break;
case ICON_CHECKBOX_GRAY:
CFontz633_set_char(drvthis, 5, icons[6]);
CFontz633_chr(drvthis, x, y, 5);
CFontzPacket_set_char(drvthis, 5, icons[6]);
CFontzPacket_chr(drvthis, x, y, 5);
break;
case ICON_SELECTOR_AT_LEFT:
if (p->model == 633)
return -1;
CFontz633_raw_chr(drvthis, x, y, 0x10);
CFontzPacket_raw_chr(drvthis, x, y, 0x10);
break;
case ICON_SELECTOR_AT_RIGHT:
if (p->model == 633)
return -1;
CFontz633_raw_chr(drvthis, x, y, 0x11);
CFontzPacket_raw_chr(drvthis, x, y, 0x11);
break;
default:
return -1; /* Let the core do other icons */
@@ -1472,7 +1464,7 @@ CFontz633_icon (Driver *drvthis, int x, int y, int icon)
* Clears the LCD screen
*/
MODULE_EXPORT void
CFontz633_clear (Driver *drvthis)
CFontzPacket_clear (Driver *drvthis)
{
PrivateData *p = drvthis->private_data;
@@ -1485,7 +1477,7 @@ CFontz633_clear (Driver *drvthis)
* Hardware clears the LCD screen
*/
static void
CFontz633_hardware_clear (Driver *drvthis)
CFontzPacket_hardware_clear (Driver *drvthis)
{
PrivateData *p = drvthis->private_data;
@@ -1498,7 +1490,7 @@ CFontz633_hardware_clear (Driver *drvthis)
* upper-left is (1,1), and the lower right is (p->width, p->height).
*/
MODULE_EXPORT void
CFontz633_string (Driver *drvthis, int x, int y, char string[])
CFontzPacket_string (Driver *drvthis, int x, int y, char string[])
{
PrivateData *p = drvthis->private_data;
int i;
@@ -1522,7 +1514,7 @@ CFontz633_string (Driver *drvthis, int x, int y, char string[])
* Output values using the LEDs of a CF635
*/
MODULE_EXPORT void
CFontz633_output(Driver *drvthis, int state)
CFontzPacket_output(Driver *drvthis, int state)
{
static const unsigned char CFontz635_LEDs[CF635_NUM_LEDs] = {
11, 9, 7, 5, // Green LEDs first, Top first
+48
View File
@@ -0,0 +1,48 @@
#ifndef CFONTZPACKET_H
#define CFONTZPACKET_H
#include "lcd.h"
#define DEFAULT_CELL_WIDTH 6
#define DEFAULT_CELL_HEIGHT 8
#define DEFAULT_CONTRAST 560
#define DEFAULT_DEVICE "/dev/lcd"
#define DEFAULT_SPEED 19200
#define DEFAULT_SPEED_CF631 115200
#define DEFAULT_SPEED_CF633 19200
#define DEFAULT_SPEED_CF635 115200
#define DEFAULT_BRIGHTNESS 1000
#define DEFAULT_OFFBRIGHTNESS 0
#define DEFAULT_SIZE "16x2"
#define DEFAULT_SIZE_CF631 "20x2"
#define DEFAULT_SIZE_CF633 "16x2"
#define DEFAULT_SIZE_CF635 "20x4"
MODULE_EXPORT int CFontzPacket_init (Driver *drvthis);
MODULE_EXPORT void CFontzPacket_close (Driver *drvthis);
MODULE_EXPORT int CFontzPacket_width (Driver *drvthis);
MODULE_EXPORT int CFontzPacket_height (Driver *drvthis);
MODULE_EXPORT int CFontzPacket_cellwidth (Driver *drvthis);
MODULE_EXPORT int CFontzPacket_cellheight (Driver *drvthis);
MODULE_EXPORT void CFontzPacket_clear (Driver *drvthis);
MODULE_EXPORT void CFontzPacket_flush (Driver *drvthis);
MODULE_EXPORT void CFontzPacket_string (Driver *drvthis, int x, int y, char string[]);
MODULE_EXPORT void CFontzPacket_chr (Driver *drvthis, int x, int y, char c);
MODULE_EXPORT char *CFontzPacket_get_key (Driver *drvthis);
MODULE_EXPORT void CFontzPacket_vbar (Driver *drvthis, int x, int y, int len, int promille, int options);
MODULE_EXPORT void CFontzPacket_hbar (Driver *drvthis, int x, int y, int len, int promille, int options);
MODULE_EXPORT void CFontzPacket_num (Driver *drvthis, int x, int num);
MODULE_EXPORT int CFontzPacket_icon(Driver *drvthis, int x, int y, int icon);
MODULE_EXPORT void CFontzPacket_set_char (Driver *drvthis, int n, char *dat);
MODULE_EXPORT int CFontzPacket_get_contrast (Driver *drvthis);
MODULE_EXPORT void CFontzPacket_set_contrast (Driver *drvthis, int promille);
MODULE_EXPORT int CFontzPacket_get_brightness (Driver *drvthis, int state);
MODULE_EXPORT void CFontzPacket_set_brightness (Driver *drvthis, int state, int promille);
MODULE_EXPORT void CFontzPacket_backlight (Driver *drvthis, int on);
MODULE_EXPORT void CFontzPacket_output (Driver *drvthis, int state);
#endif /* CFONTZPACKET_H */
+5 -2
View File
@@ -18,7 +18,7 @@ AM_LDFLAGS = @LDSHARED@
LIBS =
pkglib_PROGRAMS = @DRIVERS@
EXTRA_PROGRAMS = bayrad CFontz CFontz633 curses CwLnx glcdlib glk hd44780 icp_a106 imon IOWarrior irman joy lb216 lcdm001 lcterm lirc ms6931 mtc_s16209x MtxOrb NoritakeVFD pylcd sed1330 sed1520 stv5730 svga t6963 text tyan wirz_sli xosd
EXTRA_PROGRAMS = bayrad CFontz CFontz633 CFontzPacket curses CwLnx glcdlib glk hd44780 icp_a106 imon IOWarrior irman joy lb216 lcdm001 lcterm lirc ms6931 mtc_s16209x MtxOrb NoritakeVFD pylcd sed1330 sed1520 stv5730 svga t6963 text tyan wirz_sli xosd
noinst_LIBRARIES = libLCD.a
IOWarrior_CFLAGS = @libusb_cflags@
@@ -26,6 +26,7 @@ hd44780_CFLAGS = @libusb_cflags@
CFontz_LDADD = libLCD.a
CFontz633_LDADD = libLCD.a
CFontzPacket_LDADD = libLCD.a
curses_LDADD = @LIBCURSES@
CwLnx_LDADD = libLCD.a
CwLnx_SOURCES = lcd.h CwLnx.c CwLnx.h report.h
@@ -48,11 +49,12 @@ libLCD_a_SOURCES = lcd_lib.h lcd_lib.c
bayrad_SOURCES = lcd.h bayrad.h bayrad.c report.h
CFontz_SOURCES = lcd.h CFontz.c CFontz.h CFontz-charmap.h report.h
CFontz633_SOURCES = lcd.h CFontz633.c CFontz633.h CFontz-charmap.h CFontz633io.c CFontz633io.h report.h
CFontzPacket_SOURCES = lcd.h CFontzPacket.c CFontzPacket.h CFontz-charmap.h CFontz633io.c CFontz633io.h report.h
curses_SOURCES = lcd.h curses_drv.h curses_drv.c report.h
glcdlib_SOURCES = lcd.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 hd44780.h hd44780.c hd44780-drivers.h hd44780-low.h hd44780-charmap.h report.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-winamp.c hd44780-winamp.h hd44780-picanlcd.c hd44780-picanlcd.h hd44780-bwct-usb.c hd44780-bwct-usb.h hd44780-lcdserializer.c hd44780-lcdserializer.h hd44780-lis2.c hd44780-lis2.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-winamp.c hd44780-winamp.h hd44780-picanlcd.c hd44780-picanlcd.h hd44780-bwct-usb.c hd44780-bwct-usb.h hd44780-lcdserializer.c hd44780-lcdserializer.h hd44780-lis2.c hd44780-lis2.h hd44780-i2c.c hd44780-i2c.h port.h lpt-port.h timing.h
icp_a106_SOURCES = lcd.h icp_a106.c icp_a106.h report.h
imon_SOURCES = lcd.h imon.h imon.c report.h
@@ -79,3 +81,4 @@ wirz_sli_SOURCES = lcd.h wirz-sli.h wirz-sli.c report.h
xosd_SOURCES = lcd.h xosdlib_drv.c xosdlib_drv.h report.h
INCLUDES = -I$(top_srcdir)
+6
View File
@@ -23,6 +23,9 @@
#include "hd44780-picanlcd.h"
#include "hd44780-lcdserializer.h"
#include "hd44780-lis2.h"
#ifdef HAVE_I2C
# include "hd44780-i2c.h"
#endif
// add new connection type header files here
static const ConnectionMapping connectionMapping[] = {
@@ -41,6 +44,9 @@ static const ConnectionMapping connectionMapping[] = {
{"lis2", hd_init_lis2, "\tnone\n"},
#ifdef HAVE_LIBUSB
{"bwctusb", hd_init_bwct_usb, "\tnone\n"},
#endif
#ifdef HAVE_I2C
{"i2c", hd_init_i2c, "\tnone\n"},
#endif
// add new connection types and their string specifier here
// default, end of structure element (do not delete)
+234
View File
@@ -0,0 +1,234 @@
/*
* i2c driver module for Hitachi HD44780 based LCD displays.
* The LCD is operated in it's 4 bit-mode to be connected to the 8 bit-port
* of a single PCF8574(A) or PCA9554(A) that is accessed by the server via the i2c bus.
*
* Copyright (c) 2005 Matthias Goebl <matthias.goebl@goebl.net>
* 2000, 1999, 1995 Benjamin Tse <blt@Comports.com>
* 2001 Joris Robijn <joris@robijn.net>
* 1999 Andrew McMeikan <andrewm@engineer.com>
* 1998 Richard Rognlie <rrognlie@gamerz.net>
* 1997 Matthias Prinke <m.prinke@trashcan.mcnet.de>
*
* The connections are:
* PCF8574AP LCD
* P0 (4) D4 (11)
* P1 (5) D5 (12)
* P2 (6) D6 (13)
* P3 (7) D7 (14)
* P4 (9) RS (4)
* P5 (10) RW (5)
* P6 (11) EN (6)
*
* Backlight
* P7 (12) /backlight (optional, active-low)
*
* Configuration:
* device=/dev/i2c-0 # the device file of the i2c bus
* port=0x20 # the i2c address of the i2c port expander
*
* Attention: Bit 8 of the address given in port is special:
* It tells the driver to treat the device as PCA9554 or similar,
* a device that needs a 2-byte command, and it will be stripped
* off the address.
* So we have:
* port=0x20..0x27 PCF8574 with A[012]=0..7
* port=0x38..0x3f PCF8574A with A[012]=0..7
* port=0xa0..0xa7 PCA9554 with A[012]=0..7
* port=0xa0..0xa7 PCA9554A with A[012]=0..7
*
* When using this driver, DON'T load the i2c chip module (e.g. pcf8574),
* you only need the i2c bus driver module!
*
* Based mostly on the hd44780-4bit module, see there for a complete history.
* Suggestions for PCA9554 support from Tonu Samuel <tonu@jes.ee>.
*
* This file is released under the GNU General Public License. Refer to the
* COPYING file distributed with this package.
*/
#include "hd44780-i2c.h"
#include "hd44780-low.h"
#include "shared/str.h"
#include "shared/report.h"
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/i2c-dev.h>
/* I2C_SLAVE is missing in linux/i2c-dev.h from kernel headers of 2.4.x kernels */
#ifndef I2C_SLAVE
#define I2C_SLAVE 0x0703 /* Change slave address */
#endif
// Generally, any function that accesses the LCD control lines needs to be
// implemented separately for each HW design. This is typically (but not
// restricted to):
// HD44780_senddata
// HD44780_readkeypad
void i2c_HD44780_senddata (PrivateData *p, unsigned char displayID, unsigned char flags, unsigned char ch);
void i2c_HD44780_backlight (PrivateData *p, unsigned char state);
#define RS 0x10
#define RW 0x20
#define EN 0x40
#define BL 0x80
// note that the above bits are all meant for the data port of PCF8574
#define I2C_ADDR_MASK 0x7f
#define I2C_PCAX_MASK 0x80
static void
i2c_out (PrivateData *p, unsigned char val)
{
__u8 data[2];
int datalen;
data[0];
if(p->port & I2C_PCAX_MASK) { // we have a PCA9554 or similar, that needs a 2-byte command
data[0]=1; // command: read/write output port register
data[1]=val;
datalen=2;
} else { // we have a PCF8574 or similar, that needs a 1-byte command
data[0]=val;
datalen=1;
}
if (write(p->fd,data,datalen) != datalen) {
report( RPT_ERR, "HD44780: I2C: i2c write data %u to address %u failed: %s", val, p->fd, strerror(errno));
}
}
#define DEFAULT_DEVICE "/dev/i2c-0"
// initialisation function
int
hd_init_i2c (Driver *drvthis)
{
PrivateData *p = (PrivateData*) drvthis->private_data;
HD44780_functions *hd44780_functions = p->hd44780_functions;
int enableLines = EN;
char device[256] = DEFAULT_DEVICE;
p->backlight_bit = BL;
/* READ CONFIG FILE */
/* 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: I2C: Using device '%s' and address %u", device, p->port & I2C_ADDR_MASK);
// Open the I2C device
p->fd = open(device,O_RDWR);
if (p->fd<0) {
report( RPT_CRIT, "HD44780: I2C: open i2c device '%s' failed: %s", device, strerror(errno));
}
// Set I2C address
if (ioctl(p->fd,I2C_SLAVE, p->port & I2C_ADDR_MASK) < 0) {
report( RPT_CRIT, "HD44780: I2C: set address to '%i': %s", p->port & I2C_ADDR_MASK, strerror(errno));
}
if(p->port & I2C_PCAX_MASK) { // we have a PCA9554 or similar, that needs special config
__u8 data[2];
data[0]=2; // command: set polarity inversion
data[1]=0; // -> no polarity inversion
if (write(p->fd,data,2) != 2) {
report( RPT_ERR, "HD44780: I2C: i2c set polarity inversion failed: %s", strerror(errno));
}
data[0]=3; // command: set output direction
data[1]=0; // -> all pins are outputs
if (write(p->fd,data,2) != 2) {
report( RPT_ERR, "HD44780: I2C: i2c set output direction failed: %s", strerror(errno));
}
}
hd44780_functions->senddata = i2c_HD44780_senddata;
hd44780_functions->backlight = i2c_HD44780_backlight;
hd44780_functions->scankeypad = NULL;
// powerup the lcd now
/* We'll now send 0x03 a couple of times,
* which is in fact (FUNCSET | IF_8BIT) >> 4 */
i2c_out (p, 0x03);
if( p->delayBus ) hd44780_functions->uPause (p, 1);
i2c_out (p, enableLines | 0x03);
if( p->delayBus ) hd44780_functions->uPause (p, 1);
i2c_out (p, 0x03);
hd44780_functions->uPause (p, 15000);
i2c_out (p, enableLines | 0x03);
if( p->delayBus ) hd44780_functions->uPause (p, 1);
i2c_out (p, 0x03);
hd44780_functions->uPause (p, 5000);
i2c_out (p, enableLines | 0x03);
if( p->delayBus ) hd44780_functions->uPause (p, 1);
i2c_out (p, 0x03);
hd44780_functions->uPause (p, 100);
i2c_out (p, enableLines | 0x03);
if( p->delayBus ) hd44780_functions->uPause (p, 1);
i2c_out (p, 0x03);
hd44780_functions->uPause (p, 100);
// now in 8-bit mode... set 4-bit mode
i2c_out (p, 0x02);
if( p->delayBus ) hd44780_functions->uPause (p, 1);
i2c_out (p, enableLines | 0x02);
if( p->delayBus ) hd44780_functions->uPause (p, 1);
i2c_out (p, 0x02);
hd44780_functions->uPause (p, 100);
// Set up two-line, small character (5x8) mode
hd44780_functions->senddata (p, 0, RS_INSTR, FUNCSET | IF_4BIT | TWOLINE | SMALLCHAR );
hd44780_functions->uPause (p, 40);
common_init (p, IF_4BIT);
return 0;
}
// i2c_HD44780_senddata
void
i2c_HD44780_senddata (PrivateData *p, unsigned char displayID, unsigned char flags, unsigned char ch)
{
unsigned char enableLines = 0, portControl = 0;
unsigned char h = (ch >> 4) & 0x0f; // high and low nibbles
unsigned char l = ch & 0x0f;
if (flags == RS_INSTR)
portControl = 0;
else //if (flags == RS_DATA)
portControl = RS;
portControl |= p->backlight_bit;
enableLines = EN;
i2c_out (p, portControl | h);
if( p->delayBus ) p->hd44780_functions->uPause (p, 1);
i2c_out (p, enableLines | portControl | h);
if( p->delayBus ) p->hd44780_functions->uPause (p, 1);
i2c_out (p, portControl | h);
i2c_out (p, portControl | l);
if( p->delayBus ) p->hd44780_functions->uPause (p, 1);
i2c_out (p, enableLines | portControl | l);
if( p->delayBus ) p->hd44780_functions->uPause (p, 1);
i2c_out (p, portControl | l);
}
void i2c_HD44780_backlight (PrivateData *p, unsigned char state)
{
p->backlight_bit = ((!p->have_backlight||state)?0:BL);
i2c_out (p, p->backlight_bit);
}
+9
View File
@@ -0,0 +1,9 @@
#ifndef HD_I2C_H
#define HD_I2C_H
#include "lcd.h" /* for Driver */
// initialise this particular driver
int hd_init_i2c (Driver *drvthis);
#endif