diff --git a/arch/mips/src/pic32mz/chip/pic32mz-spi.h b/arch/mips/src/pic32mz/chip/pic32mz-spi.h index d4f5fe42a50..42d7fdf7a12 100644 --- a/arch/mips/src/pic32mz/chip/pic32mz-spi.h +++ b/arch/mips/src/pic32mz/chip/pic32mz-spi.h @@ -110,7 +110,7 @@ #define PIC32MZ_SPI1_CON2SET (PIC32MZ_SPI1_K1BASE+PIC32MZ_SPI_CON2SET_OFFSET) #define PIC32MZ_SPI1_CON2INV (PIC32MZ_SPI1_K1BASE+PIC32MZ_SPI_CON2INV_OFFSET) -#if PIC32MZ_NSPI > 1 +#if CHIP_NSPI > 1 # define PIC32MZ_SPI2_CON (PIC32MZ_SPI2_K1BASE+PIC32MZ_SPI_CON_OFFSET) # define PIC32MZ_SPI2_CONCLR (PIC32MZ_SPI2_K1BASE+PIC32MZ_SPI_CONCLR_OFFSET) # define PIC32MZ_SPI2_CONSET (PIC32MZ_SPI2_K1BASE+PIC32MZ_SPI_CONSET_OFFSET) @@ -128,7 +128,7 @@ # define PIC32MZ_SPI2_CON2INV (PIC32MZ_SPI2_K1BASE+PIC32MZ_SPI_CON2INV_OFFSET) #endif -#if PIC32MZ_NSPI > 2 +#if CHIP_NSPI > 2 # define PIC32MZ_SPI3_CON (PIC32MZ_SPI3_K1BASE+PIC32MZ_SPI_CON_OFFSET) # define PIC32MZ_SPI3_CONCLR (PIC32MZ_SPI3_K1BASE+PIC32MZ_SPI_CONCLR_OFFSET) # define PIC32MZ_SPI3_CONSET (PIC32MZ_SPI3_K1BASE+PIC32MZ_SPI_CONSET_OFFSET) @@ -145,7 +145,7 @@ # define PIC32MZ_SPI3_CON2INV (PIC32MZ_SPI3_K1BASE+PIC32MZ_SPI_CON2INV_OFFSET) #endif -#if PIC32MZ_NSPI > 3 +#if CHIP_NSPI > 3 # define PIC32MZ_SPI4_CON (PIC32MZ_SPI4_K1BASE+PIC32MZ_SPI_CON_OFFSET) # define PIC32MZ_SPI4_CONCLR (PIC32MZ_SPI4_K1BASE+PIC32MZ_SPI_CONCLR_OFFSET) # define PIC32MZ_SPI4_CONSET (PIC32MZ_SPI4_K1BASE+PIC32MZ_SPI_CONSET_OFFSET) @@ -162,7 +162,7 @@ # define PIC32MZ_SPI4_CON2INV (PIC32MZ_SPI4_K1BASE+PIC32MZ_SPI_CON2INV_OFFSET) #endif -#if PIC32MZ_NSPI > 4 +#if CHIP_NSPI > 4 # define PIC32MZ_SPI5_CON (PIC32MZ_SPI5_K1BASE+PIC32MZ_SPI_CON_OFFSET) # define PIC32MZ_SPI5_CONCLR (PIC32MZ_SPI5_K1BASE+PIC32MZ_SPI_CONCLR_OFFSET) # define PIC32MZ_SPI5_CONSET (PIC32MZ_SPI5_K1BASE+PIC32MZ_SPI_CONSET_OFFSET) @@ -179,7 +179,7 @@ # define PIC32MZ_SPI5_CON2INV (PIC32MZ_SPI5_K1BASE+PIC32MZ_SPI_CON2INV_OFFSET) #endif -#if PIC32MZ_NSPI > 5 +#if CHIP_NSPI > 5 # define PIC32MZ_SPI6_CON (PIC32MZ_SPI6_K1BASE+PIC32MZ_SPI_CON_OFFSET) # define PIC32MZ_SPI6_CONCLR (PIC32MZ_SPI6_K1BASE+PIC32MZ_SPI_CONCLR_OFFSET) # define PIC32MZ_SPI6_CONSET (PIC32MZ_SPI6_K1BASE+PIC32MZ_SPI_CONSET_OFFSET) diff --git a/arch/mips/src/pic32mz/pic32mz-spi.h b/arch/mips/src/pic32mz/pic32mz-spi.h index 4770661d3f4..e8a11d3f04c 100644 --- a/arch/mips/src/pic32mz/pic32mz-spi.h +++ b/arch/mips/src/pic32mz/pic32mz-spi.h @@ -170,6 +170,58 @@ int pic32mz_spi6cmddata(FAR struct spi_dev_s *dev, uint32_t devid, bool cmd); #endif #endif +/**************************************************************************** + * Name: pic32mz_spi1/2/...register + * + * Description: + * If the board supports a card detect callback to inform the SPI-based + * MMC/SD driver when an SD card is inserted or removed, then + * CONFIG_SPI_CALLBACK should be defined and the following function(s) + * must be implemented. These functions implements the registercallback + * method of the SPI interface (see include/nuttx/spi/spi.h for details) + * + * Input Parameters: + * dev - Device-specific state data + * callback - The function to call on the media change + * arg - A caller provided value to return with the callback + * + * Returned Value: + * 0 on success; negated errno on failure. + * + ****************************************************************************/ + +#ifdef CONFIG_SPI_CALLBACK +#ifdef CONFIG_PIC32MZ_SPI1 +int pic32mz_spi1register(FAR struct spi_dev_s *dev, spi_mediachange_t callback, + FAR void *arg); +#endif + +#ifdef CONFIG_PIC32MZ_SPI2 +int pic32mz_spi2register(FAR struct spi_dev_s *dev, spi_mediachange_t callback, + FAR void *arg); +#endif + +#ifdef CONFIG_PIC32MZ_SPI3 +int pic32mz_spi3register(FAR struct spi_dev_s *dev, spi_mediachange_t callback, + FAR void *arg); +#endif + +#ifdef CONFIG_PIC32MZ_SPI4 +int pic32mz_spi4register(FAR struct spi_dev_s *dev, spi_mediachange_t callback, + FAR void *arg); +#endif + +#ifdef CONFIG_PIC32MZ_SPI5 +int pic32mz_spi5register(FAR struct spi_dev_s *dev, spi_mediachange_t callback, + FAR void *arg); +#endif + +#ifdef CONFIG_PIC32MZ_SPI6 +int pic32mz_spi6register(FAR struct spi_dev_s *dev, spi_mediachange_t callback, + FAR void *arg); +#endif +#endif /* CONFIG_SPI_CALLBACK */ + #undef EXTERN #if defined(__cplusplus) } diff --git a/configs/flipnclick-pic32mz/Kconfig b/configs/flipnclick-pic32mz/Kconfig index 109d9a47f37..072527993fd 100644 --- a/configs/flipnclick-pic32mz/Kconfig +++ b/configs/flipnclick-pic32mz/Kconfig @@ -4,4 +4,31 @@ # if ARCH_BOARD_FLIPNCLICK_PIC32MZ -endif + + +config FLIPNCLICK_PIC32MZ_HILETGO + bool "HiletGo Click Present" + default n + depends on LCD_HILETGO + select NXSTART_EXTERNINIT if NX + +choice + prompt "HiletGo mikroBUS" + default FLIPNCLICK_PIC32MZ_HILETGO_MBA + depends on FLIPNCLICK_PIC32MZ_HILETGO + +config FLIPNCLICK_PIC32MZ_HILETGO_MBA + bool "mikroBUS A" + +config FLIPNCLICK_PIC32MZ_HILETGO_MBB + bool "mikroBUS B" + +config FLIPNCLICK_PIC32MZ_HILETGO_MBC + bool "mikroBUS C" + +config FLIPNCLICK_PIC32MZ_HILETGO_MBD + bool "mikroBUS D" + +endchoice # HiletGo mikroBUS + +endif # ARCH_BOARD_FLIPNCLICK_PIC32MZ diff --git a/configs/flipnclick-pic32mz/README.txt b/configs/flipnclick-pic32mz/README.txt index 52a3c0a33ec..913235f3c52 100644 --- a/configs/flipnclick-pic32mz/README.txt +++ b/configs/flipnclick-pic32mz/README.txt @@ -17,6 +17,7 @@ Contents Serial Console SPI LEDs + HiletGo OLED Configurations Port Status @@ -309,6 +310,30 @@ LEDs and Buttons The switches have external pull-up resistors. The switches are pulled high (+3.3V) and grounded when pressed. +HiletGo OLED +============ + + Hardware + -------- + The HiletGo is a 128x64 OLED that can be driven either via SPI or I2C (SPI + is the default and is what is used here). I have mounted the OLED on a + proto click board. The OLED is connected as follows: + + OLED ALIAS DESCRIPTION PROTO CLICK + ----- ----------- ------------- ----------------- + GND Ground GND + VCC Power Supply 5V (3-5V) + D0 SCL,CLK,SCK Clock SCK + D1 SDA,MOSI Data MOSI,SDI + RES RST,RESET Reset RST (GPIO OUTPUT) + DC AO Data/Command INT (GPIO OUTPUT) + CS Chip Select CS (GPIO OUTPUT) + + NOTE that this is a write-only display (MOSI only)! + + Configuration + ------------- + Configurations ============== @@ -374,3 +399,26 @@ Where is one of the following: CONFIG_PIC32MZ_DEBUGGER_ENABLE=n : Debugger is disabled CONFIG_PIC32MZ_TRACE_ENABLE=n : Trace is disabled CONFIG_PIC32MZ_JTAG_ENABLE=n : JTAG is disabled + + nxlines + + This is an NSH configuration that supports the NX graphics example at + apps/examples/nxlines as a built-in application. + + NOTES: + + 1. This configuration derives from the nsh configuration. All of the + notes there apply here as well. + + 2. The default configuration assumes there is the custom HiletGo OLED + in the mikroBUS A slot (and a Mikroe RS-232 Click card in the + mikroBUS B slot). That is easily changed by reconfiguring, however. + See the section entitled "HiletGo OLED" for information about this + custom click card. + + STATUS: + + 2018-02-10: The debug output indicates that the nxlines example is + running with no errors, however, nothing appears on the OLED display. + This suggests either a problem with the pin configuration or else I + have bungled the wiring of the custom card. diff --git a/configs/flipnclick-pic32mz/nxlines/defconfig b/configs/flipnclick-pic32mz/nxlines/defconfig new file mode 100644 index 00000000000..647db81d0b3 --- /dev/null +++ b/configs/flipnclick-pic32mz/nxlines/defconfig @@ -0,0 +1,62 @@ +# CONFIG_ARCH_RAMFUNCS is not set +# CONFIG_NX_DISABLE_1BPP is not set +# CONFIG_PIC32MZ_DEBUGGER_ENABLE is not set +# CONFIG_PIC32MZ_TRACE_ENABLE is not set +CONFIG_ARCH_BOARD_FLIPNCLICK_PIC32MZ=y +CONFIG_ARCH_BOARD="flipnclick-pic32mz" +CONFIG_ARCH_CHIP_PIC32MZ=y +CONFIG_ARCH_CHIP_PIC32MZ2048EFH=y +CONFIG_ARCH_CHIP_PIC32MZEF=y +CONFIG_ARCH_MIPS=y +CONFIG_ARCH_STACKDUMP=y +CONFIG_ARCH="mips" +CONFIG_BOARD_LOOPSPERMSEC=7245 +CONFIG_BUILTIN=y +CONFIG_EXAMPLES_NSH=y +CONFIG_EXAMPLES_NXLINES_BORDERWIDTH=4 +CONFIG_EXAMPLES_NXLINES_BPP=1 +CONFIG_EXAMPLES_NXLINES_LINEWIDTH=4 +CONFIG_EXAMPLES_NXLINES=y +CONFIG_FLIPNCLICK_PIC32MZ_HILETGO=y +CONFIG_FS_PROCFS=y +CONFIG_HOST_WINDOWS=y +CONFIG_IDLETHREAD_STACKSIZE=2048 +CONFIG_INTELHEX_BINARY=y +CONFIG_LCD_HILETGO=y +CONFIG_LCD_MAXCONTRAST=255 +CONFIG_LCD=y +CONFIG_MAX_TASKS=16 +CONFIG_MAX_WDOGPARMS=2 +CONFIG_MIPS_MICROMIPS=y +CONFIG_MIPS32_TOOLCHAIN_PINGUINOW=y +CONFIG_MMCSD=y +CONFIG_MQ_MAXMSGSIZE=64 +CONFIG_MTD=y +CONFIG_NFILE_DESCRIPTORS=8 +CONFIG_NFILE_STREAMS=8 +CONFIG_NSH_ARCHINIT=y +CONFIG_NSH_BUILTIN_APPS=y +CONFIG_NSH_DISABLE_IFUPDOWN=y +CONFIG_NSH_FILEIOSIZE=512 +CONFIG_NSH_LINELEN=64 +CONFIG_NSH_READLINE=y +CONFIG_NX_BLOCKING=y +CONFIG_NX=y +CONFIG_NXFONT_TOM_THUMB_4X6=y +CONFIG_NXTK_BORDERWIDTH=2 +CONFIG_PIC32MZ_ICESEL_CH2=y +CONFIG_PIC32MZ_SPI2=y +CONFIG_PIC32MZ_UART3=y +CONFIG_PREALLOC_MQ_MSGS=8 +CONFIG_PREALLOC_TIMERS=4 +CONFIG_PREALLOC_WDOGS=8 +CONFIG_RAM_SIZE=131072 +CONFIG_RAM_START=0xa0000000 +CONFIG_RR_INTERVAL=200 +CONFIG_SCHED_WAITPID=y +CONFIG_SDCLONE_DISABLE=y +CONFIG_START_DAY=10 +CONFIG_START_MONTH=2 +CONFIG_UART3_SERIAL_CONSOLE=y +CONFIG_USER_ENTRYPOINT="nsh_main" +CONFIG_WDOG_INTRESERVE=1 diff --git a/configs/flipnclick-pic32mz/src/Makefile b/configs/flipnclick-pic32mz/src/Makefile index c8226dc95ef..646415e87c6 100644 --- a/configs/flipnclick-pic32mz/src/Makefile +++ b/configs/flipnclick-pic32mz/src/Makefile @@ -50,4 +50,8 @@ ifeq ($(CONFIG_ARCH_BUTTONS),y) CSRCS += pic32mz_buttons.c endif +ifeq ($(CONFIG_FLIPNCLICK_PIC32MZ_HILETGO),y) +CSRCS += pic32mz_hiletgo.c +endif + include $(TOPDIR)/configs/Board.mk diff --git a/configs/flipnclick-pic32mz/src/flipnclick-pic32mz.h b/configs/flipnclick-pic32mz/src/flipnclick-pic32mz.h index ec514893eb4..59e58a5c65d 100644 --- a/configs/flipnclick-pic32mz/src/flipnclick-pic32mz.h +++ b/configs/flipnclick-pic32mz/src/flipnclick-pic32mz.h @@ -48,6 +48,18 @@ ****************************************************************************/ /* Configuration ************************************************************/ +#define HAVE_HILETGO 1 + +/* The HiletGo LCD must be selected, installed on the Flip&Click, and must + * be configured to use the SPI interface. + */ + +#if !defined(CONFIG_LCD_HILETGO) || \ + !defined(CONFIG_FLIPNCLICK_PIC32MZ_HILETGO) || \ + !defined(CONFIG_LCD_SSD1306_SPI) +# undef HAVE_HILETGO +#endif + /* LEDs *********************************************************************/ /* There are four LEDs on the top, red side of the board. Only one can be * controlled by software: @@ -126,6 +138,78 @@ #define GPIO_MBC_CS (GPIO_OUTPUT | GPIO_VALUE_ONE | GPIO_PORTD | GPIO_PIN12) #define GPIO_MBD_CS (GPIO_OUTPUT | GPIO_VALUE_ONE | GPIO_PORTD | GPIO_PIN13) +/* HiletGo OLED + * + * The HiletGo is a 128x64 OLED that can be driven either via SPI or I2C (SPI + * is the default and is what is used here). I have mounted the OLED on a + * proto click board. The OLED is connected as follows: + * + * OLED ALIAS DESCRIPTION PROTO CLICK + * ----- ----------- ------------- ----------------- + * GND Ground GND + * VCC Power Supply 5V (3-5V) + * D0 SCL,CLK,SCK Clock SCK + * D1 SDA,MOSI Data MOSI,SDI + * RES RST,RESET Reset RST (GPIO OUTPUT) + * DC AO Data/Command INT (GPIO OUTPUT) + * CS Chip Select CS (GPIO OUTPUT) + * + * NOTE that this is a write-only display (MOSI only)! + * + * MikroBUS A: MikroBUS B: + * Pin Board Signal PIC32MZ Pin Board Signal PIC32MZ + * ---- ------------ ------- ---- ------------ ------- + * RST RST4 RE2 RST RST3 RG13 + * DC INT4 RD9 DC INT3 RG1 + * + * MikroBUS C: MikroBUS D: + * Pin Board Signal PIC32MZ Pin Board Signal PIC32MZ + * ---- ------------ ------- ---- ------------ ------- + * RST RST1 RG14 RST RST2 RG12 + * DC INT1 RD5 DC INT2 RD4 + */ + +#if defined(CONFIG_FLIPNCLICK_PIC32MZ_HILETGO_MBA) +# ifndef CONFIG_PIC32MZ_SPI2 +# error "The OLED driver requires CONFIG_PIC32MZ_SPI2 in the configuration" +# endif + +# define HILETGO_SPI_BUS 2 +# define GPIO_HILETGO_CS GPIO_MBA_CS +# define GPIO_HILETGO_RST (GPIO_OUTPUT | GPIO_VALUE_ZERO | GPIO_PORTE | GPIO_PIN2) +# define GPIO_HILETGO_DC (GPIO_OUTPUT | GPIO_VALUE_ZERO | GPIO_PORTD | GPIO_PIN9) + +#elif defined(CONFIG_FLIPNCLICK_PIC32MZ_HILETGO_MBB) +# ifndef CONFIG_PIC32MZ_SPI2 +# error "The OLED driver requires CONFIG_PIC32MZ_SPI2 in the configuration" +# endif + +# define HILETGO_SPI_BUS 2 +# define GPIO_HILETGO_CS GPIO_MBB_CS +# define GPIO_HILETGO_RST (GPIO_OUTPUT | GPIO_VALUE_ZERO | GPIO_PORTG | GPIO_PIN13) +# define GPIO_HILETGO_DC (GPIO_OUTPUT | GPIO_VALUE_ZERO | GPIO_PORTG | GPIO_PIN1) + +#elif defined(CONFIG_FLIPNCLICK_PIC32MZ_HILETGO_MBC) +# ifndef CONFIG_PIC32MZ_SPI1 +# error "The OLED driver requires CONFIG_PIC32MZ_SPI1 in the configuration" +# endif + +# define HILETGO_SPI_BUS 1 +# define GPIO_HILETGO_CS GPIO_MBC_CS +# define GPIO_HILETGO_RST (GPIO_OUTPUT | GPIO_VALUE_ZERO | GPIO_PORTG | GPIO_PIN14) +# define GPIO_HILETGO_DC (GPIO_OUTPUT | GPIO_VALUE_ZERO | GPIO_PORTD | GPIO_PIN5) + +#elif defined(CONFIG_FLIPNCLICK_PIC32MZ_HILETGO_MBD) +# ifndef CONFIG_PIC32MZ_SPI1 +# error "The OLED driver requires CONFIG_PIC32MZ_SPI1 in the configuration" +# endif + +# define HILETGO_SPI_BUS 1 +# define GPIO_HILETGO_CS GPIO_MBD_CS +# define GPIO_HILETGO_RST (GPIO_OUTPUT | GPIO_VALUE_ZERO | GPIO_PORTG | GPIO_PIN12) +# define GPIO_HILETGO_DC (GPIO_OUTPUT | GPIO_VALUE_ZERO | GPIO_PORTD | GPIO_PIN4) +#endif + /**************************************************************************** * Public Types ****************************************************************************/ @@ -182,6 +266,21 @@ void pic32mz_led_initialize(void); int pic32mz_bringup(void); +/**************************************************************************** + * Name: pic32mz_graphics_setup + * + * Description: + * Called by either NX initialization logic (via board_graphics_setup) or + * directly from the board bring-up logic in order to configure the + * HiletGo OLED. + * + ****************************************************************************/ + +#ifdef HAVE_HILETGO +struct lcd_dev_s; /* Forward reference3 */ +FAR struct lcd_dev_s *pic32mz_graphics_setup(unsigned int devno); +#endif + #undef EXTERN #ifdef __cplusplus } diff --git a/configs/flipnclick-pic32mz/src/pic32mz_bringup.c b/configs/flipnclick-pic32mz/src/pic32mz_bringup.c index 68247177b33..0837956dd58 100644 --- a/configs/flipnclick-pic32mz/src/pic32mz_bringup.c +++ b/configs/flipnclick-pic32mz/src/pic32mz_bringup.c @@ -72,6 +72,15 @@ int pic32mz_bringup(void) } #endif +#if defined(HAVE_HILETGO) && !defined(CONFIG_NXSTART_EXTERNINIT) + /* Configure the HiletGo OLED */ + + if (pic32mz_graphics_setup(0) == NULL) + { + syslog(LOG_ERR,"ERROR: Failed to configure the HiletGo OLEDn"); + } +#endif + UNUSED(ret); return OK; } diff --git a/configs/flipnclick-pic32mz/src/pic32mz_hiletgo.c b/configs/flipnclick-pic32mz/src/pic32mz_hiletgo.c new file mode 100644 index 00000000000..24e10f889c3 --- /dev/null +++ b/configs/flipnclick-pic32mz/src/pic32mz_hiletgo.c @@ -0,0 +1,172 @@ +/**************************************************************************** + * config/flipnclick-pic32mz/src/pic32mz_hiletgo.c + * + * Copyright (C) 2018 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt + * + * 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. + * + ****************************************************************************/ + +/* HiletGo OLED + * + * The HiletGo is a 128x64 OLED that can be driven either via SPI or I2C (SPI + * is the default and is what is used here). I have mounted the OLED on a + * proto click board. The OLED is connected as follows: + * + * OLED ALIAS DESCRIPTION PROTO CLICK + * ----- ----------- ------------- ----------------- + * GND Ground GND + * VCC Power Supply 5V (3-5V) + * D0 SCL,CLK,SCK Clock SCK + * D1 SDA,MOSI Data MOSI,SDI + * RES RST,RESET Reset RST (GPIO OUTPUT) + * DC AO Data/Command INT (GPIO OUTPUT) + * CS Chip Select CS (GPIO OUTPUT) + */ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include + +#include +#include +#include +#include + +#if defined(CONFIG_VIDEO_FB) && defined(CONFIG_LCD_FRAMEBUFFER) +# include +#endif + +#include "pic32mz-gpio.h" +#include "pic32mz-spi.h" + +#include "flipnclick-pic32mz.h" + +#ifdef HAVE_HILETGO + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ +/* Configuration ************************************************************/ + +#ifndef CONFIG_SPI_CMDDATA +# error "The OLED driver requires CONFIG_SPI_CMDDATA in the configuration" +#endif + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: pic32mz_graphics_setup + * + * Description: + * Called by either NX initialization logic (via board_graphics_setup) or + * directly from the board bring-up logic in order to configure the + * HiletGo OLED. + * + ****************************************************************************/ + +FAR struct lcd_dev_s *pic32mz_graphics_setup(unsigned int devno) +{ + FAR struct spi_dev_s *spi; + FAR struct lcd_dev_s *dev; + + /* Configure the OLED GPIOs. This initial configuration is RESET low, + * putting the OLED into reset state. + */ + + (void)pic32mz_configgpio(GPIO_HILETGO_RST); + + /* Wait a bit then release the OLED from the reset state */ + + up_mdelay(20); + pic32mz_gpiowrite(GPIO_HILETGO_RST, true); + + /* Get the SPI1 port interface */ + + spi = pic32mz_spibus_initialize(HILETGO_SPI_BUS); + if (!spi) + { + lcderr("ERROR: Failed to initialize SPI port 1\n"); + } + else + { + /* Bind the SPI port to the OLED */ + + dev = ssd1306_initialize(spi, NULL, devno); + if (!dev) + { + lcderr("ERROR: Failed to bind SPI port 1 to OLED %d: %d\n", devno); + } + else + { + lcdinfo("Bound SPI port 1 to OLED %d\n", devno); + + /* And turn the OLED on */ + + (void)dev->setpower(dev, CONFIG_LCD_MAXPOWER); + +#if defined(CONFIG_VIDEO_FB) && defined(CONFIG_LCD_FRAMEBUFFER) + /* Initialize and register the simulated framebuffer driver */ + + ret = fb_register(0, 0); + if (ret < 0) + { + syslog(LOG_ERR, "ERROR: fb_register() failed: %d\n", ret); + } +#endif + + return dev; + } + } + + return NULL; +} + +/**************************************************************************** + * Name: board_graphics_setup + * + * Description: + * Called by NX initialization logic to configure the OLED. + * + ****************************************************************************/ + +#ifdef CONFIG_NXSTART_EXTERNINIT +FAR struct lcd_dev_s *board_graphics_setup(unsigned int devno) +{ + return pic32mz_graphics_setup(devno); +} +#endif + +#endif /* HAVE_HILETGO */ diff --git a/configs/flipnclick-pic32mz/src/pic32mz_spi.c b/configs/flipnclick-pic32mz/src/pic32mz_spi.c index c1387b8054f..765535f8972 100644 --- a/configs/flipnclick-pic32mz/src/pic32mz_spi.c +++ b/configs/flipnclick-pic32mz/src/pic32mz_spi.c @@ -43,9 +43,12 @@ #include #include +#include + #include #include "up_arch.h" +#include "pic32mz-gpio.h" #include "flipnclick-pic32mz.h" @@ -67,7 +70,10 @@ void weak_function pic32mz_spidev_initialize(void) { /* Configure the SPI chip select GPIOs */ -#warning "Missing logic" +#ifdef CONFIG_LCD_HILETGO + (void)pic32mz_configgpio(GPIO_HILETGO_CS); + (void)pic32mz_configgpio(GPIO_HILETGO_DC); +#endif } /************************************************************************************ @@ -104,19 +110,32 @@ struct spi_dev_s; void pic32mz_spi1select(FAR struct spi_dev_s *dev, uint32_t devid, bool selected) { spiinfo("devid: %d CS: %s\n", (int)devid, selected ? "assert" : "de-assert"); -#warning "Missing logic" + +#if defined(CONFIG_FLIPNCLICK_PIC32MZ_HILETGO_MBA) || \ + defined(CONFIG_FLIPNCLICK_PIC32MZ_HILETGO_MBB) + if (devid == SPIDEV_DISPLAY(0)) + { + pic32mz_gpiowrite(GPIO_HILETGO_CS, !selected); + } +#endif } uint8_t pic32mz_spi1status(FAR struct spi_dev_s *dev, uint32_t devid) { spiinfo("Returning nothing\n"); -#warning "Missing logic" return 0; } #ifdef CONFIG_SPI_CMDDATA int pic32mz_spi1cmddata(FAR struct spi_dev_s *dev, uint32_t devid, bool cmd) { -#warning "Missing logic" +#if defined(CONFIG_FLIPNCLICK_PIC32MZ_HILETGO_MBA) || \ + defined(CONFIG_FLIPNCLICK_PIC32MZ_HILETGO_MBB) + if (devid == SPIDEV_DISPLAY(0)) + { + pic32mz_gpiowrite(GPIO_HILETGO_CS, !cmd); + } +#endif + return 0; } #endif @@ -126,19 +145,31 @@ int pic32mz_spi1cmddata(FAR struct spi_dev_s *dev, uint32_t devid, bool cmd) void pic32mz_spi2select(FAR struct spi_dev_s *dev, uint32_t devid, bool selected) { spiinfo("devid: %d CS: %s\n", (int)devid, selected ? "assert" : "de-assert"); -#warning "Missing logic" + +#if defined(CONFIG_FLIPNCLICK_PIC32MZ_HILETGO_MBC) || \ + defined(CONFIG_FLIPNCLICK_PIC32MZ_HILETGO_MBD) + if (devid == SPIDEV_DISPLAY(0)) + { + pic32mz_gpiowrite(GPIO_HILETGO_CS, !selected); + } +#endif } uint8_t pic32mz_spi2status(FAR struct spi_dev_s *dev, uint32_t devid) { spiinfo("Returning nothing\n"); -#warning "Missing logic" return 0; } #ifdef CONFIG_SPI_CMDDATA int pic32mz_spi2cmddata(FAR struct spi_dev_s *dev, uint32_t devid, bool cmd) { -#warning "Missing logic" +#if defined(CONFIG_FLIPNCLICK_PIC32MZ_HILETGO_MBC) || \ + defined(CONFIG_FLIPNCLICK_PIC32MZ_HILETGO_MBD) + if (devid == SPIDEV_DISPLAY(0)) + { + pic32mz_gpiowrite(GPIO_HILETGO_CS, !cmd); + } +#endif return 0; } #endif @@ -148,19 +179,16 @@ int pic32mz_spi2cmddata(FAR struct spi_dev_s *dev, uint32_t devid, bool cmd) void pic32mz_spi3select(FAR struct spi_dev_s *dev, uint32_t devid, bool selected) { spiinfo("devid: %d CS: %s\n", (int)devid, selected ? "assert" : "de-assert"); -#warning "Missing logic" } uint8_t pic32mz_spi3status(FAR struct spi_dev_s *dev, uint32_t devid) { spiinfo("Returning nothing\n"); -#warning "Missing logic" return 0; } #ifdef CONFIG_SPI_CMDDATA int pic32mz_spi3cmddata(FAR struct spi_dev_s *dev, uint32_t devid, bool cmd) { -#warning "Missing logic" return 0; } #endif @@ -170,19 +198,16 @@ int pic32mz_spi3cmddata(FAR struct spi_dev_s *dev, uint32_t devid, bool cmd) void pic32mz_spi4select(FAR struct spi_dev_s *dev, uint32_t devid, bool selected) { spiinfo("devid: %d CS: %s\n", (int)devid, selected ? "assert" : "de-assert"); -#warning "Missing logic" } uint8_t pic32mz_spi4status(FAR struct spi_dev_s *dev, uint32_t devid) { spiinfo("Returning nothing\n"); -#warning "Missing logic" return 0; } #ifdef CONFIG_SPI_CMDDATA int pic32mz_spi4cmddata(FAR struct spi_dev_s *dev, uint32_t devid, bool cmd) { -#warning "Missing logic" return 0; } #endif @@ -192,7 +217,6 @@ int pic32mz_spi4cmddata(FAR struct spi_dev_s *dev, uint32_t devid, bool cmd) void pic32mz_spi5select(FAR struct spi_dev_s *dev, uint32_t devid, bool selected) { spiinfo("devid: %d CS: %s\n", (int)devid, selected ? "assert" : "de-assert"); -#warning "Missing logic" } uint8_t pic32mz_spi5status(FAR struct spi_dev_s *dev, uint32_t devid) @@ -232,4 +256,80 @@ int pic32mz_spi6cmddata(FAR struct spi_dev_s *dev, uint32_t devid, bool cmd) #endif #endif +/**************************************************************************** + * Name: pic32mz_spi1/2/...register + * + * Description: + * If the board supports a card detect callback to inform the SPI-based + * MMC/SD driver when an SD card is inserted or removed, then + * CONFIG_SPI_CALLBACK should be defined and the following function(s) + * must be implemented. These functions implements the registercallback + * method of the SPI interface (see include/nuttx/spi/spi.h for details) + * + * Input Parameters: + * dev - Device-specific state data + * callback - The function to call on the media change + * arg - A caller provided value to return with the callback + * + * Returned Value: + * 0 on success; negated errno on failure. + * + ****************************************************************************/ + +#ifdef CONFIG_SPI_CALLBACK +#ifdef CONFIG_PIC32MZ_SPI1 +int pic32mz_spi1register(FAR struct spi_dev_s *dev, spi_mediachange_t callback, + FAR void *arg) +{ +#warning Missing logic + return -ENOSYS; +} +#endif + +#ifdef CONFIG_PIC32MZ_SPI2 +int pic32mz_spi2register(FAR struct spi_dev_s *dev, spi_mediachange_t callback, + FAR void *arg) +{ +#warning Missing logic + return -ENOSYS; +} +#endif + +#ifdef CONFIG_PIC32MZ_SPI3 +int pic32mz_spi3register(FAR struct spi_dev_s *dev, spi_mediachange_t callback, + FAR void *arg) +{ +#warning Missing logic + return -ENOSYS; +} +#endif + +#ifdef CONFIG_PIC32MZ_SPI4 +int pic32mz_spi4register(FAR struct spi_dev_s *dev, spi_mediachange_t callback, + FAR void *arg) +{ +#warning Missing logic + return -ENOSYS; +} +#endif + +#ifdef CONFIG_PIC32MZ_SPI5 +int pic32mz_spi5register(FAR struct spi_dev_s *dev, spi_mediachange_t callback, + FAR void *arg) +{ +#warning Missing logic + return -ENOSYS; +} +#endif + +#ifdef CONFIG_PIC32MZ_SPI6 +int pic32mz_spi6register(FAR struct spi_dev_s *dev, spi_mediachange_t callback, + FAR void *arg) +{ +#warning Missing logic + return -ENOSYS; +} +#endif +#endif /* CONFIG_SPI_CALLBACK */ + #endif /* CONFIG_PIC32MZ_SPI */ diff --git a/drivers/lcd/Kconfig b/drivers/lcd/Kconfig index 3cb4769d14d..279bf9dfe1f 100644 --- a/drivers/lcd/Kconfig +++ b/drivers/lcd/Kconfig @@ -395,7 +395,6 @@ config LCD_UG2864HSWEG01 config LCD_UG2832HSWEG04 bool "UG-2832HSWEG04 OLED Display Module (SSD1306)" default n - depends on !LCD_UG2864HSWEG01 select LCD_SSD1306 ---help--- OLED Display Module, UG-UG2832HSWEG04, Univision Technology Inc @@ -412,7 +411,6 @@ config LCD_UG2832HSWEG04 config LCD_DD12864WO4A bool "DD-12864WO-4A OLED Display Module" default n - depends on !LCD_UG2864HSWEG01 && !LCD_UG2832HSWEG04 select LCD_SSD1306 select SPI_CMDDATA ---help--- @@ -427,6 +425,18 @@ config LCD_DD12864WO4A Required SPI driver settings: SPI_CMDDATA - Include support for cmd/data selection. +config LCD_HILETGO + bool "HiletGO 128x64 OLED" + default n + select LCD_SSD1306 + select SPI_CMDDATA + ---help--- + HiletGo 129x64 OLED Display Module, featuring an SSD1306. + + Required LCD driver settings: + LCD_MAXCONTRAST should be 255, but any value >0 and <=255 will be accepted. + LCD_MAXPOWER should be 1: 0=off, 1=on + config LCD_SSD1306 bool diff --git a/drivers/lcd/ssd1306.h b/drivers/lcd/ssd1306.h index 415f0cf9493..105e84d0985 100644 --- a/drivers/lcd/ssd1306.h +++ b/drivers/lcd/ssd1306.h @@ -65,7 +65,8 @@ #endif #if !defined(CONFIG_LCD_SH1106_OLED_132) && !defined(CONFIG_LCD_UG2864HSWEG01) && \ - !defined(CONFIG_LCD_UG2832HSWEG04) && !defined(CONFIG_LCD_DD12864WO4A) + !defined(CONFIG_LCD_UG2832HSWEG04) && !defined(CONFIG_LCD_DD12864WO4A) && \ + !defined(CONFIG_LCD_HILETGO) # error "Unknown and unsupported SSD1306 LCD" #endif @@ -171,6 +172,13 @@ # define SSD1306_DEV_PAGES 8 /* 8 pages */ # define SSD1306_DEV_CMNPAD 0x12 /* COM configuration */ # undef IS_SSD1309 +#elif defined(CONFIG_LCD_HILETGO) +# define SSD1306_DEV_NATIVE_XRES 128 /* Only 128 of 132 columns supported */ +# define SSD1306_DEV_NATIVE_YRES 64 /* 8 pages each 8 rows */ +# define SSD1306_DEV_XOFFSET 0 /* Offset to logical column 0 */ +# define SSD1306_DEV_PAGES 8 /* 8 pages */ +# define SSD1306_DEV_CMNPAD 0x12 /* COM configuration */ +# undef IS_SSD1309 #elif defined(CONFIG_LCD_DD12864WO4A) # define SSD1306_DEV_NATIVE_XRES 128 /* 128 of 128 columns used */ # define SSD1306_DEV_NATIVE_YRES 64 /* 8 pages each 8 rows */ diff --git a/libnx/nxfonts/.gitignore b/libnx/nxfonts/.gitignore index 707a097d916..90466077267 100644 --- a/libnx/nxfonts/.gitignore +++ b/libnx/nxfonts/.gitignore @@ -1,4 +1,4 @@ nxfonts_convert_*bpp.c nxfonts_bitmaps_*.c - +nxfonts_tom-thumb-4x6.c