Doc fixes.
[bertos.git] / drv / lcd_hd44.c
old mode 100755 (executable)
new mode 100644 (file)
index 0bd7b34..1c2e52f
@@ -1,8 +1,33 @@
 /**
  * \file
  * <!--
+ * This file is part of BeRTOS.
+ *
+ * Bertos 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
+ * (at your option) 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 St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ * As a special exception, you may use this file as part of a free software
+ * library without restriction.  Specifically, if other files instantiate
+ * templates or use macros or inline functions from this file, or you compile
+ * this file and link it with other files to produce an executable, this
+ * file does not by itself cause the resulting executable to be covered by
+ * the GNU General Public License.  This exception does not however
+ * invalidate any other reasons why the executable file might be covered by
+ * the GNU General Public License.
+ *
  * Copyright 2005 Develer S.r.l. (http://www.develer.com/)
- * This file is part of DevLib - See README.devlib for information.
+ *
  * -->
  *
  * \brief LM044L type LCD hardware module (impl.)
  * \author Stefano Fedrigo <aleph@develer.com>
  */
 
-/*#*
- *#* $Log$
- *#* Revision 1.3  2006/09/20 19:55:01  marco
- *#* Added CONFIG_LCD_4BIT.
- *#*
- *#* Revision 1.2  2006/07/19 12:56:25  bernie
- *#* Convert to new Doxygen style.
- *#*
- *#* Revision 1.1  2005/11/04 18:00:42  bernie
- *#* Import into DevLib.
- *#*
- *#* Revision 1.2  2005/06/14 14:43:43  bernie
- *#* Add DevLib headers.
- *#*
- *#* Revision 1.1  2005/05/24 09:17:58  batt
- *#* Move drivers to top-level.
- *#*
- *#* Revision 1.9  2005/05/09 21:58:53  batt
- *#* Fix doxygen tags.
- *#*
- *#* Revision 1.8  2005/05/09 12:52:46  batt
- *#* lcd_dataRead(): Avoid bus collision; Add back *UNTESTED* 8bit bus support.
- *#*
- *#* Revision 1.7  2005/05/09 12:24:13  batt
- *#* lcd_putc(): Fix latent bug; lcd_hw_init(): Extend timings.
- *#*/
-
 #include "lcd_hd44.h"
 #include "hw_lcd.h"
 #include <cfg/arch_config.h>
 #include <drv/timer.h>
 
+#if defined(LCD_READ_H) && defined(LCD_READ_L) && defined(LCD_WRITE_H) && defined(LCD_WRITE_L)
+       #define CONFIG_LCD_4BIT 1
+#elif defined(LCD_READ) && defined(LCD_WRITE)
+       #define CONFIG_LCD_4BIT 0
+#else
+       #error Incomplete or missing LCD_READ/LCD_WRITE macros
+#endif
+
 /** Flag di stato del display */
 #define LCDF_BUSY  BV(7)
 
+#if CONFIG_LCD_ADDRESS_FAST == 1
+#define lcd_address(x) lcd_address[x]
 /**
  * Addresses of LCD display character positions, expanded
  * for faster access (DB7 = 1).
@@ -94,6 +102,26 @@ static const uint8_t lcd_address[] =
 };
 
 STATIC_ASSERT(countof(lcd_address) == LCD_ROWS * LCD_COLS);
+#else  /* CONFIG_LCD_ADDRESS_FAST == 0 */
+
+static const uint8_t col_address[] =
+{
+       0x80,
+       0xC0,
+#if LCD_ROWS > 2
+       0x94,
+       0xD4
+#endif
+};
+STATIC_ASSERT(countof(col_address) == LCD_ROWS);
+/**
+ * Addresses of LCD display character positions, calculated runtime to save RAM
+ */
+static uint8_t lcd_address(uint8_t addr)
+{
+       return col_address[addr / LCD_COLS] + addr % LCD_COLS;
+}
+#endif /* CONFIG_LCD_ADDRESS_FAST */
 
 /**
  * Current display position. We remember this to optimize
@@ -280,7 +308,7 @@ void lcd_moveTo(uint8_t addr)
        if (addr != lcd_current_addr)
        {
                lcd_waitBusy();
-               lcd_regWrite(lcd_address[addr]);
+               lcd_regWrite(lcd_address(addr));
                lcd_current_addr = addr;
        }
 }
@@ -306,7 +334,7 @@ void lcd_setReg(uint8_t val)
 void lcd_putc(uint8_t addr, uint8_t c)
 {
        if (addr != lcd_current_addr)
-               lcd_setReg(lcd_address[addr]);
+               lcd_setReg(lcd_address(addr));
 
        lcd_waitBusy();
        lcd_dataWrite(c);
@@ -318,7 +346,7 @@ void lcd_putc(uint8_t addr, uint8_t c)
 
        /* If we are at the end of a row put the cursor at the beginning of the next */
        if (!(lcd_current_addr % LCD_COLS))
-               lcd_setReg(lcd_address[lcd_current_addr]);
+               lcd_setReg(lcd_address(lcd_current_addr));
 }
 
 
@@ -343,7 +371,7 @@ void lcd_remapChar(const char *glyph, char code)
        }
 
        /* Move back to original address */
-       lcd_setReg(lcd_address[lcd_current_addr]);
+       lcd_setReg(lcd_address(lcd_current_addr));
 }