From a8d642c8c2dcb10ebaf878b7b97c7da8f8c3062d Mon Sep 17 00:00:00 2001 From: reinelt <> Date: Sat, 16 Aug 2003 07:31:35 +0000 Subject: [lcd4linux @ 2003-08-16 07:31:35 by reinelt] double buffering in all drivers --- HD44780.c | 71 ++++++++++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 48 insertions(+), 23 deletions(-) (limited to 'HD44780.c') diff --git a/HD44780.c b/HD44780.c index ce54b24..496f922 100644 --- a/HD44780.c +++ b/HD44780.c @@ -1,4 +1,4 @@ -/* $Id: HD44780.c,v 1.31 2003/08/15 07:54:07 reinelt Exp $ +/* $Id: HD44780.c,v 1.32 2003/08/16 07:31:35 reinelt Exp $ * * driver for display modules based on the HD44780 chip * @@ -24,6 +24,9 @@ * * * $Log: HD44780.c,v $ + * Revision 1.32 2003/08/16 07:31:35 reinelt + * double buffering in all drivers + * * Revision 1.31 2003/08/15 07:54:07 reinelt * HD44780 4 bit mode implemented * @@ -168,6 +171,7 @@ #include #include +#include #include "debug.h" #include "cfg.h" @@ -194,10 +198,11 @@ static LCD Lcd; +static int Bits=0; +static int GPO=0; -static char Txt[4][40]; -static int Bits=0; -static int GPO=0; +static char *FrameBuffer1=NULL; +static char *FrameBuffer2=NULL; static unsigned char SIGNAL_RW; static unsigned char SIGNAL_RS; @@ -333,19 +338,13 @@ static void HD_define_char (int ascii, char *buffer) int HD_clear (int full) { - int row, col; - - for (row=0; rowgpos=gpos; Lcd=*Self; + // Init the framebuffers + FrameBuffer1 = (char*)malloc(Lcd.cols*Lcd.rows*sizeof(char)); + FrameBuffer2 = (char*)malloc(Lcd.cols*Lcd.rows*sizeof(char)); + if (FrameBuffer1==NULL || FrameBuffer2==NULL) { + error ("HD44780: framebuffer could not be allocated: malloc() failed"); + return -1; + } + s=cfg_get("Bits", "8"); if ((Bits=strtol(s, &e, 0))==0 || *e!='\0' || (Bits!=4 && Bits!=8)) { error ("HD44780: bad Bits '%s' in %s, should be '4' or '8'", s, cfg_file()); @@ -457,7 +464,7 @@ void HD_goto (int row, int col) int HD_put (int row, int col, char *text) { - char *p=&Txt[row][col]; + char *p=FrameBuffer1+row*Lcd.cols+col; char *t=text; while (*t && col++<=Lcd.cols) { @@ -489,9 +496,8 @@ int HD_gpo (int num, int val) int HD_flush (void) { - char buffer[256]; - char *p; - int c, row, col; + int row, col, pos1, pos2; + int c, equal; bar_process(HD_define_char); @@ -499,20 +505,28 @@ int HD_flush (void) for (col=0; col2) break; + } else { + pos2=col; + equal=0; + } } - HD_write (buffer, p-buffer, 40); // 40 usec delay for write + HD_write (FrameBuffer1+row*Lcd.cols+pos1, pos2-pos1+1, 40); // 40 usec delay for write } } + memcpy (FrameBuffer2, FrameBuffer1, Lcd.rows*Lcd.cols*sizeof(char)); + HD_setGPO(GPO); return 0; @@ -522,6 +536,17 @@ int HD_flush (void) int HD_quit (void) { info("HD44780: shutting down."); + + if (FrameBuffer1) { + free(FrameBuffer1); + FrameBuffer1=NULL; + } + + if (FrameBuffer2) { + free(FrameBuffer2); + FrameBuffer2=NULL; + } + return parport_close(); } -- cgit v1.2.3