From 565a861d91c104507cf561a40792760cbb923a73 Mon Sep 17 00:00:00 2001 From: mmdolze Date: Thu, 10 Feb 2011 22:48:57 +0000 Subject: [PATCH] Port remaining drivers to 0.5 API (icon, hbar, vbar). --- ChangeLog | 1 + server/drivers/glk.c | 177 ++++++++--------------- server/drivers/glk.h | 10 +- server/drivers/lcdm001.c | 302 ++++++++++++++++++--------------------- server/drivers/lcdm001.h | 72 ++++------ server/drivers/stv5730.c | 150 ++++++++++--------- server/drivers/stv5730.h | 8 +- 7 files changed, 320 insertions(+), 400 deletions(-) diff --git a/ChangeLog b/ChangeLog index 5cac4e3..a572fb3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -17,6 +17,7 @@ v.0.5dev (ongoing development) * lcdproc: Fix a single dot appearing on line 5 of the D screen * lcdproc: Make the iface screen more readable on 2x16 displays * All drivers: sync functions with prototypes + * Port remaining drivers to 0.5 API (glk, lcdm001, stv5730) v0.5.4 * Update driver includes and LDFLAGS (fixed glk and bayrad binding error) diff --git a/server/drivers/glk.c b/server/drivers/glk.c index f5b7acf..483ffd2 100644 --- a/server/drivers/glk.c +++ b/server/drivers/glk.c @@ -1,14 +1,17 @@ /** \file server/drivers/glk.c - * LCDd \c glk driver for graphical displays by MatroxOrbital. - * - * \todo Adapt hBar, vBar, and icon to 0.5 API. + * LCDd \c glk driver for graphical displays by MatrixOrbital (GLK series). */ /* * MatrixOrbital GLK Graphic Display Driver * * http://www.matrixorbital.com + */ + +/*- + * Copyright ??? * + * License ??? */ #include @@ -33,12 +36,10 @@ # endif #endif -#define DEBUG 1 #include "lcd.h" #include "glk.h" #include "glkproto.h" #include "report.h" - #include "adv_bignum.h" #define GLK_DEFAULT_DEVICE "/dev/lcd" @@ -48,10 +49,6 @@ #define GLK_DEFAULT_CELLHEIGHT 8 -////////////////////////////////////////////////////////////////////////// -//////////////////// Matrix Orbital Graphical Driver ///////////////////// -////////////////////////////////////////////////////////////////////////// - /** private data for the \c glk driver */ typedef struct glk_private_data { char device[256]; @@ -79,7 +76,7 @@ typedef struct glk_private_data { } PrivateData; -// Vars for the server core +/* Vars for the server core */ MODULE_EXPORT char *api_version = API_VERSION; MODULE_EXPORT int stay_in_foreground = 0; MODULE_EXPORT int supports_multiple = 0; @@ -110,7 +107,7 @@ glk_init(Driver *drvthis) p->fd = NULL; p->speed = GLK_DEFAULT_SPEED; p->backingstore = NULL; - p->fontselected = -1; // No font selected + p->fontselected = -1; /* No font selected */ p->gpo_count = 0; p->framebuf = NULL; p->cellwidth = GLK_DEFAULT_CELLWIDTH; @@ -131,7 +128,7 @@ glk_init(Driver *drvthis) if (p->speed == 9600) p->speed = B9600; else if (p->speed == 19200) p->speed = B19200; - // not in the specs: + /* not in the specs: */ //else if (p->speed == 38400) p->speed = B38400; else if (p->speed == 57600) p->speed = B57600; else if (p->speed == 115200) p->speed = B115200; @@ -158,7 +155,7 @@ glk_init(Driver *drvthis) return -1; } - // Query the module for a device type + /* Query the module for a device type */ glkputl(p->fd, GLKCommand, 0x37, EOF); i = glkget(p->fd); if (i < 0) { @@ -227,22 +224,21 @@ glk_init(Driver *drvthis) memset(p->framebuf, ' ', p->width * p->height); -// glk_clear(); glkputl(p->fd, GLKCommand, 0x58, EOF); - - // Enable flow control + /* Enable flow control */ glkflow(p->fd, 40, 2); - // Set read character timeout to 0 + /* Set read character timeout to 0 */ glktimeout(p->fd, 0); - // Enable auto-transmit of up/down key events - // This allows us to generate REPEAT keys distinct from - // normal keys using timeouts. (see glk_get_key) + /* + * Enable auto-transmit of up/down key events. This allows us to generate + * REPEAT keys distinct from normal keys using timeouts. (see glk_get_key) + */ glkputl(p->fd, GLKCommand, 0x7e, 1, GLKCommand, 0x41, EOF); - // Set p->contrast + /* Set p->contrast */ glk_set_contrast(drvthis, p->contrast); report(RPT_DEBUG, "%s: init() done", drvthis->name); @@ -360,7 +356,7 @@ glk_clear(Driver *drvthis) memset(p->framebuf, ' ', p->width * p->height); - // do a hardware clear very CLEARCOUNT invocation + /* do a hardware clear very CLEARCOUNT invocation */ if (--p->clearcount < 0) glk_clear_forced(drvthis); } @@ -375,7 +371,6 @@ glk_flush(Driver *drvthis) { PrivateData *p = drvthis->private_data; -// puts("glk_flush()"); unsigned char *pf = p->framebuf; unsigned char *qf = p->backingstore; int x, y; @@ -450,7 +445,7 @@ glk_chr(Driver *drvthis, int x, int y, char c) PrivateData *p = drvthis->private_data; int myc = (unsigned char) c; - x--; // Convert 1-based coords to 0-based... + x--; /* Convert 1-based coords to 0-based... */ y--; if (p->fontselected != 1) { @@ -507,14 +502,12 @@ glk_set_contrast(Driver *drvthis, int promille) { PrivateData *p = drvthis->private_data; - // Check it if ((promille < 0) || (promille > 1000)) return; - // Store it p->contrast = promille; - // Do it: map logical [0, 1000] -> physical [0, 255] for the hardware + /* Do it: map logical [0, 1000] -> physical [0, 255] for the hardware */ debug(RPT_DEBUG, "Contrast: %d", p->contrast); glkputl(p->fd, GLKCommand, 0x50, (int) ((long) promille * 255 / 1000), EOF); } @@ -573,7 +566,6 @@ glk_output(Driver *drvthis, int on) MODULE_EXPORT void glk_num(Driver *drvthis, int x, int num) { - //PrivateData *p = drvthis->private_data; int do_init = 1; debug(RPT_DEBUG, "glk_num(%d, %d)", x, num); @@ -581,52 +573,20 @@ glk_num(Driver *drvthis, int x, int num) if ((num < 0) || (num > 10)) return; - /* no need to check for alternative ccmodes: we have no custom characters - 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; - } - */ - - // Lib_adv_bignum does everything needed to show the bignumbers. + /* Lib_adv_bignum does everything needed to show the bignumbers. */ lib_adv_bignum(drvthis, x, num, 0, do_init); - - /* previous implementation using alternative font: - if (p->fontselected != 3) { - debug(RPT_DEBUG, "Switching to font 3"); - // Select Big Numbers font - glkputl(p->fd, GLKCommand, 0x31, 3, EOF); - p->fontselected = 3; - // Set font metrics - glkputl(p->fd, GLKCommand, 0x32, 1, 0, 1, 1, 32, EOF); - // Clear the screen - glk_clear_forced(drvthis); - } - - if ((x > 0) && (x <= p->width)) - p->framebuf[x-1] = (num >= 10) ? ':' : (num + '0'); - */ } /** - * Get total number of custom characters available. + * Get total number of custom characters available. This is required in order + * to be able to use bignum library. * \param drvthis Pointer to driver structure. * \return Number of custom characters (always 0). */ MODULE_EXPORT int glk_get_free_chars(Driver *drvthis) { - //PrivateData *p = drvthis->private_data; - debug(RPT_DEBUG, "glk_get_free_chars()"); return 0; @@ -640,35 +600,32 @@ glk_get_free_chars(Driver *drvthis) MODULE_EXPORT void glk_set_char(Driver *drvthis, int n, char *dat) { - //PrivateData *p = drvthis->private_data; - debug(RPT_DEBUG, "glk_set_char(%d)", n); } /** - * Draws a vertical bar, from the bottom of the screen up. - * This function still uses 0.4 API. + * Draws a vertical bar, from line y the screen up. */ MODULE_EXPORT void -glk_old_vbar(Driver *drvthis, int x, int len) +glk_vbar(Driver *drvthis, int x, int y, int len, int promille, int options) { PrivateData *p = drvthis->private_data; - int y = p->height; + int pixels = ((long) 2 * len * p->cellheight) * promille / 2000; - debug(RPT_DEBUG, "glk_old_vbar(%d, %d)", x, len); + debug(RPT_DEBUG, "glk_old_vbar(%d, %d)", x, pixels); - while (len > p->cellheight) { + while (pixels > p->cellheight) { glk_chr(drvthis, x, y, 255); --y; - len -= p->cellheight; + pixels -= p->cellheight; } if (y >= 0) { int lastc; - switch (len) { - case 0 : return; break; /* Don't output a char */ + switch (pixels) { + case 0 : return; /* Don't output a char */ case 1 : lastc = 138; break; /* One bar */ case 2 : lastc = 139; break; case 3 : lastc = 140; break; @@ -684,25 +641,25 @@ glk_old_vbar(Driver *drvthis, int x, int len) /** * Draws a horizontal bar to the right. - * This function still uses 0.4 API. */ MODULE_EXPORT void -glk_old_hbar(Driver *drvthis, int x, int y, int len) +glk_hbar(Driver *drvthis, int x, int y, int len, int promille, int options) { PrivateData *p = drvthis->private_data; + int pixels = ((long) 2 * len * p->cellwidth) * promille / 2000; - debug(RPT_DEBUG, "glk_old_hbar(%d, %d, %d)", x, y, len); + debug(RPT_DEBUG, "glk_old_hbar(%d, %d, %d)", x, y, pixels); - while (len > p->cellwidth) { + while (pixels > p->cellwidth) { glk_chr(drvthis, x, y, 255); ++x; - len -= p->cellwidth; + pixels -= p->cellwidth; } if (x <= p->width) { int lastc; - switch (len) { + switch (pixels) { case 0 : lastc = ' '; break; case 1 : lastc = 134; break; /* One bar */ case 2 : lastc = 135; break; @@ -716,47 +673,31 @@ glk_old_hbar(Driver *drvthis, int x, int y, int len) /** - * Sets character 0 to an icon. - * This function still uses 0.4 API. + * API: Draw an icon character on the screen. */ -MODULE_EXPORT void -glk_old_icon(Driver *drvthis, int which, int dest) +MODULE_EXPORT int +glk_icon (Driver *drvthis, int x, int y, int icon) { - PrivateData *p = drvthis->private_data; - unsigned char old, new; - unsigned char *pf = p->framebuf; - unsigned char *qf = p->backingstore; - int count; + debug(RPT_DEBUG, "%s: x=%d, y=%d, icon=%x", __FUNCTION__, x, y, icon); - debug(RPT_DEBUG, "glk_old_icon(%i, %i)", which, dest); - - if ((dest < 0) || (dest > 7)) { - /* Illegal custom character */ - return; - } - - /* which == 0 => empty heart => 131 - * which == 1 => filled heart => 132 - * which == 2 => ellipsis => 128 - */ - switch (which) { - case 0: new = 131; break; - case 1: new = 132; break; - case 2: new = 128; break; - default: return; /* ERROR */ - } - - old = p->CGRAM[(int) dest]; - p->CGRAM[(int) dest] = new; - - /* Replace all old icons with new icon in new frame */ - for (count = p->width * p->height; count > 0; count--) { - if (*qf == old) { - debug(RPT_DEBUG, "icon %d to %d at %d", old, new, qf - p->backingstore); - *pf = new; + switch (icon) { + case ICON_BLOCK_FILLED: + glk_chr(drvthis, x, y, 255); + break; + case ICON_HEART_FILLED: + glk_chr(drvthis, x, y, 132); + break; + case ICON_HEART_OPEN: + glk_chr(drvthis, x, y, 131); + break; + case ICON_ELLIPSIS: + glk_chr(drvthis, x, y, 128); + break; + default: + return -1; /* Let the core do the others */ } - ++qf; ++pf; - } + + return 0; } @@ -828,7 +769,7 @@ glk_get_key(Driver *drvthis) break; default : break; - // What to do with repeated keys? We currently ignore them. + /* What to do with repeated keys? We currently ignore them. */ //case 'v' : c = 'N'; break; //case 'p' : c = 'O'; break; //case 'q' : c = 'P'; break; diff --git a/server/drivers/glk.h b/server/drivers/glk.h index 889c035..a182e1a 100644 --- a/server/drivers/glk.h +++ b/server/drivers/glk.h @@ -1,8 +1,6 @@ #ifndef GLK_H #define GLK_H -#include "lcd.h" - MODULE_EXPORT int glk_init(Driver *drvthis); MODULE_EXPORT void glk_close(Driver *drvthis); MODULE_EXPORT int glk_width(Driver *drvthis); @@ -15,6 +13,9 @@ MODULE_EXPORT void glk_string(Driver *drvthis, int x, int y, const char string[] MODULE_EXPORT void glk_chr(Driver *drvthis, int x, int y, char c); MODULE_EXPORT void glk_num(Driver *drvthis, int x, int num); +MODULE_EXPORT void glk_vbar(Driver *drvthis, int x, int y, int len, int promille, int options); +MODULE_EXPORT void glk_hbar(Driver *drvthis, int x, int y, int len, int promille, int options); +MODULE_EXPORT int glk_icon(Driver *drvthis, int x, int y, int icon); MODULE_EXPORT int glk_get_free_chars(Driver *drvthis); MODULE_EXPORT void glk_set_char(Driver *drvthis, int n, char *dat); @@ -26,9 +27,4 @@ MODULE_EXPORT void glk_output(Driver *drvthis, int on); MODULE_EXPORT const char *glk_get_key(Driver *drvthis); -// Functions using old 0.4 API. -MODULE_EXPORT void glk_old_vbar(Driver *drvthis, int x, int len); -MODULE_EXPORT void glk_old_hbar(Driver *drvthis, int x, int y, int len); -MODULE_EXPORT void glk_old_icon(Driver *drvthis, int which, int dest); - #endif diff --git a/server/drivers/lcdm001.c b/server/drivers/lcdm001.c index 9a43691..dd7faf6 100644 --- a/server/drivers/lcdm001.c +++ b/server/drivers/lcdm001.c @@ -2,39 +2,33 @@ * LCDd \c lcdm001 driver for the LCDM001 device from kernelconcepts.de. */ +/*- + * This driver is mostly based on the MtxOrb driver. See the file MtxOrb.c + * for copyright details. The function calls needed for reporting and getting + * settings from the configfile have been written taking the calls in + * sed1330.c. + * + * Copyright (C) 2001 Rene Wagner + * + * 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 + */ + /* - Copyright (C) 2001 Rene Wagner - - 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 */ - -/* This driver is mostly based on the MtxOrb driver. - See the file MtxOrb.c for copyright details */ -/* The heartbeat workaround has been taken from the curses driver - See the file curses_drv.c for copyright details */ -/* The function calls needed for reporting and getting settings from the - configfile have been written taking the calls in - sed1330.c ((C) by Joris Robijn) as examples*/ -/* (Hopefully I have NOT forgotten any file I have stolen code from. - If so send me an e-mail or add your copyright here!) */ - -/* LCDM001 does NOT support custom chars - Most of the displaying problems have been fixed - using ASCII workarounds*/ - -/* You can modify the characters that are displayed instead of - the normal icons for the heartbeat in lcdm001.h*/ + * LCDM001 does NOT support custom chars. You can modify the characters that + * are displayed instead of the normal icons for the heartbeat in lcdm001.h. + */ #include #include @@ -49,21 +43,9 @@ # include "config.h" #endif -# if TIME_WITH_SYS_TIME -# include -# include -# else -# if HAVE_SYS_TIME_H -# include -# else -# include -# endif -# endif - #include "lcd.h" #include "lcdm001.h" #include "report.h" -//#include "configfile.h" /** private data for the \c lcdm001 driver */ @@ -72,8 +54,6 @@ typedef struct lcdm001_private_data { int fd; int speed; - char icon_char; - char pause_key; char back_key; char forward_key; @@ -81,23 +61,32 @@ typedef struct lcdm001_private_data { char *framebuf; - int width; - int height; -} PrivateData; + int width, height; + int cellwidth, cellheight; +} PrivateData; -// Vars for the server core +/* Vars 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 = "lcdm001_"; +/* Local function prototypes */ static void lcdm001_cursorblink(Driver *drvthis, int on); static char lcdm001_parse_keypad_setting(Driver *drvthis, char * keyname, char * default_value); -// Parse one key from the configfile -static char lcdm001_parse_keypad_setting(Driver *drvthis, char * keyname, char * default_value) +/** + * Parse one key from the configfile. + * \param drvthis Pointer to driver + * \param keyname Name of the key in config file + * \param default_value Default key value to assign if keyname does not exist. + * \return The key character that will be assigned if the key on the device is + * pressed. + */ +static char +lcdm001_parse_keypad_setting(Driver *drvthis, char * keyname, char * default_value) { char return_val = 0; @@ -125,7 +114,11 @@ static char lcdm001_parse_keypad_setting(Driver *drvthis, char * keyname, char * return return_val; } -/* Set cursorblink on/off */ +/** + * Turn cursor blinking on or off. + * \param drvthis Pointer to driver structure. + * \param on Integer: 0 to turn off blinking, 1 to turn on blinking. + */ static void lcdm001_cursorblink(Driver *drvthis, int on) { @@ -141,11 +134,8 @@ lcdm001_cursorblink(Driver *drvthis, int on) } -/* TODO: Get lcd.framebuf to properly work as whatever driver is running...*/ - -/********************************************************************* - * init() should set up any device-specific stuff, and - * point all the function pointers. +/** + * API: Set up any device-specific stuff. */ MODULE_EXPORT int lcdm001_init (Driver *drvthis) @@ -162,7 +152,6 @@ lcdm001_init (Driver *drvthis) /* initialize private data */ p->speed = B38400; - p->icon_char = '@'; p->pause_key = DOWN_KEY; p->back_key = LEFT_KEY; p->forward_key = RIGHT_KEY; @@ -170,6 +159,8 @@ lcdm001_init (Driver *drvthis) p->framebuf = NULL; p->width = LCD_DEFAULT_WIDTH; p->height = LCD_DEFAULT_HEIGHT; + p->cellwidth = LCD_DEFAULT_CELLWIDTH; + p->cellheight = LCD_DEFAULT_CELLHEIGHT; debug(RPT_INFO, "LCDM001: init(%p)", drvthis); @@ -180,20 +171,20 @@ lcdm001_init (Driver *drvthis) } memset(p->framebuf, ' ', p->width * p->height); - // READ CONFIG FILE: + /* READ CONFIG FILE: */ - // which serial device should be used + /* which serial device should be used */ strncpy(p->device, drvthis->config_get_string(drvthis->name, "Device", 0, "/dev/lcd"), sizeof(p->device)); p->device[sizeof(p->device)-1] = '\0'; report(RPT_INFO, "%s: using Device %s", drvthis->name, p->device); - // keypad settings + /* keypad settings */ p->pause_key = lcdm001_parse_keypad_setting(drvthis, "PauseKey", "DownKey"); p->back_key = lcdm001_parse_keypad_setting(drvthis, "BackKey", "LeftKey"); p->forward_key = lcdm001_parse_keypad_setting(drvthis, "ForwardKey", "RightKey"); p->main_menu_key = lcdm001_parse_keypad_setting(drvthis, "MainMenuKey", "UpKey"); - // Set up io port correctly, and open it... + /* Set up io port correctly, and open it... */ debug(RPT_DEBUG, "%s: opening serial device: %s", __FUNCTION__, p->device); p->fd = open(p->device, O_RDWR | O_NOCTTY | O_NDELAY); if (p->fd == -1) { @@ -224,23 +215,22 @@ lcdm001_init (Driver *drvthis) tcsetattr(p->fd, TCSANOW, &portset); tcflush(p->fd, TCIOFLUSH); - // Reset and clear the LCDM001 + /* Reset and clear the LCDM001 */ write(p->fd, "~C", 2); - //Set cursorblink default + /* Set cursorblink default */ lcdm001_cursorblink(drvthis, DEFAULT_CURSORBLINK); - // Turn all LEDs off + /* Turn all LEDs off */ lcdm001_output(drvthis, 0); - report(RPT_DEBUG, "%s: init() done", drvthis->name); + report(RPT_INFO, "%s: init() done", drvthis->name); return 0; } -/* Below here, you may use either lcd.framebuf or driver->framebuf.. - * lcd.framebuf will be set to the appropriate buffer before calling - * your driver. - */ +/** + * API: Cleanup all data structures and close device. + */ MODULE_EXPORT void lcdm001_close (Driver *drvthis) { @@ -252,10 +242,10 @@ lcdm001_close (Driver *drvthis) p->framebuf = NULL; if (p->fd >= 0) { - //switch off all LEDs + /* switch off all LEDs */ lcdm001_output(drvthis, 0); close(p->fd); - } + } p->fd = -1; free(p); @@ -265,9 +255,9 @@ lcdm001_close (Driver *drvthis) report(RPT_INFO, "%s: closed", drvthis->name); } -///////////////////////////////////////////////////////////////// -// Returns the display width -// +/** + * API: Returns the display width + */ MODULE_EXPORT int lcdm001_width (Driver *drvthis) { @@ -276,9 +266,9 @@ lcdm001_width (Driver *drvthis) return p->width; } -///////////////////////////////////////////////////////////////// -// Returns the display height -// +/** + * API: Returns the display height + */ MODULE_EXPORT int lcdm001_height (Driver *drvthis) { @@ -287,49 +277,44 @@ lcdm001_height (Driver *drvthis) return p->height; } -///////////////////////////////////////////////////////////////// -// Clears the LCD screen -// +/** + * API: Clears the internal frame buffer. Does not clear display screen + * immediately as it only makes the display flicker. + */ MODULE_EXPORT void lcdm001_clear (Driver *drvthis) { PrivateData *p = drvthis->private_data; memset(p->framebuf, ' ', p->width * p->height); - /* instant clear is NOT neccessary, it only makes the display flicker */ - //write(fd, "~C", 2); debug(RPT_DEBUG, "LCDM001: cleared screen"); } -////////////////////////////////////////////////////////////////// -// Flushes all output to the lcd... -// +/** + * API: Flushes all output to the lcd... + */ MODULE_EXPORT void lcdm001_flush (Driver *drvthis) { PrivateData *p = drvthis->private_data; - //TODO: Check whether this is still correct - + /* TODO: Check whether this is still correct */ write(p->fd, p->framebuf, p->width * p->height); - debug(RPT_DEBUG, "LCDM001: frame buffer flushed"); + debug(RPT_DEBUG, "LCDM001: frame buffer flushed"); } -///////////////////////////////////////////////////////////////// -// Prints a character on the lcd display, at position (x,y). The -// upper-left is (1,1), and the lower right should be (20,4). -// +/** + * API: Prints a character on the lcd display, at position (x,y). The + * upper-left is (1,1), and the lower right should be (20,4). + */ MODULE_EXPORT void lcdm001_chr (Driver *drvthis, int x, int y, char c) { PrivateData *p = drvthis->private_data; - if (c == '\0') - c = p->icon_char; //heartbeat workaround - - y--; x--; // translate to 0-coords + y--; x--; /* translate to 0-coords */ if ((x >= 0) && (y >= 0) && (x < p->width) && (y < p->height)) p->framebuf[(y * p->width) + x] = c; @@ -337,31 +322,36 @@ lcdm001_chr (Driver *drvthis, int x, int y, char c) debug(RPT_DEBUG, "LCDM001: writing character %02X to position (%d,%d)", c, x, y); } -///////////////////////////////////////////////////////////////// -// Prints a string on the lcd display, at position (x,y). The -// upper-left is (1,1), and the lower right should be (20,4). -// +/** + * API: Prints a string on the lcd display, at position (x,y). The + * upper-left is (1,1), and the lower right should be (20,4). + */ MODULE_EXPORT void lcdm001_string (Driver *drvthis, int x, int y, const char string[]) { PrivateData *p = drvthis->private_data; int i; - x--; y--; // Convert 1-based coords to 0-based... + x--; y--; /* Convert 1-based coords to 0-based... */ if ((y < 0) || (y >= p->height)) return; for (i = 0; (string[i] != '\0') && (x < p->width); i++, x++) { - if (x >= 0) // no write left of left border + if (x >= 0) /* no write left of left border */ p->framebuf[(y * p->width) + x] = string[i]; } debug(RPT_DEBUG, "LCDM001: printed string at (%d,%d)", x, y); } -///////////////////////////////////////////////////////////////// -// Controls LEDs +/** + * API: Controls LEDs. + * \param drvthis Pointer to driver + * \param state LED state + * + * \todo Document LED state. + */ MODULE_EXPORT void lcdm001_output (Driver *drvthis, int state) { @@ -376,91 +366,79 @@ lcdm001_output (Driver *drvthis, int state) debug(RPT_DEBUG, "LCDM001: current LED state %d", state); } -///////////////////////////////////////////////////////////////// -// Draws a vertical bar, from the bottom of the screen up. -// +/** + * API: Draws a vertical bar, from the bottom of the screen up. + */ MODULE_EXPORT void -lcdm001_old_vbar(Driver *drvthis, int x, int len) +lcdm001_vbar (Driver *drvthis, int x, int y, int len, int promille, int options) { PrivateData *p = drvthis->private_data; - int y = p->height; + int pixels = ((long) 2 * len * p->cellheight) * promille / 2000; - debug(RPT_DEBUG , "LCDM001: vertical bar at %d set to %d", x, len); + if ((x <= 0) || (x > p->width) || (y <= 0) || (y > p->height)) + return; - while (len >= LCD_DEFAULT_CELLHEIGHT) { + debug(RPT_DEBUG , "LCDM001: vertical bar at %d set to %d", x, pixels); + + while (y > 0 && pixels >= p->cellheight) { lcdm001_chr(drvthis, x, y, 0xFF); - len -= LCD_DEFAULT_CELLHEIGHT; + pixels -= p->cellheight; y--; } - - if (!len) - return; - - //TODO: Distinguish between len>=4 and len<4 } -///////////////////////////////////////////////////////////////// -// Draws a horizontal bar to the right. -// +/** + * API: Draws a horizontal bar to the right. + */ MODULE_EXPORT void -lcdm001_old_hbar(Driver *drvthis, int x, int y, int len) +lcdm001_hbar (Driver *drvthis, int x, int y, int len, int promille, int options) { PrivateData *p = drvthis->private_data; + int pixels = ((long) 2 * len * p->cellwidth) * promille / 2000; - if ((y <= 0) || (y > p->height)) + if ((x <= 0) || (y <= 0) || (y > p->height)) return; - debug(RPT_DEBUG, "LCDM001: horizontal bar at %d set to %d", x, len); - - //TODO: Improve this function - - while ((x <= p->width) && (len > 0)) { - if (len < LCD_DEFAULT_CELLWIDTH) { - //lcdm001_chr(x, y, 0x98 + len); - break; - } + debug(RPT_DEBUG, "LCDM001: horizontal bar at %d set to %d", x, pixels); + while (x <= p->width && pixels >= p->cellwidth) { lcdm001_chr(drvthis, x, y, 0xFF); - len -= LCD_DEFAULT_CELLWIDTH; + pixels -= p->cellwidth; x++; } return; } -///////////////////////////////////////////////////////////////// -// Sets character 0 to an icon... -// -MODULE_EXPORT void -lcdm001_old_icon (Driver *drvthis, int which, char dest) +/** + * API: Place an icon on the screen. As this driver does not support custom + * characters only generic icons from core are supported. The heartbeat + * icons however are replaced with some different characters. + */ +MODULE_EXPORT int +lcdm001_icon (Driver *drvthis, int x, int y, int icon) { - PrivateData *p = drvthis->private_data; + switch (icon) { + case ICON_HEART_OPEN: + lcdm001_chr(drvthis, x, y, LCDM001_OPEN_HEART); + break; + case ICON_HEART_FILLED: + lcdm001_chr(drvthis, x, y, LCDM001_FILLED_HEART); + break; + default: + return -1; /* Let the core do the other */ + } -/*Heartbeat workaround: - As custom chars are not supported OPEN_HEART - and FILLED_HEART are displayed instead. - Change them in lcdm001.h*/ - - if (dest == 0) - switch (which) { - case 0: - p->icon_char = OPEN_HEART; - break; - case 1: - p->icon_char = FILLED_HEART; - break; - default: - p->icon_char = PAD; - break; - } + return 0; } -////////////////////////////////////////////////////////////////////// -// Tries to read a character from an input device... -// -// Return NULL for "nothing available". -// +/** + * API: Tries to read a character from an input device... + * + * \return NULL for "nothing available" or one of the fixed strings "Enter", + * "Left", "Right", or "Escape". + */ MODULE_EXPORT const char * lcdm001_get_key (Driver *drvthis) { diff --git a/server/drivers/lcdm001.h b/server/drivers/lcdm001.h index 246afa6..e30be39 100644 --- a/server/drivers/lcdm001.h +++ b/server/drivers/lcdm001.h @@ -1,38 +1,29 @@ -/* This is the header file of the LCDproc driver for - the "LCDM001" device from kernelconcepts.de - - Copyright (C) 2001 Rene Wagner - - 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 */ - -/* This driver is mostly based on the MtxOrb driver. - See the file MtxOrb.c for copyright details */ -/* The heartbeat workaround has been taken from the curses driver - See the file curses_drv.c for copyright details */ +/** + * This is the header file of the LCDproc driver for the "LCDM001" device from + * kernelconcepts.de + */ +/*- + * Copyright (C) 2001 Rene Wagner + * + * 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 LCDM001_H #define LCDM001_H -/******************************************************************** - lcdm001.h -******************************************************************/ - -/* REMOVE: I don't thing this is actualy needed. */ -/* extern lcd_logical_driver *lcdm001; */ - MODULE_EXPORT int lcdm001_init (Driver *drvthis); MODULE_EXPORT void lcdm001_close (Driver *drvthis); MODULE_EXPORT int lcdm001_width (Driver *drvthis); @@ -42,24 +33,23 @@ MODULE_EXPORT void lcdm001_flush (Driver *drvthis); MODULE_EXPORT void lcdm001_string (Driver *drvthis, int x, int y, const char string[]); MODULE_EXPORT void lcdm001_chr (Driver *drvthis, int x, int y, char c); -MODULE_EXPORT void lcdm001_old_vbar (Driver *drvthis, int x, int len); -MODULE_EXPORT void lcdm001_old_hbar (Driver *drvthis, int x, int y, int len); +MODULE_EXPORT void lcdm001_vbar (Driver *drvthis, int x, int y, int len, int promille, int options); +MODULE_EXPORT void lcdm001_hbar (Driver *drvthis, int x, int y, int len, int promille, int options); MODULE_EXPORT void lcdm001_num (Driver *drvthis, int x, int num); -MODULE_EXPORT void lcdm001_old_icon (Driver *drvthis, int which, char dest); +MODULE_EXPORT int lcdm001_icon (Driver *drvthis, int x, int y, int icon); MODULE_EXPORT void lcdm001_output (Driver *drvthis, int on); - MODULE_EXPORT char lcdm001_getkey (Driver *drvthis); #define DEFAULT_DEVICE "/dev/lcd" -#define DEFAULT_CURSORBLINK 0 +#define DEFAULT_CURSORBLINK 0 /* cursor blinking off */ -/*Heartbeat workaround - set chars to be displayed instead of "normal" icons*/ - -#define OPEN_HEART ' ' /* This combination is at least visible */ -#define FILLED_HEART '*' -#define PAD 255 +/* + * Use our own chars for the heartbeat instead of core's default. This + * combination is at least visible. + */ +#define LCDM001_OPEN_HEART ' ' +#define LCDM001_FILLED_HEART '*' #define LEFT_KEY '1' #define RIGHT_KEY '2' diff --git a/server/drivers/stv5730.c b/server/drivers/stv5730.c index 1474a8e..c105393 100644 --- a/server/drivers/stv5730.c +++ b/server/drivers/stv5730.c @@ -29,7 +29,6 @@ #include #include #include -//#include #include #include "port.h" #include "timing.h" @@ -102,40 +101,42 @@ MODULE_EXPORT char *symbol_prefix = "stv5730_"; // Translation map ascii->stv5730 charset unsigned char stv5730_to_ascii[256] = - { 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, - 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, - 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, - 0x0B, 0x0B, 0x0B, 0x0B, - 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, - 0x27, 0x0B, 0x27, 0x28, - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x26, 0x26, - 0x62, 0x78, 0x61, 0x70, - 0x6c, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, - 0x17, 0x18, 0x19, 0x1A, - 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x0B, - 0x0B, 0x0B, 0x0B, 0x72, - 0x0B, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34, - 0x35, 0x36, 0x37, 0x38, - 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 0x40, 0x41, 0x42, 0x43, 0x6E, - 0x6C, 0x71, 0x79, 0x7F, - 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, - 0x0B, 0x0B, 0x0B, 0x0B, - 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, - 0x0B, 0x0B, 0x0B, 0x0B, - 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, - 0x0B, 0x0B, 0x0B, 0x0B, - 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, - 0x0B, 0x0B, 0x0B, 0x0B, - 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, - 0x0B, 0x0B, 0x0B, 0x0B, - 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, - 0x0B, 0x0B, 0x0B, 0x0B, - 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, - 0x0B, 0x0B, 0x0B, 0x0B, - 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, - 0x0B, 0x0B, 0x0B, 0x77 -}; - + { + /* 00 - 7F */ + 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, + 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, + 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, + 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, + 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x29, /* ' */ + 0x0B, 0x0B, 0x5F, 0x5E, 0x27, 0x0A, 0x27, 0x28, /* * + . - . / */ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, /* 0 1 2 3 4 5 6 7 */ + 0x08, 0x09, 0x26, 0x26, 0x62, 0x78, 0x61, 0x70, /* 8 9 : : « = » ? */ + 0x6c, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, /* @ A B C D E F G */ + 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, /* H I J K L M N O */ + 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, /* P Q R S T U V W */ + 0x23, 0x24, 0x25, 0x0B, 0x0B, 0x0B, 0x0B, 0x72, /* X Y Z _ */ + 0x0B, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, /* a b c d e f g */ + 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, /* h i j k l m n o */ + 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 0x40, /* p q r s t u v w */ + 0x41, 0x42, 0x43, 0x6E, 0x6C, 0x71, 0x79, 0x7F, /* x y z # # # # # */ + /* 80 - FF */ + 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, + 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, + 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, + 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, + 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, + 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, + 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, + 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, + 0x0B, 0x0B, 0x0B, 0x0B, 0x58, 0x69, 0x0B, 0x0B, /* Ä Å */ + 0x0B, 0x6B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, /* É */ + 0x0B, 0x6D, 0x0B, 0x0B, 0x0B, 0x0B, 0x59, 0x0B, /* Ñ Ö */ + 0x0B, 0x0B, 0x0B, 0x0B, 0x5A, 0x0B, 0x0B, 0x5C, /* Ü ß */ + 0x44, 0x47, 0x45, 0x0B, 0x46, 0x6A, 0x0B, 0x58, /* à á â ä å ç */ + 0x49, 0x48, 0x4B, 0x4A, 0x4C, 0x4F, 0x4D, 0x4E, /* è é ê ë ì í î ï */ + 0x0B, 0x5D, 0x50, 0x53, 0x51, 0x0B, 0x52, 0x0B, /* ñ ò ó ô ö */ + 0x0B, 0x54, 0x57, 0x55, 0x56, 0x0B, 0x0B, 0x77 /* ù ú û ü # */ + }; //static void stv5730_upause(int delayCalls); @@ -144,7 +145,6 @@ unsigned char stv5730_to_ascii[256] = ///////////////////////////////////////////////////////////////// // This function returns true if a powered and working STV5730 // hardware is present at p->port - static int stv5730_detect (unsigned int port) { @@ -178,7 +178,6 @@ stv5730_is_mute (unsigned int port) // this family of functions write commands or data to the stv5730 // 8 bit writes repeat the high byte, 0 byte writes repeat the last // written word - static void stv5730_write16bit (unsigned int port, unsigned int flags, unsigned int value) { @@ -571,49 +570,53 @@ stv5730_num (Driver *drvthis, int x, int num) } ///////////////////////////////////////////////////////////////// -// Draws a vertical bar from the bottom up to the last 7 rows of the -// framebuffer at 1-based position x. len is given in pixels. +// Draws a vertical bar from the bottom up at 1-based position x. // MODULE_EXPORT void -stv5730_old_vbar (Driver *drvthis, int x, int len) +stv5730_vbar(Driver *drvthis, int x, int y, int len, int promille, int options) { PrivateData *p = drvthis->private_data; - int i; + int i; /* number of pixels drawn */ + int pixels; x--; - if (x < 0 || len < 0 || (len / 6) >= STV5730_WID) + if (x < 0 || len < 0 || (len) >= STV5730_HGT) return; - for (i = 0; i <= len; i += 6) { - if (len >= (i + 6)) /* 6 = cellheight */ + pixels = ((long) 2 * len * 6) * promille / 2000; + + for (i = 0; i <= pixels; i += 6) { + if (pixels >= (i + 6)) /* 6 = cellheight */ p->framebuf[((10 - (i / 6)) * STV5730_WID) + x] = 0x77; else - p->framebuf[((10 - (i / 6)) * STV5730_WID) + x] = 0x72 + (len % 6); + p->framebuf[((10 - (i / 6)) * STV5730_WID) + x] = 0x72 + (pixels % 6); } } ///////////////////////////////////////////////////////////////// // Draws a horizontal bar from left to right at 1-based position -// x,y into the framebuffer. len is given in pixels. +// x,y into the framebuffer. // It uses the STV5730 'channel-tuning' chars(0x64-0x68) to do // this. MODULE_EXPORT void -stv5730_old_hbar (Driver *drvthis, int x, int y, int len) +stv5730_hbar (Driver *drvthis, int x, int y, int len, int promille, int options) { PrivateData *p = drvthis->private_data; int i; + int pixels; x--; y--; - if (y < 0 || y >= STV5730_HGT || x < 0 || len < 0 - || (x + (len / 5)) >= STV5730_WID) + if (y < 0 || y >= STV5730_HGT || x < 0 || len < 0 || (x + len) >= STV5730_WID) return; - for (i = 0; i <= len; i += 5) { - if (len >= (i + 4)) /* 4 = cellwidth */ + pixels = ((long) 2 * len * 4) * promille / 2000; + + for (i = 0; i <= pixels; i += 5) { + if (pixels >= (i + 4)) /* 4 = cellwidth */ p->framebuf[(y * STV5730_WID) + x + (i / 5)] = 0x64; else p->framebuf[(y * STV5730_WID) + x + (i / 5)] = 0x65 + (len % 5); @@ -626,23 +629,36 @@ stv5730_old_hbar (Driver *drvthis, int x, int y, int len) // The STV5730 has no programmable chars. The charset is very // limited, it doesn't even contain a '%' char. But wait... // It contains a heartbeat char ! :-) -MODULE_EXPORT void -stv5730_old_icon (Driver *drvthis, int which, char dest) +MODULE_EXPORT int +stv5730_icon(Driver *drvthis, int x, int y, int icon) { - //PrivateData *p = drvthis->private_data; + PrivateData *p = drvthis->private_data; - switch (which) { - case 0: // 0:empty Heart - stv5730_to_ascii[(int) dest] = 0x71; - break; - case 1: // 1:Filled Heart - stv5730_to_ascii[(int) dest] = 0x0B; - break; - case 2: // 2:Ellipsis - stv5730_to_ascii[(int) dest] = 0x5F; - break; + switch (icon) { + case ICON_BLOCK_FILLED: + p->framebuf[(y * STV5730_WID) + x] = 0x77; + break; + case ICON_HEART_OPEN: + p->framebuf[(y * STV5730_WID) + x] = 0x0B; + break; + case ICON_HEART_FILLED: + p->framebuf[(y * STV5730_WID) + x] = 0x71; + break; + case ICON_ARROW_UP: + p->framebuf[(y * STV5730_WID) + x] = 0x7C; + break; + case ICON_ARROW_DOWN: + p->framebuf[(y * STV5730_WID) + x] = 0x7D; + break; + case ICON_ARROW_LEFT: + p->framebuf[(y * STV5730_WID) + x] = 0x7B; + break; + case ICON_ARROW_RIGHT: + p->framebuf[(y * STV5730_WID) + x] = 0x7A; + break; default: - stv5730_to_ascii[(int) dest] = 0x0B; - break; - } + return -1; /* Let the core do the others */ + } + + return 0; } diff --git a/server/drivers/stv5730.h b/server/drivers/stv5730.h index 148af35..743a5fe 100644 --- a/server/drivers/stv5730.h +++ b/server/drivers/stv5730.h @@ -1,8 +1,6 @@ #ifndef STV5730_H #define STV5730_H -#include "lcd.h" - MODULE_EXPORT int stv5730_init (Driver *drvthis); MODULE_EXPORT void stv5730_close (Driver *drvthis); MODULE_EXPORT int stv5730_width (Driver *drvthis); @@ -13,9 +11,9 @@ MODULE_EXPORT void stv5730_clear (Driver *drvthis); MODULE_EXPORT void stv5730_flush (Driver *drvthis); MODULE_EXPORT void stv5730_string (Driver *drvthis, int x, int y, const char string[]); MODULE_EXPORT void stv5730_chr (Driver *drvthis, int x, int y, char c); -MODULE_EXPORT void stv5730_old_vbar (Driver *drvthis, int x, int len); -MODULE_EXPORT void stv5730_old_hbar (Driver *drvthis, int x, int y, int len); +MODULE_EXPORT void stv5730_vbar(Driver *drvthis, int x, int y, int len, int promille, int options); +MODULE_EXPORT void stv5730_hbar (Driver *drvthis, int x, int y, int len, int promille, int options); MODULE_EXPORT void stv5730_num (Driver *drvthis, int x, int num); -MODULE_EXPORT void stv5730_old_icon (Driver *drvthis, int which, char dest); +MODULE_EXPORT int stv5730_icon(Driver *drvthis, int x, int y, int icon); #endif