aboutsummaryrefslogtreecommitdiffstats
path: root/os/various/devices_lib/lcd
diff options
context:
space:
mode:
authorgdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4>2013-06-15 15:58:20 +0000
committergdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4>2013-06-15 15:58:20 +0000
commit7c68ef157d009f9932ac47ba21ba5d74e321623f (patch)
tree6c2442ca44cd090656ec3059ffb959f3d747e18d /os/various/devices_lib/lcd
parent076746af63d317f8e96766b9137a65679f60463f (diff)
parente0d850113610f3efa0c0ac4946901f683e5e7332 (diff)
downloadChibiOS-7c68ef157d009f9932ac47ba21ba5d74e321623f.tar.gz
ChibiOS-7c68ef157d009f9932ac47ba21ba5d74e321623f.tar.bz2
ChibiOS-7c68ef157d009f9932ac47ba21ba5d74e321623f.zip
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/branches/kernel_3_dev@5854 35acf78f-673a-0410-8e92-d51de3d6d3f4
Diffstat (limited to 'os/various/devices_lib/lcd')
-rw-r--r--os/various/devices_lib/lcd/lcd3310.c310
-rw-r--r--os/various/devices_lib/lcd/lcd3310.h94
2 files changed, 404 insertions, 0 deletions
diff --git a/os/various/devices_lib/lcd/lcd3310.c b/os/various/devices_lib/lcd/lcd3310.c
new file mode 100644
index 000000000..86fee541b
--- /dev/null
+++ b/os/various/devices_lib/lcd/lcd3310.c
@@ -0,0 +1,310 @@
+/*
+ Copyright (C) 2013 Marcin Jokel
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+
+/**
+ * @file lcd3310.c
+ * @brief Nokia 3310 LCD interface module through SPI code.
+ *
+ * @addtogroup lcd3310
+ * @{
+ */
+
+#include "ch.h"
+#include "hal.h"
+#include "lcd3310.h"
+
+/*===========================================================================*/
+/* Driver local definitions. */
+/*===========================================================================*/
+
+/*===========================================================================*/
+/* Driver exported variables. */
+/*===========================================================================*/
+
+/*===========================================================================*/
+/* Driver local variables and types. */
+/*===========================================================================*/
+
+const uint8_t Fonts8x5 [][LCD3310_FONT_X_SIZE] =
+{
+ { 0x00, 0x00, 0x00, 0x00, 0x00 }, /* space */
+ { 0x00, 0x00, 0x2f, 0x00, 0x00 }, /* ! */
+ { 0x00, 0x07, 0x00, 0x07, 0x00 }, /* " */
+ { 0x14, 0x7f, 0x14, 0x7f, 0x14 }, /* # */
+ { 0x24, 0x2a, 0x7f, 0x2a, 0x12 }, /* $ */
+ { 0xc4, 0xc8, 0x10, 0x26, 0x46 }, /* % */
+ { 0x36, 0x49, 0x55, 0x22, 0x50 }, /* & */
+ { 0x00, 0x05, 0x03, 0x00, 0x00 }, /* ' */
+ { 0x00, 0x1c, 0x22, 0x41, 0x00 }, /* ( */
+ { 0x00, 0x41, 0x22, 0x1c, 0x00 }, /* ) */
+ { 0x14, 0x08, 0x3E, 0x08, 0x14 }, /* * */
+ { 0x08, 0x08, 0x3E, 0x08, 0x08 }, /* + */
+ { 0x00, 0x00, 0x50, 0x30, 0x00 }, /* , */
+ { 0x10, 0x10, 0x10, 0x10, 0x10 }, /* - */
+ { 0x00, 0x60, 0x60, 0x00, 0x00 }, /* . */
+ { 0x20, 0x10, 0x08, 0x04, 0x02 }, /* / */
+ { 0x3E, 0x51, 0x49, 0x45, 0x3E }, /* 0 */
+ { 0x00, 0x42, 0x7F, 0x40, 0x00 }, /* 1 */
+ { 0x42, 0x61, 0x51, 0x49, 0x46 }, /* 2 */
+ { 0x21, 0x41, 0x45, 0x4B, 0x31 }, /* 3 */
+ { 0x18, 0x14, 0x12, 0x7F, 0x10 }, /* 4 */
+ { 0x27, 0x45, 0x45, 0x45, 0x39 }, /* 5 */
+ { 0x3C, 0x4A, 0x49, 0x49, 0x30 }, /* 6 */
+ { 0x01, 0x71, 0x09, 0x05, 0x03 }, /* 7 */
+ { 0x36, 0x49, 0x49, 0x49, 0x36 }, /* 8 */
+ { 0x06, 0x49, 0x49, 0x29, 0x1E }, /* 9 */
+ { 0x00, 0x36, 0x36, 0x00, 0x00 }, /* : */
+ { 0x00, 0x56, 0x36, 0x00, 0x00 }, /* ; */
+ { 0x08, 0x14, 0x22, 0x41, 0x00 }, /* < */
+ { 0x14, 0x14, 0x14, 0x14, 0x14 }, /* = */
+ { 0x00, 0x41, 0x22, 0x14, 0x08 }, /* > */
+ { 0x02, 0x01, 0x51, 0x09, 0x06 }, /* ? */
+ { 0x32, 0x49, 0x59, 0x51, 0x3E }, /* @ */
+ { 0x7E, 0x11, 0x11, 0x11, 0x7E }, /* A */
+ { 0x7F, 0x49, 0x49, 0x49, 0x36 }, /* B */
+ { 0x3E, 0x41, 0x41, 0x41, 0x22 }, /* C */
+ { 0x7F, 0x41, 0x41, 0x22, 0x1C }, /* D */
+ { 0x7F, 0x49, 0x49, 0x49, 0x41 }, /* E */
+ { 0x7F, 0x09, 0x09, 0x09, 0x01 }, /* F */
+ { 0x3E, 0x41, 0x49, 0x49, 0x7A }, /* G */
+ { 0x7F, 0x08, 0x08, 0x08, 0x7F }, /* H */
+ { 0x00, 0x41, 0x7F, 0x41, 0x00 }, /* I */
+ { 0x20, 0x40, 0x41, 0x3F, 0x01 }, /* J */
+ { 0x7F, 0x08, 0x14, 0x22, 0x41 }, /* K */
+ { 0x7F, 0x40, 0x40, 0x40, 0x40 }, /* L */
+ { 0x7F, 0x02, 0x0C, 0x02, 0x7F }, /* M */
+ { 0x7F, 0x04, 0x08, 0x10, 0x7F }, /* N */
+ { 0x3E, 0x41, 0x41, 0x41, 0x3E }, /* O */
+ { 0x7F, 0x09, 0x09, 0x09, 0x06 }, /* P */
+ { 0x3E, 0x41, 0x51, 0x21, 0x5E }, /* Q */
+ { 0x7F, 0x09, 0x19, 0x29, 0x46 }, /* R */
+ { 0x46, 0x49, 0x49, 0x49, 0x31 }, /* S */
+ { 0x01, 0x01, 0x7F, 0x01, 0x01 }, /* T */
+ { 0x3F, 0x40, 0x40, 0x40, 0x3F }, /* U */
+ { 0x1F, 0x20, 0x40, 0x20, 0x1F }, /* V */
+ { 0x3F, 0x40, 0x38, 0x40, 0x3F }, /* W */
+ { 0x63, 0x14, 0x08, 0x14, 0x63 }, /* X */
+ { 0x07, 0x08, 0x70, 0x08, 0x07 }, /* Y */
+ { 0x61, 0x51, 0x49, 0x45, 0x43 }, /* Z */
+ { 0x00, 0x7F, 0x41, 0x41, 0x00 }, /* [ */
+ { 0x55, 0x2A, 0x55, 0x2A, 0x55 }, /* \ */
+ { 0x00, 0x41, 0x41, 0x7F, 0x00 }, /* ] */
+ { 0x04, 0x02, 0x01, 0x02, 0x04 }, /* ^ */
+ { 0x40, 0x40, 0x40, 0x40, 0x40 }, /* _ */
+ { 0x00, 0x01, 0x02, 0x04, 0x00 }, /* ' */
+ { 0x20, 0x54, 0x54, 0x54, 0x78 }, /* a */
+ { 0x7F, 0x48, 0x44, 0x44, 0x38 }, /* b */
+ { 0x38, 0x44, 0x44, 0x44, 0x20 }, /* c */
+ { 0x38, 0x44, 0x44, 0x48, 0x7F }, /* d */
+ { 0x38, 0x54, 0x54, 0x54, 0x18 }, /* e */
+ { 0x08, 0x7E, 0x09, 0x01, 0x02 }, /* f */
+ { 0x0C, 0x52, 0x52, 0x52, 0x3E }, /* g */
+ { 0x7F, 0x08, 0x04, 0x04, 0x78 }, /* h */
+ { 0x00, 0x44, 0x7D, 0x40, 0x00 }, /* i */
+ { 0x20, 0x40, 0x44, 0x3D, 0x00 }, /* j */
+ { 0x7F, 0x10, 0x28, 0x44, 0x00 }, /* k */
+ { 0x00, 0x41, 0x7F, 0x40, 0x00 }, /* l */
+ { 0x7C, 0x04, 0x18, 0x04, 0x78 }, /* m */
+ { 0x7C, 0x08, 0x04, 0x04, 0x78 }, /* n */
+ { 0x38, 0x44, 0x44, 0x44, 0x38 }, /* o */
+ { 0x7C, 0x14, 0x14, 0x14, 0x08 }, /* p */
+ { 0x08, 0x14, 0x14, 0x18, 0x7C }, /* q */
+ { 0x7C, 0x08, 0x04, 0x04, 0x08 }, /* r */
+ { 0x48, 0x54, 0x54, 0x54, 0x20 }, /* s */
+ { 0x04, 0x3F, 0x44, 0x40, 0x20 }, /* t */
+ { 0x3C, 0x40, 0x40, 0x20, 0x7C }, /* u */
+ { 0x1C, 0x20, 0x40, 0x20, 0x1C }, /* v */
+ { 0x3C, 0x40, 0x30, 0x40, 0x3C }, /* w */
+ { 0x44, 0x28, 0x10, 0x28, 0x44 }, /* x */
+ { 0x0C, 0x50, 0x50, 0x50, 0x3C }, /* y */
+ { 0x44, 0x64, 0x54, 0x4C, 0x44 }, /* z */
+ { 0x00, 0x08, 0x36, 0x41, 0x00 }, /* { */
+ { 0x00, 0x00, 0x7F, 0x00, 0x00 }, /* | */
+ { 0x00, 0x41, 0x36, 0x08, 0x00 }, /* } */
+};
+
+
+/*===========================================================================*/
+/* Driver local functions. */
+/*===========================================================================*/
+
+/*===========================================================================*/
+/* Driver exported functions. */
+/*===========================================================================*/
+
+/**
+ * @brief LCD driver initialization.
+ * @pre The SPI interface must be initialized and the driver started.
+ *
+ * @param[in] spip pointer to the SPI interface
+ *
+ */
+void lcd3310Init(SPIDriver *spip) {
+
+ /* Reset LCD */
+ palClearPad(LCD3310_RES_PORT, LCD3310_RES_PIN);
+ chThdSleepMilliseconds(15);
+ palSetPad(LCD3310_RES_PORT, LCD3310_RES_PIN);
+ chThdSleepMilliseconds(15);
+
+ /* Send configuration commands to LCD */
+ lcd3310WriteByte(spip, 0x21, LCD3310_SEND_CMD); /* LCD extended commands */
+ lcd3310WriteByte(spip, 0xC8, LCD3310_SEND_CMD); /* Set LCD Vop (Contrast) */
+ lcd3310WriteByte(spip, 0x05, LCD3310_SEND_CMD); /* Set start line S6 to 1 TLS8204 */
+ lcd3310WriteByte(spip, 0x40, LCD3310_SEND_CMD); /* Set start line S[5:0] to 0x00 TLS8204 */
+ lcd3310WriteByte(spip, 0x12, LCD3310_SEND_CMD); /* LCD bias mode 1:68. */
+ lcd3310WriteByte(spip, 0x20, LCD3310_SEND_CMD); /* LCD standard Commands, horizontal addressing mode. */
+ lcd3310WriteByte(spip, 0x08, LCD3310_SEND_CMD); /* LCD blank */
+ lcd3310WriteByte(spip, 0x0C, LCD3310_SEND_CMD); /* LCD in normal mode. */
+
+ lcd3310Clear(spip); /* Clear LCD */
+}
+
+/**
+ * @brief Write byte to LCD driver.
+ * @pre The LCD driver must be initialized.
+ *
+ * @param[in] spip pointer to the SPI interface
+ * @param[in] data data to write
+ * @param[in] cd select between command or data
+ */
+void lcd3310WriteByte(SPIDriver *spip, uint8_t data, uint8_t cd) {
+
+ spiSelect(spip);
+
+ if(cd == LCD3310_SEND_DATA) {
+ palSetPad(LCD3310_DC_PORT, LCD3310_DC_PIN);
+ }
+ else {
+ palClearPad(LCD3310_DC_PORT, LCD3310_DC_PIN);
+ }
+
+ spiSend(spip, 1, &data); // change to normal spi send
+ spiUnselect(spip);
+}
+
+/**
+ * @brief Clear LCD
+ * @pre The LCD driver must be initialized.
+ *
+ * @param[in] spip pointer to the SPI interface
+ */
+void lcd3310Clear(SPIDriver *spip) { // ok
+
+ uint32_t i, j;
+
+ for (i = 0; i < LCD3310_Y_RES/LCD3310_FONT_Y_SIZE; i++) {
+ lcd3310SetPosXY(spip, 0, i);
+ for (j = 0; j < LCD3310_X_RES; j++)
+ lcd3310WriteByte(spip, 0x00, LCD3310_SEND_DATA);
+ }
+
+}
+
+/**
+ * @brief Set position
+ * @pre The LCD driver must be initialized.
+ *
+ * @param[in] spip pointer to the SPI interface
+ * @param[in] x column address in LCD DDRAM, 0 to 83
+ * @param[in] y page address in LCD DDRAM, 0 to 5
+ */
+void lcd3310SetPosXY(SPIDriver *spip, uint8_t x, uint8_t y) {
+
+ if (y > LCD3310_Y_RES/LCD3310_FONT_Y_SIZE) return;
+ if (x > LCD3310_X_RES) return;
+
+ lcd3310WriteByte(spip, 0x80 | x, LCD3310_SEND_CMD); /* Set x position */
+ lcd3310WriteByte(spip, 0x40 | y, LCD3310_SEND_CMD); /* Set y position */
+
+}
+
+/**
+ * @brief Write char
+ * @pre The LCD driver must be initialized.
+ *
+ * @param[in] spip pointer to the SPI interface
+ * @param[in] ch char
+ */
+void lcd3310WriteChar(SPIDriver *spip, uint8_t ch) {
+
+ uint8_t i;
+
+ for ( i = 0; i < LCD3310_FONT_X_SIZE; i++ ){
+ lcd3310WriteByte(spip, Fonts8x5[ch - 32][i], LCD3310_SEND_DATA);
+ }
+
+}
+
+/**
+ * @brief Set LCD contrast.
+ * @pre The LCD driver must be initialized.
+ *
+ * @param[in] spip pointer to the SPI interface
+ * @param[in] contrast LCD contrast value
+ */
+void lcd3310Contrast (SPIDriver *spip, uint8_t contrast) {
+
+ lcd3310WriteByte(spip, 0x21, LCD3310_SEND_CMD); /* LCD Extended Commands */
+ lcd3310WriteByte(spip, 0x80 | contrast, LCD3310_SEND_CMD); /* Set LCD Vop (Contrast) */
+ lcd3310WriteByte(spip, 0x20, LCD3310_SEND_CMD); /* LCD Standard Commands, horizontal addressing mode */
+}
+
+
+/**
+ * @brief Write text
+ * @pre The LCD driver must be initialized.
+ *
+ * @param[in] spip pointer to the SPI interface
+ * @param[in] strp pointer to text
+ */
+void lcd3310WriteText(SPIDriver *spip, const uint8_t * strp) {
+
+ while ( *strp ) {
+ lcd3310WriteChar(spip, *strp);
+ strp++;
+ }
+}
+
+/**
+ * @brief Rotate text
+ * @pre The LCD driver must be initialized.
+ *
+ * @param[in] spip pointer to the SPI interface
+ * @param[in] strp pointer to text
+ * @param[in] offset text offset
+ */
+void lcd3310RotateText(SPIDriver *spip, const uint8_t * strp, uint8_t offset) {
+
+ uint8_t i;
+ uint8_t n;
+ uint8_t m;
+
+ for(n = 0; strp[n] != '\0'; n++); /* Count number of char */
+
+ if (offset >= n)
+ return;
+
+ for (i = 0; i < LCD3310_X_RES/LCD3310_FONT_X_SIZE; i++) {
+ m = i + offset;
+ if ( m < n)
+ lcd3310WriteChar(spip, strp[m]);
+ else
+ lcd3310WriteChar(spip, strp[m - n]);
+ }
+}
+
+/** @} */
diff --git a/os/various/devices_lib/lcd/lcd3310.h b/os/various/devices_lib/lcd/lcd3310.h
new file mode 100644
index 000000000..b3bf90660
--- /dev/null
+++ b/os/various/devices_lib/lcd/lcd3310.h
@@ -0,0 +1,94 @@
+/*
+ Copyright (C) 2013 Marcin Jokel
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+
+/**
+ * @file lcd3310.h
+ * @brief Nokia 3310 LCD interface module through SPI code.
+ *
+ * @addtogroup lcd3310
+ * @{
+ */
+
+#ifndef _LCD3310_H_
+#define _LCD3310_H_
+
+/*===========================================================================*/
+/* Driver constants. */
+/*===========================================================================*/
+
+#define LCD3310_X_RES 84
+#define LCD3310_Y_RES 48
+
+#define LCD3310_FONT_X_SIZE 5
+#define LCD3310_FONT_Y_SIZE 8
+
+#define LCD3310_SEND_CMD 0
+#define LCD3310_SEND_DATA 1
+
+/*===========================================================================*/
+/* Driver pre-compile time settings. */
+/*===========================================================================*/
+
+/*===========================================================================*/
+/* Derived constants and error checks. */
+/*===========================================================================*/
+
+#if !defined(LCD3310_RES_PIN)
+#error "LCD3310_RES_PIN not defined!!!"
+#endif
+
+#if !defined(LCD3310_RES_PORT)
+#error "LCD3310_RES_PORT not defined!!!"
+#endif
+
+#if !defined(LCD3310_DC_PIN)
+#error "LCD3310_DC_PIN not defined!!!"
+#endif
+
+#if!defined(LCD3310_DC_PORT)
+#error "LCD3310_DC_PORT not defined!!!"
+#endif
+
+/*===========================================================================*/
+/* Driver data structures and types. */
+/*===========================================================================*/
+
+/*===========================================================================*/
+/* Driver macros. */
+/*===========================================================================*/
+
+/*===========================================================================*/
+/* External declarations. */
+/*===========================================================================*/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+ void lcd3310Init(SPIDriver *spip);
+ void lcd3310WriteByte(SPIDriver *spip, uint8_t data, uint8_t cd);
+ void lcd3310Contrast(SPIDriver *spip, uint8_t contrast);
+ void lcd3310Clear(SPIDriver *spip);
+ void lcd3310SetPosXY(SPIDriver *spip, uint8_t x, uint8_t y);
+ void lcd3310WriteChar (SPIDriver *spip, uint8_t ch);
+ void lcd3310WriteText(SPIDriver *spip, const uint8_t * strp);
+ void lcd3310RotateText(SPIDriver *spip, const uint8_t * strp, uint8_t offset);
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _LCD3310_H_ */
+
+/** @} */