update lis driver Daryl F

This commit is contained in:
marschap
2007-05-26 19:43:13 +00:00
parent bb5e622393
commit 5e5ee21e37
4 changed files with 354 additions and 258 deletions
+10 -4
View File
@@ -622,12 +622,18 @@ Size=16x2
## LIS MCE 2005 driver ## ## LIS MCE 2005 driver ##
[lis] [lis]
# USB device to use [default: /dev/ttyUSB0]
Device=/dev/ttyUSB0
# Set the initial brightness [default: 1000; legal: 0 - 1000] # Set the initial brightness [default: 1000; legal: 0 - 1000]
Brightness=1000 # 0-250 = 25%, 251-500 = 50%, 501-750 = 75%, 751-1000 = 100%
#Brightness=1000
# Columns by lines (default 20x2)
#Size=20x2
# USB Vendor ID (default 0x0403)
VendorID=0x0403
# USB Product ID (default 0x6001
ProductID=0x6001
##The driver for the VFD of the Medion MD8800 PC ## ##The driver for the VFD of the Medion MD8800 PC ##
+86 -20
View File
@@ -3,13 +3,47 @@
<para> <para>
This section talks about using LCDproc with the VLSystem L.I.S This section talks about using LCDproc with the VLSystem L.I.S
MCE 2005 Vacuum Flourescent Display based on the FTDI USB-to-serial MCE 2005 Vacuum Flourescent Display (VFD) based on the FTDI USB-to-serial
converter, the Microchip PIC-16F716 microcontroller, and converter, the Microchip PIC-16F716 microcontroller, and
the NEC UPD16314 display driver that can be obtained at the NEC UPD16314 display driver manufactured by
<ulink url="http://www.vlsys.co.kr">VLSys</ulink>. <ulink url="http://www.vlsys.co.kr">VLSystem</ulink>.
</para> </para>
<!-- ## VLSys lis driver ## --> <!-- ## VLSys lis driver ## -->
<sect2 id="lis-features">
<title>Features</title>
<para>
This device uses a vacuum flourescent display of 20 characters by 2 lines. Each each
character is 5 pixels wide by 8 pixels high. The device is connected by USB. The FTDI chip
translates the USB protocol to serial expected by the VFD driver chip, an NEC UPD16314. A
programmable interrupt controller (PIC), the PIC16F716 by Microchip, provides the glue
between the FTDI and the NEC chips.
</para>
</sect2>
<sect2 id="lis-requirements">
<title>Requirements</title>
<para>
The driver depends on libftdi, version 0.8 or higher, from
<ulink url="http://www.intra2net.com/opensource/ftdi/">
http://www.intra2net.com/opensource/ftdi/</ulink>.
</para>
</sect2>
<sect2 id="lis-compiling">
<title>Compiling</title>
<para>
Make sure that the L.I.S files are built when you run configure. This
can be done by specifying "--enable-drivers=all" or by
"--enable-drivers=lis".
</para>
</sect2>
<sect2 id="lis-config"> <sect2 id="lis-config">
<title>Configuration in LCDd.conf</title> <title>Configuration in LCDd.conf</title>
@@ -17,30 +51,62 @@
<title>[lis]</title> <title>[lis]</title>
<variablelist> <variablelist>
<varlistentry>
<term>
<command>Size=</command>
<arg choice="plain">
<replaceable>WIDTH</replaceable>
<literal>x</literal>
<replaceable>HEIGHT</replaceable>
</arg>
</term>
<listitem><para>
Set the display size. The default <literal>20x2</literal> should be safe
for most if not all users, since the device seeems to be made only with
this one size.
But who knowns &hellip;
</para></listitem>
</varlistentry>
<varlistentry>
<term>
<command>VendorID=</command>
<arg choice="plain">
<replaceable>VENDORID</replaceable>
</arg>
</term>
<listitem><para>
USB Vendor ID
[default: <literal>0x0403</literal>].
</para></listitem>
</varlistentry>
<varlistentry>
<term>
<command>ProductID=</command>
<arg choice="plain">
<replaceable>PRODUCTID</replaceable>
</arg>
</term>
<listitem><para>
USB Product ID
[default: <literal>0x6001</literal>].
</para></listitem>
</varlistentry>
<varlistentry> <varlistentry>
<term> <term>
<command>Brightness=</command> <command>Brightness=</command>
<arg choice="plain"><replaceable>BRIGHTNESS</replaceable></arg> <arg choice="plain"><replaceable>BRIGHTNESS</replaceable></arg>
</term> </term>
<listitem><para> <listitem>
Set the initial brightness [default: <literal>1000</literal>; legal: <literal>0</literal> - <literal>1000</literal>] <para>
</para></listitem> Set the initial brightness [default: <literal>1000</literal>;
</term> legal: <literal>0</literal> - <literal>1000</literal>. Values
<listitem><para> between 0 and 250 give 25% brightness, 251 to 500 give 50% brightness,
Select the LCD size [default: <literal>20x4</literal>] 501 and 750, give 75% brightness, and values higher than 751 give 100%
</para></listitem> brightness.
</para>
</listitem>
</varlistentry> </varlistentry>
<varlistentry>
<term>
<command>Device=</command>
<arg choice="plain"><replaceable>DEVICE</replaceable></arg>
</term>
<listitem><para>
USB device to use. Usual values are <filename>/dev/ttyUSB0</filename>, <filename>/dev/ttyUSB1</filename>, etc.
[default: <filename>/dev/ttyUSB0</filename>].
</para></listitem>
</varlistentry>
</variablelist> </variablelist>
</sect3> </sect3>
+196 -219
View File
@@ -7,8 +7,7 @@
* This driver uses the libftdi library to interface to the FTDI chip. Make * This driver uses the libftdi library to interface to the FTDI chip. Make
* sure kernel module ftdi_sio doesn't claim the device. * sure kernel module ftdi_sio doesn't claim the device.
* *
* Based on the ula200 driver Copyright (C) 2006, Bernhard Walle * Based on: ula200 driver Copyright (C) 2006, Bernhard Walle
* and the CrystalFontz 633 driver Copyright (C) 2002 David GLAUDE
* *
* Copyright (c) 2007, Daryl Fonseca-Holt <wyatt@prairieturtle.ca> * Copyright (c) 2007, Daryl Fonseca-Holt <wyatt@prairieturtle.ca>
* *
@@ -33,6 +32,16 @@
* was which line would be written at column 1. * was which line would be written at column 1.
*/ */
/* CHANGES:
*
* 2007/05/22 Removed useless Device= config option.
* Added VendorID= and ProductID= config
* option parsting. Moved constants to
* lis.h where they belong. Added
* lis_cellheight() and lis_cellwidth().
* Completely commented out lis_test() to
* save memory.
*/
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>
#include <unistd.h> #include <unistd.h>
@@ -57,7 +66,7 @@
#include "lcd_lib.h" #include "lcd_lib.h"
#include "timing.h" #include "timing.h"
void lis_test(Driver *drvthis); // void lis_test(Driver *drvthis);
/* Vars for the server core */ /* Vars for the server core */
MODULE_EXPORT char *api_version = API_VERSION; MODULE_EXPORT char *api_version = API_VERSION;
@@ -66,17 +75,6 @@ MODULE_EXPORT int supports_multiple = 1;
MODULE_EXPORT char *symbol_prefix = "lis_"; MODULE_EXPORT char *symbol_prefix = "lis_";
///////////////////////////////////////////////////////////////////////////////
// constants
//
#define DISPLAY_VENDOR_ID 0x0403
#define DISPLAY_PRODUCT_ID 0x6001
#define CELLWIDTH 5
#define CELLHEIGHT 8
#define DEFAULT_BRIGHTNESS 750
/* /*
* Charactar mapping for UPD16314 device by Daryl Fonseca-Holt * Charactar mapping for UPD16314 device by Daryl Fonseca-Holt
* <wyatt@prairieturtle.ca> taken from Mark Haemmerling's HD44780 table. * <wyatt@prairieturtle.ca> taken from Mark Haemmerling's HD44780 table.
@@ -96,81 +94,49 @@ MODULE_EXPORT char *symbol_prefix = "lis_";
*/ */
const unsigned char UPD16314_charmap[] = { const unsigned char UPD16314_charmap[] = {
/* #0 */ /* #0 */
0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7,
8, 9, 10, 11, 12, 13, 14, 15, 8, 9, 10, 11, 12, 13, 14, 15,
16, 17, 18, 19, 20, 21, 22, 23, 16, 17, 18, 19, 20, 21, 22, 23,
24, 25, 26, 27, 28, 29, 30, 31, 24, 25, 26, 27, 28, 29, 30, 31,
/* #32 */ /* #32 */
32, 33, 34, 35, 36, 37, 38, 39, 32, 33, 34, 35, 36, 37, 38, 39,
40, 41, 42, 43, 44, 45, 46, 47, 40, 41, 42, 43, 44, 45, 46, 47,
48, 49, 50, 51, 52, 53, 54, 55, 48, 49, 50, 51, 52, 53, 54, 55,
56, 57, 58, 59, 60, 61, 62, 63, 56, 57, 58, 59, 60, 61, 62, 63,
/* #64 */ /* #64 */
64, 65, 66, 67, 68, 69, 70, 71, 64, 65, 66, 67, 68, 69, 70, 71,
72, 73, 74, 75, 76, 77, 78, 79, 72, 73, 74, 75, 76, 77, 78, 79,
80, 81, 82, 83, 84, 85, 86, 87, 80, 81, 82, 83, 84, 85, 86, 87,
88, 89, 90, 91, 47, 93, 94, 95, 88, 89, 90, 91, 47, 93, 94, 95,
/* #96 */ /* #96 */
96, 97, 98, 99, 100, 101, 102, 103, 96, 97, 98, 99, 100, 101, 102, 103,
104, 105, 106, 107, 108, 109, 110, 111, 104, 105, 106, 107, 108, 109, 110, 111,
112, 113, 114, 115, 116, 117, 118, 119, 112, 113, 114, 115, 116, 117, 118, 119,
120, 121, 122, 123, 124, 125, 126, 127, 120, 121, 122, 123, 124, 125, 126, 127,
/* #128 */ /* #128 */
128, 129, 130, 131, 132, 133, 134, 135, 128, 129, 130, 131, 132, 133, 134, 135,
136, 137, 138, 139, 140, 141, 142, 143, 136, 137, 138, 139, 140, 141, 142, 143,
144, 145, 146, 147, 148, 149, 150, 151, 144, 145, 146, 147, 148, 149, 150, 151,
152, 153, 154, 155, 156, 157, 158, 159, 152, 153, 154, 155, 156, 157, 158, 159,
/* #160 */ /* #160 */
160, 33, 236, 237, 164, 92, 124, 167, 160, 33, 236, 237, 164, 92, 124, 167,
168, 169, 170, 171, 172, 173, 174, 175, 168, 169, 170, 171, 172, 173, 174, 175,
176, 177, 178, 179, 180, 181, 182, 183, 176, 177, 178, 179, 180, 181, 182, 183,
184, 185, 186, 187, 188, 189, 190, 191, 184, 185, 186, 187, 188, 189, 190, 191,
/* #192 */ /* #192 */
192, 193, 194, 195, 196, 197, 198, 199, 192, 193, 194, 195, 196, 197, 198, 199,
200, 201, 202, 203, 204, 205, 206, 207, 200, 201, 202, 203, 204, 205, 206, 207,
208, 209, 210, 211, 212, 213, 214, 215, 208, 209, 210, 211, 212, 213, 214, 215,
216, 217, 218, 219, 220, 221, 223, 224, 216, 217, 218, 219, 220, 221, 223, 224,
/* #224 */ /* #224 */
224, 225, 226, 227, 228, 229, 230, 231, 224, 225, 226, 227, 228, 229, 230, 231,
232, 233, 234, 235, 237, 237, 238, 239, 232, 233, 234, 235, 237, 237, 238, 239,
240, 241, 242, 243, 244, 245, 246, 247, 240, 241, 242, 243, 244, 245, 246, 247,
248, 249, 250, 251, 252, 253, 254, 3 248, 249, 250, 251, 252, 253, 254, 3
}; };
///////////////////////////////////////////////////////////////////////////////
// private data types
//
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
int width, height;
// The framebuffer and the framebuffer for the last contents (incr. update)
unsigned char *framebuf;
// dirty line flags
unsigned int *line_flags;
// child thread flag
int child_flag;
// parent thread flag
int parent_flag;
// display brightness 0-1000
int brightness;
// custom characters loaded
int cc_flag;
} PrivateData;
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
// Write a command to the display. // Write a command to the display.
// //
@@ -182,18 +148,18 @@ typedef struct {
static int static int
lis_ftdi_write_command(Driver *drvthis, unsigned char *data, int length) lis_ftdi_write_command(Driver *drvthis, unsigned char *data, int length)
{ {
PrivateData *p = (PrivateData *) drvthis->private_data; PrivateData *p = (PrivateData *) drvthis->private_data;
int err; int err;
err = ftdi_write_data(&p->ftdic, data, length); err = ftdi_write_data(&p->ftdic, data, length);
if (err < 0) { if (err < 0) {
report(RPT_WARNING, "%s: ftdi_write_data failed with %d", drvthis->name, err); report(RPT_WARNING, "%s: ftdi_write_data failed with %d", drvthis->name, err);
return -1; return -1;
} }
timing_uPause(16000); timing_uPause(16000);
return 0; return 0;
} }
////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////
@@ -202,30 +168,30 @@ lis_ftdi_write_command(Driver *drvthis, unsigned char *data, int length)
static int static int
lis_ftdi_line_to_display(Driver *drvthis, int line, unsigned char *string, int len) lis_ftdi_line_to_display(Driver *drvthis, int line, unsigned char *string, int len)
{ {
PrivateData *p = (PrivateData *) drvthis->private_data; PrivateData *p = (PrivateData *) drvthis->private_data;
unsigned char buffer[128]; unsigned char buffer[128];
int err; int err;
int i; int i;
if (len > p->width || line < 1 || line > p->height) { if (len > p->width || line < 1 || line > p->height) {
return -EINVAL; return -EINVAL;
} }
buffer[0] = 0xA0 + line; buffer[0] = 0xA0 + line;
buffer[1] = 0; buffer[1] = 0;
buffer[2] = 0xA7; buffer[2] = 0xA7;
for (i=0; i < len; i++) { for (i=0; i < len; i++) {
buffer[i+3] = UPD16314_charmap[(unsigned char)string[i]]; buffer[i+3] = UPD16314_charmap[(unsigned char)string[i]];
} }
buffer[i+3] = 0x00; buffer[i+3] = 0x00;
err = lis_ftdi_write_command(drvthis, buffer, len+4); err = lis_ftdi_write_command(drvthis, buffer, len+4);
if (err < 0) { if (err < 0) {
report(RPT_WARNING, "%s: lis_ftdi_string: " report(RPT_WARNING, "%s: lis_ftdi_string: "
"lis_ftdi_write_command() failed", drvthis->name); "lis_ftdi_write_command() failed", drvthis->name);
} }
return err; return err;
} }
@@ -256,103 +222,103 @@ static int
lis_load_custom_chars(Driver *drvthis) lis_load_custom_chars(Driver *drvthis)
{ {
PrivateData *p = (PrivateData *) drvthis->private_data; PrivateData *p = (PrivateData *) drvthis->private_data;
int i, col, row, err; int i, col, row, err;
unsigned char buffer[65]; unsigned char buffer[65];
char custom_chars[8][CELLHEIGHT*CELLHEIGHT] = { 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,
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-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, 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, 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, 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, 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,
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,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 1, 1, 1, 1, 1, 1, 1, 1,
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, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 0, 1, 0, 1, 1, 0, 1, 0, 1,
1, 1, 0, 1, 1, 1, 1, 0, 1, 1,
1, 0, 1, 0, 1, 1, 0, 1, 0, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
0, 0, 0, 0, 0 }}; 0, 0, 0, 0, 0 }};
buffer[0] = 0xAD; // command to write CGRAM at 0 buffer[0] = 0xAD; // command to write CGRAM at 0
for (i = 0; i < 8; i++) for (i = 0; i < 8; i++)
{ {
/* build the buffer */ /* build the buffer */
for (row = 0; row < CELLHEIGHT; row++) { for (row = 0; row < CELLHEIGHT; row++) {
unsigned char value = 0; unsigned char value = 0;
for (col = 0; col < CELLWIDTH; col++) { for (col = 0; col < CELLWIDTH; col++) {
value <<= 1; value <<= 1;
value |= (custom_chars[i][(row * CELLWIDTH) + col] > 0) ? 1 : 0; value |= (custom_chars[i][(row * CELLWIDTH) + col] > 0) ? 1 : 0;
} }
buffer[(i*8)+row+1] = value; buffer[(i*8)+row+1] = value;
} }
} }
err = lis_ftdi_write_command(drvthis, buffer, 65); err = lis_ftdi_write_command(drvthis, buffer, 65);
if (err < 0) { if (err < 0) {
report(RPT_WARNING, "%s: lis_load_custom_chars(): " report(RPT_WARNING, "%s: lis_load_custom_chars(): "
"lis_ftdi_write_command() failed", drvthis->name); "lis_ftdi_write_command() failed", drvthis->name);
} }
else else
p->cc_flag = 1; p->cc_flag = 1;
return err; return err;
} }
////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////
// Seperate thread to keep a read up on the USB device at all times // Separate thread to keep a read up on the USB device at all times
int int
lis_read_thread(void *arg) lis_read_thread(void *arg)
{ {
@@ -388,7 +354,7 @@ lis_set_brightness(Driver *drvthis, int state, int promille)
PrivateData *p = (PrivateData *) drvthis->private_data; PrivateData *p = (PrivateData *) drvthis->private_data;
if (promille < 0 || promille > 1000) if (promille < 0 || promille > 1000)
return -EINVAL; return -EINVAL;
buffer[0] = 0xA5; buffer[0] = 0xA5;
if ( promille < 251 ) if ( promille < 251 )
@@ -400,11 +366,11 @@ lis_set_brightness(Driver *drvthis, int state, int promille)
else else
buffer[1] = 0x0; // 100% buffer[1] = 0x0; // 100%
err = ftdi_write_data(&p->ftdic, buffer, 2); err = ftdi_write_data(&p->ftdic, buffer, 2);
if (err < 0) { if (err < 0) {
report(RPT_WARNING, "%s: lis_set_brightness(): ftdi_write_data failed with %d", drvthis->name, err); report(RPT_WARNING, "%s: lis_set_brightness(): ftdi_write_data failed with %d", drvthis->name, err);
return err; return err;
} }
else else
p->brightness = promille; p->brightness = promille;
return 0; return 0;
@@ -448,8 +414,8 @@ lis_init(Driver *drvthis)
// Get and parse size // Get and parse size
s = drvthis->config_get_string( drvthis->name, "size", 0, "20x2"); s = drvthis->config_get_string( drvthis->name, "size", 0, "20x2");
if ((sscanf(s, "%dx%d", &(p->width), &(p->height)) != 2) if ((sscanf(s, "%dx%d", &(p->width), &(p->height)) != 2)
|| (p->width <= 0) || (p->width > LCD_MAX_WIDTH) || (p->width <= 0) || (p->width > LCD_MAX_WIDTH)
|| (p->height <= 0) || (p->height > LCD_MAX_HEIGHT)) { || (p->height <= 0) || (p->height > LCD_MAX_HEIGHT)) {
report(RPT_ERR, "%s: cannot read Size %s", drvthis->name, s); report(RPT_ERR, "%s: cannot read Size %s", drvthis->name, s);
return -1; return -1;
} }
@@ -471,6 +437,9 @@ lis_init(Driver *drvthis)
} }
p->brightness = count; p->brightness = count;
p->VendorID = drvthis->config_get_int(drvthis->name, "VendorID", 0, DISPLAY_VENDOR_ID);
p->ProductID = drvthis->config_get_int(drvthis->name, "ProductID", 0, DISPLAY_PRODUCT_ID);
/* End of config file parsing */ /* End of config file parsing */
@@ -492,9 +461,12 @@ lis_init(Driver *drvthis)
// (&p->ftdic)->usb_read_timeout = 20; // (&p->ftdic)->usb_read_timeout = 20;
// open the device // open the device
err = ftdi_usb_open(&p->ftdic, DISPLAY_VENDOR_ID, DISPLAY_PRODUCT_ID); err = ftdi_usb_open(&p->ftdic, p->VendorID, p->ProductID);
if (err < 0) { if (err < 0) {
report(RPT_ERR, "%s: cannot open USB device", drvthis->name); report(RPT_ERR, "%s: cannot open USB device %x:%x",
drvthis->name
p->VendorID,
p->ProductID);
goto err_framebuf; goto err_framebuf;
} }
@@ -1042,11 +1014,11 @@ lis_init(Driver *drvthis)
// don't know what this does exactly // don't know what this does exactly
buffer[0] = 0xA4; buffer[0] = 0xA4;
buffer[1] = 0x7d; buffer[1] = 0x7d;
err = ftdi_write_data(&p->ftdic, buffer, 2); err = ftdi_write_data(&p->ftdic, buffer, 2);
if (err < 0) { if (err < 0) {
report(RPT_WARNING, "%s: ftdi_write_data failed with %d", drvthis->name, err); report(RPT_WARNING, "%s: ftdi_write_data failed with %d", drvthis->name, err);
goto err_ftdi; goto err_ftdi;
} }
timing_uPause(3*16000); timing_uPause(3*16000);
@@ -1054,7 +1026,7 @@ lis_init(Driver *drvthis)
buffer[1] = 0xAA; buffer[1] = 0xAA;
for(count = 0; count < 10; count++) { for(count = 0; count < 10; count++) {
err = ftdi_write_data(&p->ftdic, buffer, 2); err = ftdi_write_data(&p->ftdic, buffer, 2);
if (err < 0) { if (err < 0) {
report(RPT_WARNING, "%s: ftdi_write_data failed with %d", drvthis->name, err); report(RPT_WARNING, "%s: ftdi_write_data failed with %d", drvthis->name, err);
goto err_ftdi; goto err_ftdi;
} }
@@ -1182,12 +1154,12 @@ lis_init(Driver *drvthis)
// timing_uPause(2*16000); // timing_uPause(2*16000);
// not sure about this // not sure about this
buffer[0] = 0xA0; buffer[0] = 0xA0;
err = lis_ftdi_write_command(drvthis, buffer, 1); err = lis_ftdi_write_command(drvthis, buffer, 1);
if (err < 0) { if (err < 0) {
report(RPT_WARNING, "%s: lis_ftdi_clear: " 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); timing_uPause(10*16000);
@@ -1235,7 +1207,7 @@ lis_close(Driver *drvthis)
ftdi_deinit(&p->ftdic); ftdi_deinit(&p->ftdic);
if (p->framebuf != NULL) if (p->framebuf != NULL)
free(p->framebuf); free(p->framebuf);
free(p); free(p);
} }
@@ -1277,6 +1249,7 @@ lis_clear (Driver *drvthis)
memset(p->framebuf + (line * p->width), ' ', p->width); memset(p->framebuf + (line * p->width), ' ', p->width);
p->line_flags[line] = 1; p->line_flags[line] = 1;
} }
p->ccmode = standard;
} }
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
@@ -1448,6 +1421,9 @@ lis_hbar(Driver *drvthis, int x, int y, int len, int promille, int options)
} }
#if 0
void void
lis_test(Driver *drvthis) lis_test(Driver *drvthis)
{ {
@@ -1463,3 +1439,4 @@ lis_test(Driver *drvthis)
lis_flush(drvthis); lis_flush(drvthis);
} }
} }
#endif
+62 -15
View File
@@ -1,21 +1,21 @@
/* /*
Based on the lis driver Copyright (C) 2006, Bernhard Walle Based on the lis driver Copyright (C) 2006, Bernhard Walle
Copyright (c) 2007, Daryl Fonseca-Holt <wyatt@prairieturtle.ca> Copyright (c) 2007, Daryl Fonseca-Holt <wyatt@prairieturtle.ca>
This program is free software; you can redistribute it and/or modify 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 it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or the Free Software Foundation; either version 2 of the License, or
any later version. any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 */ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 */
#ifndef LIS_H #ifndef LIS_H
#define LIS_H #define LIS_H
@@ -27,6 +27,55 @@
# define false 0 # define false 0
#endif #endif
///////////////////////////////////////////////////////////////////////////////
// constants
//
#define DISPLAY_VENDOR_ID 0x0403
#define DISPLAY_PRODUCT_ID 0x6001
#define CELLWIDTH 5
#define CELLHEIGHT 8
#define DEFAULT_BRIGHTNESS 1000
///////////////////////////////////////////////////////////////////////////////
// private data types
//
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
int width, height;
// The framebuffer and the framebuffer for the last contents (incr. update)
unsigned char *framebuf;
// dirty line flags
unsigned int *line_flags;
// child thread flag
int child_flag;
// parent thread flag
int parent_flag;
// display brightness 0-1000
int brightness;
// custom characters loaded?
int cc_flag;
// USB Vendor ID
int VendorID;
// USB Product ID
int ProductID;
} PrivateData;
MODULE_EXPORT int lis_init(Driver *drvthis); MODULE_EXPORT int lis_init(Driver *drvthis);
MODULE_EXPORT void lis_close (Driver *drvthis); MODULE_EXPORT void lis_close (Driver *drvthis);
MODULE_EXPORT int lis_width (Driver *drvthis); MODULE_EXPORT int lis_width (Driver *drvthis);
@@ -34,11 +83,9 @@ MODULE_EXPORT int lis_height (Driver *drvthis);
MODULE_EXPORT void lis_clear (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_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, char c);
MODULE_EXPORT void lis_set_char (Driver * drvthis, int n, char *dat);
MODULE_EXPORT void lis_flush (Driver * drvthis); 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_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 void lis_hbar (Driver * drvthis, int x, int y, int len, int promille, int options);
MODULE_EXPORT void lis_num (Driver * drvthis, int x, int num);
MODULE_EXPORT int lis_icon(Driver * drvthis, int x, int y, int icon); MODULE_EXPORT int lis_icon(Driver * drvthis, int x, int y, int icon);
#endif /* LIS_H */ #endif /* LIS_H */