From e36cafd6c9c462b2ba61ee4ce6d87ff4621789e3 Mon Sep 17 00:00:00 2001 From: mmdolze Date: Thu, 6 Jan 2011 15:20:52 +0000 Subject: [PATCH] Convert comments according to style guide. Pass through indent but preserve the 4 spaces indent. --- server/drivers/sed1520.c | 410 +++++++++++++++++++++------------------ 1 file changed, 219 insertions(+), 191 deletions(-) diff --git a/server/drivers/sed1520.c b/server/drivers/sed1520.c index 3b893a2..42def86 100644 --- a/server/drivers/sed1520.c +++ b/server/drivers/sed1520.c @@ -1,28 +1,34 @@ /** \file server/drivers/sed1520.c * LCDd \c sed1520 driver for graphic displays based on the SED1520. + * + * This is a driver for 122x32 pixel graphic displays based on the SED1520 + * controller connected to the parallel port. Check http://www.usblcd.de/lcdproc/ + * for where to buy and how to build the hardware. This Controller has no + * built in character generator. Therefore all fonts and pixels are generated + * by this driver. + * + * \todo Convert to 0.5 style hbar / vbar API. */ -////////////////////////////////////////////////////////////////////////// -// This is a driver for 122x32 pixel graphic displays based on the // -// SED1520 Controller connected to the parallel port. Check // -// http://www.usblcd.de/lcdproc/ for where to buy // -// and how to build the hardware. This Controller has no built in // -// character generator. Therefore all fonts and pixels are generated // -// by this driver. // -// // -// This driver is based on drv_base.c and hd44780.c. // -// The HD44780 font in sed1520fm.c was shamelessly stolen from // -// Michael Reinelt / lcd4linux and is (C) 2000 by him. // -// The rest of fontmap.c and this driver is // -// // -// Moved the delay timing code by Charles Steinkuehler to timing.h. // -// Guillaume Filion , December 2001 // -// // -// (C) 2001 Robin Adams ( robin@adams-online.de ) // -// // -// This driver is released under the GPL. See file COPYING in this // -// package for further details. // -////////////////////////////////////////////////////////////////////////// +/*- + * (C) 2001 Robin Adams ( robin@adams-online.de ) + * + * The HD44780 font in sed1520fm.c was shamelessly stolen from + * Michael Reinelt / lcd4linux and is (C) 2000 by him. + * + * This file is released under the GNU General Public License. Refer to the + * COPYING file distributed with this package. + */ + +/*- + * Driver history: + * Moved the delay timing code by Charles Steinkuehler to timing.h. + * Guillaume Filion , December 2001 + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif #include #include @@ -32,16 +38,16 @@ #include #include #include + +#include "lcd.h" +#include "sed1520.h" +#include "report.h" #include "port.h" #include "timing.h" -#define uPause timing_uPause - #include "sed1520fm.h" -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - +#define uPause timing_uPause +#define IODELAY 500 #ifndef DEFAULT_PORT # define DEFAULT_PORT 0x378 @@ -56,16 +62,10 @@ #define WIDTH ((int) (PIXELWIDTH / CELLWIDTH)) /* 20 */ #define HEIGHT ((int) (PIXELHEIGHT / CELLHEIGHT)) /* 4 */ -#define A0 0x08 -#define CS2 0x04 -#define CS1 0x02 -#define WR 0x01 -#define IODELAY 500 - -#include "lcd.h" -#include "sed1520.h" -#include "report.h" - +#define A0 0x08 /* nSEL */ +#define CS2 0x04 /* INIT */ +#define CS1 0x02 /* nLF */ +#define WR 0x01 /* nSTRB */ /** private data for the \c sed1520 driver */ typedef struct sed1520_private_data { @@ -75,33 +75,49 @@ typedef struct sed1520_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; MODULE_EXPORT char *symbol_prefix = "sed1520_"; -///////////////////////////////////////////////////////////////// -// writes command value to one or both sed1520 selected by chip -// +/** + * Writes command value to one or both sed1520 selected by chip. + * \param port Output port base address + * \param value Command byte to write + * \param chip Bitmap of controllers to send value to + */ void -writecommand (unsigned int port, int value, int chip) +writecommand(unsigned int port, int value, int chip) { port_out(port, value); + /* + * lower WR, rise A0 and CS1 and/or CS2. Take bit inversion of parallel + * port into account. + */ port_out(port + 2, WR + CS1 - (chip & CS1) + (chip & CS2)); + /* rise WR */ port_out(port + 2, CS1 - (chip & CS1) + (chip & CS2)); uPause(IODELAY); + /* lower WR again */ port_out(port + 2, WR + CS1 - (chip & CS1) + (chip & CS2)); uPause(IODELAY); } -///////////////////////////////////////////////////////////////// -// writes data value to one or both sed 1520 selected by chip -// +/** + * Writes data value to one or both sed 1520 selected by chip. + * \param port Output port base address + * \param value Data byte to write + * \param chip Bitmap of controllers to send value to + */ void -writedata (unsigned int port, int value, int chip) +writedata(unsigned int port, int value, int chip) { port_out(port, value); + /* + * lower WR and A0, rise CS1 and/or CS2. Take bit inversion of parallel + * port into account. + */ port_out(port + 2, A0 + WR + CS1 - (chip & CS1) + (chip & CS2)); port_out(port + 2, A0 + CS1 - (chip & CS1) + (chip & CS2)); uPause(IODELAY); @@ -109,54 +125,65 @@ writedata (unsigned int port, int value, int chip) uPause(IODELAY); } -///////////////////////////////////////////////////////////////// -// selects a page (=row) on both sed1520s -// +/** + * Selects a page (=row) on both sed1520s. + * \param port Output port base address + * \param page Page (=row) number (0-3) + */ void -selectpage (unsigned int port, int page) +selectpage(unsigned int port, int page) { writecommand(port, 0xB8 + (page & 0x03), CS1 + CS2); } -///////////////////////////////////////////////////////////////// -// selects a column on the sed1520s specified by chip -// +/** + * Selects a column on the sed1520s specified by chip. + * \param port Output port base address + * \param column Select column (segment) in controller (0-79) + * \param chip Bitmap of controllers to send value to + */ void -selectcolumn (unsigned int port, int column, int chip) +selectcolumn(unsigned int port, int column, int chip) { writecommand(port, (column & 0x7F), chip); } -///////////////////////////////////////////////////////////////// -// draws char z from fontmap to the framebuffer at position -// x,y. These are zero-based textmode positions. -// The Fontmap is stored in rows while the framebuffer is stored -// in columns, so we need a little conversion. -// +/** + * Draws character z from fontmap to the framebuffer at position x,y. + * The Fontmap is stored in rows while the framebuffer is stored in columns, + * so we need a little conversion. + * + * \param framebuf Pointer to framebuffer + * \param x Character column (zero-based) + * \param y Line (zero-based) + * \param z Character index in fontmap + */ void -drawchar2fb (unsigned char *framebuf, int x, int y, unsigned char z) +drawchar2fb(unsigned char *framebuf, int x, int y, unsigned char z) { int i, j; if ((x < 0) || (x >= WIDTH) || (y < 0) || (y >= HEIGHT)) return; + /* for each raster column */ for (i = CELLWIDTH; i > 0; i--) { - int k = 0; + int k = 0; - for (j = 0; j < CELLHEIGHT; j++) - k |= ((fontmap[(int) z][j] >> (i-1)) & 0x01) << j; + /* gather the bits from the fontmap for each raster row */ + for (j = 0; j < CELLHEIGHT; j++) + k |= ((fontmap[(int)z][j] >> (i - 1)) & 0x01) << j; - framebuf[(y * PIXELWIDTH) + (x * CELLWIDTH) + (CELLWIDTH - i)] = k; - } + /* And store it in framebuffer pixel column */ + framebuf[(y * PIXELWIDTH) + (x * CELLWIDTH) + (CELLWIDTH - i)] = k; + } } -///////////////////////////////////////////////////////////////// -// This initialises the stuff. We support supplying port as -// a command line argument. -// +/** + * API: Initialize the driver. + */ MODULE_EXPORT int -sed1520_init (Driver *drvthis) +sed1520_init(Driver * drvthis) { PrivateData *p; @@ -167,53 +194,48 @@ sed1520_init (Driver *drvthis) if (drvthis->store_private_ptr(drvthis, p)) return -1; - - /* Read config file */ - /* What port to use */ p->port = drvthis->config_get_int(drvthis->name, "Port", 0, DEFAULT_PORT); - /* End of config file parsing */ - + /* Initialize timing */ if (timing_init() == -1) { report(RPT_ERR, "%s: timing_init() failed (%s)", drvthis->name, strerror(errno)); return -1; } - // Allocate our framebuffer + /* Allocate our framebuffer */ p->framebuf = (unsigned char *) calloc(PIXELWIDTH * HEIGHT, sizeof(unsigned char)); if (p->framebuf == NULL) { report(RPT_ERR, "%s: unable to allocate framebuffer", drvthis->name); - // sed1520_close (); return -1; - } + } - // clear screen + /* Clear screen */ memset(p->framebuf, '\0', PIXELWIDTH * HEIGHT); - // Initialize the Port and the sed1520s - if (port_access(p->port) || port_access(p->port+2)) { + /* Open port */ + if (port_access(p->port) || port_access(p->port + 2)) { report(RPT_ERR, "%s: unable to access port 0x%03X", drvthis->name, p->port); return -1; } - port_out(p->port,0); - port_out(p->port +2, WR + CS2); - writecommand(p->port, 0xE2, CS1 + CS2); - writecommand(p->port, 0xAF, CS1 + CS2); - writecommand(p->port, 0xC0, CS1 + CS2); + /* Initialize display */ + port_out(p->port, 0); + port_out(p->port + 2, WR + CS2); + writecommand(p->port, 0xE2, CS1 + CS2); /* software reset */ + writecommand(p->port, 0xAF, CS1 + CS2); /* display on */ + writecommand(p->port, 0xC0, CS1 + CS2); /* display start address */ selectpage(p->port, 3); report(RPT_DEBUG, "%s: init() done", drvthis->name); - return 0; } -///////////////////////////////////////////////////////////////// -// Frees the frambuffer and exits the driver. -// +/** + * API: Frees the frambuffer and exits the driver. + */ MODULE_EXPORT void -sed1520_close (Driver *drvthis) +sed1520_close(Driver * drvthis) { PrivateData *p = drvthis->private_data; @@ -226,103 +248,102 @@ sed1520_close (Driver *drvthis) drvthis->store_private_ptr(drvthis, NULL); } -///////////////////////////////////////////////////////////////// -// Returns the display width -// +/** + * API: Returns the display width + */ MODULE_EXPORT int -sed1520_width (Driver *drvthis) +sed1520_width(Driver * drvthis) { - //PrivateData *p = drvthis->private_data; return WIDTH; } -///////////////////////////////////////////////////////////////// -// Returns the display height -// +/** + * API: Returns the display height + */ MODULE_EXPORT int -sed1520_height (Driver *drvthis) +sed1520_height(Driver * drvthis) { - //PrivateData *p = drvthis->private_data; return HEIGHT; } -///////////////////////////////////////////////////////////////// -// Returns the display width -// +/** + * API: Return the width of a character in pixels. + */ MODULE_EXPORT int -sed1520_cellwidth (Driver *drvthis) +sed1520_cellwidth(Driver * drvthis) { - //PrivateData *p = drvthis->private_data; return CELLWIDTH; } -///////////////////////////////////////////////////////////////// -// Returns the display height -// +/** + * API: Return the height of a character in pixels. + */ MODULE_EXPORT int -sed1520_cellheight (Driver *drvthis) +sed1520_cellheight(Driver * drvthis) { - //PrivateData *p = drvthis->private_data; return CELLHEIGHT; } -///////////////////////////////////////////////////////////////// -// Clears the LCD screen -// +/** + * API: Clears the LCD screen + */ MODULE_EXPORT void -sed1520_clear (Driver *drvthis) +sed1520_clear(Driver * drvthis) { PrivateData *p = drvthis->private_data; memset(p->framebuf, '\0', PIXELWIDTH * HEIGHT); } -///////////////////////////////////////////////////////////////// -// -// Flushes all output to the lcd... -// +/** + * API: Flushes all output to the lcd. No conversion needed here as + * framebuffer is prepared by \c drawchar2fb. + */ MODULE_EXPORT void -sed1520_flush (Driver *drvthis) +sed1520_flush(Driver * drvthis) { PrivateData *p = drvthis->private_data; int i, j; for (i = 0; i < HEIGHT; i++) { - selectpage(p->port, i); + /* select line */ + selectpage(p->port, i); - selectcolumn(p->port, 0, CS2) ; - for (j = 0; j < PIXELWIDTH/2; j++) - writedata(p->port, p->framebuf[j + (i * PIXELWIDTH)], CS2); + /* update left half of display */ + selectcolumn(p->port, 0, CS2); + for (j = 0; j < PIXELWIDTH / 2; j++) + writedata(p->port, p->framebuf[j + (i * PIXELWIDTH)], CS2); - selectcolumn(p->port, 0, CS1) ; - for (j = PIXELWIDTH/2; j < PIXELWIDTH; j++) - writedata(p->port, p->framebuf[j + (i * PIXELWIDTH)], CS1); - } + /* update right half of display */ + selectcolumn(p->port, 0, CS1); + for (j = PIXELWIDTH / 2; j < PIXELWIDTH; j++) + writedata(p->port, p->framebuf[j + (i * PIXELWIDTH)], CS1); + } } -///////////////////////////////////////////////////////////////// -// Prints a string on the lc 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 lc display, at position (x,y). The + * upper-left is (1,1), and the lower right should be (20,4). + */ MODULE_EXPORT void -sed1520_string (Driver *drvthis, int x, int y, const char string[]) +sed1520_string(Driver * drvthis, int x, int y, const char string[]) { PrivateData *p = drvthis->private_data; int i; - x--; // Convert 1-based coords to 0-based + x--; /* Convert 1-based coords to 0-based */ y--; for (i = 0; string[i] != '\0'; i++) drawchar2fb(p->framebuf, x + i, y, string[i]); } -///////////////////////////////////////////////////////////////// -// Writes char c at position x,y into the framebuffer. -// x and y are 1-based textmode coordinates. -// +/** + * API: Writes char c at position x,y into the framebuffer. + * x and y are 1-based textmode coordinates. + */ MODULE_EXPORT void -sed1520_chr (Driver *drvthis, int x, int y, char c) +sed1520_chr(Driver * drvthis, int x, int y, char c) { PrivateData *p = drvthis->private_data; @@ -331,43 +352,46 @@ sed1520_chr (Driver *drvthis, int x, int y, char c) drawchar2fb(p->framebuf, x, y, c); } -///////////////////////////////////////////////////////////////// -// This function draws a number num into the last 3 rows of the -// framebuffer at 1-based position x. It should draw a 4-row font, -// but methinks this would look a little stretched. When -// num=10 a colon is drawn. -// FIXME: make big numbers use less memory -// +/** + * API: This function draws a number num into the last 3 rows of the + * framebuffer at 1-based position x. It should draw a 4-row font, but me + * thinks this would look a little stretched. When num=10 a colon is drawn. + * + * FIXME: make big numbers use less memory + */ MODULE_EXPORT void -sed1520_num (Driver *drvthis, int x, int num) +sed1520_num(Driver * drvthis, int x, int num) { PrivateData *p = drvthis->private_data; int z, c, i, s; + x--; - // return on illegal char or illegal position + /* return on illegal char or illegal position */ if ((x >= WIDTH) || (num < 0) || (num > 10)) return; - if (num == 10) { // colon - for (z = 0; z < 3; z++) { // Zeilen a 8 Punkte - for (c = 0; c < 6; c++) { // 6 columns + if (num == 10) { /* colon */ + for (z = 0; z < 3; z++) { /* 3 rows at 8 dots */ + for (c = 0; c < 6; c++) { /* 6 columns */ s = 0; - for (i = 0; i < 8; i++) { // 8 bits aus zeilen + /* convert font definition to bitmap */ + for (i = 0; i < 8; i++) { s >>= 1; if (*(fontbigdp[(z * 8) + i] + c) == '.') s |= 0x80; } + /* Draw directly into framebuffer */ if ((x * CELLWIDTH + c >= 0) && (x * CELLWIDTH + c < PIXELWIDTH)) p->framebuf[((z + 1) * PIXELWIDTH) + (x * CELLWIDTH) + c] = s; } } } - else { // digits 0 - 9 - for (z = 0; z < 3; z++) { // Zeilen a 8 Punkte - for (c = 0; c < 18; c++) { // 18 columns + else { /* digits 0 - 9 */ + for (z = 0; z < 3; z++) { /* 3 rows at 8 dots */ + for (c = 0; c < 18; c++) { /* 18 columns */ s = 0; - for (i = 0; i < 8; i++) { // 8 bits aus zeilen + for (i = 0; i < 8; i++) { s >>= 1; if (*(fontbignum[num][z * 8 + i] + c) == '.') s |= 0x80; @@ -380,19 +404,18 @@ sed1520_num (Driver *drvthis, int x, int num) } -///////////////////////////////////////////////////////////////// -// Changes the font of character n to a pattern given by *dat. -// HD44780 Controllers only posses 8 programmable chars. But -// we store the fontmap completely in RAM, so every character -// can be altered. !Important: Characters have to be redrawn -// by drawchar2fb() to show their new shape. Because we use -// a non-standard 6x8 font a *dat not calculated from -// width and height will fail. -// +/** + * API: Changes the font of character n to a pattern given by *dat. + * HD44780 Controllers only posses 8 programmable chars. But we store the + * fontmap completely in RAM, so every character can be altered. + * + * Important: Characters have to be redrawn by drawchar2fb() to show their + * new shape. Because we use a non-standard 6x8 font a *dat not calculated + * from width and height will fail. + */ MODULE_EXPORT void -sed1520_set_char (Driver *drvthis, int n, char *dat) +sed1520_set_char(Driver * drvthis, int n, char *dat) { - //PrivateData *p = drvthis->private_data; int row, col; if (n < 0 || n > 255) @@ -411,12 +434,12 @@ sed1520_set_char (Driver *drvthis, int n, char *dat) } -///////////////////////////////////////////////////////////////// -// Draws a vertical from the bottom up to the last 3 rows of the -// framebuffer at 1-based position x. len is given in pixels. -// +/* + * Draws a vertical from the bottom up to the last 3 rows of the framebuffer + * at 1-based position x. len is given in pixels. + */ MODULE_EXPORT void -sed1520_old_vbar (Driver *drvthis, int x, int len) +sed1520_old_vbar(Driver * drvthis, int x, int len) { PrivateData *p = drvthis->private_data; int i, j, k; @@ -425,28 +448,31 @@ sed1520_old_vbar (Driver *drvthis, int x, int len) for (j = 0; j < 3; j++) { k = 0; + /* Set height of block. Bottom is leftmost bit */ for (i = 0; i < CELLHEIGHT; i++) { if (len > i) - k |= (1 << (CELLHEIGHT-1 - i)); + k |= (1 << (CELLHEIGHT - 1 - i)); } + /* Draw directly into framebuffer starting from bottom */ p->framebuf[((3 - j) * PIXELWIDTH) + (x * CELLWIDTH) + 0] = 0; p->framebuf[((3 - j) * PIXELWIDTH) + (x * CELLWIDTH) + 1] = 0; p->framebuf[((3 - j) * PIXELWIDTH) + (x * CELLWIDTH) + 2] = k; p->framebuf[((3 - j) * PIXELWIDTH) + (x * CELLWIDTH) + 3] = k; p->framebuf[((3 - j) * PIXELWIDTH) + (x * CELLWIDTH) + 4] = k; p->framebuf[((3 - j) * PIXELWIDTH) + (x * CELLWIDTH) + 5] = 0; + len -= CELLHEIGHT; } } -///////////////////////////////////////////////////////////////// -// Draws a horizontal bar from left to right at 1-based position -// x,y into the framebuffer. len is given in pixels. -// +/* + * Draws a horizontal bar from left to right at 1-based position x,y into the + * framebuffer. len is given in pixels. + */ MODULE_EXPORT void -sed1520_old_hbar (Driver *drvthis, int x, int y, int len) +sed1520_old_hbar(Driver * drvthis, int x, int y, int len) { PrivateData *p = drvthis->private_data; int i; @@ -457,19 +483,19 @@ sed1520_old_hbar (Driver *drvthis, int x, int y, int len) if ((y < 0) || (y >= HEIGHT) || (x < 0) || (len < 0) || ((x + (len / CELLWIDTH)) >= WIDTH)) return; + /* Draw directly into framebuffer. Use 4 dots in the middle (0x3C). */ for (i = 0; i < len; i++) - p->framebuf[(y * PIXELWIDTH) + (x * CELLWIDTH) + i] = 0x3C; // set low 6 bits + p->framebuf[(y * PIXELWIDTH) + (x * CELLWIDTH) + i] = 0x3C; } -///////////////////////////////////////////////////////////////// -// Reprogrammes character dest to contain an icon given by -// which. Calls set_char() to do this. -// +/** + * API: Place an icon on the screen. + */ MODULE_EXPORT int -sed1520_icon (Driver *drvthis, int x, int y, int icon) +sed1520_icon(Driver * drvthis, int x, int y, int icon) { - //PrivateData *p = drvthis->private_data; - static char heart_open[] = { + static char heart_open[] = + { 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, @@ -477,9 +503,11 @@ sed1520_icon (Driver *drvthis, int x, int y, int icon) 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, - 1, 1, 1, 1, 1 }; + 1, 1, 1, 1, 1 + }; - static char heart_filled[] = { + static char heart_filled[] = + { 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, @@ -487,7 +515,8 @@ sed1520_icon (Driver *drvthis, int x, int y, int icon) 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, - 1, 1, 1, 1, 1 }; + 1, 1, 1, 1, 1 + }; switch (icon) { case ICON_BLOCK_FILLED: @@ -506,4 +535,3 @@ sed1520_icon (Driver *drvthis, int x, int y, int icon) } return 0; } -