add new hardware port

This commit is contained in:
FantasyGmm 2022-08-27 15:47:02 +08:00
parent efff96052a
commit 14f4ee403d
7 changed files with 1350 additions and 7 deletions

View File

@ -1,6 +1,12 @@
include($ENV{IDF_PATH}/tools/cmake/project.cmake)
set(EXTRA_COMPONENT_DIRS "${CMAKE_CURRENT_LIST_DIR}/components")
set(SDKCONFIG_DEFAULTS "${CMAKE_CURRENT_LIST_DIR}/base.sdkconfig")
if (DEFINED "RG_TARGET_ESPLAY_S3")
message("SDKCONFIG_DEFAULTS: ${CMAKE_CURRENT_LIST_DIR}/baseS3.sdkconfig")
set(SDKCONFIG_DEFAULTS "${CMAKE_CURRENT_LIST_DIR}/baseS3.sdkconfig")
else()
message("SDKCONFIG_DEFAULTS: ${CMAKE_CURRENT_LIST_DIR}/base.sdkconfig")
set(SDKCONFIG_DEFAULTS "${CMAKE_CURRENT_LIST_DIR}/base.sdkconfig")
endif ()
macro(rg_setup_compile_options)
set(RG_TARGET "RG_TARGET_$ENV{RG_BUILD_TARGET}")

1184
baseS3.sdkconfig Normal file

File diff suppressed because it is too large Load Diff

View File

@ -69,12 +69,21 @@ void rg_audio_init(int sampleRate)
.mode = I2S_MODE_MASTER | I2S_MODE_TX,
.sample_rate = sampleRate,
.bits_per_sample = 16,
.channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT,
#ifdef RG_TARGET_ESPLAY_S3
.channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT,
.communication_format = I2S_COMM_FORMAT_STAND_I2S | I2S_COMM_FORMAT_STAND_MSB,
.intr_alloc_flags = ESP_INTR_FLAG_LEVEL1, // ESP_INTR_FLAG_LEVEL1
.dma_buf_count = 8, // Goal is to have ~800 samples over 2-8 buffers (3x270 or 5x180 are pretty good)
.dma_buf_len = 534, // The unit is stereo samples (4 bytes) (optimize for 533 usage)
.use_apll = false, // S3 cant use apll
#else
.channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT,
.communication_format = I2S_COMM_FORMAT_STAND_I2S,
.intr_alloc_flags = 0, // ESP_INTR_FLAG_LEVEL1
.intr_alloc_flags = 0, // ESP_INTR_FLAG_LEVEL1
.dma_buf_count = 4, // Goal is to have ~800 samples over 2-8 buffers (3x270 or 5x180 are pretty good)
.dma_buf_len = 180, // The unit is stereo samples (4 bytes) (optimize for 533 usage)
.use_apll = true, // External DAC may care about accuracy
#endif
};
esp_err_t ret = ESP_FAIL;

View File

@ -16,8 +16,10 @@
#define SPI_BUFFER_COUNT (6)
#define SPI_BUFFER_LENGTH (4 * 320) // In pixels (uint16)
#if CONFIG_IDF_TARGET_ESP32
#ifndef SPI_DMA_CH_AUTO
#define SPI_DMA_CH_AUTO 1
#define SPI_DMA_CH_AUTO 1
#endif
#endif
static spi_device_handle_t spi_dev;
@ -140,7 +142,11 @@ static void spi_init(void)
};
const spi_device_interface_config_t devcfg = {
.clock_speed_hz = SPI_MASTER_FREQ_40M, // 80Mhz causes glitches unfortunately
#if defined(RG_TARGET_ESPLAY_S3)
.clock_speed_hz = SPI_MASTER_FREQ_80M, // 80Mhz s3 can run 80M
#else
.clock_speed_hz = SPI_MASTER_FREQ_40M, // 80Mhz causes glitches unfortunately
#endif
.mode = 0, // SPI mode 0
.spics_io_num = RG_GPIO_LCD_CS, // CS pin
.queue_size = SPI_TRANSACTION_COUNT, // We want to be able to queue 5 transactions at a time
@ -214,7 +220,10 @@ static void lcd_init(void)
// Setup Data/Command line
// gpio_iomux_out(RG_GPIO_LCD_DC, PIN_FUNC_GPIO, false);
#if CONFIG_IDF_TARGET_ESP32
// gpio_iomux_out(RG_GPIO_LCD_DC, PIN_FUNC_GPIO, false);
PIN_FUNC_SELECT(GPIO_PIN_MUX_REG[RG_GPIO_LCD_DC], PIN_FUNC_GPIO);
#endif
gpio_set_direction(RG_GPIO_LCD_DC, GPIO_MODE_OUTPUT);
gpio_set_level(RG_GPIO_LCD_DC, 1);
@ -298,6 +307,33 @@ static void lcd_init(void)
ILI9341_CMD(0xE1, {0x00, 0x0E, 0x14, 0x03, 0x11, 0x07, 0x31, 0xC1, 0x48, 0x08, 0x0F, 0x0C, 0x31, 0x36, 0x0F}); // Set Gamma
ILI9341_CMD(0x11, {}); // Exit Sleep
ILI9341_CMD(0x29, {}); // Display on
#elif RG_SCREEN_TYPE == 4
gpio_set_direction(RG_GPIO_LCD_RST,GPIO_MODE_OUTPUT);
gpio_set_level(RG_GPIO_LCD_RST,0);
vTaskDelay(120 / portTICK_RATE_MS);
gpio_set_level(RG_GPIO_LCD_RST,1);
ILI9341_CMD(0x01, {}); // Reset
vTaskDelay(120 / portTICK_RATE_MS);
ILI9341_CMD(0x3A, {0X05}); //65k mode
ILI9341_CMD(0xC5, {0x1A}); //VCOM
ILI9341_CMD(0x36, {0x60}); //Display Rotation
ILI9341_CMD(0xB2, {0x05, 0x05, 0x00, 0x33, 0x33}); //Porch Setting
ILI9341_CMD(0xB7, {0x05}); //Gate Control //12.2v -10.43v
ILI9341_CMD(0xBB, {0x3F}); //VCOM
ILI9341_CMD(0xC0, {0x2c}); //Power control
ILI9341_CMD(0xC2, {0x01}); //VDV and VRH Command Enable
ILI9341_CMD(0xC3, {0x0F}); //VRH Set 4.3+( vcom+vcom offset+vdv)
ILI9341_CMD(0xC4, {0xBE}); //VDV Set 0v
ILI9341_CMD(0xC6, {0X01}); //Frame Rate Control in Normal Mode 111Hz
ILI9341_CMD(0xD0, {0xA4,0xA1}); //Power Control 1
ILI9341_CMD(0xE8, {0x03}); //Power Control 1
ILI9341_CMD(0xE9, {0x09,0x09,0x08}); //Equalize time control
ILI9341_CMD(0xE0, {0xD0,0x05,0x09,0x09,0x08,0x14,0x28,0x33,0x3F,0x07,0x13,0x14,0x28,0x30}); //Set Gamma
ILI9341_CMD(0xE1, {0xD0, 0x05, 0x09, 0x09, 0x08, 0x03, 0x24, 0x32, 0x32, 0x3B, 0x14, 0x13, 0x28, 0x2F, 0x1F}); //Set Gamma
ILI9341_CMD(0x20, {0x00}); //Reverse Display
ILI9341_CMD(0x11, {0x03}); //Exit Sleep
ILI9341_CMD(0x29, {0x03}); //Display on
vTaskDelay(100 / portTICK_RATE_MS);
#else
#error "LCD init sequence is not defined for this device!"
#endif

View File

@ -97,6 +97,26 @@ static inline uint32_t gamepad_read(void)
battery_level = 99;
#elif RG_GAMEPAD_DRIVER == 5 // I2C ESPLAY
uint8_t data[5];
if (rg_i2c_read(0x20, -1, &data, 5))
{
int buttons = ~((data[2] << 8) | data[1]);
if (buttons & (1 << 2)) state |= RG_KEY_UP;
if (buttons & (1 << 3)) state |= RG_KEY_DOWN;
if (buttons & (1 << 4)) state |= RG_KEY_LEFT;
if (buttons & (1 << 5)) state |= RG_KEY_RIGHT;
if (!gpio_get_level(RG_GPIO_GAMEPAD_MENU)) state |= RG_KEY_MENU;
if (!gpio_get_level(RG_GPIO_GAMEPAD_R)) state |= RG_KEY_OPTION;
if (buttons & (1 << 1)) state |= RG_KEY_SELECT;
if (buttons & (1 << 0)) state |= RG_KEY_START;
if (buttons & (1 << 6)) state |= RG_KEY_A;
if (buttons & (1 << 7)) state |= RG_KEY_B;
battery_level = data[4];
}
#endif
// Virtual buttons (combos) to replace essential missing buttons.
@ -231,7 +251,12 @@ void rg_input_init(void)
vTaskDelay(pdMS_TO_TICKS(10));
aw_digitalWrite(AW_TFT_RESET, 1);
vTaskDelay(pdMS_TO_TICKS(10));
#elif RG_GAMEPAD_DRIVER == 5 //I2C ESPLAY
const char *driver = "ESPLAY-I2C";
rg_i2c_init();
#else
#error "No gamepad driver selected"

View File

@ -13,8 +13,10 @@
static esp_err_t sdcard_mount = ESP_FAIL;
static bool disk_led = true;
#if CONFIG_IDF_TARGET_ESP32
#ifndef SPI_DMA_CH_AUTO
#define SPI_DMA_CH_AUTO 1
#define SPI_DMA_CH_AUTO 1
#endif
#endif
#define SETTING_DISK_ACTIVITY "DiskActivity"
@ -85,11 +87,24 @@ void rg_storage_init(void)
sdmmc_host_t host_config = SDMMC_HOST_DEFAULT();
host_config.flags = SDMMC_HOST_FLAG_1BIT;
#if RG_SDSPI_HIGHSPEED == 1
host_config.max_freq_khz = SDMMC_FREQ_HIGHSPEED;
#else
host_config.max_freq_khz = SDMMC_FREQ_DEFAULT;
#endif
host_config.do_transaction = &sdcard_do_transaction;
#if CONFIG_IDF_TARGET_ESP32
sdmmc_slot_config_t slot_config = SDMMC_SLOT_CONFIG_DEFAULT();
slot_config.width = 1;
#elif defined(RG_TARGET_ESPLAY_S3)
sdmmc_slot_config_t slot_config = {
.width = 1, .flags = 0,
.d0 = RG_GPIO_SDSPI_D0, .d1 = -1, .d2 = -1, .d3 = -1, .d4 = -1, .d5 = -1, .d6 = -1, .d7 = -1,
.clk = RG_GPIO_SDSPI_CLK, .cmd = RG_GPIO_SDSPI_CMD, .cd = -1, .wp = -1,
};
#else
#error "No available SD Card driver slot"
#endif
#else

View File

@ -0,0 +1,68 @@
// REF: https://wiki.odroid.com/odroid_go/odroid_go
// Target definition
#define RG_TARGET_NAME "ESPLAY-S3"
// Storage
#define RG_STORAGE_DRIVER 2 // 1 = SDSPI, 2 = SDMMC, 3 = USB
// Audio
#define RG_AUDIO_USE_INT_DAC 0
#define RG_AUDIO_USE_EXT_DAC 1
// Video
#define RG_SCREEN_DRIVER 0 // 0 = ILI9341
#define RG_SCREEN_TYPE 4 // 4 = ESPLAY-ST7789V2
#define RG_SCREEN_WIDTH 320
#define RG_SCREEN_HEIGHT 240
#define RG_SCREEN_ROTATE 0
#define RG_SCREEN_MARGIN_TOP 0
#define RG_SCREEN_MARGIN_BOTTOM 0
#define RG_SCREEN_MARGIN_LEFT 0
#define RG_SCREEN_MARGIN_RIGHT 0
// Input
#define RG_GAMEPAD_DRIVER 5 // 1 = ODROID-GO, 2 = Serial, 3 = MRGC-IO 5 = ESPLAY
#define RG_GAMEPAD_HAS_MENU_BTN 1
#define RG_GAMEPAD_HAS_OPTION_BTN 1
#define RG_BATTERY_ADC_CHANNEL ADC1_CHANNEL_3
#define RG_BATTERY_CALC_PERCENT(raw) (((raw) * 2.f - 3500.f) / (4200.f - 3500.f) * 100.f)
#define RG_BATTERY_CALC_VOLTAGE(raw) ((raw) * 2.f * 0.001f)
// Status LED
#define RG_GPIO_LED GPIO_NUM_2
// I2C BUS
#define RG_GPIO_I2C_SDA GPIO_NUM_10
#define RG_GPIO_I2C_SCL GPIO_NUM_11
// Built-in gamepad
#define RG_GPIO_GAMEPAD_L GPIO_NUM_40
#define RG_GPIO_GAMEPAD_R GPIO_NUM_41
#define RG_GPIO_GAMEPAD_MENU GPIO_NUM_42
// SNES-style gamepad
// #define RG_GPIO_GAMEPAD_LATCH GPIO_NUM_NC
// #define RG_GPIO_GAMEPAD_CLOCK GPIO_NUM_NC
// #define RG_GPIO_GAMEPAD_DATA GPIO_NUM_NC
// SPI Display
#define RG_GPIO_LCD_HOST SPI2_HOST
#define RG_GPIO_LCD_MISO GPIO_NUM_NC
#define RG_GPIO_LCD_MOSI GPIO_NUM_12
#define RG_GPIO_LCD_CLK GPIO_NUM_48
#define RG_GPIO_LCD_CS GPIO_NUM_8
#define RG_GPIO_LCD_DC GPIO_NUM_47
#define RG_GPIO_LCD_BCKL GPIO_NUM_39
#define RG_GPIO_LCD_RST GPIO_NUM_3
// SPI SD Card
#define RG_GPIO_SDSPI_CMD GPIO_NUM_14
#define RG_GPIO_SDSPI_CLK GPIO_NUM_21
#define RG_GPIO_SDSPI_D0 GPIO_NUM_17
#define RG_SDSPI_HIGHSPEED 0
// External I2S DAC
#define RG_GPIO_SND_I2S_BCK 38
#define RG_GPIO_SND_I2S_WS 13
#define RG_GPIO_SND_I2S_DATA 9
#define RG_GPIO_SND_AMP_ENABLE 18