add my own driver for the NEC FC20X2JA display to lcd4linux
authorFelix Fietkau <nbd@openwrt.org>
Fri, 20 Jan 2006 08:36:55 +0000 (08:36 +0000)
committerFelix Fietkau <nbd@openwrt.org>
Fri, 20 Jan 2006 08:36:55 +0000 (08:36 +0000)
SVN-Revision: 3026

openwrt/package/lcd4linux/patches/130-nec_fc.patch [new file with mode: 0644]

diff --git a/openwrt/package/lcd4linux/patches/130-nec_fc.patch b/openwrt/package/lcd4linux/patches/130-nec_fc.patch
new file mode 100644 (file)
index 0000000..be8882c
--- /dev/null
@@ -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,
++};