From 9b3e71fa1136627b74b39e10566be222a95878fc Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Fri, 20 Jan 2006 08:36:55 +0000 Subject: [PATCH] add my own driver for the NEC FC20X2JA display to lcd4linux SVN-Revision: 3026 --- .../lcd4linux/patches/130-nec_fc.patch | 435 ++++++++++++++++++ 1 file changed, 435 insertions(+) create mode 100644 openwrt/package/lcd4linux/patches/130-nec_fc.patch diff --git a/openwrt/package/lcd4linux/patches/130-nec_fc.patch b/openwrt/package/lcd4linux/patches/130-nec_fc.patch new file mode 100644 index 00000000000..be8882c1098 --- /dev/null +++ b/openwrt/package/lcd4linux/patches/130-nec_fc.patch @@ -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= 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 ++ * ++ * 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 ++#include ++#include ++#include ++ ++#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, ++};