From bef230cf7300c25d25351615be378e62785f78cf Mon Sep 17 00:00:00 2001 From: reinelt Date: Sun, 15 Feb 2004 21:43:43 +0000 Subject: [lcd4linux @ 2004-02-15 21:43:43 by reinelt] T6963 driver nearly finished framework for graphic displays done i2c_sensors patch from Xavier some more old generation files removed git-svn-id: https://ssl.bulix.org/svn/lcd4linux/trunk@367 3ae390bd-cb1e-0410-b409-cd5a39f66f1f --- drv_T6963.c | 498 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 498 insertions(+) create mode 100644 drv_T6963.c (limited to 'drv_T6963.c') diff --git a/drv_T6963.c b/drv_T6963.c new file mode 100644 index 0000000..2706805 --- /dev/null +++ b/drv_T6963.c @@ -0,0 +1,498 @@ +/* $Id: drv_T6963.c,v 1.1 2004/02/15 21:43:43 reinelt Exp $ + * + * new style driver for T6963-based displays + * + * Copyright 1999-2004 Michael Reinelt + * Copyright 2004 The LCD4Linux Team + * + * This file is part of LCD4Linux. + * + * LCD4Linux 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, or (at your option) + * any later version. + * + * LCD4Linux 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., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * + * $Log: drv_T6963.c,v $ + * Revision 1.1 2004/02/15 21:43:43 reinelt + * T6963 driver nearly finished + * framework for graphic displays done + * i2c_sensors patch from Xavier + * some more old generation files removed + * + */ + +/* + * + * exported fuctions: + * + * struct DRIVER drv_T6963 + * + */ + +#include "config.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "debug.h" +#include "cfg.h" +#include "udelay.h" +#include "plugin.h" +#include "widget.h" +#include "widget_text.h" +#include "widget_icon.h" +#include "widget_bar.h" +#include "drv.h" +#include "drv_generic_graphic.h" +#include "drv_generic_parport.h" + +static char Name[]="T6963"; +static int Model; + +typedef struct { + int type; + char *name; +} MODEL; + +static MODEL Models[] = { + { 0x01, "generic" }, + { 0xff, "Unknown" } +}; + + +static unsigned char SIGNAL_CE; +static unsigned char SIGNAL_CD; +static unsigned char SIGNAL_RD; +static unsigned char SIGNAL_WR; + +// Fixme: +static int bug=0; + + +// **************************************** +// *** hardware dependant functions *** +// **************************************** + +// perform normal status check +static void drv_T6_status1 (void) +{ + int n; + + // turn off data line drivers + drv_generic_parport_direction (1); + + // lower CE and RD + drv_generic_parport_control (SIGNAL_CE | SIGNAL_RD, 0); + + // Access Time: 150 ns + ndelay(150); + + // wait for STA0=1 and STA1=1 + n=0; + do { + rep_nop(); + if (++n>1000) { + debug("hang in status1"); + bug=1; + break; + } + } while ((drv_generic_parport_read() & 0x03) != 0x03); + + // rise RD and CE + drv_generic_parport_control (SIGNAL_RD | SIGNAL_CE, SIGNAL_RD | SIGNAL_CE); + + // Output Hold Time: 50 ns + ndelay(50); + + // turn on data line drivers + drv_generic_parport_direction (0); +} + + +// perform status check in "auto mode" +static void drv_T6_status2 (void) +{ + int n; + + // turn off data line drivers + drv_generic_parport_direction (1); + + // lower RD and CE + drv_generic_parport_control (SIGNAL_RD | SIGNAL_CE, 0); + + // Access Time: 150 ns + ndelay(150); + + // wait for STA3=1 + n=0; + do { + rep_nop(); + if (++n>1000) { + debug("hang in status2"); + bug=1; + break; + } + } while ((drv_generic_parport_read() & 0x08) != 0x08); + + // rise RD and CE + drv_generic_parport_control (SIGNAL_RD | SIGNAL_CE, SIGNAL_RD | SIGNAL_CE); + + // Output Hold Time: 50 ns + ndelay(50); + + // turn on data line drivers + drv_generic_parport_direction (0); +} + + +static void drv_T6_write_cmd (unsigned char cmd) +{ + // wait until the T6963 is idle + drv_T6_status1(); + + // put data on DB1..DB8 + drv_generic_parport_data (cmd); + + // lower WR and CE + drv_generic_parport_control (SIGNAL_WR | SIGNAL_CE, 0); + + // Pulse width + ndelay(80); + + // rise WR and CE + drv_generic_parport_control (SIGNAL_WR | SIGNAL_CE, SIGNAL_WR | SIGNAL_CE); + + // Data Hold Time + ndelay(40); +} + + +static void drv_T6_write_data (unsigned char data) +{ + // wait until the T6963 is idle + drv_T6_status1(); + + // put data on DB1..DB8 + drv_generic_parport_data (data); + + // lower C/D + drv_generic_parport_control (SIGNAL_CD, 0); + + // C/D Setup Time + ndelay(20); + + // lower WR and CE + drv_generic_parport_control (SIGNAL_WR | SIGNAL_CE, 0); + + // Pulse Width + ndelay(80); + + // rise WR and CE + drv_generic_parport_control (SIGNAL_WR | SIGNAL_CE, SIGNAL_WR | SIGNAL_CE); + + // Data Hold Time + ndelay(40); + + // rise CD + drv_generic_parport_control (SIGNAL_CD, SIGNAL_CD); +} + + +static void drv_T6_write_auto (unsigned char data) +{ + // wait until the T6963 is idle + drv_T6_status2(); + + // put data on DB1..DB8 + drv_generic_parport_data (data); + + // lower C/D + drv_generic_parport_control (SIGNAL_CD, 0); + + // C/D Setup Time + ndelay(20); + + // lower WR and CE + drv_generic_parport_control (SIGNAL_WR | SIGNAL_CE, 0); + + // Pulse Width + ndelay(80); + + // rise WR and CE + drv_generic_parport_control (SIGNAL_WR | SIGNAL_CE, SIGNAL_WR | SIGNAL_CE); + + // Data Hold Time + ndelay(40); + + // rise CD + drv_generic_parport_control (SIGNAL_CD, SIGNAL_CD); +} + + +#if 0 // not used +static void drv_T6_send_byte (unsigned char cmd, unsigned char data) +{ + drv_T6_write_data(data); + drv_T6_write_cmd(cmd); +} +#endif + +static void drv_T6_send_word (unsigned char cmd, unsigned short data) +{ + drv_T6_write_data(data&0xff); + drv_T6_write_data(data>>8); + drv_T6_write_cmd(cmd); +} + + +static void drv_T6_memset(unsigned short addr, unsigned char data, int len) +{ + int i; + + drv_T6_send_word (0x24, addr); // Set Adress Pointer + drv_T6_write_cmd(0xb0); // Set Data Auto Write + for (i=0; i8) rows=8; + drv_T6_memset(0x0000, 0, cols*rows); // clear text area + drv_T6_memset(0x0200, 0, cols*rows*8); // clear graphic area + + // lower half + if (DROWS>8*8) { + rows=DROWS/8-8; + drv_T6_memset(0x8000, 0, cols*rows); // clear text area #2 + drv_T6_memset(0x8200, 0, cols*rows*8); // clear graphic area #2 + } + + return 0; +} + + +// **************************************** +// *** plugins *** +// **************************************** + +// none at the moment... + + +// **************************************** +// *** widget callbacks *** +// **************************************** + + +// using drv_generic_graphic_draw(W) +// using drv_generic_graphic_icon_draw(W) +// using drv_generic_graphic_bar_draw(W) + + +// **************************************** +// *** exported functions *** +// **************************************** + + +// list models +int drv_T6_list (void) +{ + int i; + + for (i=0; Models[i].type!=0xff; i++) { + printf ("%s ", Models[i].name); + } + return 0; +} + + +// initialize driver & display +int drv_T6_init (char *section) +{ + WIDGET_CLASS wc; + int ret; + + // display preferences + GOTO_COST = 2; // number of bytes a goto command requires + + // real worker functions + // Fixme: which one? + // drv_generic_text_real_write = drv_T6_write; + // drv_generic_text_real_goto = drv_T6_goto; + // drv_generic_text_real_defchar = drv_T6_defchar; + + // start display + if ((ret=drv_T6_start (section))!=0) + return ret; + + // initialize generic graphic driver + if ((ret=drv_generic_graphic_init(section, Name))!=0) + return ret; + + // register text widget + wc=Widget_Text; + wc.draw=drv_generic_graphic_draw; + widget_register(&wc); + + // register icon widget + wc=Widget_Icon; + wc.draw=drv_generic_graphic_icon_draw; + widget_register(&wc); + + // register bar widget + wc=Widget_Bar; + wc.draw=drv_generic_graphic_bar_draw; + widget_register(&wc); + + // register plugins + // none at the moment... + + + return 0; +} + + +// close driver & display +int drv_T6_quit (void) { + + info("%s: shutting down.", Name); + drv_generic_parport_close(); + drv_generic_graphic_quit(); + + return (0); +} + + +DRIVER drv_T6963 = { + name: Name, + list: drv_T6_list, + init: drv_T6_init, + quit: drv_T6_quit, +}; + + -- cgit v1.2.3