diff --git a/boards/ESP32_CYD.py b/boards/ESP32_CYD.py new file mode 100755 index 000000000..1d05a4dd2 --- /dev/null +++ b/boards/ESP32_CYD.py @@ -0,0 +1,237 @@ +#!/bin/false +# This file is part of Espruino, a JavaScript interpreter for Microcontrollers +# +# Copyright (C) 2013 Gordon Williams +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# ---------------------------------------------------------------------------------------- +# This file contains information for a specific board - the available pins, and where LEDs, +# Buttons, and other in-built peripherals are. It is used to build documentation as well +# as various source and header files for Espruino. +# ---------------------------------------------------------------------------------------- + + + +# A Note about the 'variables' parameter on ESP32 Builds +# ------------------------------------------------------ +# +# For the ESP32 build, the number of JsVars is governed by two factors: +# * Available memory +# * Maximum number of JsVars for the used JsVar format +# +# This setting will chose the optimum JsVar format for a given number +# of JsVars. + +# If you add PSRAM to your ESP32 or compile with modules removed, you +# may wish to select a value using this table: +# +# Value | Max JsVars | Bytes per JsVar | Maximum References | +# ------+--------------+-----------------+--------------------+ +# 4095 | 4095 | 13 | 255 | +# 8191 | 8191 | 13 | 15 | +# 16383 | 16383 | 14 | 255 | +# 65535 | 65535 | 16 | 255 | +# ------+--------------+-----------------+--------------------+ + +# CAUTION: Chosing 8191 only allows 15 references to a variable. This +# may be too restrictive to run some code. + +# Using too large a JsVar format may limit how many JsVars can fit into +# available memory. Using too small a JsVar format will under utilise +# available memory. + + +import pinutils; +info = { + 'name' : "ESP32_CYD", + 'espruino_page_link' : 'ESP32', + 'default_console' : "EV_SERIAL1", + 'default_console_baudrate' : "115200", + 'variables' : 16383, # See note above + 'io_buffer_size' : 1024, # How big is the input buffer (in 4 byte words). Default is 256, but this makes us less likely to drop data + 'binary_name' : 'espruino_%v_esp32_cyd.bin', + 'build' : { + 'optimizeflags' : '-Og', + 'libraries' : [ + 'ESP32', + 'NET', + 'GRAPHICS', + 'CRYPTO','SHA256','SHA512', + 'TLS', + 'TELNET', +# 'NEOPIXEL', + 'FILESYSTEM', + 'BLUETOOTH', + 'LCD_SPI_UNBUF' + ], + 'makefile' : [ + 'DEFINES+=-DESP_PLATFORM -DESP32=1', + 'DEFINES+=-DESP_STACK_SIZE=25000', + 'DEFINES+=-DJSVAR_MALLOC', # Allocate space for variables at jsvInit time + 'DEFINES+=-DESPR_GRAPHICS_INTERNAL -DESPR_GRAPHICS_SELF_INIT', # ensure graphics instantiates itself + 'DEFINES+=-DUSE_FONT_6X8 -DSPISENDMANY_BUFFER_SIZE=1600', + 'ESP32_FLASH_MAX=1572864' + ] + } +}; + +chip = { + 'part' : "ESP32", + 'family' : "ESP32", + 'package' : "", + 'ram' : 512, + 'flash' : 0, + 'speed' : 240, + 'usart' : 3, + 'spi' : 2, + 'i2c' : 2, + 'adc' : 2, + 'dac' : 0, + 'saved_code' : { + 'address' : 0x320000, + 'page_size' : 4096, + 'pages' : 64, + 'flash_available' : 1344, # firmware can be up to this size - see partitions_espruino.csv + }, +}; +devices = { +#https://github.com/witnessmenow/ESP32-Cheap-Yellow-Display/blob/main/PINS.md + 'LED1' : { 'pin' : 'D4' }, # FIXME swap polarity of LEDs + 'LED2' : { 'pin' : 'D16' }, + 'LED3' : { 'pin' : 'D17' }, + 'BTN1' : { 'pin' : 'D0', "inverted":1, 'pinstate' : 'IN_PULLUP' }, # FIXME swap polarity of button + 'SD' : { 'pin_cs' : 'D5', + 'pin_di' : 'D23', + 'pin_do' : 'D19', + 'pin_clk' : 'D18' }, + 'QWIIC0' : { # CN1 + 'pin_sda' : 'D22', + 'pin_scl' : 'D27' + }, + 'QWIIC1' : { # P1 + 'pin_sda' : 'D1', + 'pin_scl' : 'D3' + }, + 'QWIIC3' : { # P3 + 'pin_sda' : 'D35', + 'pin_scl' : 'D22', + 'pin_vcc' : 'D21', + }, + 'TOUCHSCREEN' : { # XPT2046 + 'pin_irq' : 'D36', + 'pin_cs' : 'D33', + 'pin_sck' : 'D25', + 'pin_miso' : 'D39', + 'pin_mosi' : 'D32' + }, + 'LCD' : { + 'width' : 320, 'height' : 240, 'bpp' : 16, 'controller' : 'ili9341', + 'pin_dc' : 'D2', + 'pin_cs' : 'D15', + 'pin_sck' : 'D14', + 'pin_mosi' : 'D13', + 'pin_miso' : 'D12', + 'pin_bl' : 'D21', # backlight pwm + 'spi_device' : 'EV_SPI1' + }, + # LCD on pin 34 +}; + +# left-right, or top-bottom order +board_esp32 = { +}; +board_esp32["_css"] = """ +#board { + width: 600px; + height: 435px; + left: 50px; + top: 170px; + background-image: url(img/ESP32_CYD.jpg); +} +#boardcontainer { + height: 700px; +} +#board #right { + top: 80px; + left: 600px; +} +#board #top { + bottom: 440px; + left: 155px; +} +#board #bottom { + top: 435px; + left: 155px; +} +#board .rightpin { + height: 28px; +} +#board .toppin, #board .bottompin { + width: 24px; +} +"""; + +boards = [ board_esp32 ]; + +def get_pins(): + + +# { "name":"PD20", "sortingname":"D20", "port":"D", "num":"30", "functions":{ "I2C1_SDA":0 }, "csv":{} }, + + +# pins = pinutils.generate_pins(0,5); +##6-11 are used by Flash chip +# pins.extend(pinutils.generate_pins(12,23)); + +# pins.extend(pinutils.generate_pins(25,27)); +##32-33 are routed to rtc for xtal +# pins.extend(pinutils.generate_pins(34,39)); + +# pins = pinutils.fill_gaps_in_pin_list(pins); + + pins = pinutils.generate_pins(0,39) # 40 General Purpose I/O Pins. + + pinutils.findpin(pins, "PD36", True)["functions"]["ADC1_IN0"]=0; + pinutils.findpin(pins, "PD37", True)["functions"]["ADC1_IN1"]=0; + pinutils.findpin(pins, "PD38", True)["functions"]["ADC1_IN2"]=0; + pinutils.findpin(pins, "PD39", True)["functions"]["ADC1_IN3"]=0; + pinutils.findpin(pins, "PD32", True)["functions"]["ADC1_IN4"]=0; + pinutils.findpin(pins, "PD33", True)["functions"]["ADC1_IN5"]=0; + pinutils.findpin(pins, "PD34", True)["functions"]["ADC1_IN6"]=0; + pinutils.findpin(pins, "PD35", True)["functions"]["ADC1_IN7"]=0; + +#ADC2 not supported yet, waiting for driver from espressif +# pinutils.findpin(pins, "PD4", True)["functions"]["ADC2_IN0"]=0; +# pinutils.findpin(pins, "PD0", True)["functions"]["ADC2_IN1"]=0; +# pinutils.findpin(pins, "PD2", True)["functions"]["ADC2_IN2"]=0; +# pinutils.findpin(pins, "PD15", True)["functions"]["ADC2_IN3"]=0; +# pinutils.findpin(pins, "PD13", True)["functions"]["ADC2_IN4"]=0; +# pinutils.findpin(pins, "PD12", True)["functions"]["ADC2_IN5"]=0; +# pinutils.findpin(pins, "PD14", True)["functions"]["ADC2_IN6"]=0; +# pinutils.findpin(pins, "PD27", True)["functions"]["ADC2_IN7"]=0; + + pinutils.findpin(pins, "PD25", True)["functions"]["DAC_OUT1"]=0; + pinutils.findpin(pins, "PD26", True)["functions"]["DAC_OUT2"]=0; + + pinutils.findpin(pins, "PD0", True)["functions"]["LED_1"]=0; + + pinutils.findpin(pins, "PD10", True)["functions"]["USART0_TX"]=0; + pinutils.findpin(pins, "PD16", True)["functions"]["USART2_RX"]=0; + pinutils.findpin(pins, "PD17", True)["functions"]["USART2_TX"]=0; + pinutils.findpin(pins, "PD32", True)["functions"]["USART0_RX"]=0; + + pinutils.findpin(pins, "PD13", True)["functions"]["SPI1_MOSI"]=0; + pinutils.findpin(pins, "PD12", True)["functions"]["SPI1_MISO"]=0; + pinutils.findpin(pins, "PD14", True)["functions"]["SPI1_SCLK"]=0; + pinutils.findpin(pins, "PD23", True)["functions"]["SPI2_MOSI"]=0; + pinutils.findpin(pins, "PD19", True)["functions"]["SPI2_MISO"]=0; + pinutils.findpin(pins, "PD18", True)["functions"]["SPI2_SCLK"]=0; + + + # everything is non-5v tolerant + #for pin in pins: + # pin["functions"]["3.3"]=0; + return pins diff --git a/libs/graphics/jswrap_graphics.c b/libs/graphics/jswrap_graphics.c index c32ef7bc5..25be71e82 100644 --- a/libs/graphics/jswrap_graphics.c +++ b/libs/graphics/jswrap_graphics.c @@ -29,6 +29,9 @@ #ifdef USE_LCD_ST7789_8BIT #include "lcd_st7789_8bit.h" #endif +#ifdef USE_LCD_SPI_UNBUF +#include "lcd_spi_unbuf.h" +#endif #include "jswrap_functions.h" // for asURL #include "jswrap_object.h" // for getFonts @@ -560,6 +563,10 @@ void jswrap_graphics_init() { gfx->data.type = JSGRAPHICSTYPE_FSMC; lcdInit_FSMC(gfx); lcdSetCallbacks_FSMC(gfx); +#elif defined(USE_LCD_SPI_UNBUF) + gfx->data.type = JSGRAPHICSTYPE_LCD_SPI_UNBUF; + lcd_spi_unbuf_init(gfx); + lcd_spi_unbuf_setCallbacks(gfx); #else #error Unknown LCD type #endif diff --git a/libs/graphics/lcd_spi_unbuf.c b/libs/graphics/lcd_spi_unbuf.c index 68410e920..aa12b50fe 100644 --- a/libs/graphics/lcd_spi_unbuf.c +++ b/libs/graphics/lcd_spi_unbuf.c @@ -17,6 +17,7 @@ "class" : "lcd_spi_unbuf" }*/ +#include "lcd_spilcd_info.h" #include "lcd_spi_unbuf.h" #include "jsutils.h" #include "jsinteractive.h" @@ -63,6 +64,20 @@ static inline _put_pixel( uint16_t c) { if (_chunk_index==LCD_SPI_UNBUF_LEN) flush_chunk_buffer(); } +void lcdSendInitCmd_SPILCD() { + // Send initialization commands to ST7735 + const unsigned char *cmd = SPILCD_INIT_CODE; + while(cmd[CMDINDEX_DATALEN]!=255) { + jshPinSetValue(_pin_cs, 0); + spi_cmd(cmd[CMDINDEX_CMD]); + if (cmd[CMDINDEX_DATALEN]) spi_data(&cmd[3], cmd[CMDINDEX_DATALEN]); + if (cmd[CMDINDEX_DELAY]) + jshDelayMicroseconds(1000*cmd[CMDINDEX_DELAY]); + jshPinSetValue(_pin_cs, 1); + cmd += 3 + cmd[CMDINDEX_DATALEN]; + } +} + /// flush chunk buffer to screen void lcd_flip(JsVar *parent) { if(_chunk_index == 0) return; @@ -164,6 +179,45 @@ JsVar *jswrap_lcd_spi_unbuf_connect(JsVar *device, JsVar *options) { return parent; } +#ifdef LCD_SPI_DEVICE +void lcd_spi_unbuf_init(JsGraphics *gfx) { + gfx->data.width = LCD_WIDTH; + gfx->data.height = LCD_HEIGHT; + gfx->data.bpp = LCD_BPP; + + _pin_mosi = LCD_SPI_MOSI; + _pin_clk = LCD_SPI_SCK; + _pin_cs = LCD_SPI_CS; + _pin_dc = LCD_SPI_DC; + _device = LCD_SPI_DEVICE; + _colstart = 0; + _rowstart = 0; + +#ifdef LCD_BL + jshPinOutput(LCD_BL, 1); +#endif +#ifdef LCD_EN + jshPinOutput(LCD_EN, 1); +#endif + jshPinOutput(_pin_dc, 1); + jshPinOutput(_pin_cs, 1); + + JshSPIInfo inf; + jshSPIInitInfo(&inf); +#ifndef LCD_SPI_BITRATE +#define LCD_SPI_BITRATE 8000000 +#endif + inf.baudRate = LCD_SPI_BITRATE; + inf.pinMOSI = LCD_SPI_MOSI; +#ifdef LCD_SPI_MISO + inf.pinMISO = LCD_SPI_MISO; +#endif + inf.pinSCK = LCD_SPI_SCK; + jshSPISetup(_device, &inf); + lcdSendInitCmd_SPILCD(); +} +#endif + void disp_spi_transfer_addrwin(int x1, int y1, int x2, int y2) { unsigned char wd[4]; flush_chunk_buffer(); diff --git a/libs/graphics/lcd_spi_unbuf.h b/libs/graphics/lcd_spi_unbuf.h index 04389ee3a..8cdcd4e59 100644 --- a/libs/graphics/lcd_spi_unbuf.h +++ b/libs/graphics/lcd_spi_unbuf.h @@ -8,7 +8,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * ---------------------------------------------------------------------------- - * Graphics Backend for drawing to SPI displays in unbuffered mode + * Graphics Backend for drawing to SPI displays in unbuffered mode * ---------------------------------------------------------------------------- */ @@ -27,6 +27,8 @@ typedef struct { int rowstart; //!< Aditional starting address some pixels dont begin at 0 } JshLCD_SPI_UNBUFInfo; +void lcd_spi_unbuf_init(JsGraphics *gfx); + bool jswrap_lcd_spi_unbuf_idle(); JsVar *jswrap_lcd_spi_unbuf_connect(JsVar *device, JsVar *options); void lcd_spi_unbuf_setCallbacks(JsGraphics *gfx); diff --git a/libs/graphics/lcd_spilcd_info.h b/libs/graphics/lcd_spilcd_info.h index c68cb8cf6..cb77abaa1 100644 --- a/libs/graphics/lcd_spilcd_info.h +++ b/libs/graphics/lcd_spilcd_info.h @@ -18,6 +18,40 @@ #define CMDINDEX_DELAY 1 #define CMDINDEX_DATALEN 2 +#ifdef LCD_CONTROLLER_ILI9341 +static const unsigned char SPILCD_INIT_CODE[] = { + // CMD,DELAY,DATA_LEN,D0,D1,D2... + 0xCF/*ILI_PCB*/, 0, 3, 0x00, 0xC1, 0X30, + 0xED/*ILI_POSC*/, 0, 4, 0x64, 0x03, 0X12, 0X81, + 0xE8/*ILI_DTCA_ic*/, 0, 3, 0x85, 0x10, 0x7A, + 0xCB/*ILI_PCA*/, 0, 5, 0x39, 0x2C, 0x00, 0x34, 0x02, + 0xF7/*ILI_PRC*/,0, 1, 0x20, + 0xEA/*ILI_DTCB*/, 0, 2, 0x00, 0x00, + 0xC0/*ILI_PWCTRL1*/, 0, 1, 0x1B, + 0xC1/*ILI_PWCTRL2*/,0, 1, 0x01, + 0xC5/*ILI_VMCTRL1*/, 0, 2, 0x30, 0x30, + 0xC7/*ILI_VMCTRL2*/, 0, 1, 0XB7, + 0x36/*ILI_MADCTL*/, 0, 1, 0x48, + 0x3A/*ILI_PIXSET*/, 0, 1, 0x55, + 0xB1/*ILI_FRMCTR1*/, 0, 2, 0x00, 0x1A, + 0xB6/*ILI_DISCTRL*/, 0, 2, 0x0A, 0xA2, + 0xF2/*ILI_E3G*/, 0, 1, 0x00, + 0x26/*ILI_GAMSET*/, 0, 1, 0x01, + 0xE0/*ILI_PGAMCTRL*/, 0, 15, 0x0F, 0x2A, 0x28, 0x08, 0x0E, 0x08, 0x54, 0XA9, 0x43, 0x0A, 0x0F, 0x00, 0x00, 0x00, 0x00, + 0xE1/*ILI_NGAMCTRL*/, 0, 15, 0x00, 0x15, 0x17, 0x07, 0x11, 0x06, 0x2B, 0x56, 0x3C, 0x05, 0x10, 0x0F, 0x3F, 0x3F, 0x0F, + 0x2B/*ILI_PASET*/, 0, 4, 0x00, 0x00, 0x01, 0x3f, + 0x2A/*ILI_CASET*/, 0, 4, 0x00, 0x00, 0x00, 0xef, + 0x11/*ILI_SLPOUT*/, 120, 0, + 0x29/*ILI_DISPON*/, 0, 0, + 0x36/*ILI_MADCTL*/, 0, 1, 0x68, + // End + 0, 0, 255/*DATA_LEN = 255 => END*/ +}; + +const unsigned char SPILCD_CMD_WINDOW_X = 0x2A; +const unsigned char SPILCD_CMD_WINDOW_Y = 0x2B; +const unsigned char SPILCD_CMD_DATA = 0x2C; +#endif #ifdef LCD_CONTROLLER_ST7735 static const unsigned char SPILCD_INIT_CODE[] = { // CMD,DELAY,DATA_LEN,D0,D1,D2... @@ -130,7 +164,7 @@ static const unsigned char SPILCD_INIT_CODE[] = { 0x36,0,1, 0xB8, // Memory Access Control (rotated 270 degrees) #else 0x36,0,1, 0x88, // Memory Access Control (no rotation) - #endif + #endif #else 0x36,0,1, 0x88, // Memory Access Control (no rotation) #endif diff --git a/scripts/build_platform_config.py b/scripts/build_platform_config.py index bef2a5436..849ad1597 100755 --- a/scripts/build_platform_config.py +++ b/scripts/build_platform_config.py @@ -430,19 +430,22 @@ if "LCD" in board.devices: if "pin_reset" in board.devices["LCD"]: codeOutDevicePin("LCD", "pin_reset", "LCD_RESET") if board.devices["LCD"]["controller"]=="ssd1306" or board.devices["LCD"]["controller"]=="st7567" or board.devices["LCD"]["controller"]=="st7789v" or board.devices["LCD"]["controller"]=="st7735" or board.devices["LCD"]["controller"]=="gc9a01": - codeOutDevicePin("LCD", "pin_mosi", "LCD_SPI_MOSI") - codeOutDevicePin("LCD", "pin_sck", "LCD_SPI_SCK") - codeOutDevicePin("LCD", "pin_cs", "LCD_SPI_CS") - codeOutDevicePin("LCD", "pin_dc", "LCD_SPI_DC") codeOutDevicePin("LCD", "pin_rst", "LCD_SPI_RST") if board.devices["LCD"]["controller"]=="LPM013M126": - codeOutDevicePin("LCD", "pin_mosi", "LCD_SPI_MOSI") - codeOutDevicePin("LCD", "pin_sck", "LCD_SPI_SCK") - codeOutDevicePin("LCD", "pin_cs", "LCD_SPI_CS") codeOutDevicePin("LCD", "pin_disp", "LCD_DISP") codeOutDevicePin("LCD", "pin_extcomin", "LCD_EXTCOMIN") + if "pin_cs" in board.devices["LCD"]: + codeOutDevicePin("LCD", "pin_cs", "LCD_SPI_CS") + if "pin_mosi" in board.devices["LCD"]: + codeOutDevicePin("LCD", "pin_mosi", "LCD_SPI_MOSI") if "pin_miso" in board.devices["LCD"]: codeOutDevicePin("LCD", "pin_miso", "LCD_SPI_MISO") + if "pin_sck" in board.devices["LCD"]: + codeOutDevicePin("LCD", "pin_sck", "LCD_SPI_SCK") + if "pin_dc" in board.devices["LCD"]: + codeOutDevicePin("LCD", "pin_dc", "LCD_SPI_DC") + if "spi_device" in board.devices["LCD"]: + codeOut("#define LCD_SPI_DEVICE "+board.devices["LCD"]["spi_device"]) if "pin_tearing" in board.devices["LCD"]: codeOutDevicePin("LCD", "pin_tearing", "LCD_TEARING") @@ -453,8 +456,8 @@ if "SD" in board.devices: if "pin_cd" in board.devices["SD"]: codeOutDevicePin("SD", "pin_cd", "SD_DETECT_PIN") if "pin_pwr" in board.devices["SD"]: codeOutDevicePin("SD", "pin_pwr", "SD_POWER_PIN") if "pin_cs" in board.devices["SD"]: codeOutDevicePin("SD", "pin_cs", "SD_CS_PIN") - if "pin_di" in board.devices["SD"]: codeOutDevicePin("SD", "pin_di", "SD_DI_PIN") - if "pin_do" in board.devices["SD"]: codeOutDevicePin("SD", "pin_do", "SD_DO_PIN") + if "pin_di" in board.devices["SD"]: codeOutDevicePin("SD", "pin_di", "SD_DI_PIN") # MOSI + if "pin_do" in board.devices["SD"]: codeOutDevicePin("SD", "pin_do", "SD_DO_PIN") # MISO if "pin_clk" in board.devices["SD"]: codeOutDevicePin("SD", "pin_clk", "SD_CLK_PIN") if not "pin_d3" in board.devices["SD"]: # NOT SDIO - normal SD @@ -469,7 +472,7 @@ if "SD" in board.devices: if "pin_d1" in board.devices["SD"]: codeOutDevicePin("SD", "pin_d1", "SD_D1_PIN") if "pin_d2" in board.devices["SD"]: codeOutDevicePin("SD", "pin_d2", "SD_D2_PIN") if "pin_d3" in board.devices["SD"]: codeOutDevicePin("SD", "pin_d3", "SD_D3_PIN") - if "pin_cmd" in board.devices["SD"]: codeOutDevicePin("SD", "pin_cmd", "SD_CMD_PIN") + if "pin_cmd" in board.devices["SD"]: codeOutDevicePin("SD", "pin_cmd", "SD_CMD_PIN") if "IR" in board.devices: codeOutDevicePin("IR", "pin_anode", "IR_ANODE_PIN") diff --git a/targets/esp32/jshardwareSpi.c b/targets/esp32/jshardwareSpi.c index 7b26d8b7b..8d08f48e7 100644 --- a/targets/esp32/jshardwareSpi.c +++ b/targets/esp32/jshardwareSpi.c @@ -62,12 +62,12 @@ void jshSetDeviceInitialised(IOEventFlags device, bool isInit); /* https://hackadaycom.files.wordpress.com/2016/10/esp32_pinmap.png -HSPI 2 //SPI bus normally mapped to pins 12 - 15, but can be matrixed to any pins +SPI1 -> HSPI 2 //SPI bus normally mapped to pins 12 - 15, but can be matrixed to any pins 15 HSPI SS 14 HSPI SCK 12 HSPI MISO 13 HSPI MOSI -VSPI 3 //SPI bus normally attached to pin: +SPI2 -> VSPI 3 //SPI bus normally attached to pin: 5 VSPI SS 18 VSPI SCK 19 VSPI MISO