diff options
Diffstat (limited to 'nuttx')
-rw-r--r-- | nuttx/ChangeLog | 5 | ||||
-rw-r--r-- | nuttx/arch/mips/src/pic32mx/pic32mx-pmp.h | 3 | ||||
-rw-r--r-- | nuttx/configs/pcblogic-pic32mx/src/up_lcd1602.c | 374 | ||||
-rw-r--r-- | nuttx/configs/pic32mx7mmb/src/up_mio283qt2.c | 2 | ||||
-rw-r--r-- | nuttx/drivers/lcd/README.txt | 10 | ||||
-rw-r--r-- | nuttx/include/nuttx/lcd/hd4478ou.h | 118 |
6 files changed, 508 insertions, 4 deletions
diff --git a/nuttx/ChangeLog b/nuttx/ChangeLog index 77441dd21..41f38bd91 100644 --- a/nuttx/ChangeLog +++ b/nuttx/ChangeLog @@ -3996,3 +3996,8 @@ * net/recvfrom(): Fix a introduced with the last bugfix. If the peer does an orderly closure of the socket, report 0 not -ENOTCONN + * configs/lm3s6965-ek/README.txt and tools/: Add an OpenOCD + configuration for the LM3S (from Jose Pablo Carballo). + * nuttx/lcd/hd4478ou.h and configs/pcblogic-pic32mx/src/up_lcd1602: + Start of support of LCD1602 alphanumeric LCD. I need a few + more parts before I can finish integrating this one. diff --git a/nuttx/arch/mips/src/pic32mx/pic32mx-pmp.h b/nuttx/arch/mips/src/pic32mx/pic32mx-pmp.h index 745c56a3d..abfc3358b 100644 --- a/nuttx/arch/mips/src/pic32mx/pic32mx-pmp.h +++ b/nuttx/arch/mips/src/pic32mx/pic32mx-pmp.h @@ -157,7 +157,8 @@ # define PMP_MODE_MODE_SLAVE (1 << PMP_MODE_MODE_SHIFT) /* Enhanced slave mode */ # define PMP_MODE_MODE_MODE2 (2 << PMP_MODE_MODE_SHIFT) /* Master mode 2 */ # define PMP_MODE_MODE_MODE1 (3 << PMP_MODE_MODE_SHIFT) /* Master mode 1 */ -#define PMP_MODE_MODE16 (1 << 10) /* Bit 10: 8/16-bit mode */ +#define PMP_MODE_MODE16 (1 << 10) /* Bit 10: 1=16-bit mode */ +#define PMP_MODE_MODE8 (0) /* 0=8-bit mode */ #define PMP_MODE_INCM_SHIFT (11) /* Bits 11-12: Increment Mode */ #define PMP_MODE_INCM_MASK (3 << PMP_MODE_INCM_SHIFT) # define PMP_MODE_INCM_NONE (0 << PMP_MODE_INCM_SHIFT) /* No incr or decr of addr */ diff --git a/nuttx/configs/pcblogic-pic32mx/src/up_lcd1602.c b/nuttx/configs/pcblogic-pic32mx/src/up_lcd1602.c new file mode 100644 index 000000000..3f99baee1 --- /dev/null +++ b/nuttx/configs/pcblogic-pic32mx/src/up_lcd1602.c @@ -0,0 +1,374 @@ +/**************************************************************************** + * configs/pcblocic-pic32mx/src/up_lcd1602.c + * + * This logic supports the connection of an LCD1602 LCD to the + * STM32F4Discovery board. The LCD1602 is based on the Hitachi HD44780U LCD + * controller + * + * Copyright (C) 2013 Gregory Nutt. All rights reserved. + * Authors: Gregory Nutt <gnutt@nuttx.org> + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + + /* LCD pin mapping (see configs/pcblogic-pic32mx/README.txt) + * + * ----------------------------------- ---------- ---------------------------------- + * PIC32 LCD1602 UBW32 PIN + * PIN SIGNAL NAME PIN NAME(s) + * ----------------------------------- ---------- ---------------------------------- + * 1. Vss GND + * 2. Vdd Vcc (5V) + * 3. Vee To ground via 10K potentiometer + * 4 AN15/OCFB/PMALL/PMA0/CN12/RB15 4. RS PMA0, Selects registers + * 82 PMRD/CN14/RD5 5. RW PMRD/PMWR, Selects read or write + * 81 OC5/PMWR/CN13/RD4 6. E PMENB, Starts data read/write + * 93 PMD0/RE0 7. D0 PMD0 + * 94 PMD1/RE1 8. D1 PMD1 + * 98 PMD2/RE2 9. D2 PMD2 + * 99 PMD3/RE3 10. D3 PMD3 + * 100 PMD4/RE4 11. D4 PMD4 + * 3 PMD5/RE5 12. D5 PMD5 + * 4 PMD6/RE6 13. D6 PMD6 + * 5 PMD7/RE7 14. D7 PMD7 + * 15. A To Vcc (5V) via 10K potentiometer + * 16. K GND + * ----------------------------------- ---------- ---------------------------------- + */ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include <nuttx/config.h> + +#include <sys/types.h> +#include <stdint.h> +#include <stdbool.h> +#include <semaphore.h> +#include <poll.h> +#include <errno.h> +#include <debug.h> + +#include <nuttx/fs/fs.h> +#include <nuttx/lcd/hd4478ou.h> + +#include "up_arch.h" +#include "pic32mx-pmp.h" +#include "pic32mx-int.h" +#include "pic32mx-internal.h" +#include "pcblogic-internal.h" + +#ifdef CONFIG_LCD_LCD1602 + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ +/* Configuration ************************************************************/ + +#ifndef CONFIG_PIC32MX_PMP +# error "CONFIG_PIC32MX_PMP is required to use the LCD" +#endif + +/* Define CONFIG_DEBUG_LCD to enable detailed LCD debug output. Verbose debug must + * also be enabled. + */ + +#ifndef CONFIG_DEBUG +# undef CONFIG_DEBUG_VERBOSE +# undef CONFIG_DEBUG_GRAPHICS +# undef CONFIG_DEBUG_LCD +#endif + +#ifndef CONFIG_DEBUG_VERBOSE +# undef CONFIG_DEBUG_LCD +#endif + +/* Pin configuratin *********************************************************/ +/* RB15, RS -- High values selects data */ + +#define GPIO_LCD_RS (GPIO_OUTPUT|GPIO_VALUE_ZERO|GPIO_PORTB|GPIO_PIN15) + +/* Debug ********************************************************************/ + +#ifdef CONFIG_DEBUG_LCD +# define lcddbg dbg +# define lcdvdbg vdbg +#else +# define lcddbg(x...) +# define lcdvdbg(x...) +#endif + +/**************************************************************************** + * Private Type Definition + ****************************************************************************/ + +struct lpc1620_s +{ + bool initialized; /* True: Completed initialization sequence */ +}; + +/**************************************************************************** + * Private Function Protototypes + ****************************************************************************/ + +static ssize_t lcd_read(FAR struct file *, FAR char *, size_t); +static ssize_t lcd_write(FAR struct file *, FAR const char *, size_t); +#ifndef CONFIG_DISABLE_POLL +static int lcd_poll(FAR struct file *filp, FAR struct pollfd *fds, + bool setup); +#endif + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +/* This is the driver state structure (there is no retained state information) */ + +static const struct file_operations g_lcd1602 = +{ + 0, /* open */ + 0, /* close */ + lcd_read, /* read */ + lcd_write, /* write */ + 0, /* seek */ + 0 /* ioctl */ +#ifndef CONFIG_DISABLE_POLL + , lcd_poll /* poll */ +#endif +}; + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: lcd_wrcommand + * + * Description: + * Configure to write an LCD command + * + ****************************************************************************/ + +static void lcd_wrcommand(uint8_t cmd) +{ + /* Address bit A0 is RS. Set the address latch to A0=0 */ + + putreg32(1, PIC32MX_PMP_ADDRCLR); + + /* And write the command to the data out register */ + + putreg32((uint32_t)cmd, PIC32MX_PMP_DOUT); +} + +/**************************************************************************** + * Name: lcd_wrdata + * + * Description: + * Configure to read or write LCD data + * + ****************************************************************************/ + +static void lcd_wrdata(uint8_t data) +{ + /* Address bit A0 is RS. Set the address latch to A0=1 */ + + putreg32(1, PIC32MX_PMP_ADDRSET); + + /* And write the data to the data out register */ + + putreg32((uint32_t)data, PIC32MX_PMP_DOUT); +} + +/**************************************************************************** + * Name: lcd_rddata + * + * Description: + * Configure to read or write LCD data + * + ****************************************************************************/ + +static uint8_t lcd_rddata(void) +{ + /* Address bit A0 is RS. Set the address latch to A0=1 */ + + putreg32(1, PIC32MX_PMP_ADDRSET); + + /* And read the data to the data in register */ + + return (uint8_t)getreg32(PIC32MX_PMP_DIN); +} + +/**************************************************************************** + * Name: lcd_read + ****************************************************************************/ + +static ssize_t lcd_read(FAR struct file *filp, FAR char *buffer, size_t len) +{ + int i; + + for (i = 0; i < len; i++) + { + *buffer++ = lcd_rddata(); + } + + return len; +} + +/**************************************************************************** + * Name: lcd_write + ****************************************************************************/ + +static ssize_t lcd_write(FAR struct file *filp, FAR const char *buffer, size_t len) +{ + int i; + + for (i = 0; i < len; i++) + { + uint8_t data = *buffer++; + lcd_wrdata(data); + } + + return len; +} + +/**************************************************************************** + * Name: lcd_poll + ****************************************************************************/ + +#ifndef CONFIG_DISABLE_POLL +static int lcd_poll(FAR struct file *filp, FAR struct pollfd *fds, + bool setup) +{ + if (setup) + { + /* Data is always avaialble to be read */ + + fds->revents |= (fds->events & (POLLIN|POLLOUT)); + if (fds->revents != 0) + { + sem_post(fds->sem); + } + } + return OK; +} +#endif + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: up_lcd1602_initialize + * + * Description: + * Initialize the LCD1602 hardware and register the character driver. + * + ****************************************************************************/ + +int up_lcd1602_initialize(void) +{ + uint32_t regval; + int ret = OK; + + /* Only initialize the driver once. */ + + if (!g_lcd1602.initialized) + { + lcdvdbg("Initializing\n"); + + /* PMP Master mode configuration */ + /* Make sure that interrupts are disabled */ + + putreg32(INT_PMP, PIC32MX_INT_IEC1CLR); + + /* Stop and reset the PMP module and clear the mode and control registers. */ + + putreg32(0, PIC32MX_PMP_MODE); + putreg32(0, PIC32MX_PMP_AEN); + putreg32(0, PIC32MX_PMP_CON); + putreg32(0, PIC32MX_PMP_ADDR); + + /* Set LCD timing values, PMP master mode 3, 8-bit mode, no address + * increment, and no interrupts. + */ + + regval = (PMP_MODE_WAITE_RD(0) | PMP_MODE_WAITM(3) | PMP_MODE_WAITB_1TPB | + PMP_MODE_MODE_MODE1 | PMP_MODE_MODE8 | PMP_MODE_INCM_NONE | + PMP_MODE_IRQM_NONE); + putreg32(regval, PIC32MX_PMP_MODE); + + /* Enable the PMP for reading and writing + * PMRD/PMWR is active high (1=RD; 0=WR) + * PMENB is active high. + * No chip selects + * Address latch is active high + * Enable PMRD/PMWR, PMENB, and the PMP. + */ + + + regval = (PMP_CON_RDSP | PMP_CON_WRSP | PMP_CON_ALP | + PMP_CON_CSF_ADDR1415 | PMP_CON_PTRDEN | PMP_CON_PTWREN | + PMP_CON_ADRMUX_NONE | PMP_CON_ON); + putreg32(regval, PIC32MX_PMP_CON); + + /* Configure and enable the LCD */ + /* Wait > 15 milliseconds afer Vdd > 4.5V */ + + up_mdelay(100); + + /* Select the 8-bit interface. BF cannot be checked before this command. + * This needs to be done a few times with some magic delays. + */ + + lcd_wrcommand(HD4478OU_FUNC | HD4478OU_FUNC_DL8D | HD4478OU_FUNC_N1); + up_mdelay(50); + lcd_wrcommand(HD4478OU_FUNC | HD4478OU_FUNC_DL8D | HD4478OU_FUNC_N1); + up_udelay(50); + lcd_wrcommand(HD4478OU_FUNC | HD4478OU_FUNC_DL8D | HD4478OU_FUNC_N1); + lcd_wrcommand(HD4478OU_FUNC | HD4478OU_FUNC_DL8D | HD4478OU_FUNC_N1); + + /* Configure the display */ + + lcd_wrcommand(HD4478OU_DISPLAY); /* Display, cursor, and blink off */ + lcd_wrcommand(HD4478OU_CLEAR); /* Clear the display */ + lcd_wrcommand(HD4478OU_INPUT | HD4478OU_INPUT_INCR); /* Increment mode */ + lcd_wrcommand(HD4478OU_DISPLAY | HD4478OU_DISPLAY_ON); /* Display on, cursor and blink off */ + lcd_wrcommand(HD4478OU_DDRAM_AD(0)); /* Select DDRAM RAM AD=0 */ + + /* Register the LCD device driver */ + + ret = register_driver("/dev/lcd1602", &g_lcd1602, 0644, &g_lcd1602); + g_lcd1602.initialized = true; + } + + return ret; +} + +#endif /* CONFIG_LCD_LCD1602 */ diff --git a/nuttx/configs/pic32mx7mmb/src/up_mio283qt2.c b/nuttx/configs/pic32mx7mmb/src/up_mio283qt2.c index 22d6252a9..7ab4353c6 100644 --- a/nuttx/configs/pic32mx7mmb/src/up_mio283qt2.c +++ b/nuttx/configs/pic32mx7mmb/src/up_mio283qt2.c @@ -138,7 +138,7 @@ #define GPIO_LCD_RS (GPIO_OUTPUT|GPIO_VALUE_ZERO|GPIO_PORTB|GPIO_PIN15) - /* Debug ******************************************************************************/ +/* Debug ******************************************************************************/ #ifdef CONFIG_DEBUG_LCD # define lcddbg dbg diff --git a/nuttx/drivers/lcd/README.txt b/nuttx/drivers/lcd/README.txt index 198be18a1..0472043e6 100644 --- a/nuttx/drivers/lcd/README.txt +++ b/nuttx/drivers/lcd/README.txt @@ -151,6 +151,12 @@ that makes then less re-usable: a TFT/Transmissive color LCD module with touch-screen, FTM280C12D, with integrated driver IC HX8346. + HX8347: + + configs/pic32mx7mmb/src/up_mio283qt2.c. This driver is for the MI0283QT-2 + LCD from Multi-Inno Technology Co., Ltd. This LCD is based on the Himax + HX8347-D LCD controller. + ILI93xx and Similar: configs/stm3210e-eval/src/up_lcd.c. This driver supports the following @@ -171,10 +177,10 @@ that makes then less re-usable: configs/stm32f4discovery/src/up_ug2864hsweg01.c configs/zp214xpa/src/up_ug2864ambag01.c - Alphnumeric Displays: + Alphnumeric LCD Displays: configs/skp16c26/src/up_lcd.c. Untested alphanumeric LCD driver. - configs/stm32f4discovery/src/up_lcd1602.c + configs/pcblogic-pic32/src/up_lcd1602.c graphics/ ========= diff --git a/nuttx/include/nuttx/lcd/hd4478ou.h b/nuttx/include/nuttx/lcd/hd4478ou.h new file mode 100644 index 000000000..4bb93fca9 --- /dev/null +++ b/nuttx/include/nuttx/lcd/hd4478ou.h @@ -0,0 +1,118 @@ +/******************************************************************************************** + * include/nuttx/lcd/hd4478ou.h + * + * Definitions for the Hitachi HD44780U LCD controller (as used in the + * LCD1602). + * + * Copyright (C) 2013 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt <gnutt@nuttx.org> + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ********************************************************************************************/ + +#ifndef __INCLUDE_NUTTX_HD4478OU_H +#define __INCLUDE_NUTTX_HD4478OU_H + +/******************************************************************************************** + * Included Files + ********************************************************************************************/ +/* Command set: + * + * RS=0 R/W=0 : Command + * RS=0 R/W=1 : Busy/AD, Read CT (see below) + * RS=1 R/W=0 : Write data to CGRAM or DDRAM + * RS=1 R/W=0 : Read data from CGRAM or DDRAM + */ + +#define HD4478OU_CLEAR (0x01) /* Screen Clear, Set AC to 0 */ +#define HD4478OU_RETURN (0x02) /* DDRAM AD=0, return */ +#define HD4478OU_INPUT (0x04) /* Set moving direction of cursor */ +# define HD4478OU_INPUT_SHIFT (1 << 0) /* Shift */ +# define HD4478OU_INPUT_INCR (1 << 1) /* Increment mode */ +# define HD4478OU_INPUT_DECR (0x00) /* Decrement mode */ +#define HD4478OU_DISPLAY (0x08) /* Set display, cursor, blink on/off */ +# define HD4478OU_DISPLAY_BLINK (1 << 0) /* Blink on/off */ +# define HD4478OU_DISPLAY_CURSOR (1 << 1) /* Cursor on/off */ +# define HD4478OU_DISPLAY_ON (1 << 2) /* Display on/off */ +#define HD4478OU_SHIFT (0x10) /* Remove cursor and whole diplay */ +# define HD4478OU_SHIFT_RIGHT (1 << 2) /* Shift right */ +# define HD4478OU_SHIFT_LEFT (0x00) /* Shift right */ +# define HD4478OU_SHIFT_DISPLAY (1 << 3) /* Display shift */ +# define HD4478OU_SHIFT_CURSOR (0x00) /* Cursor shift */ +#define HD4478OU_FUNC (0x20) /* Set DL, display line, font */ +# define HD4478OU_FUNC_F5x10 (1 << 2) /* 5x10 Style */ +# define HD4478OU_FUNC_F5x7 (0x00) /* 5x7 Style */ +# define HD4478OU_FUNC_N1 (1 << 3) /* N=2R */ +# define HD4478OU_FUNC_N0 (0x00) /* N=1R */ +# define HD4478OU_FUNC_DL8D (1 << 4) /* DL=8D, 8-bit interface */ +# define HD4478OU_FUNC_DL4D (0x00) /* DL=4D, 4-bit interface */ +#define HD4478OU_CGRAM_AD(a) (0x40|(a)) /* Set CGRAM AD, send receive data */ +#define HD4478OU_DDRAM_AD(a) (0x80|(a)) /* Set DDRAM AD, send receive data */ + +/* RS=0 R/W=1 : Execute internal function, read AD of CT */ + +#define HD4478OU_BUSY(bf,ac) ((bf) << 7 | (ac)) + +/******************************************************************************************** + * Pre-processor Definitions + ********************************************************************************************/ + +/******************************************************************************************** + * Public Types + ********************************************************************************************/ + +/******************************************************************************************** + * Public Data + ********************************************************************************************/ + +#ifdef __cplusplus +extern "C" +{ +#endif + +/******************************************************************************************** + * Public Function Prototypes + ********************************************************************************************/ + +/******************************************************************************************** + * Name: up_lcd1602_initialize + * + * Description: + * the LCD1602 is an HD4478OU-based LCD from Wave share. This function initializes the + * LCD1602 hardware and registers the character driver as /dev/lcd1602. + * + ********************************************************************************************/ + +int up_lcd1602_initialize(void); + +#ifdef __cplusplus +} +#endif + +#endif /* __INCLUDE_NUTTX_HD4478OU_H */ |