add new hardware port
This commit is contained in:
parent
efff96052a
commit
14f4ee403d
@ -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
1184
baseS3.sdkconfig
Normal file
File diff suppressed because it is too large
Load Diff
@ -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;
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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"
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
68
components/retro-go/targets/esplay-s3.h
Normal file
68
components/retro-go/targets/esplay-s3.h
Normal 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
|
||||
Loading…
x
Reference in New Issue
Block a user