update serialVFD driver and comment bignum library -

patch provided by Stefan Herdler
This commit is contained in:
marschap
2006-02-18 13:41:39 +00:00
parent df4c6d4f2c
commit dd66eac255
4 changed files with 834 additions and 768 deletions
+6 -3
View File
@@ -24,8 +24,8 @@
If you want to add a new device to the driver add a new section
to the displaytype-switch-case in the init-function and fill it
with the corrrect commands for the display.
(Try wich displaytype works best with your display, copy and modify
with the correct commands for the display.
(Try which displaytype works best with your display, copy and modify
it's section that is the easiest way I guess.)
@@ -33,10 +33,13 @@
http://www.maltepoeggel.de/html/vfd/index.html
It is possible to switch the display off and back on while the server is
running. It may take a few minutes untill the next full refresh makes
the display show everything correctly.
To enable the bignumbers on 2-line displays (only this driver supports
this yet) you have to edit "/clientchrono.c" before compiling.
this yet) you have to edit "/clients/lcdproc/chrono.c" before compiling.
In function "big_clock_screen" you have to replace the "4" by a "2" in
this line: "if (lcd_hgt < 4)"
+111 -67
View File
@@ -23,27 +23,49 @@
Demands on the calling driver / display:
Requirements to the calling driver / display:
cellwidth == 5
cellheight == 7 or 8 (testet only on 7)
cellheight == 7 or 8 (tested only on 7)
needed functions:
drvthis->set_char (only if the display has usercharacters)
drvthis->set_char (only if the display has customcharacters)
drvthis->chr
usercharacters (if available) at 0, 1, 2, ..... ,n
customcharacters (if available) at char 0, 1, 2, ..... ,n
USAGE:
Just call lib_adv_bignum(drvthis, x, num, height, do_init, customchars)
from drvthis->num.
The library does everything needed to show bignumbers EXPECT checking or
The library does everything needed to show bignumbers EXCEPT checking or
setting the CCMODE variable. The driver has to do this (see serialVFD.c
for details).
Example: Call of the lib_adv_bignum from a drivers_num function :
MODULE_EXPORT void
serialVFD_num( Driver * drvthis, int x, int num )
{
int do_init=0;
PrivateData *p = drvthis->private_data;
if (p->ccmode != CCMODE_BIGNUM) // Are the customcharacters set up correctly? If not:
{
do_init=1; // Lib_adv_bignum has to set the customcharacters.
p->ccmode = CCMODE_BIGNUM; // Switch customcharactermode to bignum.
}
// Lib_adv_bignum does everything needed to show the bignumbers.
lib_adv_bignum(drvthis, x, num, p->height, do_init, p->customchars);
}
To enable the bignumbers on 2-line displays you have to edit "/clients/lcdproc/chrono.c"
before compiling. In function "big_clock_screen" you have to replace the "4" by a "2" in
this line: "if (lcd_hgt < 4)".
*/
#include <stdlib.h>
//#include <stdio.h>
#include <unistd.h>
//#include <termios.h>
#include <fcntl.h>
#include <string.h>
#include <errno.h>
@@ -75,36 +97,38 @@ static void adv_bignum_num_4_3 (Driver *drvthis, int x, int num, int height, int
static void adv_bignum_write_num (Driver *drvthis, char write_num_map[][4][4], int x, int num, int height);
/////////////////////////////////////////////////////////////////////////////////////////////
// This function determines the best possible bignumbertype for the display.
// The called bignumberfunction is depending on the display's height and the
// number of customcharacters.
void
lib_adv_bignum(Driver *drvthis, int x, int num, int height, int do_init, int customchars)
{
switch (height) {
case 2:
case 3:
if(customchars == 0){
switch (height) { // Display heigth:
case 2: // 2 lines
case 3: // are 3 line displays really existing?
if(customchars == 0){// 2 lines and customchars = 0
adv_bignum_num_2_0 (drvthis, x, num, height, do_init);
}
else if(customchars ==1 ){
else if(customchars ==1 ){// 2 lines and customchars = 1
adv_bignum_num_2_1 (drvthis, x, num, height, do_init);
}
else if(customchars < 3){
else if(customchars < 5){// 2 lines and customchars = 2 ... 4
adv_bignum_num_2_2 (drvthis, x, num, height, do_init);
}
else if(customchars < 28){
else if(customchars < 28){ // 2 lines and customchars = 5 ... 27
adv_bignum_num_2_5 (drvthis, x, num, height, do_init);
}
else { //p->customchars <= 28
else { // 2 lines and customchars >= 28
adv_bignum_num_2_28 (drvthis, x, num, height, do_init);
}
break;
case 4:
if(customchars < 3){
case 4: // 4 lines
if(customchars < 3){// 4 lines and customchars < 3
adv_bignum_num_4_0 (drvthis, x, num, height, do_init);
}
else { //p->customchars <= 4
else { // 4 lines and customchars >= 3
adv_bignum_num_4_3 (drvthis, x, num, height, do_init);
}
break;
@@ -113,12 +137,16 @@ lib_adv_bignum(Driver *drvthis, int x, int num, int height, int do_init, int cus
}
}
/////////////////////////////////////////////////////////////////////////////////////////////
// This function writes the selected type of bignumber by calling the drivers_char function.
// It is called by displaydepending bignumber function to write the numbers.
static void adv_bignum_write_num (Driver *drvthis, char write_num_map[][4][4], int x, int num, int height)
{
int y, dx;
for (y = 0; y < height; y++)
{
if(num == 10)
if(num == 10) // ":" is only 1 character wide.
drvthis->chr (drvthis, x, y+1, write_num_map[num][y][0]);
else
for (dx = 0; dx <3; dx++)
@@ -131,16 +159,17 @@ static void adv_bignum_write_num (Driver *drvthis, char write_num_map[][4][4], i
//
//
//
// stored usercharacters
// Display dependent functions.
//
//
//
/////////////////////////////////////////////////////////////////////////////////////////////
// This function is called for a 2 line display without custom characters.
// (pretty ugly looking)
static void adv_bignum_num_2_0 (Driver *drvthis, int x, int num, int height, int do_init)
{
static char num_map[][4][4] = {
static char num_map[][4][4] = {
{ /* 0 */
" ||",
" ||",
@@ -196,17 +225,19 @@ static char num_map[][4][4] = {
".",
" ",
" " }
};
}; // Defines the character placing inside the bignumber.
adv_bignum_write_num (drvthis, num_map, x, num, height);
adv_bignum_write_num (drvthis, num_map, x, num, height); // write the number
}
/////////////////////////////////////////////////////////////////////////////////////////////
// This function is usable for a 2 line display with 1 or more custom characters.
// (not a beauty, but useable)
static void adv_bignum_num_2_1 (Driver *drvthis, int x, int num, int height, int do_init)
{
static char num_map[][4][4] = {
static char num_map[][4][4] = {
{ /* 0 */
{'|' , 0 , '|',0},
{"|_|"},
@@ -262,10 +293,10 @@ static char num_map[][4][4] = {
{"."},
{" "},
{" "} }
};
if (do_init)
}; // Defines the character placing inside the bignumber.
if (do_init) // Set customcharacters if needed.
{
static char bignum[1][5 * 8] = {
static char bignum[1][5 * 8] = { // stored customcharacter
{
1, 1, 1, 1, 1,
0, 0, 0, 0, 0,
@@ -276,17 +307,19 @@ if (do_init)
0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
}};
drvthis->set_char (drvthis, 0, &bignum[0][0]);
drvthis->set_char (drvthis, 0, &bignum[0][0]); // put the customcharacter into the display
}
adv_bignum_write_num (drvthis, num_map, x, num, height);
adv_bignum_write_num (drvthis, num_map, x, num, height); // write the number
}
/////////////////////////////////////////////////////////////////////////////////////////////
// This function is usable for a 2 line display with 2 or more custom characters.
// (o.k.)
static void adv_bignum_num_2_2 (Driver *drvthis, int x, int num, int height, int do_init)
{
static char num_map[][4][4] ={
static char num_map[][4][4] ={
{ /* 0 */
{'|',0,'|'},
"|_|",
@@ -342,10 +375,10 @@ static char num_map[][4][4] ={
".",
" ",
" " }
};
if (do_init)
}; // Defines the character placing inside the bignumber.
if (do_init) // Set customcharacters if needed.
{
static char bignum[2][5 * 8] = {
static char bignum[2][5 * 8] = { // stored customcharacters
{
1, 1, 1, 1, 1,
0, 0, 0, 0, 0,
@@ -367,18 +400,20 @@ if (do_init)
1, 1, 1, 1, 1,
}};
int i;
for (i = 0; i <= 2 ; i++) {
for (i = 0; i <= 2 ; i++) { // put the customcharacters into the display
drvthis->set_char (drvthis, i, &bignum[i][0]);
}
}
adv_bignum_write_num (drvthis, num_map, x, num, height);
}
adv_bignum_write_num (drvthis, num_map, x, num, height); // write the number
}
/////////////////////////////////////////////////////////////////////////////////////////////
// This function is usable for a 2 line display with 5 or more custom characters.
// (nice bignumbers)
static void adv_bignum_num_2_5 (Driver *drvthis, int x, int num, int height, int do_init)
{
static char num_map[][4][4] =
static char num_map[][4][4] =
{{{3 ,0 ,2}, /*0*/
{3 ,1 ,2},
{" "},
@@ -422,10 +457,10 @@ static char num_map[][4][4] =
{{'.'},/*:*/
{'.'},
{" "},
{" "}}};
if (do_init)
{" "}}}; // Defines the character placing inside the bignumber.
if (do_init) // Set customcharacters if needed.
{
static char bignum[5][5 * 8] = {
static char bignum[5][5 * 8] = { // stored customcharacters
{
1, 1, 1, 1, 1,
1, 1, 1, 1, 1,
@@ -477,18 +512,20 @@ if (do_init)
1, 1, 1, 1, 1,
}};
int i;
for (i = 0; i <= 5 ; i++) {
for (i = 0; i <= 5 ; i++) { // put the customcharacters into the display
drvthis->set_char (drvthis, i, &bignum[i][0]);
}
}
adv_bignum_write_num (drvthis, num_map, x, num, height);
}
adv_bignum_write_num (drvthis, num_map, x, num, height); // write the number
}
/////////////////////////////////////////////////////////////////////////////////////////////
// This function is usable for a 2 line display with 28 or more custom characters.
// (Wow, allmost graphical)
static void adv_bignum_num_2_28 (Driver *drvthis, int x, int num, int height, int do_init)
{
static char num_map[][4][4] =
static char num_map[][4][4] =
{{{15 ,6 ,2}, /*0*/
{14 ,4 ,5},
{" "},
@@ -532,12 +569,12 @@ static char num_map[][4][4] =
{{27},/*:*/
{27},
{" "},
{" "}}};
{" "}}}; // Defines the character placing inside the bignumber.
if (do_init)
if (do_init) // Set customcharacters if needed.
{
static char bignum[28][5 * 8] = {
static char bignum[28][5 * 8] = { // stored customcharacters
{ //0
0, 0, 0, 1, 1,
0, 0, 1, 1, 1,
@@ -820,17 +857,22 @@ static char bignum[28][5 * 8] = {
}
};
int i;
for (i = 0; i <= 28 ; i++) {
for (i = 0; i <= 28 ; i++) { // put the customcharacters into the display
drvthis->set_char (drvthis, i, &bignum[i][0]);
}
}
adv_bignum_write_num (drvthis, num_map, x, num, height);
}
adv_bignum_write_num (drvthis, num_map, x, num, height); // write the number
}
/////////////////////////////////////////////////////////////////////////////////////////////
// This function is usable for a 4 line display without custom characters.
// (o.k.)
static void adv_bignum_num_4_0 (Driver *drvthis, int x, int num, int height, int do_init)
{
/* Ugly code extracted by David GLAUDE from lcdm001.c ;)*/
/* Moved to driver.c by Joris Robijn */
// Moved to adv_bignum.c by Stefan Herdler
static char num_map[][4][4] = {
{ /* 0 */
" _ ",
@@ -887,13 +929,15 @@ static char num_map[][4][4] = {
".",
".",
" " }
};
}; // Defines the character placing inside the bignumber.
adv_bignum_write_num (drvthis, num_map, x, num, height);
adv_bignum_write_num (drvthis, num_map, x, num, height); // write the number
}
/////////////////////////////////////////////////////////////////////////////////////////////
// This function is usable for a 4 line display with 5 or more custom characters.
// (nice bignumbers)
static void adv_bignum_num_4_3 (Driver *drvthis, int x, int num, int height, int do_init)
{
static char num_map[][4][4] =
@@ -940,10 +984,10 @@ static char num_map[][4][4] =
{{" "},/*:*/
{'.'},
{'.'},
{" "}}};
if (do_init)
{" "}}}; // Defines the character placing inside the bignumber.
if (do_init) // Set customcharacters if needed.
{
static char bignum[5][5 * 8] = {
static char bignum[5][5 * 8] = { // stored customcharacters
{
1, 1, 1, 1, 1,
1, 1, 1, 1, 1,
@@ -976,11 +1020,11 @@ if (do_init)
}
};
int i;
for (i = 0; i <= 3 ; i++) {
for (i = 0; i <= 3 ; i++) { // put the customcharacters into the display
drvthis->set_char (drvthis, i, &bignum[i][0]);
}
}
adv_bignum_write_num (drvthis, num_map, x, num, height);
adv_bignum_write_num (drvthis, num_map, x, num, height); // write the number
}
+86 -67
View File
@@ -2,11 +2,11 @@
Copyright (C) 2006 Stefan Herdler
This driver is based on drv_base.c, wirz-sli.c and hd44780 from LCDproc
and the NoritakeVFD driver from this package.
This driver is based on wirz-sli.c, hd44780.c, drv_base.c and NoritakeVFD
driver.
It may contain parts of other drivers of this package too.
2006-01-26 Version 0.1: everything should work (not all hardware tested!)
2006-02-13 Version 0.2: everything should work (not all hardware tested!)
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -55,16 +55,16 @@
it's section that is the easiest way I guess.)
On this page I found pictures and datasheets from the VFD's:
On this page I found pictures and datasheets of the VFD's:
http://www.maltepoeggel.de/html/vfd/index.html
To enable the bignumbers on 2-line displays (only this driver supports
this yet) you have to edit "/clientchrono.c" before compiling.
this yet) you have to edit "/clients/lcdproc/chrono.c" before compiling.
In function "big_clock_screen" you have to replace the "4" by a "2" in
this line: "if (lcd_hgt < 4)"
this line: "if (lcd_hgt < 4)".
@@ -192,24 +192,13 @@ get_info Implemented.
#include "lcd_lib.h"
#include "adv_bignum.h"
#define pos1_cursor 4
#define mv_cursor 5 //moves cursor to position (next byte).
#define reset 6
#define init_cmds 7
#define set_user_char 8
#define pos1_cursor 4 //moves cursor to top left character.
#define mv_cursor 5 //moves cursor to position specified by the next byte.
#define reset 6 //reset
#define init_cmds 7 //commands needed to initialize the display.
#define set_user_char 8 //set user character.
#define hor_tab 9 //moves cursor 1 chr right
/* Constants for userdefchar_mode */
//#define NUM_CCs 8 /* max. number of custom characters */
//typedef enum {
// standard, /* only char 0 is used for heartbeat */
// vbar, /* vertical bars */
// hbar, /* horizontal bars */
// custom, /* custom settings */
// bignum,
// } CGmode;
typedef struct driver_private_data {
char device[200];
int fd;
@@ -225,6 +214,7 @@ typedef struct driver_private_data {
int brightness;
int customchars;
int ISO_8859_1;
unsigned int refresh_timer;
unsigned char charmap[128];
int display_type;
char custom_char[31][7]; // used for "KD Rev 2.1" only
@@ -245,10 +235,11 @@ MODULE_EXPORT int supports_multiple = 0;
MODULE_EXPORT char *symbol_prefix = "serialVFD_";
/* Internal functions */
static void serialVFD_init_vbar (Driver *drvthis);
static void serialVFD_init_hbar (Driver *drvthis);
static void serialVFD_draw_frame (Driver *drvthis, char *dat);
void serialVFD_init_vbar (Driver *drvthis);
void serialVFD_init_hbar (Driver *drvthis);
void serialVFD_draw_frame (Driver *drvthis, char *dat);
void serialVFD_put_brightness (Driver *drvthis);
void serialVFD_put_char (Driver *drvthis, int n);
// Opens com port and sets baud correctly...
//
@@ -257,7 +248,6 @@ serialVFD_init (Driver *drvthis)
{
struct termios portset;
int tmp, w, h, brightness;
// int reboot = 0;
char size[200] = DEFAULT_SIZE;
PrivateData *p;
@@ -274,6 +264,7 @@ serialVFD_init (Driver *drvthis)
p->cellheight = DEFAULT_CELL_HEIGHT;
p->ccmode = CCMODE_STANDARD;
p->ISO_8859_1 = 1;
p->refresh_timer = 0;
debug(RPT_INFO, "%s(%p)", __FUNCTION__, drvthis );
@@ -664,27 +655,36 @@ serialVFD_init (Driver *drvthis)
/////////////////////////////////////////////////////////////////
// Changes screen brightness (0-255; 140 seems good)
// Changes screen brightness (0 min ... 255 max ... 1000 also max)
//
MODULE_EXPORT void
serialVFD_set_brightness (Driver *drvthis, int state, int brightness)
{
{ // set p->brightness
PrivateData *p = drvthis->private_data;
int realbrightness = -1;
if (brightness > 0) {
if (brightness > 0)
{
if (brightness > 255)
brightness = 255;
if (p->brightness != brightness)
{
realbrightness = (int) (brightness / 64);
write (p->fd, &p->hw_cmd[realbrightness][1],\
p->hw_cmd[realbrightness][0]);
}
p->brightness=brightness;
serialVFD_put_brightness (drvthis);
}
}
}
void
serialVFD_put_brightness (Driver *drvthis)
{ // set hardware brightness
PrivateData *p = drvthis->private_data;
int realbrightness = (int) (p->brightness / 64);
//(4 steps 0-64, 65-128, 129-192, 193-1000)
write (p->fd, &p->hw_cmd[realbrightness][1],\
p->hw_cmd[realbrightness][0]);
}
/////////////////////////////////////////////////////////////////
@@ -723,7 +723,7 @@ serialVFD_hbar (Driver *drvthis, int x, int y, int len, int promille, int option
//
MODULE_EXPORT void
serialVFD_set_char (Driver *drvthis, int n, char *dat)
{
{ //set char in p->custom_char
PrivateData *p = drvthis->private_data;
int letter=0;
unsigned int byte, bit;
@@ -734,8 +734,6 @@ serialVFD_set_char (Driver *drvthis, int n, char *dat)
return;
if(p->display_type==1)
{
for (byte = 0;byte < p->usr_chr_dot_assignment[0]; byte++)
{
for (bit = 0;bit < 8; bit++)
@@ -746,29 +744,26 @@ serialVFD_set_char (Driver *drvthis, int n, char *dat)
p->custom_char[n][byte] = letter;
letter = 0;
}
}
else
{
write (p->fd, &p->hw_cmd[set_user_char][1],\
p->hw_cmd[set_user_char][0]);
write (p->fd, &p->usr_chr_mapping[n], 1);
if (p->display_type != 1) //not KD Rev 2.1
serialVFD_put_char (drvthis, n);
for (byte = 0;byte < p->usr_chr_dot_assignment[0]; byte++)
{
for (bit = 0;bit < 8; bit++)
{
if((int)p->usr_chr_dot_assignment[bit+8*byte+1] != 0)
letter |= (dat[(int)p->usr_chr_dot_assignment[bit+8*byte+1]-1] << bit);
}
write (p->fd, &letter, 1);
letter = 0;
}
}
if (p->need_refresh == 1)
p->custom_char_changed[n]=1;
}
void
serialVFD_put_char (Driver *drvthis, int n)
{ // put char in display
PrivateData *p = drvthis->private_data;
write (p->fd, &p->hw_cmd[set_user_char][1],\
p->hw_cmd[set_user_char][0]);// substitute and select Character to overwrite
write (p->fd, &p->usr_chr_mapping[n], 1);
write (p->fd, &p->custom_char[n][0], p->usr_chr_dot_assignment[0]);// overwrite selected Character
}
/////////////////////////////////////////////////////////////
// Blasts a single frame onscreen, to the lcd...
//
@@ -782,6 +777,30 @@ serialVFD_draw_frame (Driver *drvthis, char *dat)
if (!dat)
return;
if (p->refresh_timer > 500) // Do a full refresh every 500 refreshs.
// With this it is possible to switch display on and off while lcdproc is running
{
write (p->fd, &p->hw_cmd[init_cmds][1],p->hw_cmd[init_cmds][0]);
serialVFD_put_brightness (drvthis); // restore brightness
for (i = 0; i < (p->height * p->width); i++)
p->backingstore[i]=0; // clear Backing-store
if (p->display_type != 1) //not KD Rev 2.1
{
for(i=0;i<p->customchars;i++) // refresh all customcharacters
serialVFD_put_char (drvthis, i);
/* {
write (p->fd, &p->hw_cmd[set_user_char][1],\
p->hw_cmd[set_user_char][0]);// substitute and select character to overwrite
write (p->fd, &p->usr_chr_mapping[i], 1);
write (p->fd, &p->custom_char[(int)dat[i]][0], p->usr_chr_dot_assignment[0]);// overwrite selected Character
}*/
}
p->refresh_timer = 0;
}
p->refresh_timer++;
for (i = 0; i < (p->height * p->width); i++)
{
@@ -809,20 +828,20 @@ serialVFD_draw_frame (Driver *drvthis, char *dat)
}
}
if(dat[i] >= 0 && dat[i] <= 30)
if(dat[i] >= 0 && dat[i] <= 30) // custom character
{
if (p->display_type == 1) // KD Rev 2.1 only
{
write (p->fd, "\x1A\xDB", 2); // substitute and select Character to overwrite (237)
write (p->fd, &p->custom_char[(int)dat[i]][0], 7);// overwrite selected Character
write (p->fd, "\xDB", 1); // Write Character
write (p->fd, "\x1A\xDB", 2); // substitute and select character to overwrite (237)
write (p->fd, &p->custom_char[(int)dat[i]][0], 7);// overwrite selected character
write (p->fd, "\xDB", 1); // write character
}
else // all other displays
{
write (p->fd, &p->usr_chr_mapping[(int)dat[i]], 1);
}
}
else if(dat[i] < 0 && (p->ISO_8859_1 != 0))
else if(dat[i] < 0 && (p->ISO_8859_1 != 0)) // ISO_8859_1 translation for 129 ... 255
{
write (p->fd, &p->charmap[dat[i] + 128], 1);
}
@@ -835,11 +854,11 @@ serialVFD_draw_frame (Driver *drvthis, char *dat)
}
}
if (last_chr != -10)
if (last_chr != -10) // update backingstore if something changed
{
memcpy(p->backingstore, dat, p->height * p->width);
int i;
for(i=0;i<32;i++)
for(i=0;i<p->customchars;i++)
p->custom_char_changed[i]=0;
}
@@ -854,11 +873,12 @@ serialVFD_num( Driver * drvthis, int x, int num )
PrivateData *p = drvthis->private_data;
if (p->ccmode != CCMODE_BIGNUM)
if (p->ccmode != CCMODE_BIGNUM) // Are the customcharacters set up correctly? If not:
{
do_init=1;
p->ccmode = CCMODE_BIGNUM;
do_init=1; // Lib_adv_bignum has to set the customcharacters.
p->ccmode = CCMODE_BIGNUM; // Switch customcharactermode to bignum.
}
// Lib_adv_bignum does everything needed to show the bignumbers.
lib_adv_bignum(drvthis, x, num, p->height, do_init, p->customchars);
}
@@ -906,7 +926,6 @@ serialVFD_icon (Driver *drvthis, int x, int y, int icon)
p->ccmode = CCMODE_STANDARD;
serialVFD_set_char(drvthis, 0, icons[0]);
serialVFD_chr(drvthis, x, y, 0);
// serialVFD_chr(drvthis, x, y, 127 );
break;
default:
return -1; // Let the core do other icons
@@ -1196,6 +1215,6 @@ MODULE_EXPORT char *
serialVFD_get_info (Driver *drvthis)
{
PrivateData *p = drvthis->private_data;
strcpy(p->info, "Driver for many serialVFDs from NEC(all FIPC based), Noritake, Futaba and the \"KD Rev2.1\"VFD");
strcpy(p->info, "Driver for many serialVFDs from NEC(all FIPC based), Noritake, Futaba and the \"KD Rev2.1\"VFD.");
return p->info;
}
+3 -3
View File
@@ -2,11 +2,11 @@
Copyright (C) 2006 Stefan Herdler
This driver is based on drv_base.c, wirz-sli.c and hd44780 from LCDproc
0.4.5 and the NoritakeVFD driver from this package.
This driver is based on wirz-sli.c, hd44780.c, drv_base.c and NoritakeVFD
driver.
It may contain parts of other drivers of this package too.
2006-01-26 Version 0.1: everything should work (not all hardware tested!)
2006-02-13 Version 0.2: everything should work (not all hardware tested!)
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by