update lis driver (Daryl F)

This commit is contained in:
marschap
2007-06-17 12:07:37 +00:00
parent 77209a6f3f
commit 2f9f70e87e
5 changed files with 353 additions and 188 deletions
+9 -7
View File
@@ -422,10 +422,10 @@ Speed=19200
# Select what type of connection. See documentation for types.
ConnectionType=4bit
# Port where the LPT is. Usual values are 0x278, 0x378 and 0x3BC
# Port where the LPT is [ususal: 0x278, 0x378 and 0x3BC]
Port=0x378
# Device of the serial interface (default is /dev/lcd)
# Device of the serial interface [default: /dev/lcd]
Device=/dev/ttyS0
# Bitrate of the serial port (0 for interface default)
@@ -626,14 +626,16 @@ Size=16x2
# 0-250 = 25%, 251-500 = 50%, 501-750 = 75%, 751-1000 = 100%
#Brightness=1000
# Columns by lines (default 20x2)
# Columns by lines [default: 20x2]
#Size=20x2
# USB Vendor ID (default 0x0403)
VendorID=0x0403
# USB Vendor ID [default: 0x0403]
# Change only if testing a compatible device.
#VendorID=0x0403
# USB Product ID (default 0x6001
ProductID=0x6001
# USB Product ID [default: 0x6001]
# Change only if testing a compatible device.
#ProductID=0x6001
##The driver for the VFD of the Medion MD8800 PC ##
+24 -8
View File
@@ -74,10 +74,18 @@ can be done by specifying "--enable-drivers=all" or by
<replaceable>VENDORID</replaceable>
</arg>
</term>
<listitem><para>
USB Vendor ID
[default: <literal>0x0403</literal>].
</para></listitem>
<listitem>
<para>
The USB Vendor ID of the device to use.
If not given, it defaults to <literal>0x0403</literal> for a VLSystems L.I.S. MCE 2005 VFD
based on a FT232BL USB-to-RS232 converter by FTDIi, which was produced
before March 2007.
</para>
<para>
It is usually not necessary to specify a <replaceable>VENDORID</replaceable>.
Please do so only if you want to test a compatible device.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>
@@ -86,10 +94,18 @@ can be done by specifying "--enable-drivers=all" or by
<replaceable>PRODUCTID</replaceable>
</arg>
</term>
<listitem><para>
USB Product ID
[default: <literal>0x6001</literal>].
</para></listitem>
<listitem>
<para>
The USB Product ID of the device to use.
If not given, it defaults to <literal>0x6001</literal> for a VLSystems L.I.S. MCE 2005 VFD
based on a FT232BL USB-to-RS232 converter by FTDIi, which was produced
before March 2007.
</para>
<para>
It is usually not necessary to specify a <replaceable>PRODUCTID</replaceable>.
Please do so only if you want to test a compatible device.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>
+1 -1
View File
@@ -42,7 +42,7 @@ IOWarrior_LDADD = @libusb_libs@ libLCD.a libbignum.a
irman_LDADD = @LIBIRMAN@
lcterm_LDADD = libLCD.a
lirc_LDADD = @LIBLIRC_CLIENT@
lis_LDADD = libLCD.a @LIBFTDI@
lis_LDADD = libLCD.a @LIBFTDI@ libbignum.a
MD8800_LDADD = libLCD.a
mtc_s16209x_LDADD = libLCD.a
MtxOrb_LDADD = libLCD.a libbignum.a
+285 -168
View File
@@ -8,6 +8,7 @@
* sure kernel module ftdi_sio doesn't claim the device.
*
* Based on: ula200 driver Copyright (C) 2006, Bernhard Walle
* IOWarrior driver Copyright(C) 2004-2006 Peter Marschall <peter@adpm.de>
*
* Copyright (c) 2007, Daryl Fonseca-Holt <wyatt@prairieturtle.ca>
*
@@ -41,6 +42,9 @@
* lis_cellheight() and lis_cellwidth().
* Completely commented out lis_test() to
* save memory.
* 2007/05/30 Remove set_custom_chars(). Implement
* lis_set_chars(), lis_vbar(), lis_hbar()
* and lis_num() using helper functions.
*/
#include <stdlib.h>
#include <stdio.h>
@@ -64,9 +68,10 @@
#include "lis.h"
#include "report.h"
#include "lcd_lib.h"
#include "adv_bignum.h"
#include "timing.h"
// void lis_test(Driver *drvthis);
//void lis_test(Driver *drvthis);
/* Vars for the server core */
MODULE_EXPORT char *api_version = API_VERSION;
@@ -133,9 +138,42 @@ const unsigned char UPD16314_charmap[] = {
224, 225, 226, 227, 228, 229, 230, 231,
232, 233, 234, 235, 237, 237, 238, 239,
240, 241, 242, 243, 244, 245, 246, 247,
248, 249, 250, 251, 252, 253, 254, 3
248, 249, 250, 251, 252, 253, 254, 1
};
/////////////////////////////////////////
// Cache standard custom chars
void
lis_standard_custom_chars (Driver *drvthis) {
PrivateData *p = drvthis->private_data;
static unsigned char checkbox_gray[] =
{ b_______,
b_______,
b__XXXXX,
b__X_X_X,
b__XX_XX,
b__X_X_X,
b__XXXXX,
b_______ };
static unsigned char block_filled[] =
{ b__XXXXX,
b__XXXXX,
b__XXXXX,
b__XXXXX,
b__XXXXX,
b__XXXXX,
b__XXXXX,
b__XXXXX };
lis_set_char(drvthis, 1, block_filled);
lis_set_char(drvthis, 2, checkbox_gray);
p->ccmode = standard;
}
///////////////////////////////////////////////////////////////////////////////
// Write a command to the display.
@@ -203,120 +241,43 @@ lis_flush(Driver *drvthis)
{
PrivateData *p = (PrivateData *) drvthis->private_data;
int line;
int line, err, i, count;
unsigned char buffer[65];
// see if any custom characters changed
for (i = 0, count = 0; i < NUM_CCs; i++) {
if ( ! p->cc[i].clean ) {
count++;
p->cc[i].clean++; // mark clean
}
}
if (count) {
// flush custom characters to device
buffer[0] = 0xAD; // command to write CGRAM at 0
for (i = 0; i < NUM_CCs; i++) {
memcpy(buffer + 1 + (i*CELLHEIGHT), p->cc[i].cache, CELLHEIGHT);
}
err = lis_ftdi_write_command(drvthis, buffer, sizeof(buffer));
if (err < 0) {
report(RPT_WARNING, "%s: lis_flush(): "
"lis_ftdi_write_command() failed", drvthis->name);
}
report(RPT_DEBUG, "Flushed %d custom chars that changed", count);
timing_uPause(16000);
}
// write any line that has a change in it
for (line = 0; line < p->height; line++) {
if (p->line_flags[line]) {
report(RPT_DEBUG, "Flushing line %d", line+1);
lis_ftdi_line_to_display(drvthis, line+1, p->framebuf + (line * p->width), p->width);
p->line_flags[line] = 0; // clean
timing_uPause(16000);
}
}
}
///////////////////////////////////////////////////////////////////////////////
// Loads custom characters in the display
//
static int
lis_load_custom_chars(Driver *drvthis)
{
PrivateData *p = (PrivateData *) drvthis->private_data;
int i, col, row, err;
unsigned char buffer[65];
char custom_chars[8][CELLHEIGHT*CELLHEIGHT] = {
{ 0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0 },
{ 1, 0, 0, 0, 0, /* 1-5 characters used by hbar() */
1, 0, 0, 0, 0,
1, 0, 0, 0, 0,
1, 0, 0, 0, 0,
1, 0, 0, 0, 0,
1, 0, 0, 0, 0,
1, 0, 0, 0, 0,
1, 0, 0, 0, 0 },
{ 1, 1, 0, 0, 0,
1, 1, 0, 0, 0,
1, 1, 0, 0, 0,
1, 1, 0, 0, 0,
1, 1, 0, 0, 0,
1, 1, 0, 0, 0,
1, 1, 0, 0, 0,
1, 1, 0, 0, 0 },
{ 1, 1, 1, 0, 0,
1, 1, 1, 0, 0,
1, 1, 1, 0, 0,
1, 1, 1, 0, 0,
1, 1, 1, 0, 0,
1, 1, 1, 0, 0,
1, 1, 1, 0, 0,
1, 1, 1, 0, 0 },
{ 1, 1, 1, 1, 0,
1, 1, 1, 1, 0,
1, 1, 1, 1, 0,
1, 1, 1, 1, 0,
1, 1, 1, 1, 0,
1, 1, 1, 1, 0,
1, 1, 1, 1, 0,
1, 1, 1, 1, 0 },
{ 1, 1, 1, 1, 1,
1, 1, 1, 1, 1,
1, 1, 1, 1, 1,
1, 1, 1, 1, 1,
1, 1, 1, 1, 1,
1, 1, 1, 1, 1,
1, 1, 1, 1, 1,
1, 1, 1, 1, 1 },
{ 0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
1, 1, 1, 1, 1,
1, 0, 0, 0, 1,
1, 0, 0, 0, 1,
1, 0, 0, 0, 1,
1, 1, 1, 1, 1,
0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
1, 1, 1, 1, 1,
1, 0, 1, 0, 1,
1, 1, 0, 1, 1,
1, 0, 1, 0, 1,
1, 1, 1, 1, 1,
0, 0, 0, 0, 0 }};
buffer[0] = 0xAD; // command to write CGRAM at 0
for (i = 0; i < 8; i++)
{
/* build the buffer */
for (row = 0; row < CELLHEIGHT; row++) {
unsigned char value = 0;
for (col = 0; col < CELLWIDTH; col++) {
value <<= 1;
value |= (custom_chars[i][(row * CELLWIDTH) + col] > 0) ? 1 : 0;
}
buffer[(i*8)+row+1] = value;
}
}
err = lis_ftdi_write_command(drvthis, buffer, 65);
if (err < 0) {
report(RPT_WARNING, "%s: lis_load_custom_chars(): "
"lis_ftdi_write_command() failed", drvthis->name);
}
else
p->cc_flag = 1;
return err;
}
//////////////////////////////////////////////////////////////////////////////
// Separate thread to keep a read up on the USB device at all times
int
@@ -353,8 +314,12 @@ lis_set_brightness(Driver *drvthis, int state, int promille)
int err;
PrivateData *p = (PrivateData *) drvthis->private_data;
if (promille < 0 || promille > 1000)
if (promille < 0 || promille > 1000) {
report(RPT_WARNING, "%s: invalid brightness %d less then 0 or greater than 1000",
drvthis->name, promille);
return -EINVAL;
}
buffer[0] = 0xA5;
if ( promille < 251 )
@@ -373,6 +338,10 @@ lis_set_brightness(Driver *drvthis, int state, int promille)
}
else
p->brightness = promille;
report(RPT_DEBUG, "%s: brightness set to %d",
drvthis->name, promille);
return 0;
}
@@ -383,6 +352,9 @@ lis_get_brightness(Driver *drvthis, int state)
{
PrivateData *p = (PrivateData *) drvthis->private_data;
report(RPT_DEBUG, "%s: brightness query returns %d",
drvthis->name, p->brightness);
return p->brightness;
}
@@ -398,6 +370,8 @@ lis_init(Driver *drvthis)
unsigned char buffer[64], *thread_stack;
int count;
report(RPT_DEBUG, "%s: Initializing driver",
drvthis->name);
// Alocate and store private data
p = (PrivateData *) malloc( sizeof( PrivateData) );
if (p == NULL) {
@@ -409,7 +383,8 @@ lis_init(Driver *drvthis)
p->child_flag = 0;
p->parent_flag = 0;
p->cc_flag = 0;
p->cellwidth = CELLWIDTH;
p->cellheight = CELLHEIGHT;
// Get and parse size
s = drvthis->config_get_string( drvthis->name, "size", 0, "20x2");
@@ -1158,13 +1133,11 @@ lis_init(Driver *drvthis)
err = lis_ftdi_write_command(drvthis, buffer, 1);
if (err < 0) {
report(RPT_WARNING, "%s: lis_ftdi_clear: "
"lis_ftdi_write_command failed", drvthis->name);
"lis_ftdi_write_command failed", drvthis->name);
}
timing_uPause(10*16000);
lis_load_custom_chars(drvthis);
report(RPT_DEBUG, "%s: init() done", drvthis->name);
// lis_test(drvthis); /*DEBUG*/
@@ -1196,6 +1169,8 @@ lis_close(Driver *drvthis)
{
PrivateData *p = (PrivateData *) drvthis->private_data;
report(RPT_DEBUG, "%s: closing driver",
drvthis->name);
if (p != NULL) {
if (p->parent_flag) { // terminate the child
p->child_flag = 1;
@@ -1245,24 +1220,30 @@ lis_clear (Driver *drvthis)
PrivateData *p = (PrivateData *) drvthis->private_data;
int line;
report(RPT_DEBUG, "%s: Clearing display",
drvthis->name);
for (line = 0; line < p->height; line++) {
memset(p->framebuf + (line * p->width), ' ', p->width);
p->line_flags[line] = 1;
}
p->ccmode = standard;
lis_standard_custom_chars(drvthis);
}
///////////////////////////////////////////////////////////////////////////////
// Place a character in the framebuffer
//
MODULE_EXPORT void
lis_chr (Driver *drvthis, int x, int y, char ch)
lis_chr (Driver *drvthis, int x, int y, unsigned char ch)
{
PrivateData *p = (PrivateData *) drvthis->private_data;
// ignore out-of-range
if (y > p->height || x > p->width)
if (y > p->height || x > p->width) {
report(RPT_WARNING, "%s: Writing char %x at %d,%d"
" ignored out of range %d,%d",
drvthis->name, ch, x, y, p->height, p->width);
return;
}
y--;
x--;
@@ -1271,6 +1252,8 @@ lis_chr (Driver *drvthis, int x, int y, char ch)
p->framebuf[ (y * p->width) + x] = ch;
p->line_flags[y] = 1;
report(RPT_DEBUG, "%s: Caching char %x at %d,%d",
drvthis->name, ch, x, y);
}
}
@@ -1286,10 +1269,16 @@ lis_string (Driver *drvthis, int x, int y, char *s)
x --; // Convert 1-based coords to 0-based
y --;
report(RPT_DEBUG, "%s: Write string to framebuffer %d,%d \"%s\"",
drvthis->name, x, y, s);
for (i = 0; s[i]; i++) {
// Check for buffer overflows...
if ((y * p->width) + x + i > (p->width * p->height))
if ((y * p->width) + x + i > (p->width * p->height)) {
report(RPT_WARNING, "%s: Writing string ignored, out of range",
drvthis->name, x, y);
break;
}
if ( p->framebuf[(y*p->width) + x + i] != s[i] ) {
p->framebuf[(y*p->width) + x + i] = s[i];
@@ -1305,11 +1294,12 @@ lis_string (Driver *drvthis, int x, int y, char *s)
MODULE_EXPORT int
lis_icon (Driver *drvthis, int x, int y, int icon)
{
char ch;
PrivateData *p = (PrivateData *) drvthis->private_data;
unsigned char ch;
switch (icon) {
case ICON_BLOCK_FILLED:
ch = 0xFF;
ch = 0xff;
break;
case ICON_HEART_FILLED:
ch = 0x9D;
@@ -1336,7 +1326,9 @@ lis_icon (Driver *drvthis, int x, int y, int icon)
ch = 0xC7;
break;
case ICON_CHECKBOX_GRAY:
ch = 7;
ch = 2;
if (p->ccmode != standard)
lis_standard_custom_chars(drvthis);
break;
case ICON_STOP:
ch = 0x16;
@@ -1368,60 +1360,14 @@ lis_icon (Driver *drvthis, int x, int y, int icon)
default:
return -1; /* Let the core do other icons */
lis_chr(drvthis, x, y, ch);
}
report(RPT_DEBUG, "%s: Writing icon #%d (%x) @ %d,%d",
drvthis->name, icon, ch, x, y);
lis_chr(drvthis, x, y, ch);
return 0;
}
///////////////////////////////////////////////////////////////////////////////
// Draw a horizontal bar
//
// options ignored
// truncates to fit display if needed
MODULE_EXPORT void
lis_hbar(Driver *drvthis, int x, int y, int len, int promille, int options)
{
PrivateData *p = (PrivateData *) drvthis->private_data;
char buf[p->width+1];
int per_pel;
char *bp;
if (! p->cc_flag)
lis_load_custom_chars(drvthis);
if (x + len > p->width)
len = p->width - x;
if (len < 1 || promille < 0 || promille > 1000 )
return;
// blank area for bar
memset(buf, ' ', len);
if( promille == 0)
return;
per_pel = 1000 / (len * CELLWIDTH);
bp = buf;
while(promille > per_pel) {
if( promille >= per_pel * CELLWIDTH) {
*bp = 0x05; // full width
promille -= CELLWIDTH*per_pel;
} else {
*bp = (promille / per_pel);
promille = 0;
}
bp++;
}
*bp = 0x00;
lis_string(drvthis, x, y, buf);
}
#if 0
void
@@ -1435,8 +1381,179 @@ lis_test(Driver *drvthis)
lis_clear(drvthis);
for (i = 0; i < 1001; i++) {
lis_hbar(drvthis, 1, 1, 20, i, 0);
lis_vbar(drvthis, 1, 2, 2, i, 0);
lis_flush(drvthis);
}
}
#endif
/**
* Define a custom character and write it to the LCD.
* \param drvthis Pointer to driver structure.
* \param n Custom character to define [0 - (NUM_CCs-1)].
* \param dat Array of 8(=cellheight) bytes, each representing a pixel row
* starting from the top to bottom.
* The bits in each byte represent the pixels where the LSB
* (least significant bit) is the rightmost pixel in each pixel row.
*/
MODULE_EXPORT void
lis_set_char(Driver *drvthis, int n, unsigned char *dat)
{
PrivateData *p = drvthis->private_data;
unsigned char mask = (1 << p->cellwidth) - 1;
int row;
if ((n < 0) || (n >= NUM_CCs))
return;
if (dat == NULL)
return;
for (row = 0; row < p->cellheight; row++) {
int letter = 0;
if (p->lastline || (row < p->cellheight - 1))
letter = dat[row] & mask;
if (p->cc[n].cache[row] != letter) {
p->cc[n].clean = 0; /* only mark dirty if really different */
}
p->cc[n].cache[row] = letter;
}
report(RPT_DEBUG, "%s: cached custom character #%d",
drvthis->name, n);
}
/**
* Draw a vertical bar bottom-up.
* \param drvthis Pointer to driver structure.
* \param x Horizontal character position (column) of the starting point.
* \param y Vertical character position (row) of the starting point.
* \param len Number of characters that the bar is high at 100%
* \param promille Current height level of the bar in promille.
* \param options Options (currently unused).
*/
MODULE_EXPORT void
lis_vbar(Driver *drvthis, int x, int y, int len, int promille, int options)
{
PrivateData *p = drvthis->private_data;
if (p->ccmode != vbar) {
unsigned char vBar[p->cellheight];
int i;
if (p->ccmode != standard) {
/* Not supported(yet) */
report(RPT_WARNING, "%s: vbar: cannot combine two modes using user-defined characters",
drvthis->name);
return;
}
p->ccmode = vbar;
memset(vBar, 0x00, sizeof(vBar));
for (i = 2; i <= p->cellheight; i++) {
// add pixel line per pixel line ...
vBar[p->cellheight - i + 1] = 0x1F;
lis_set_char(drvthis, i, vBar);
}
}
report(RPT_DEBUG, "%s: vbar @ %d,%d len %d, %d/1000",
drvthis->name, x, y, len, promille);
lib_vbar_static(drvthis, x, y, len, promille, options, p->cellheight, 2);
}
/**
* Draw a horizontal bar to the right.
* \param drvthis Pointer to driver structure.
* \param x Horizontal character position (column) of the starting point.
* \param y Vertical character position (row) of the starting point.
* \param len Number of characters that the bar is long at 100%
* \param promille Current length level of the bar in promille.
* \param options Options (currently unused).
*/
MODULE_EXPORT void
lis_hbar(Driver *drvthis, int x, int y, int len, int promille, int options)
{
PrivateData *p = drvthis->private_data;
if (p->ccmode != hbar) {
unsigned char hBar[p->cellheight];
int i;
if (p->ccmode != standard) {
/* Not supported(yet) */
report(RPT_WARNING, "%s: hbar: cannot combine two modes using user-defined characters",
drvthis->name);
return;
}
p->ccmode = hbar;
for (i = 1; i <= p->cellwidth; i++) {
// fill pixel columns from left to right.
memset(hBar, 0xFF & ~((1 << (p->cellwidth - i)) - 1), sizeof(hBar));
lis_set_char(drvthis, i + 2, hBar);
}
}
report(RPT_DEBUG, "%s: hbar @ %d,%d len %d, %d/1000",
drvthis->name, x, y, len, promille);
lib_hbar_static(drvthis, x, y, len, promille, options, p->cellwidth, 2);
}
/**
* Write a big number to the screen.
* \param drvthis Pointer to driver structure.
* \param x Horizontal character position (column).
* \param num Character to write (0 - 10 with 10 representing ':')
*/
MODULE_EXPORT void
lis_num(Driver *drvthis, int x, int num)
{
PrivateData *p = drvthis->private_data;
int do_init = 0;
if ((num < 0) || (num > 10))
return;
if (p->ccmode != bignum) {
if (p->ccmode != standard) {
/* Not supported (yet) */
report(RPT_WARNING, "%s: num: cannot combine two modes using user-defined characters",
drvthis->name);
return;
}
p->ccmode = bignum;
do_init = 1;
}
report(RPT_DEBUG, "%s: big number %d @ %d",
drvthis->name, x, num);
// Lib_adv_bignum does everything needed to show the bignumbers.
// offset by 2 because driver uses first three custom characters
lib_adv_bignum(drvthis, x, num, 3, do_init);
}
/**
* Get total number of custom characters available.
* \param drvthis Pointer to driver structure.
* \return Number of custom characters.
*/
MODULE_EXPORT int
lis_get_free_chars (Driver *drvthis)
{
//PrivateData *p = drvthis->private_data;
return NUM_CCs - 3; // first three are reserved
}
+34 -4
View File
@@ -38,17 +38,36 @@
#define DEFAULT_BRIGHTNESS 1000
#define NUM_CCs 8
///////////////////////////////////////////////////////////////////////////////
// private data types
//
typedef enum {
standard, /* only char 0 is used for heartbeat */
vbar, /* vertical bars */
hbar, /* horizontal bars */
bignum, /* big numbers */
bigchar, /* big characters */
custom /* custom icons */
} CGmode;
typedef struct cgram_cache {
unsigned char cache[CELLHEIGHT];
int clean;
} CGram;
typedef struct {
// the handle for the USB FTDI library
struct ftdi_context ftdic;
// the width and the height (in number of characters) of the library
// the width and the height (in number of characters) of the display
int width, height;
// pixel width and height of each character
int cellwidth, cellheight;
// The framebuffer and the framebuffer for the last contents (incr. update)
unsigned char *framebuf;
@@ -65,8 +84,9 @@ typedef struct {
// display brightness 0-1000
int brightness;
// custom characters loaded?
int cc_flag;
// ustom characters
CGram cc[NUM_CCs];
CGmode ccmode;
// USB Vendor ID
int VendorID;
@@ -74,6 +94,11 @@ typedef struct {
// USB Product ID
int ProductID;
/* lastline controls the use of the last line, if pixel addressable (true, default) or */
/* underline effect (false). To avoid the underline effect in the latter case, the last */
/* line is always zeroed for whatever redefined character */
char lastline;
} PrivateData;
MODULE_EXPORT int lis_init(Driver *drvthis);
@@ -82,10 +107,15 @@ MODULE_EXPORT int lis_width (Driver *drvthis);
MODULE_EXPORT int lis_height (Driver *drvthis);
MODULE_EXPORT void lis_clear (Driver * drvthis);
MODULE_EXPORT void lis_string (Driver * drvthis, int x, int y, char string[]);
MODULE_EXPORT void lis_chr (Driver * drvthis, int x, int y, char c);
MODULE_EXPORT void lis_chr (Driver * drvthis, int x, int y, unsigned char c);
MODULE_EXPORT void lis_flush (Driver * drvthis);
MODULE_EXPORT void lis_vbar (Driver * drvthis, int x, int y, int len, int promille, int options);
MODULE_EXPORT void lis_hbar (Driver * drvthis, int x, int y, int len, int promille, int options);
MODULE_EXPORT int lis_icon(Driver * drvthis, int x, int y, int icon);
MODULE_EXPORT int lis_cellheight (Driver *drvthis);
MODULE_EXPORT int lis_cellwidth (Driver *drvthis);
MODULE_EXPORT void lis_num(Driver *drvthis, int x, int num);
MODULE_EXPORT int lis_get_free_chars(Driver *drvthis);
MODULE_EXPORT void lis_set_char(Driver *drvthis, int n, unsigned char *dat);
#endif /* LIS_H */