From 9d9c4d890bbfe48be220660a5c24bfa945abe9a8 Mon Sep 17 00:00:00 2001 From: marschap Date: Wed, 16 Apr 2008 16:59:18 +0000 Subject: [PATCH] new driver mx5000 for Logitech MX5000 keyboards (Christian Jodar) --- CREDITS | 3 + ChangeLog | 1 + LCDd.conf | 12 +- acinclude.m4 | 20 +- docs/LCDd.8.in | 3 + docs/lcdproc-user/drivers.docbook | 1 + docs/lcdproc-user/drivers/mx5000.docbook | 52 +++ docs/lcdproc-user/lcdproc-user.docbook | 1 + server/drivers/Makefile.am | 4 +- server/drivers/mx5000.c | 404 +++++++++++++++++++++++ server/drivers/mx5000.h | 74 +++++ 11 files changed, 571 insertions(+), 4 deletions(-) create mode 100644 docs/lcdproc-user/drivers/mx5000.docbook create mode 100644 server/drivers/mx5000.c create mode 100644 server/drivers/mx5000.h diff --git a/CREDITS b/CREDITS index 6e8f14f..ff4fbb4 100644 --- a/CREDITS +++ b/CREDITS @@ -242,6 +242,9 @@ Thomas Jarosch - HD44780 connection type for a USB connection via a FTDI FT2232D chip - i2500vfd driver +Christian Jodar + - mx5000 driver + Further developers in the sourceforge lcdproc team: diff --git a/ChangeLog b/ChangeLog index 349bb9d..d5c5f07 100644 --- a/ChangeLog +++ b/ChangeLog @@ -46,6 +46,7 @@ v.0.5dev (ongoing development) * hd44780 driver: more complete initialization (idea by Pierre Ossman) * hd44780 driver: "euro" character mapping table (Markus Dolze) * CwLnx driver: support for CW12832 + + new driver mx5000 for Logitech MX5000 keyboards (Christian Jodar) v.0.5.2 * fix switching on/off the Load screen in lcdproc client using the menu diff --git a/LCDd.conf b/LCDd.conf index 74894a8..b88655a 100644 --- a/LCDd.conf +++ b/LCDd.conf @@ -47,7 +47,7 @@ DriverPath=server/drivers/ # bayrad, CFontz, CFontz633, CFontzPacket, curses, CwLnx, ea65, # EyeboxOne, g15, glcdlib, glk, hd44780, icp_a106, imon, IOWarrior, # irman, joy, lb216, lcdm001, lcterm, lirc, MD8800, ms6931, mtc_s16209x, -# MtxOrb, NoritakeVFD, picolcd, pyramid, sed1330, sed1520, serialPOS, +# MtxOrb, mx5000, NoritakeVFD, picolcd, pyramid, sed1330, sed1520, serialPOS, # serialVFD, shuttleVFD, sli, stv5730, svga, t6963, text, tyan, ula200, # xosd Driver=curses @@ -734,6 +734,16 @@ keypad_test_mode=no +## mx5000 driver for LCD display on the Logitech MX5000 keyboard ## +[mx5000] + +# Select the output device to use [default: /dev/hiddev0] +Device = /dev/hiddev0 +# Time to wait in ms after the refresh screen has been sent [default: 1000] +WaitAfterRefresh = 1000 + + + ## Noritake VFD driver ## [NoritakeVFD] # device where the VFD is. Usual values are /dev/ttyS0 and /dev/ttyS1 [default: /dev/lcd] diff --git a/acinclude.m4 b/acinclude.m4 index 7b44a69..f3c9e42 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -11,7 +11,7 @@ AC_ARG_ENABLE(drivers, [ bayrad,CFontz,CFontz633,CFontzPacket,curses,CwLnx,ea65,] [ EyeboxOne,g15,glcdlib,glk,hd44780,icp_a106,imon,IOWarrior,] [ irman,joy,lb216,lcdm001,lcterm,lirc,lis,MD8800,ms6931,] - [ mtc_s16209x,MtxOrb,NoritakeVFD,picolcd,pyramid,sed1330,] + [ mtc_s16209x,MtxOrb,mx5000,NoritakeVFD,picolcd,pyramid,sed1330,] [ sed1520,serialPOS,serialVFD,shuttleVFD,sli,stv5730,svga,] [ t6963,text,tyan,ula200,xosd,i2500vfd] [ 'all' compiles all drivers;] @@ -19,7 +19,7 @@ AC_ARG_ENABLE(drivers, drivers="$enableval", drivers=[bayrad,CFontz,CFontz633,curses,CwLnx,glk,lb216,lcdm001,MtxOrb,pyramid,text]) -allDrivers=[bayrad,CFontz,CFontz633,CFontzPacket,curses,CwLnx,ea65,EyeboxOne,g15,glcdlib,glk,hd44780,icp_a106,imon,IOWarrior,irman,joy,lb216,lcdm001,lcterm,lirc,lis,MD8800,ms6931,mtc_s16209x,MtxOrb,NoritakeVFD,picolcd,pyramid,sed1330,sed1520,serialPOS,serialVFD,shuttleVFD,sli,stv5730,svga,t6963,text,tyan,ula200,xosd,i2500vfd] +allDrivers=[bayrad,CFontz,CFontz633,CFontzPacket,curses,CwLnx,ea65,EyeboxOne,g15,glcdlib,glk,hd44780,icp_a106,imon,IOWarrior,irman,joy,lb216,lcdm001,lcterm,lirc,lis,MD8800,ms6931,mtc_s16209x,MtxOrb,mx5000,NoritakeVFD,picolcd,pyramid,sed1330,sed1520,serialPOS,serialVFD,shuttleVFD,sli,stv5730,svga,t6963,text,tyan,ula200,xosd,i2500vfd] drivers=`echo $drivers | sed -e 's/,/ /g'` @@ -308,6 +308,21 @@ dnl else DRIVERS="$DRIVERS MtxOrb${SO}" actdrivers=["$actdrivers MtxOrb"] ;; + mx5000) + AC_CHECK_HEADERS([libmx5000/mx5000.h],[ + AC_CHECK_LIB(mx5000, mx5000_sc_new_static,[ + LIBMX5000="-lmx5000" + DRIVERS="$DRIVERS mx5000${SO}" + actdrivers=["$actdrivers mx5000"] + ],[ +dnl else + AC_MSG_WARN([The mx5000 driver needs the mx5000tools library]) + ]) + ],[ +dnl else + AC_MSG_WARN([The mx5000 driver needs libmx5000/mx5000.h]) + ]) + ;; NoritakeVFD) DRIVERS="$DRIVERS NoritakeVFD${SO}" actdrivers=["$actdrivers NoritakeVFD"] @@ -454,6 +469,7 @@ AC_SUBST(LIBGLCD) AC_SUBST(LIBFTDI) AC_SUBST(LIBXOSD) AC_SUBST(LIBPTHREAD_LIBS) +AC_SUBST(LIBMX5000) ]) diff --git a/docs/LCDd.8.in b/docs/LCDd.8.in index e96e2e5..3d3bcdb 100644 --- a/docs/LCDd.8.in +++ b/docs/LCDd.8.in @@ -210,6 +210,9 @@ MTC_S16209x LCD displays by Microtips Technology Inc .B MtxOrb Matrix Orbital displays (except Matrix Orbital GLK displays) .TP +.B mx5000 +LCD display on the Logitech MX5000 keyboard +.TP .B NoritakeVFD Noritake VFD Device CU20045SCPB-T28A .TP diff --git a/docs/lcdproc-user/drivers.docbook b/docs/lcdproc-user/drivers.docbook index 68c2644..b7b7def 100644 --- a/docs/lcdproc-user/drivers.docbook +++ b/docs/lcdproc-user/drivers.docbook @@ -33,6 +33,7 @@ well as the configuration of LCDd. &ms6931; &mtc_s16209x; &MtxOrb; +&mx5000; &NoritakeVFD; &picolcd; &pylcd; diff --git a/docs/lcdproc-user/drivers/mx5000.docbook b/docs/lcdproc-user/drivers/mx5000.docbook new file mode 100644 index 0000000..6e0486b --- /dev/null +++ b/docs/lcdproc-user/drivers/mx5000.docbook @@ -0,0 +1,52 @@ + +The MX5000 Driver + + +This section talks about using LCDproc with LCD displays on Logitech MX5000 +keyboards. + + + +Features + + +This drivers uses the library from mx5000tools. + + + + + +Configuration in LCDd.conf + + +[mx5000] + + + + + Device = + DEVICE + + + Select the output device to use [default: /dev/hiddev0] + + + + + + WaitAfterRefresh = + MS + + + + Set the time (in ms) to wait after each screen sent to the keyboard. + Default is 1000ms. + + + + + + + + + diff --git a/docs/lcdproc-user/lcdproc-user.docbook b/docs/lcdproc-user/lcdproc-user.docbook index 7b58438..64c97e5 100644 --- a/docs/lcdproc-user/lcdproc-user.docbook +++ b/docs/lcdproc-user/lcdproc-user.docbook @@ -40,6 +40,7 @@ + diff --git a/server/drivers/Makefile.am b/server/drivers/Makefile.am index 94cdad9..b63b35c 100644 --- a/server/drivers/Makefile.am +++ b/server/drivers/Makefile.am @@ -19,7 +19,7 @@ AM_LDFLAGS = @LDSHARED@ #LIBS = pkglib_PROGRAMS = @DRIVERS@ -EXTRA_PROGRAMS = bayrad CFontz CFontz633 CFontzPacket curses CwLnx ea65 EyeboxOne g15 glcdlib glk hd44780 icp_a106 imon IOWarrior irman joy lb216 lcdm001 lcterm lirc lis MD8800 ms6931 mtc_s16209x MtxOrb NoritakeVFD picolcd pyramid sed1330 sed1520 serialPOS serialVFD shuttleVFD stv5730 svga t6963 text tyan sli ula200 xosd i2500vfd +EXTRA_PROGRAMS = bayrad CFontz CFontz633 CFontzPacket curses CwLnx ea65 EyeboxOne g15 glcdlib glk hd44780 icp_a106 imon IOWarrior irman joy lb216 lcdm001 lcterm lirc lis MD8800 ms6931 mtc_s16209x MtxOrb mx5000 NoritakeVFD picolcd pyramid sed1330 sed1520 serialPOS serialVFD shuttleVFD stv5730 svga t6963 text tyan sli ula200 xosd i2500vfd noinst_LIBRARIES = libLCD.a libbignum.a IOWarrior_CFLAGS = @LIBUSB_CFLAGS@ $(AM_CFLAGS) @@ -50,6 +50,7 @@ lis_LDADD = libLCD.a @LIBFTDI_LIBS@ @LIBUSB_LIBS@ @LIBPTHREAD_LIBS@ lib MD8800_LDADD = libLCD.a mtc_s16209x_LDADD = libLCD.a MtxOrb_LDADD = libLCD.a libbignum.a +mx5000_LDADD = libLCD.a @LIBMX5000@ NoritakeVFD_LDADD = libLCD.a libbignum.a picolcd_LDADD = @LIBUSB_LIBS@ libLCD.a libbignum.a pyramid_LDADD = libLCD.a @@ -95,6 +96,7 @@ MD8800_SOURCES = lcd.h lcd_lib.h MD8800.c MD8800.h report.h ms6931_SOURCES = lcd.h lcd_lib.h ms6931.h ms6931.c report.h mtc_s16209x_SOURCES = lcd.h lcd_lib.h mtc_s16209x.c mtc_s16209x.h report.h MtxOrb_SOURCES = lcd.h lcd_lib.h MtxOrb.c MtxOrb.h report.h adv_bignum.h +mx5000_SOURCES = lcd.h mx5000.c mx5000.h report.h NoritakeVFD_SOURCES = lcd.h lcd_lib.h NoritakeVFD.c NoritakeVFD.h report.h adv_bignum.h picolcd_SOURCES = lcd.h picolcd.h picolcd.c report.h pyramid_SOURCES = lcd.h pylcd.c pylcd.h diff --git a/server/drivers/mx5000.c b/server/drivers/mx5000.c new file mode 100644 index 0000000..20f2260 --- /dev/null +++ b/server/drivers/mx5000.c @@ -0,0 +1,404 @@ +/* This is the LCDproc driver header for the Logitech MX5000 keyboard + + Author: Christian Jodar (tian@gcstar.org) + + Copyright (C) 2008 Christian Jodar + + 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 + the Free Software Foundation; either version 2 of the License, or + any later version. + + This program 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 */ + +/* Based on mx5000 tools http://home.gna.org/mx5000tools/ */ + +/* + * Driver status + * 02/01/2008: First test version + * + * + * + */ + +#include +#include +#include +#include +#include +#include +#include + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "lcd.h" +#include "mx5000.h" +#include "report.h" +#include "lcd_lib.h" + + +/* Internal functions */ + +/* + * Prepare a static screen + */ +MODULE_EXPORT int +mx5000_init (Driver *drvthis, char *args) +{ + PrivateData *p; + + /* Allocate and store private data */ + p = (PrivateData *) calloc(1, sizeof(PrivateData)); + if (p == NULL) + return -1; + if (drvthis->store_private_ptr(drvthis, p)) + return -1; + + /* initialize private data */ + p->fd = -1; + p->sc = NULL; + + debug(RPT_INFO, "mx5000: init(%p,%s)", drvthis, args); + + /* Read config file */ + /* Which hiddev device should be used */ + strncpy(p->device, drvthis->config_get_string(drvthis->name, "Device", 0, DEFAULT_DEVICE), sizeof(p->device)); + p->device[sizeof(p->device)-1] = '\0'; + debug(RPT_INFO,"%s: using Device %s", drvthis->name, p->device); + + p->wait = drvthis->config_get_int(drvthis->name, "WaitAfterRefresh", 0, DEFAULT_WAIT); + + p->fd = mx5000_open_path(p->device); + if (p->fd == -1) + { + report(RPT_ERR, "%s: open(%s) failed (%s)", + drvthis->name, p->device, strerror(errno)); + return -1; + } + p->sc = mx5000_sc_new_static(); + if (! p->sc) + { + report(RPT_ERR, "%s: creation of screen failed (%s)", + drvthis->name, strerror(errno)); + return -1; + } + + report(RPT_DEBUG, "%s: init() done", drvthis->name); + + return 1; +} + + +/* + * Clean-up + */ +MODULE_EXPORT void +mx5000_close (Driver *drvthis) +{ + PrivateData *p = drvthis->private_data; + + if (p != NULL) + { + // Just to be sure we flushed current command + sleep(1); + mx5000_reset(p->fd); + if (p->sc) + { + mx5000_sc_free(p->sc); + } + if (p->fd >= 0) + { + close(p->fd); + } + free(p); + } + drvthis->store_private_ptr(drvthis, NULL); +} + + +/* + * Returns the display width + */ +MODULE_EXPORT int +mx5000_width (Driver *drvthis) +{ + return SCREEN_WIDTH; +} + + +/* + * Returns the display height + */ +MODULE_EXPORT int +mx5000_height (Driver *drvthis) +{ + return SCREEN_HEIGHT; +} + + +/* + * Returns the display's character cell width + */ +MODULE_EXPORT int +mx5000_cellwidth(Driver *drvthis) +{ + return CELL_WIDTH; +} + + +/* + * Returns the display's character cell height + */ +MODULE_EXPORT int +mx5000_cellheight(Driver *drvthis) +{ + return CELL_HEIGHT; +} + + +/* + * Flushes all output to the lcd... + */ +MODULE_EXPORT void +mx5000_flush (Driver *drvthis) +{ + PrivateData *p = drvthis->private_data; + + /* + We could only update the needed part. But it would be hard to really + figure out what has been changed + */ + + if (p->changed) + { + mx5000_sc_send(p->sc, p->fd); + p->changed = 0; + // The screen seems to be unable to react quickly + usleep(1000 * p->wait); + } +} + +/* + * Prints a character on the lcd display, at position (x,y). + * The upper-left is (1,1), and the lower right should be (16,4). + */ +MODULE_EXPORT void +mx5000_chr (Driver *drvthis, int x, int y, char c) +{ + PrivateData *p = drvthis->private_data; + char str[2]; + // The position should be given in pixels + int px, py; + + if ((x <= 0) || (y <= 0) || (x > SCREEN_WIDTH) || (y > SCREEN_HEIGHT)) + { + return; + } + + px = (x - 1) * CELL_WIDTH; + py = y * CELL_HEIGHT; + + str[0] = c; + str[1] = 0; + mx5000_sc_add_text(p->sc, str, -1, STATIC, py, px); + p->changed = 1; +} + +/* + * Prints a string on the lcd display, at position (x,y). The + * upper-left is (1,1), and the lower right should be (16,4). + */ +MODULE_EXPORT void +mx5000_string (Driver *drvthis, int x, int y, const char string[]) +{ + PrivateData *p = drvthis->private_data; + int actual_len; + // The position should be given in pixels + int px, py; + + if ((x <= 0) || (y <= 0) || (x > SCREEN_WIDTH) || (y > SCREEN_HEIGHT)) + { + return; + } + + actual_len = strlen(string); + // If the string is too long, it is cut + if ((actual_len + x - 1) > SCREEN_WIDTH) + { + actual_len = SCREEN_WIDTH - x + 1; + } + + px = (x - 1) * CELL_WIDTH; + py = y * CELL_HEIGHT; + + mx5000_sc_add_text(p->sc, string, actual_len, STATIC, py, px); + p->changed = 1; + //printf("Added %s on %d,%d\n",string,x,y); +} + +/* + * Sets the backlight on or off. + * Not supported + */ +MODULE_EXPORT void +mx5000_backlight (Driver *drvthis, int on) +{ +} + +/* + * Draws a horizontal bar to the right. + */ +MODULE_EXPORT void +mx5000_hbar (Driver *drvthis, int x, int y, int len, int promille, int options) +{ +/* x and y are the start position of the bar. + * The bar by default grows in the 'right' direction + * (other direction not yet implemented). + * len is the number of characters that the bar is long at 100% + * promille is the number of promilles (0..1000) that the bar should be filled. + */ + PrivateData *p = drvthis->private_data; + // The position should be given in pixels + int px, py; + //printf("Bar : %d, %d, %d, %d, %d\n", x, y, len, promille, options); + px = (x - 1) * CELL_WIDTH; + py = y * CELL_HEIGHT; + + mx5000_sc_add_progress_bar(p->sc, + promille * len / 1000, + len, + STATIC, + py, + px); + p->changed = 1; +} + +MODULE_EXPORT void +mx5000_num (Driver *drvthis, int x, int num) +{ + PrivateData *p = drvthis->private_data; + int px, py; + char text[10]; + px = (x - 1) * CELL_WIDTH; + py = 33; + + if (num < 10) + { + sprintf(text, "%d", num); + } + else + { + sprintf(text, ":"); + px -= CELL_WIDTH; + } + + //printf("Display %s on %d, %d\n", text, px, py); + + mx5000_sc_add_text(p->sc, text, -1, STATICHUGE, py, px); +} + +MODULE_EXPORT int +mx5000_icon(Driver *drvthis, int x, int y, int icon) +{ + PrivateData *p = drvthis->private_data; + int px, py; + enum display_icon mx5000_icon = 0; + + px = (x - 1) * CELL_WIDTH; + py = y * CELL_HEIGHT; + + switch (icon) + { + case ICON_ARROW_UP: + mx5000_icon = ARROW_UP; + break; + case ICON_ARROW_DOWN: + mx5000_icon = ARROW_DOWN; + break; + case ICON_ARROW_LEFT: + mx5000_icon = TRIANGLE_LEFT; + break; + case ICON_ARROW_RIGHT: + mx5000_icon = TRIANGLE_RIGHT; + break; + case ICON_PAUSE: + mx5000_icon = PAUSE1; + break; + case ICON_PLAY: + mx5000_icon = TRIANGLE_RIGHT; + break; + case ICON_NEXT: + mx5000_icon = NEXTTRACK1; + break; + case ICON_REC: + mx5000_icon = CIRCLE; + break; + } + if (mx5000_icon) + { + mx5000_sc_add_icon(p->sc, mx5000_icon, STATIC, py, px); + return 0; + } + else + { + + return -1; /* Let the core do other icons */ + } +} + +MODULE_EXPORT void +mx5000_heartbeat(Driver *drvthis, int state) +{ +} + +/* + * Gets number of custom chars (always NUM_CCs) + */ +MODULE_EXPORT int +mx5000_get_free_chars(Driver *drvthis) +{ + return 0; +} + +/* + * Clears the LCD screen + */ +MODULE_EXPORT void +mx5000_clear (Driver *drvthis) +{ + PrivateData *p = drvthis->private_data; + + // No way yet (as of 0.1.1) to clear the screen in libmx5000 + if (p->sc) + { + mx5000_sc_free(p->sc); + } + p->sc = mx5000_sc_new_static(); + if (! p->sc) + { + report(RPT_ERR, "%s: creation of screen failed (%s)", + drvthis->name, strerror(errno)); + } + p->changed = 1; +} + + +MODULE_EXPORT const char * +mx5000_get_info (Driver *drvthis) +{ + PrivateData *p = drvthis->private_data; + + memset(p->info, '\0', sizeof(p->info)); + strcpy(p->info, "Logitech MX 5000 Driver"); + + return p->info; +} diff --git a/server/drivers/mx5000.h b/server/drivers/mx5000.h new file mode 100644 index 0000000..1a96720 --- /dev/null +++ b/server/drivers/mx5000.h @@ -0,0 +1,74 @@ +/* This is the LCDproc driver header for the Logitech MX5000 keyboard + + Author: Christian Jodar (tian@gcstar.org) + + Copyright (C) 2008 Christian Jodar + + 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 + the Free Software Foundation; either version 2 of the License, or + any later version. + + This program 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 */ + +#ifndef LCD_MX5000_H +#define LCD_MX5000_H + +#include "lcd.h" + +#define SCREEN_WIDTH 17 +#define SCREEN_HEIGHT 4 +#define CELL_WIDTH 6 +#define CELL_HEIGHT 10 +#define DEFAULT_DEVICE "/dev/hiddev0" +#define DEFAULT_WAIT 1000 + +typedef struct driver_private_data { + char device[200]; + int wait; + int fd; + struct MX5000ScreenContent *sc; + char info[255]; + char changed; +} PrivateData; + + +/* API: variables for the server core */ +MODULE_EXPORT char *api_version = API_VERSION; +MODULE_EXPORT int stay_in_foreground = 0; +MODULE_EXPORT int supports_multiple = 0; +MODULE_EXPORT char *symbol_prefix = "mx5000_"; + +/* API: functions for the server core */ +MODULE_EXPORT int mx5000_init (Driver *drvthis, char *device); +MODULE_EXPORT void mx5000_close (Driver *drvthis); +MODULE_EXPORT int mx5000_width (Driver *drvthis); +MODULE_EXPORT int mx5000_height (Driver *drvthis); +MODULE_EXPORT int mx5000_cellwidth (Driver *drvthis); +MODULE_EXPORT int mx5000_cellheight (Driver *drvthis); +MODULE_EXPORT void mx5000_clear (Driver *drvthis); +MODULE_EXPORT void mx5000_flush (Driver *drvthis); +MODULE_EXPORT void mx5000_string (Driver *drvthis, int x, int y, const char string[]); +MODULE_EXPORT void mx5000_chr (Driver *drvthis, int x, int y, char c); +MODULE_EXPORT void mx5000_hbar (Driver *drvthis, int x, int y, int len, int promille, int options); +MODULE_EXPORT void mx5000_heartbeat (Driver *drvthis, int state); +MODULE_EXPORT void mx5000_num (Driver *drvthis, int x, int num); +MODULE_EXPORT int mx5000_icon(Driver *drvthis, int x, int y, int icon); + +/* +MODULE_EXPORT void mx5000_vbar (Driver *drvthis, int x, int y, int len, int promille, int options); +MODULE_EXPORT int mx5000_icon(Driver *drvthis, int x, int y, int icon); +*/ + +MODULE_EXPORT int mx5000_get_free_chars (Driver *drvthis); +MODULE_EXPORT void mx5000_set_char (Driver *drvthis, int n, unsigned char *dat); +MODULE_EXPORT void mx5000_backlight (Driver *drvthis, int on); + +#endif