add my own driver for the NEC FC20X2JA display to lcd4linux

SVN-Revision: 3026
This commit is contained in:
Felix Fietkau 2006-01-20 08:36:55 +00:00
parent fa830a2d81
commit 9b3e71fa11

View File

@ -0,0 +1,435 @@
diff -urN lcd4linux.old/Makefile.in lcd4linux.dev/Makefile.in
--- lcd4linux.old/Makefile.in 2006-01-20 03:52:18.414424750 +0100
+++ lcd4linux.dev/Makefile.in 2006-01-20 07:59:02.782678750 +0100
@@ -104,7 +104,7 @@
lcd4linux_SOURCES = lcd4linux.c cfg.c cfg.h debug.c debug.h drv.c drv.h evaluator.c evaluator.h hash.c hash.h layout.c layout.h pid.c pid.h timer.c timer.h thread.c thread.h udelay.c udelay.h qprintf.c qprintf.h widget.c widget.h widget_text.c widget_text.h widget_bar.c widget_bar.h widget_icon.c widget_icon.h plugin.c plugin.h plugin_cfg.c plugin_math.c plugin_string.c plugin_test.c plugin_time.c
-EXTRA_lcd4linux_SOURCES = drv_generic_text.c drv_generic_text.h drv_generic_graphic.c drv_generic_graphic.h drv_generic_serial.c drv_generic_serial.h drv_generic_parport.c drv_generic_parport.h drv_generic_i2c.c drv_generic_i2c.h drv_BeckmannEgle.c drv_BWCT.c drv_Crystalfontz.c drv_Curses.c drv_Cwlinux.c drv_HD44780.c drv_Image.c drv_LCDLinux.c drv_LCDLinux.h drv_LCDTerm.c drv_M50530.c drv_MatrixOrbital.c drv_MilfordInstruments.c drv_Noritake.c drv_NULL.c drv_RouterBoard.c drv_serdisplib.c drv_SimpleLCD.c drv_T6963.c drv_Trefon.c drv_USBLCD.c drv_X11.c font_6x8.h lcd4linux_i2c.h plugin_apm.c plugin_cpuinfo.c plugin_diskstats.c plugin_dvb.c plugin_exec.c plugin_i2c_sensors.c plugin_imon.c plugin_isdn.c plugin_loadavg.c plugin_meminfo.c plugin_mysql.c plugin_netdev.c plugin_pop3.c plugin_ppp.c plugin_proc_stat.c plugin_python.c plugin_seti.c plugin_statfs.c plugin_uname.c plugin_uptime.c plugin_wireless.c plugin_xmms.c
+EXTRA_lcd4linux_SOURCES = drv_generic_text.c drv_generic_text.h drv_generic_graphic.c drv_generic_graphic.h drv_generic_serial.c drv_generic_serial.h drv_generic_parport.c drv_generic_parport.h drv_generic_i2c.c drv_generic_i2c.h drv_BeckmannEgle.c drv_BWCT.c drv_Crystalfontz.c drv_Curses.c drv_Cwlinux.c drv_HD44780.c drv_Image.c drv_LCDLinux.c drv_LCDLinux.h drv_LCDTerm.c drv_M50530.c drv_MatrixOrbital.c drv_FC-NEC.c drv_MilfordInstruments.c drv_Noritake.c drv_NULL.c drv_RouterBoard.c drv_serdisplib.c drv_SimpleLCD.c drv_T6963.c drv_Trefon.c drv_USBLCD.c drv_X11.c font_6x8.h lcd4linux_i2c.h plugin_apm.c plugin_cpuinfo.c plugin_diskstats.c plugin_dvb.c plugin_exec.c plugin_i2c_sensors.c plugin_imon.c plugin_isdn.c plugin_loadavg.c plugin_meminfo.c plugin_mysql.c plugin_netdev.c plugin_pop3.c plugin_ppp.c plugin_proc_stat.c plugin_python.c plugin_seti.c plugin_statfs.c plugin_uname.c plugin_uptime.c plugin_wireless.c plugin_xmms.c
EXTRA_DIST = lcd4linux.conf.sample lcd4kde.conf lcd4linux.kdelnk lcd4linux.xpm lcd4linux.lsm curses.m4 AUTHORS CREDITS FAQ NEWS TODO README README.Drivers README.Plugins README.KDE plugin_sample.c
@@ -362,6 +362,9 @@
drv_M50530.o: drv_M50530.c config.h debug.h cfg.h qprintf.h udelay.h \
plugin.h evaluator.h widget.h widget_text.h widget_icon.h \
widget_bar.h drv.h drv_generic_text.h drv_generic_parport.h
+drv_NEC-FC.o: drv_NEC-FC.c config.h debug.h cfg.h plugin.h \
+ evaluator.h widget.h widget_text.h widget_icon.h widget_bar.h \
+ drv.h drv_generic_text.h drv_generic_serial.h
drv_MatrixOrbital.o: drv_MatrixOrbital.c config.h debug.h cfg.h plugin.h \
evaluator.h widget.h widget_text.h widget_icon.h widget_bar.h \
drv.h drv_generic_text.h drv_generic_serial.h
diff -urN lcd4linux.old/config.h.in lcd4linux.dev/config.h.in
--- lcd4linux.old/config.h.in 2006-01-20 03:52:18.418423000 +0100
+++ lcd4linux.dev/config.h.in 2006-01-20 08:01:07.332164500 +0100
@@ -368,6 +368,9 @@
/* MatrixOrbital driver */
#undef WITH_MATRIXORBITAL
+/* NEC-FC driver */
+#undef WITH_NEC_FC
+
/* Milford Instruments driver */
#undef WITH_MILINST
diff -urN lcd4linux.old/configure lcd4linux.dev/configure
--- lcd4linux.old/configure 2006-01-20 03:52:18.418423000 +0100
+++ lcd4linux.dev/configure 2006-01-20 08:00:27.973391500 +0100
@@ -872,7 +872,7 @@
HD44780, LCDLinux, LCDTerm, M50530, MatrixOrbital,
MilfordInstruments, Noritake, NULL, PNG, PPM,
RouterBoard, serdisplib, SimpleLCD, T6963, Trefon,
- USBLCD, X11
+ USBLCD, X11, NEC-FC
--with-plugins=<list> choose which plugins to compile.
type --with-plugins=list for a list
of avaible plugins
@@ -5888,6 +5888,7 @@
LCDTERM="yes"
M50530="yes"
MATRIXORBITAL="yes"
+ NEC_FC="yes"
MILINST="yes"
NORITAKE="yes"
NULL="yes"
@@ -5930,6 +5931,9 @@
;;
MatrixOrbital)
MATRIXORBITAL=$val
+ ;;
+ NEC-FC)
+ NEC_FC=$val
;;
MilfordInstruments)
MILINST=$val
@@ -6109,6 +6113,16 @@
fi
+if test "$NEC_FC" = "yes"; then
+ SERIAL="yes"
+ DRIVERS="$DRIVERS drv_NEC-FC.o"
+
+cat >>confdefs.h <<\_ACEOF
+#define WITH_NEC_FC 1
+_ACEOF
+
+fi
+
if test "$MILINST" = "yes"; then
DRIVERS="$DRIVERS drv_MilfordInstruments.o"
diff -urN lcd4linux.old/drv.c lcd4linux.dev/drv.c
--- lcd4linux.old/drv.c 2006-01-20 03:52:18.422421250 +0100
+++ lcd4linux.dev/drv.c 2006-01-20 08:02:30.895589500 +0100
@@ -207,6 +207,7 @@
extern DRIVER drv_LCDLinux;
extern DRIVER drv_LCDTerm;
extern DRIVER drv_M50530;
+extern DRIVER drv_NEC_FC;
extern DRIVER drv_MatrixOrbital;
extern DRIVER drv_MilfordInstruments;
extern DRIVER drv_Noritake;
@@ -259,6 +260,9 @@
#ifdef WITH_MATRIXORBITAL
&drv_MatrixOrbital,
#endif
+#ifdef WITH_NEC_FC
+ &drv_NEC_FC,
+#endif
#ifdef WITH_MILINST
&drv_MilfordInstruments,
#endif
diff -urN lcd4linux.old/drv_NEC-FC.c lcd4linux.dev/drv_NEC-FC.c
--- lcd4linux.old/drv_NEC-FC.c 1970-01-01 01:00:00.000000000 +0100
+++ lcd4linux.dev/drv_NEC-FC.c 2006-01-20 09:32:19.632985000 +0100
@@ -0,0 +1,328 @@
+/* $Id$
+ *
+ * Driver for NEC FC20X2JA
+ * Copyright (C) 2006, Felix Fietkau <nbd@openwrt.org>
+ *
+ * Based on MatrixOrbital driver
+ *
+ * LCD4Linux is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * LCD4Linux is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+/*
+ *
+ * exported fuctions:
+ *
+ * struct DRIVER drv_NEC_FC_
+ *
+ */
+
+#include "config.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "debug.h"
+#include "cfg.h"
+#include "plugin.h"
+#include "widget.h"
+#include "widget_text.h"
+#include "widget_icon.h"
+#include "widget_bar.h"
+#include "drv.h"
+#include "drv_generic_text.h"
+#include "drv_generic_serial.h"
+
+
+static char Name[] = "NEC-FC";
+static int cur_pos = 0;
+static int Model;
+static int Protocol;
+
+/* Fixme: GPO's not yet implemented */
+/* static int GPO[8]; */
+static int GPOS;
+
+
+typedef struct {
+ int type;
+ char *name;
+ int rows;
+ int cols;
+ int gpos;
+ int protocol;
+} MODEL;
+
+/* Fixme #1: number of gpo's should be verified */
+/* Fixme #2: protocol should be verified */
+
+static MODEL Models[] = {
+ {0x01, "FC20X2JA", 2, 20, 0, 1},
+ {0xff, "Unknown", -1, -1, 0, 0}
+};
+
+
+/****************************************/
+/*** hardware dependant functions ***/
+/****************************************/
+
+static void drv_FC_clear(void)
+{
+ drv_generic_serial_write("\014", 1); /* Clear Screen */
+ cur_pos = 0;
+}
+
+
+static void drv_FC_write(const int row, const int col, const char *data, const int len)
+{
+ int i;
+ int target = (row * DCOLS) + col;
+ target -= cur_pos;
+ char *buf;
+
+ buf = malloc(len + 1);
+ memcpy(buf, data, len);
+ buf[len] = 0;
+
+ if (target < 0)
+ for (i = 0; i < -target; i++)
+ drv_generic_serial_write("\x08", 1);
+ else
+ for (i = 0; i < target; i++)
+ drv_generic_serial_write("\x09", 1);
+
+ cur_pos += target + len;
+ if (cur_pos >= (DROWS * DCOLS))
+ cur_pos = 0;
+
+ drv_generic_serial_write(data, len);
+}
+
+
+static void drv_FC_defchar(const int ascii, const unsigned char *matrix)
+{
+ int i;
+ char cmd[11] = "\x1aN";
+
+ cmd[2] = (char) ascii;
+ for (i = 0; i < 8; i++) {
+ cmd[i + 3] = matrix[i] & 0x1f;
+ }
+ drv_generic_serial_write(cmd, 11);
+}
+
+
+static int drv_FC_contrast(int contrast)
+{
+ char c = (char) contrast;
+ c >>= 6;
+ c &= 2;
+ c = 4 - c;
+
+ drv_generic_serial_write(&c, 1);
+ return contrast;
+}
+
+
+static int drv_FC_start(const char *section, const int quiet)
+{
+ int i;
+ char *model;
+ char buffer[256];
+
+ model = cfg_get(section, "Model", NULL);
+ if (model != NULL && *model != '\0') {
+ for (i = 0; Models[i].type != 0xff; i++) {
+ if (strcasecmp(Models[i].name, model) == 0)
+ break;
+ }
+ if (Models[i].type == 0xff) {
+ error("%s: %s.Model '%s' is unknown from %s", Name, section, model, cfg_source());
+ return -1;
+ }
+ Model = i;
+ info("%s: using model '%s'", Name, Models[Model].name);
+ } else {
+ info("%s: no '%s.Model' entry from %s, auto-dedecting", Name, section, cfg_source());
+ Model = -1;
+ }
+
+
+ if (drv_generic_serial_open(section, Name, 0) < 0)
+ return -1;
+
+ /* initialize global variables */
+ DROWS = Models[Model].rows;
+ DCOLS = Models[Model].cols;
+ GPOS = Models[Model].gpos;
+ Protocol = Models[Model].protocol;
+
+ drv_FC_clear();
+
+ drv_generic_serial_write("\x01", 1); /* 100% lum */
+ drv_generic_serial_write("\x14", 1); /* cursor on */
+ drv_generic_serial_write("\x11", 1); /* scroll write */
+
+ /* set contrast */
+ if (cfg_number(section, "Contrast", 0, 0, 255, &i) > 0) {
+ drv_FC_contrast(i);
+ }
+
+ return 0;
+}
+
+
+/****************************************/
+/*** plugins ***/
+/****************************************/
+
+
+static void plugin_contrast(RESULT * result, const int argc, RESULT * argv[])
+{
+ double contrast;
+
+ switch (argc) {
+ case 0:
+ contrast = drv_FC_contrast(-1);
+ SetResult(&result, R_NUMBER, &contrast);
+ break;
+ case 1:
+ contrast = drv_FC_contrast(R2N(argv[0]));
+ SetResult(&result, R_NUMBER, &contrast);
+ break;
+ default:
+ error("%s::contrast(): wrong number of parameters", Name);
+ SetResult(&result, R_STRING, "");
+ }
+}
+
+
+
+/****************************************/
+/*** widget callbacks ***/
+/****************************************/
+
+/* using drv_generic_text_draw(W) */
+/* using drv_generic_text_icon_draw(W) */
+/* using drv_generic_text_bar_draw(W) */
+
+
+/****************************************/
+/*** exported functions ***/
+/****************************************/
+
+
+/* list models */
+int drv_FC_list(void)
+{
+ int i;
+
+ for (i = 0; Models[i].type != 0xff; i++) {
+ printf("%s ", Models[i].name);
+ }
+ return 0;
+}
+
+
+/* initialize driver & display */
+int drv_FC_init(const char *section, const int quiet)
+{
+ WIDGET_CLASS wc;
+ int ret;
+
+ /* display preferences */
+ XRES = 5; /* pixel width of one char */
+ YRES = 8; /* pixel height of one char */
+ CHARS = 8; /* number of user-defineable characters */
+ CHAR0 = 0; /* ASCII of first user-defineable char */
+ GOTO_COST = 4; /* number of bytes a goto command requires */
+
+ /* real worker functions */
+ drv_generic_text_real_write = drv_FC_write;
+ drv_generic_text_real_defchar = drv_FC_defchar;
+
+
+ /* start display */
+ if ((ret = drv_FC_start(section, quiet)) != 0)
+ return ret;
+
+ /* initialize generic text driver */
+ if ((ret = drv_generic_text_init(section, Name)) != 0)
+ return ret;
+
+ /* initialize generic icon driver */
+ if ((ret = drv_generic_text_icon_init()) != 0)
+ return ret;
+
+ /* initialize generic bar driver */
+ if ((ret = drv_generic_text_bar_init(0)) != 0)
+ return ret;
+
+ /* add fixed chars to the bar driver */
+ drv_generic_text_bar_add_segment(0, 0, 255, 32); /* ASCII 32 = blank */
+ drv_generic_text_bar_add_segment(255, 255, 255, 255); /* ASCII 255 = block */
+
+ /* register text widget */
+ wc = Widget_Text;
+ wc.draw = drv_generic_text_draw;
+ widget_register(&wc);
+
+ /* register icon widget */
+ wc = Widget_Icon;
+ wc.draw = drv_generic_text_icon_draw;
+ widget_register(&wc);
+
+ /* register bar widget */
+ wc = Widget_Bar;
+ wc.draw = drv_generic_text_bar_draw;
+ widget_register(&wc);
+
+ /* register plugins */
+ AddFunction("LCD::contrast", -1, plugin_contrast);
+
+ return 0;
+}
+
+
+/* close driver & display */
+int drv_FC_quit(const int quiet)
+{
+
+ info("%s: shutting down.", Name);
+
+ drv_generic_text_quit();
+
+ /* clear display */
+ drv_FC_clear();
+
+ /* say goodbye... */
+ if (!quiet) {
+ drv_generic_text_greet("goodbye!", NULL);
+ }
+
+ drv_generic_serial_close();
+
+ return (0);
+}
+
+
+DRIVER drv_NEC_FC = {
+ name:Name,
+ list:drv_FC_list,
+ init:drv_FC_init,
+ quit:drv_FC_quit,
+};