mirror of
https://github.com/apache/nuttx.git
synced 2026-06-06 00:14:22 +08:00
The SLCD driver is now fully functional for Sure PIC32MX board
This commit is contained in:
@@ -161,7 +161,7 @@ MAX3232 Connection
|
|||||||
GND -- POWER POINT: GND
|
GND -- POWER POINT: GND
|
||||||
Vcc -- POWER POINT: Vdd (3.3V) -- Or P32_VBUS (+5V)
|
Vcc -- POWER POINT: Vdd (3.3V) -- Or P32_VBUS (+5V)
|
||||||
Or +5V from a USB PC port.
|
Or +5V from a USB PC port.
|
||||||
|
|
||||||
Toolchains
|
Toolchains
|
||||||
==========
|
==========
|
||||||
|
|
||||||
@@ -252,7 +252,7 @@ Toolchains
|
|||||||
|
|
||||||
Windows Native Toolchains
|
Windows Native Toolchains
|
||||||
-------------------------
|
-------------------------
|
||||||
|
|
||||||
NOTE: There are several limitations to using a Windows based toolchain in a
|
NOTE: There are several limitations to using a Windows based toolchain in a
|
||||||
Cygwin environment. The three biggest are:
|
Cygwin environment. The three biggest are:
|
||||||
|
|
||||||
@@ -478,7 +478,7 @@ PIC32MX Configuration Options
|
|||||||
CONFIG_PIC32MX_CODEWP - Default 1 (disabled)
|
CONFIG_PIC32MX_CODEWP - Default 1 (disabled)
|
||||||
DEVCFG1: (All settings determined by selections in board.h)
|
DEVCFG1: (All settings determined by selections in board.h)
|
||||||
DEVCFG2: (All settings determined by selections in board.h)
|
DEVCFG2: (All settings determined by selections in board.h)
|
||||||
DEVCFG3:
|
DEVCFG3:
|
||||||
CONFIG_PIC32MX_USBIDO - USB USBID Selection. Default 1 if USB enabled
|
CONFIG_PIC32MX_USBIDO - USB USBID Selection. Default 1 if USB enabled
|
||||||
(USBID pin is controlled by the USB module), but 0 (GPIO) otherwise.
|
(USBID pin is controlled by the USB module), but 0 (GPIO) otherwise.
|
||||||
CONFIG_PIC32MX_VBUSIO - USB VBUSON Selection (Default 1 if USB enabled
|
CONFIG_PIC32MX_VBUSIO - USB VBUSON Selection (Default 1 if USB enabled
|
||||||
@@ -670,7 +670,10 @@ Configuration sub-directories
|
|||||||
NOTES:
|
NOTES:
|
||||||
a. I do not have the LCD1602 working. I may just be getting lost in the
|
a. I do not have the LCD1602 working. I may just be getting lost in the
|
||||||
tangle of wires or perhaps there is something fundamentally wrong with
|
tangle of wires or perhaps there is something fundamentally wrong with
|
||||||
the code.
|
the code. If you decide to work on this, you might want to consider
|
||||||
|
the working, big-bang version of this driver at configs/sure-pic32mx/src/pic32mx_lcd1602.c.
|
||||||
|
A bit-bang driver is probably more appropriate for such a low performance
|
||||||
|
device (and a LOT easier to debug).
|
||||||
b. At this point in time, testing of the SLCD is very limited because
|
b. At this point in time, testing of the SLCD is very limited because
|
||||||
there is not much in apps/examples/slcd. Basically driver with a working
|
there is not much in apps/examples/slcd. Basically driver with a working
|
||||||
test setup and ready to be tested and debugged.
|
test setup and ready to be tested and debugged.
|
||||||
|
|||||||
@@ -318,7 +318,7 @@ Toolchains
|
|||||||
|
|
||||||
Windows Native Toolchains
|
Windows Native Toolchains
|
||||||
-------------------------
|
-------------------------
|
||||||
|
|
||||||
NOTE: There are several limitations to using a Windows based toolchain in a
|
NOTE: There are several limitations to using a Windows based toolchain in a
|
||||||
Cygwin environment. The three biggest are:
|
Cygwin environment. The three biggest are:
|
||||||
|
|
||||||
@@ -423,6 +423,8 @@ LCD1602
|
|||||||
46 INT0/RD0 16. K Transistor circuit driven by PWM1
|
46 INT0/RD0 16. K Transistor circuit driven by PWM1
|
||||||
--------------------- ---------- ----------------------------------
|
--------------------- ---------- ----------------------------------
|
||||||
|
|
||||||
|
Vbus power also requires Vbuson/AN5/RB5
|
||||||
|
|
||||||
PIC32MX Configuration Options
|
PIC32MX Configuration Options
|
||||||
=============================
|
=============================
|
||||||
|
|
||||||
@@ -455,7 +457,7 @@ PIC32MX Configuration Options
|
|||||||
|
|
||||||
CONFIG_ARCH_BOARD=sure-pic32mx
|
CONFIG_ARCH_BOARD=sure-pic32mx
|
||||||
|
|
||||||
CONFIG_ARCH_DBDP11215 Distinguishes the DB_DP11215 PIC32 Storage
|
CONFIG_ARCH_DBDP11215 Distinguishes the DB_DP11215 PIC32 Storage
|
||||||
Demo Board
|
Demo Board
|
||||||
|
|
||||||
CONFIG_ARCH_DBDP11212 Distingustes the DB-DP11212 PIC32 General
|
CONFIG_ARCH_DBDP11212 Distingustes the DB-DP11212 PIC32 General
|
||||||
@@ -551,7 +553,7 @@ PIC32MX Configuration Options
|
|||||||
CONFIG_PIC32MX_CODEWP - Default 1 (disabled)
|
CONFIG_PIC32MX_CODEWP - Default 1 (disabled)
|
||||||
DEVCFG1: (All settings determined by selections in board.h)
|
DEVCFG1: (All settings determined by selections in board.h)
|
||||||
DEVCFG2: (All settings determined by selections in board.h)
|
DEVCFG2: (All settings determined by selections in board.h)
|
||||||
DEVCFG3:
|
DEVCFG3:
|
||||||
CONFIG_PIC32MX_USBIDO - USB USBID Selection. Default 1 if USB enabled
|
CONFIG_PIC32MX_USBIDO - USB USBID Selection. Default 1 if USB enabled
|
||||||
(USBID pin is controlled by the USB module), but 0 (GPIO) otherwise.
|
(USBID pin is controlled by the USB module), but 0 (GPIO) otherwise.
|
||||||
CONFIG_PIC32MX_VBUSIO - USB VBUSON Selection (Default 1 if USB enabled
|
CONFIG_PIC32MX_VBUSIO - USB VBUSON Selection (Default 1 if USB enabled
|
||||||
@@ -698,7 +700,7 @@ Where <subdir> is one of the following:
|
|||||||
Several USB device configurations can be enabled and included
|
Several USB device configurations can be enabled and included
|
||||||
as NSH built-in built in functions. All require the following
|
as NSH built-in built in functions. All require the following
|
||||||
basic setup in your .config to enable USB device support:
|
basic setup in your .config to enable USB device support:
|
||||||
|
|
||||||
Drivers:
|
Drivers:
|
||||||
CONFIG_USBDEV=y : Enable basic USB device support
|
CONFIG_USBDEV=y : Enable basic USB device support
|
||||||
|
|
||||||
@@ -717,9 +719,9 @@ Where <subdir> is one of the following:
|
|||||||
CONFIG_PL2303=y : Enable the Prolifics PL2303 emulation
|
CONFIG_PL2303=y : Enable the Prolifics PL2303 emulation
|
||||||
CONFIG_CDCACM=y : or the CDC/ACM serial driver (not both)
|
CONFIG_CDCACM=y : or the CDC/ACM serial driver (not both)
|
||||||
|
|
||||||
examples/cdcacm - The examples/cdcacm program can be included as an
|
examples/cdcacm - The examples/cdcacm program can be included as an
|
||||||
function by uncommenting the following line in the appconfig file:
|
function by uncommenting the following line in the appconfig file:
|
||||||
|
|
||||||
Application Configuration->Examples:
|
Application Configuration->Examples:
|
||||||
CONFIG_EXAMPLES_CDCACM=y : Select apps/examples/cdcacm
|
CONFIG_EXAMPLES_CDCACM=y : Select apps/examples/cdcacm
|
||||||
|
|
||||||
@@ -766,28 +768,34 @@ Where <subdir> is one of the following:
|
|||||||
|
|
||||||
4. To enable LCD1602 support:
|
4. To enable LCD1602 support:
|
||||||
|
|
||||||
Device Drivers:
|
Device Drivers ->LCD Driver Support:
|
||||||
CONFIG_LCD=y : Enable LCD menus
|
CONFIG_LCD=y : Enable LCD menus
|
||||||
CONFIG_LCD_LCD1602=y : Select LCD1602
|
CONFIG_LCD_LCD1602=y : Select LCD1602
|
||||||
|
CONFIG_LCD_MAXCONTRAST=255 : (Or any large-ish value that you prefer)
|
||||||
|
CONFIG_LCD_MAXPOWER=255 : (Or any large-ish value that you prefer)
|
||||||
|
|
||||||
Library Routines:
|
Library Routines:
|
||||||
CONFIG_LIB_SLCDCODEC=y : Enable the SLCD CODEC
|
CONFIG_LIB_SLCDCODEC=y : Enable the SLCD CODEC
|
||||||
|
|
||||||
System Type -> PIC32MX Peripheral Support:
|
NOTE that is is not necessary to select the PMP peripheral; this LCD
|
||||||
CONFIG_PIC32MX_PMP=y : Enable PMP support
|
driver is a bit-bang driver that just happens to use the PMP pins as
|
||||||
|
GPIOS.
|
||||||
|
|
||||||
To enable apps/examples/slcd to test the LCD:
|
To enable apps/examples/slcd to test the LCD:
|
||||||
|
|
||||||
Application Configuration:
|
Application Configuration -> NSH Library:
|
||||||
CONFIG_NSH_ARCHINIT=y : Needed to initialize the SLCD
|
CONFIG_NSH_ARCHINIT=y : Needed to initialize the SLCD
|
||||||
|
|
||||||
|
Application Configuration -> Examples:
|
||||||
CONFIG_EXAMPLES_SLCD=y : Enable apps/examples/slcd use /dev/lcd1602
|
CONFIG_EXAMPLES_SLCD=y : Enable apps/examples/slcd use /dev/lcd1602
|
||||||
CONFIG_EXAMPLES_SLCD_DEVNAME="/dev/lcd1602"
|
CONFIG_EXAMPLES_SLCD_DEVNAME="/dev/lcd1602"
|
||||||
|
|
||||||
To enable LCD debug output:
|
To enable LCD debug output:
|
||||||
|
|
||||||
Build Setup:
|
Build Setup -> Debug Options:
|
||||||
CONFIG_DEBUG=y : Enable debug features
|
CONFIG_DEBUG=y : Enable debug features
|
||||||
CONFIG_DEBUG_VERBOSE=y : Enable LCD debug
|
CONFIG_DEBUG_VERBOSE=y : Enable verbose debug output
|
||||||
|
CONFIG_DEBUG_LCD=y : Enable LCD debug output
|
||||||
|
|
||||||
NOTES:
|
NOTES:
|
||||||
a. I do not have the LCD1602 working. I may just be getting lost in the
|
a. I do not have the LCD1602 working. I may just be getting lost in the
|
||||||
|
|||||||
@@ -79,11 +79,6 @@
|
|||||||
* LED_PANIC 5 N/C N/C N/C ON N/C N/C N/C OFF
|
* LED_PANIC 5 N/C N/C N/C ON N/C N/C N/C OFF
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define GPIO_USB_LED (GPIO_OUTPUT|GPIO_VALUE_ONE|GPIO_PORTD|GPIO_PIN7)
|
|
||||||
#define GPIO_SD_LED (GPIO_OUTPUT|GPIO_VALUE_ONE|GPIO_PORTD|GPIO_PIN6)
|
|
||||||
#define GPIO_FLASH_LED (GPIO_OUTPUT|GPIO_VALUE_ONE|GPIO_PORTF|GPIO_PIN0)
|
|
||||||
#define GPIO_ERROR_LED (GPIO_OUTPUT|GPIO_VALUE_ONE|GPIO_PORTF|GPIO_PIN1)
|
|
||||||
|
|
||||||
/* LED Management Definitions ***********************************************/
|
/* LED Management Definitions ***********************************************/
|
||||||
|
|
||||||
#define LED_OFF 0
|
#define LED_OFF 0
|
||||||
|
|||||||
@@ -37,7 +37,7 @@
|
|||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
/* LCD pin mapping (see configs/pcblogic-pic32mx/README.txt)
|
/* LCD pin mapping (see configs/sure-pic32mx/README.txt)
|
||||||
*
|
*
|
||||||
* --------------------- ---------- ----------------------------------
|
* --------------------- ---------- ----------------------------------
|
||||||
* PIC32 Sure JP1 Sure Signal Description
|
* PIC32 Sure JP1 Sure Signal Description
|
||||||
@@ -61,6 +61,8 @@
|
|||||||
* 15. A +5V_DUSB
|
* 15. A +5V_DUSB
|
||||||
* 46 INT0/RD0 16. K Transistor circuit driven by PWM1
|
* 46 INT0/RD0 16. K Transistor circuit driven by PWM1
|
||||||
* --------------------- ---------- ----------------------------------
|
* --------------------- ---------- ----------------------------------
|
||||||
|
*
|
||||||
|
* Vbus power also requires Vbuson/AN5/RB5
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
@@ -87,7 +89,7 @@
|
|||||||
#include <nuttx/lcd/slcd_codec.h>
|
#include <nuttx/lcd/slcd_codec.h>
|
||||||
|
|
||||||
#include "up_arch.h"
|
#include "up_arch.h"
|
||||||
#include "pic32mx-pmp.h"
|
#include "pic32mx-ioport.h"
|
||||||
#include "pic32mx-int.h"
|
#include "pic32mx-int.h"
|
||||||
#include "pic32mx-internal.h"
|
#include "pic32mx-internal.h"
|
||||||
#include "sure-pic32mx.h"
|
#include "sure-pic32mx.h"
|
||||||
@@ -99,10 +101,6 @@
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
/* Configuration ************************************************************/
|
/* Configuration ************************************************************/
|
||||||
|
|
||||||
#ifndef CONFIG_PIC32MX_PMP
|
|
||||||
# error "CONFIG_PIC32MX_PMP is required to use the LCD"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef CONFIG_LCD_MAXCONTRAST
|
#ifndef CONFIG_LCD_MAXCONTRAST
|
||||||
# define CONFIG_LCD_MAXCONTRAST 100
|
# define CONFIG_LCD_MAXCONTRAST 100
|
||||||
#endif
|
#endif
|
||||||
@@ -135,17 +133,14 @@
|
|||||||
# define MAX(a,b) (a > b ? a : b)
|
# define MAX(a,b) (a > b ? a : b)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Pin configuration ********************************************************/
|
|
||||||
/* RB15, RS -- High values selects data */
|
|
||||||
|
|
||||||
#define GPIO_LCD_RS (GPIO_OUTPUT|GPIO_VALUE_ZERO|GPIO_PORTB|GPIO_PIN15)
|
|
||||||
|
|
||||||
/* LCD **********************************************************************/
|
/* LCD **********************************************************************/
|
||||||
|
|
||||||
#define LCD_NROWS 2
|
#define LCD_NROWS 2
|
||||||
#define LCD_NCOLUMNS 16
|
#define LCD_NCOLUMNS 16
|
||||||
#define LCD_NCHARS (LCD_NROWS * LCD_NCOLUMNS)
|
#define LCD_NCHARS (LCD_NROWS * LCD_NCOLUMNS)
|
||||||
|
|
||||||
|
#define NOP __asm__ __volatile__ ("nop");
|
||||||
|
|
||||||
/* Debug ********************************************************************/
|
/* Debug ********************************************************************/
|
||||||
|
|
||||||
#ifdef CONFIG_DEBUG_LCD
|
#ifdef CONFIG_DEBUG_LCD
|
||||||
@@ -173,9 +168,10 @@ struct lcd_instream_s
|
|||||||
|
|
||||||
struct lcd1602_2
|
struct lcd1602_2
|
||||||
{
|
{
|
||||||
bool initialized; /* True: Completed initialization sequence */
|
bool initialized; /* True: Completed initialization sequence */
|
||||||
uint8_t currow; /* Current row */
|
uint8_t currow; /* Current row */
|
||||||
uint8_t curcol; /* Current column */
|
uint8_t curcol; /* Current column */
|
||||||
|
uint8_t brightness; /* Current brightness */
|
||||||
};
|
};
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
@@ -195,9 +191,13 @@ static void lcd_dumpstream(FAR const char *msg,
|
|||||||
/* Internal functions */
|
/* Internal functions */
|
||||||
|
|
||||||
static int lcd_getstream(FAR struct lib_instream_s *instream);
|
static int lcd_getstream(FAR struct lib_instream_s *instream);
|
||||||
|
static void lcd_brightness(uint8_t brightness);
|
||||||
|
static void lcd_shortdelay(int delay);
|
||||||
static void lcd_wrcommand(uint8_t cmd);
|
static void lcd_wrcommand(uint8_t cmd);
|
||||||
static void lcd_wrdata(uint8_t data);
|
static void lcd_wrdata(uint8_t data);
|
||||||
static uint8_t lcd_rddata(void);
|
static uint8_t lcd_rddata(void);
|
||||||
|
static uint8_t lcd_readstatus(void);
|
||||||
|
static void lcd_waitbusy(void);
|
||||||
static uint8_t lcd_readch(uint8_t row, uint8_t column);
|
static uint8_t lcd_readch(uint8_t row, uint8_t column);
|
||||||
static void lcd_writech(uint8_t ch, uint8_t row, uint8_t column);
|
static void lcd_writech(uint8_t ch, uint8_t row, uint8_t column);
|
||||||
static void lcd_appendch(uint8_t ch);
|
static void lcd_appendch(uint8_t ch);
|
||||||
@@ -312,6 +312,66 @@ static int lcd_getstream(FAR struct lib_instream_s *instream)
|
|||||||
return EOF;
|
return EOF;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: lcd_brightness
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Enable for disable LCD lighting.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
static void lcd_brightness(uint8_t brightness)
|
||||||
|
{
|
||||||
|
/* The LIGHT and COMP pins are label PWM1 and PWM2 and so are obviously
|
||||||
|
* intended to support modulated outputs. However, here for simplicity,
|
||||||
|
* they are just treated as on/off discretes outputs.
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (brightness > 0)
|
||||||
|
{
|
||||||
|
/* Turn the LCD light on */
|
||||||
|
|
||||||
|
pic32mx_gpiowrite(GPIO_LCD_LIGHT, true);
|
||||||
|
NOP;NOP;NOP;
|
||||||
|
pic32mx_gpiowrite(GPIO_LCD_COMP, true);
|
||||||
|
NOP;NOP;
|
||||||
|
pic32mx_gpiowrite(GPIO_LCD_PWR, true);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Turn the LCD light off */
|
||||||
|
|
||||||
|
pic32mx_gpiowrite(GPIO_LCD_PWR, false);
|
||||||
|
pic32mx_gpiowrite(GPIO_LCD_COMP, false);
|
||||||
|
pic32mx_gpiowrite(GPIO_LCD_LIGHT, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
g_lcd1602.brightness = brightness;
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: lcd_shortdelay
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Small delays are needed to make some of the LCD operations work.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
static void lcd_shortdelay(int delay)
|
||||||
|
{
|
||||||
|
volatile int loop;
|
||||||
|
|
||||||
|
/* On a 32MHz MCU, this should amount to about 300NS per loop */
|
||||||
|
|
||||||
|
while (delay-- > 0)
|
||||||
|
{
|
||||||
|
for (loop = 0; loop < 1; loop++)
|
||||||
|
{
|
||||||
|
NOP;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: lcd_wrcommand
|
* Name: lcd_wrcommand
|
||||||
*
|
*
|
||||||
@@ -322,13 +382,28 @@ static int lcd_getstream(FAR struct lib_instream_s *instream)
|
|||||||
|
|
||||||
static void lcd_wrcommand(uint8_t cmd)
|
static void lcd_wrcommand(uint8_t cmd)
|
||||||
{
|
{
|
||||||
/* Address bit A0 is RS. Set the address latch to A0=0 */
|
/* Make sure that the LCD is available */
|
||||||
|
|
||||||
putreg32(1, PIC32MX_PMP_ADDRCLR);
|
lcd_waitbusy();
|
||||||
|
|
||||||
/* And write the command to the data out register */
|
/* Select DB0-15 as outputs (only DB-0-7 are actually used) */
|
||||||
|
|
||||||
putreg32((uint32_t)cmd, PIC32MX_PMP_DOUT);
|
putreg16(0, PIC32MX_IOPORTE_TRIS);
|
||||||
|
|
||||||
|
/* Set up to write the commond */
|
||||||
|
|
||||||
|
pic32mx_gpiowrite(GPIO_LCD_RS, false); /* Select command */
|
||||||
|
pic32mx_gpiowrite(GPIO_LCD_RW, false); /* Select write */
|
||||||
|
lcd_shortdelay(2);
|
||||||
|
|
||||||
|
pic32mx_gpiowrite(GPIO_LCD_E, true); /* Enable transfer */
|
||||||
|
lcd_shortdelay(1);
|
||||||
|
|
||||||
|
/* Write the command to the LCD */
|
||||||
|
|
||||||
|
putreg16(cmd, PIC32MX_IOPORTE_PORT);
|
||||||
|
lcd_shortdelay(1);
|
||||||
|
pic32mx_gpiowrite(GPIO_LCD_E, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
@@ -341,13 +416,28 @@ static void lcd_wrcommand(uint8_t cmd)
|
|||||||
|
|
||||||
static void lcd_wrdata(uint8_t data)
|
static void lcd_wrdata(uint8_t data)
|
||||||
{
|
{
|
||||||
/* Address bit A0 is RS. Set the address latch to A0=1 */
|
/* Make sure that the LCD is available */
|
||||||
|
|
||||||
putreg32(1, PIC32MX_PMP_ADDRSET);
|
lcd_waitbusy();
|
||||||
|
|
||||||
/* And write the data to the data out register */
|
/* Select DB0-15 as outputs (only DB-0-7 are actually used) */
|
||||||
|
|
||||||
putreg32((uint32_t)data, PIC32MX_PMP_DOUT);
|
putreg16(0, PIC32MX_IOPORTE_TRIS);
|
||||||
|
|
||||||
|
/* Set up to write the data */
|
||||||
|
|
||||||
|
pic32mx_gpiowrite(GPIO_LCD_RS, true); /* Select data */
|
||||||
|
pic32mx_gpiowrite(GPIO_LCD_RW, false); /* Select write */
|
||||||
|
lcd_shortdelay(2);
|
||||||
|
|
||||||
|
pic32mx_gpiowrite(GPIO_LCD_E, true); /* Enable transfer */
|
||||||
|
lcd_shortdelay(1);
|
||||||
|
|
||||||
|
/* Write the data to the LCD */
|
||||||
|
|
||||||
|
putreg16(data, PIC32MX_IOPORTE_PORT); /* Write the data */
|
||||||
|
lcd_shortdelay(1);
|
||||||
|
pic32mx_gpiowrite(GPIO_LCD_E, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
@@ -360,13 +450,69 @@ static void lcd_wrdata(uint8_t data)
|
|||||||
|
|
||||||
static uint8_t lcd_rddata(void)
|
static uint8_t lcd_rddata(void)
|
||||||
{
|
{
|
||||||
/* Address bit A0 is RS. Set the address latch to A0=1 */
|
/* Make sure that the LCD is available */
|
||||||
|
|
||||||
putreg32(1, PIC32MX_PMP_ADDRSET);
|
lcd_waitbusy();
|
||||||
|
|
||||||
/* And read the data to the data in register */
|
/* Setup to read data */
|
||||||
|
|
||||||
return (uint8_t)getreg32(PIC32MX_PMP_DIN);
|
pic32mx_gpiowrite(GPIO_LCD_RS, true); /* Select data */
|
||||||
|
pic32mx_gpiowrite(GPIO_LCD_RW, true); /* Select read */
|
||||||
|
lcd_shortdelay(2);
|
||||||
|
|
||||||
|
pic32mx_gpiowrite(GPIO_LCD_E, true); /* Enable transfer */
|
||||||
|
lcd_shortdelay(1);
|
||||||
|
|
||||||
|
putreg16(0xff, PIC32MX_IOPORTE_TRISSET); /* Set DB0-7 as inputs */
|
||||||
|
pic32mx_gpiowrite(GPIO_LCD_E, false); /* Disable transfer */
|
||||||
|
|
||||||
|
/* Read the data from the LCD */
|
||||||
|
|
||||||
|
return (uint8_t)getreg16(PIC32MX_IOPORTE_PORT);
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: lcd_readstatus
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Read the DDRAM address and busy bit.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
static uint8_t lcd_readstatus(void)
|
||||||
|
{
|
||||||
|
uint8_t status;
|
||||||
|
|
||||||
|
/* Set up to read BUSY/AD information */
|
||||||
|
|
||||||
|
putreg16(0xff, PIC32MX_IOPORTE_TRISSET); /* Set DB0-7 as inputs */
|
||||||
|
pic32mx_gpiowrite(GPIO_LCD_RS, false); /* Select command */
|
||||||
|
pic32mx_gpiowrite(GPIO_LCD_RW, true); /* Select read */
|
||||||
|
lcd_shortdelay(2);
|
||||||
|
|
||||||
|
pic32mx_gpiowrite(GPIO_LCD_E, true); /* Enable transfer */
|
||||||
|
lcd_shortdelay(1);
|
||||||
|
|
||||||
|
/* Read the status from the LCD */
|
||||||
|
|
||||||
|
status = (uint8_t)getreg16(PIC32MX_IOPORTE_PORT);
|
||||||
|
lcd_shortdelay(1);
|
||||||
|
pic32mx_gpiowrite(GPIO_LCD_E, false);
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: lcd_waitbusy
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Check LCD status and wait until the BUSY flag is no long set.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
static void lcd_waitbusy(void)
|
||||||
|
{
|
||||||
|
while ((lcd_readstatus() & HD4478OU_BF) != 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
@@ -843,11 +989,46 @@ static int lcd_ioctl(FAR struct file *filp, int cmd, unsigned long arg)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
/* SLCDIOC_GETBRIGHTNESS: Get the current brightness setting
|
||||||
|
*
|
||||||
|
* argument: Pointer type int that will receive the current brightness
|
||||||
|
* setting
|
||||||
|
*/
|
||||||
|
|
||||||
|
case SLCDIOC_GETBRIGHTNESS:
|
||||||
|
{
|
||||||
|
FAR int *brightness = (FAR int *)((uintptr_t)arg);
|
||||||
|
if (!brightness)
|
||||||
|
{
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
*brightness = (int)g_lcd1602.brightness;
|
||||||
|
lcdvdbg("SLCDIOC_GETCONTRAST: brightness=%d\n", *brightness);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* SLCDIOC_SETBRIGHTNESS: Set the brightness to a new value
|
||||||
|
*
|
||||||
|
* argument: The new brightness value
|
||||||
|
*/
|
||||||
|
|
||||||
|
case SLCDIOC_SETBRIGHTNESS:
|
||||||
|
{
|
||||||
|
lcdvdbg("SLCDIOC_SETCONTRAST: arg=%ld\n", arg);
|
||||||
|
|
||||||
|
if (arg > CONFIG_LCD_MAXPOWER)
|
||||||
|
{
|
||||||
|
return -ERANGE;
|
||||||
|
}
|
||||||
|
|
||||||
|
lcd_brightness((uint8_t)arg);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case SLCDIOC_SETBAR: /* SLCDIOC_SETBAR: Set bars on a bar display */
|
case SLCDIOC_SETBAR: /* SLCDIOC_SETBAR: Set bars on a bar display */
|
||||||
case SLCDIOC_GETCONTRAST: /* SLCDIOC_GETCONTRAST: Get the current contrast setting */
|
case SLCDIOC_GETCONTRAST: /* SLCDIOC_GETCONTRAST: Get the current contrast setting */
|
||||||
case SLCDIOC_SETCONTRAST: /* SLCDIOC_SETCONTRAST: Set the contrast to a new value */
|
case SLCDIOC_SETCONTRAST: /* SLCDIOC_SETCONTRAST: Set the contrast to a new value */
|
||||||
case SLCDIOC_GETBRIGHTNESS: /* Get the current brightness setting */
|
|
||||||
case SLCDIOC_SETBRIGHTNESS: /* Set the brightness to a new value */
|
|
||||||
default:
|
default:
|
||||||
return -ENOTTY;
|
return -ENOTTY;
|
||||||
}
|
}
|
||||||
@@ -892,7 +1073,6 @@ static int lcd_poll(FAR struct file *filp, FAR struct pollfd *fds,
|
|||||||
|
|
||||||
int up_lcd1602_initialize(void)
|
int up_lcd1602_initialize(void)
|
||||||
{
|
{
|
||||||
uint32_t regval;
|
|
||||||
int ret = OK;
|
int ret = OK;
|
||||||
|
|
||||||
/* Only initialize the driver once. */
|
/* Only initialize the driver once. */
|
||||||
@@ -901,64 +1081,69 @@ int up_lcd1602_initialize(void)
|
|||||||
{
|
{
|
||||||
lcdvdbg("Initializing\n");
|
lcdvdbg("Initializing\n");
|
||||||
|
|
||||||
/* PMP Master mode configuration */
|
/* Configure GPIO pins */
|
||||||
/* Make sure that interrupts are disabled */
|
|
||||||
|
|
||||||
putreg32(INT_PMP, PIC32MX_INT_IEC1CLR);
|
putreg16(0, PIC32MX_IOPORTE_TRIS); /* Set DB0-15 as outputs */
|
||||||
|
pic32mx_configgpio(GPIO_LCD_RS); /* RS: Selects commnand or data */
|
||||||
|
pic32mx_configgpio(GPIO_LCD_RW); /* RW: Selects read or write */
|
||||||
|
pic32mx_configgpio(GPIO_LCD_E); /* E: Starts transfer */
|
||||||
|
|
||||||
/* Stop and reset the PMP module and clear the mode and control registers. */
|
/* Configure LCD power in the OFF state */
|
||||||
|
|
||||||
putreg32(0, PIC32MX_PMP_MODE);
|
pic32mx_configgpio(GPIO_LCD_LIGHT); /* K */
|
||||||
putreg32(0, PIC32MX_PMP_AEN);
|
pic32mx_configgpio(GPIO_LCD_COMP); /* Vo */
|
||||||
putreg32(0, PIC32MX_PMP_CON);
|
pic32mx_configgpio(GPIO_LCD_PWR); /* Vbuson/AN5/RB5 controls +5V USB */
|
||||||
putreg32(0, PIC32MX_PMP_ADDR);
|
g_lcd1602.brightness = 0; /* Remember tht the light is off */
|
||||||
|
|
||||||
/* Set LCD timing values, PMP master mode 3, 8-bit mode, no address
|
/* A small delay is necessary between when GPIO_LCD_E was set up as an
|
||||||
* increment, and no interrupts.
|
* output with initial value of 0 and this operation. That delay should
|
||||||
|
* be well covered by the intervening GPIO configurations.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
regval = (PMP_MODE_WAITE_RD(0) | PMP_MODE_WAITM(3) | PMP_MODE_WAITB_1TPB |
|
pic32mx_gpiowrite(GPIO_LCD_E, true); /* Enable transfer */
|
||||||
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 */
|
/* Configure and enable the LCD */
|
||||||
/* Wait > 15 milliseconds afer Vdd > 4.5V */
|
/* Delay for 4.1MS or more */
|
||||||
|
|
||||||
up_mdelay(100);
|
up_mdelay(5);
|
||||||
|
|
||||||
/* Select the 8-bit interface. BF cannot be checked before this command.
|
/* Select the 8-bit interface. BF cannot be checked before this command.
|
||||||
* This needs to be done a few times with some magic delays.
|
* This needs to be done a few times with some magic delays.
|
||||||
|
*
|
||||||
|
* Function set: 5x7 Style | N=2R | DL=8D
|
||||||
*/
|
*/
|
||||||
|
|
||||||
lcd_wrcommand(HD4478OU_FUNC | HD4478OU_FUNC_DL8D | HD4478OU_FUNC_N1);
|
lcd_wrcommand(HD4478OU_FUNC | HD4478OU_FUNC_F5x7 | HD4478OU_FUNC_N1 | HD4478OU_FUNC_DL8D);
|
||||||
up_mdelay(50);
|
up_udelay(100); /* Delay more than 100uS */
|
||||||
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_FUNC | HD4478OU_FUNC_F5x7 | HD4478OU_FUNC_N1 | HD4478OU_FUNC_DL8D);
|
||||||
|
up_udelay(40); /* Delay more than 40uS */
|
||||||
|
lcd_wrcommand(HD4478OU_FUNC | HD4478OU_FUNC_F5x7 | HD4478OU_FUNC_N1 | HD4478OU_FUNC_DL8D);
|
||||||
|
lcd_waitbusy();
|
||||||
|
|
||||||
lcd_wrcommand(HD4478OU_DISPLAY); /* Display, cursor, and blink off */
|
lcd_wrcommand(HD4478OU_FUNC | HD4478OU_FUNC_F5x7 | HD4478OU_FUNC_N1 | HD4478OU_FUNC_DL8D);
|
||||||
lcd_wrcommand(HD4478OU_CLEAR); /* Clear the display */
|
lcd_waitbusy();
|
||||||
lcd_wrcommand(HD4478OU_INPUT | HD4478OU_INPUT_INCR); /* Increment mode */
|
|
||||||
lcd_wrcommand(HD4478OU_DISPLAY | HD4478OU_DISPLAY_ON); /* Display on, cursor and blink off */
|
/* Display ON, cursor OFF, blink OFF */
|
||||||
lcd_wrcommand(HD4478OU_DDRAM_AD(0)); /* Select DDRAM RAM AD=0 */
|
|
||||||
|
lcd_wrcommand(HD4478OU_DISPLAY | HD4478OU_DISPLAY_ON);
|
||||||
|
lcd_waitbusy();
|
||||||
|
|
||||||
|
/* Clear the display and home the cursor */
|
||||||
|
|
||||||
|
lcd_wrcommand(HD4478OU_CLEAR); /* Clear display */
|
||||||
|
lcd_waitbusy();
|
||||||
|
|
||||||
|
lcd_wrcommand(HD4478OU_RETURN); /* Return home: AC=0 */
|
||||||
|
lcd_waitbusy();
|
||||||
|
|
||||||
|
/* Entry Mode Set:
|
||||||
|
*
|
||||||
|
* - Increment address by one,
|
||||||
|
* - Shift cursor to right (display is not shifted)
|
||||||
|
*/
|
||||||
|
|
||||||
|
lcd_wrcommand(HD4478OU_INPUT | HD4478OU_INPUT_INCR);
|
||||||
|
|
||||||
/* Register the LCD device driver */
|
/* Register the LCD device driver */
|
||||||
|
|
||||||
|
|||||||
@@ -47,6 +47,7 @@
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
/* Configuration ************************************************************/
|
/* Configuration ************************************************************/
|
||||||
|
|
||||||
|
/* GPIO Pin Configurations **************************************************/
|
||||||
/* The Sure PIC32MX board has five LEDs. One (D4, lablel "Power") is not
|
/* The Sure PIC32MX board has five LEDs. One (D4, lablel "Power") is not
|
||||||
* controllable by software. Four are controllable by software:
|
* controllable by software. Four are controllable by software:
|
||||||
*
|
*
|
||||||
@@ -54,8 +55,58 @@
|
|||||||
* D8 "SD" Yellow RD6 Low illuminates
|
* D8 "SD" Yellow RD6 Low illuminates
|
||||||
* D9 "Flash" Yellow RF0 Low illuminates
|
* D9 "Flash" Yellow RF0 Low illuminates
|
||||||
* D10 "Error" Red RF1 Low illuminates
|
* D10 "Error" Red RF1 Low illuminates
|
||||||
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#define GPIO_USB_LED (GPIO_OUTPUT | GPIO_VALUE_ONE | GPIO_PORTD | GPIO_PIN7)
|
||||||
|
#define GPIO_SD_LED (GPIO_OUTPUT | GPIO_VALUE_ONE | GPIO_PORTD | GPIO_PIN6)
|
||||||
|
#define GPIO_FLASH_LED (GPIO_OUTPUT | GPIO_VALUE_ONE | GPIO_PORTF | GPIO_PIN0)
|
||||||
|
#define GPIO_ERROR_LED (GPIO_OUTPUT | GPIO_VALUE_ONE | GPIO_PORTF | GPIO_PIN1)
|
||||||
|
|
||||||
|
/* LCD pin mapping (see configs/sure-pic32mx/README.txt)
|
||||||
|
*
|
||||||
|
* --------------------- ---------- ----------------------------------
|
||||||
|
* PIC32 Sure JP1 Sure Signal Description
|
||||||
|
* PIN SIGNAL NAME PIN NAME(s)
|
||||||
|
* --------------------- ---------- ----------------------------------
|
||||||
|
* 34 Vbus 1. +5V +5V VBUS device mode
|
||||||
|
* To GND via capacitor
|
||||||
|
* 2. GND GND
|
||||||
|
* 49 RD1 3. Vo Transistor circuit driven by PWM2
|
||||||
|
* 44 PMA0/AN15/RB15 4. RS PMA0, Selects registers
|
||||||
|
* 53 PMRD/RD5 5. RW PMRD/PMWR, Selects read or write
|
||||||
|
* 45 PMPCS1/RD11 6. E Starts data read/write
|
||||||
|
* 60 PMD0/RE0 7. DB0 PMD0
|
||||||
|
* 61 PMD1/RE1 8. DB1 PMD1
|
||||||
|
* 62 PMD2/RE2 9. DB2 PMD2
|
||||||
|
* 63 PMD3/RE3 10. DB3 PMD3
|
||||||
|
* 64 PMD4/RE4 11. DB4 PMD4
|
||||||
|
* 1 PMD5/RE5 12. DB5 PMD5
|
||||||
|
* 2 PMD6/RE6 13. DB6 PMD6
|
||||||
|
* 3 PMD7/RE7 14. DB7 PMD7
|
||||||
|
* 15. A +5V_DUSB
|
||||||
|
* 46 INT0/RD0 16. K Transistor circuit driven by PWM1
|
||||||
|
* --------------------- ---------- ----------------------------------
|
||||||
|
*
|
||||||
|
* Vbus power also requires Vbuson/AN5/RB5
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define GPIO_LCD_RS (GPIO_OUTPUT | GPIO_VALUE_ZERO | GPIO_PORTB | GPIO_PIN15)
|
||||||
|
#define GPIO_LCD_RW (GPIO_OUTPUT | GPIO_VALUE_ZERO | GPIO_PORTD | GPIO_PIN5)
|
||||||
|
#define GPIO_LCD_E (GPIO_OUTPUT | GPIO_VALUE_ZERO | GPIO_PORTD | GPIO_PIN11)
|
||||||
|
|
||||||
|
/* This pin drives the +5V needed by the LCD */
|
||||||
|
|
||||||
|
#define GPIO_LCD_PWR (GPIO_OUTPUT | GPIO_VALUE_ZERO | GPIO_PORTB | GPIO_PIN5)
|
||||||
|
|
||||||
|
/* These pins are label PWM1 and PWM2 and so are obviously intended to
|
||||||
|
* support modulated outputs. However, here for simplicity, they are
|
||||||
|
* just treated as on/off discretes outputs.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define GPIO_LCD_LIGHT (GPIO_OUTPUT | GPIO_VALUE_ZERO | GPIO_PORTD | GPIO_PIN0)
|
||||||
|
#define GPIO_LCD_COMP (GPIO_OUTPUT | GPIO_VALUE_ZERO | GPIO_PORTD | GPIO_PIN1)
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Public Types
|
* Public Types
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ ifeq ($(WINTOOL),y)
|
|||||||
ARCHXXINCLUDES = -I. -isystem "${shell cygpath -w $(TOPDIR)/include}" -isystem "${shell cygpath -w $(TOPDIR)/include/cxx}"
|
ARCHXXINCLUDES = -I. -isystem "${shell cygpath -w $(TOPDIR)/include}" -isystem "${shell cygpath -w $(TOPDIR)/include/cxx}"
|
||||||
ARCHSCRIPT = -T "${shell cygpath -w $(TOPDIR)/configs/$(CONFIG_ARCH_BOARD)/scripts/ld.script}"
|
ARCHSCRIPT = -T "${shell cygpath -w $(TOPDIR)/configs/$(CONFIG_ARCH_BOARD)/scripts/ld.script}"
|
||||||
else
|
else
|
||||||
# Linux/Cygwin-native toolchain
|
# Linux/Cygwin-native toolchain
|
||||||
MKDEP = $(TOPDIR)/tools/mkdeps.sh
|
MKDEP = $(TOPDIR)/tools/mkdeps.sh
|
||||||
ARCHINCLUDES = -I. -isystem $(TOPDIR)/include
|
ARCHINCLUDES = -I. -isystem $(TOPDIR)/include
|
||||||
ARCHXXINCLUDES = -I. -isystem $(TOPDIR)/include -isystem $(TOPDIR)/include/cxx
|
ARCHXXINCLUDES = -I. -isystem $(TOPDIR)/include -isystem $(TOPDIR)/include/cxx
|
||||||
|
|||||||
Reference in New Issue
Block a user