diff --git a/components/retro-go/config.h b/components/retro-go/config.h index a7bda5186..a17d21e9b 100644 --- a/components/retro-go/config.h +++ b/components/retro-go/config.h @@ -32,6 +32,8 @@ #include "targets/vmu/config.h" #elif defined(RG_TARGET_CROKPOCKET) #include "targets/crokpocket/config.h" +#elif defined(RG_TARGET_SCRATCH_ARCADE) +#include "targets/scratch-arcade/config.h" #else #warning "No target defined. Defaulting to ODROID-GO." #include "targets/odroid-go/config.h" diff --git a/components/retro-go/targets/scratch-arcade/config.h b/components/retro-go/targets/scratch-arcade/config.h new file mode 100644 index 000000000..084542287 --- /dev/null +++ b/components/retro-go/targets/scratch-arcade/config.h @@ -0,0 +1,94 @@ +// Target definition +#define RG_TARGET_NAME "SCRATCH-ARCADE" + +// Storage +#define RG_STORAGE_ROOT "/vfs" +#define RG_STORAGE_FLASH_PARTITION "vfs" + +// Audio +#define RG_AUDIO_USE_INT_DAC 0 // 0 = Disable +#define RG_AUDIO_USE_EXT_DAC 1 // 0 = Disable, 1 = Enable + +// Video +#define RG_SCREEN_DRIVER 0 // 0 = ST7789 +#define RG_SCREEN_HOST SPI2_HOST +#define RG_SCREEN_SPEED SPI_MASTER_FREQ_40M // SPI_MASTER_FREQ_80M +#define RG_SCREEN_BACKLIGHT 1 +#define RG_SCREEN_WIDTH 320 +#define RG_SCREEN_HEIGHT 240 +#define RG_SCREEN_ROTATE 0 +#define RG_SCREEN_VISIBLE_AREA {0, 0, 0, 0} // Left, Top, Right, Bottom +#define RG_SCREEN_SAFE_AREA {0, 0, 0, 0} // Left, Top, Right, Bottom + +#define ST7789_MADCTL 0x36 // Memory Access Control +#define ST7789_MADCTL_MV 0x20 +#define ST7789_MADCTL_RGB 0x00 +#define ST7789_MADCTL_BGR 0x08 + +#define RG_SCREEN_INIT() \ + ILI9341_CMD(0xCF, 0x00, 0xc3, 0x30); \ + ILI9341_CMD(0xED, 0x64, 0x03, 0x12, 0x81); \ + ILI9341_CMD(0xE8, 0x85, 0x00, 0x78); \ + ILI9341_CMD(0xCB, 0x39, 0x2c, 0x00, 0x34, 0x02); \ + ILI9341_CMD(0xF7, 0x20); \ + ILI9341_CMD(0xEA, 0x00, 0x00); \ + ILI9341_CMD(0xC0, 0x1B); /* Power control //VRH[5:0] */ \ + ILI9341_CMD(0xC1, 0x12); /* Power control //SAP[2:0];BT[3:0] */ \ + ILI9341_CMD(0xC5, 0x32, 0x3C); /* VCM control */ \ + ILI9341_CMD(0xC7, 0x91); /* VCM control2 */ \ + ILI9341_CMD(ST7789_MADCTL, (ST7789_MADCTL_BGR)); \ + ILI9341_CMD(0xB1, 0x00, 0x10); /* Frame Rate Control (1B=70, 1F=61, 10=119) */ \ + ILI9341_CMD(0xB6, 0x0A, 0xA2); /* Display Function Control */ \ + ILI9341_CMD(0xF6, 0x01, 0x30); \ + ILI9341_CMD(0xF2, 0x00); /* 3Gamma Function Disable */ \ + ILI9341_CMD(0xE0, 0xD0, 0x00, 0x05, 0x0E, 0x15, 0x0D, 0x37, 0x43, 0x47, 0x09, 0x15, 0x12, 0x16, 0x19); \ + ILI9341_CMD(0xE1, 0xD0, 0x00, 0x05, 0x0D, 0x0C, 0x06, 0x2D, 0x44, 0x40, 0x0E, 0x1C, 0x18, 0x16, 0x19); + + +// Input +#define RG_GAMEPAD_ADC_MAP {\ + {RG_KEY_UP, ADC_UNIT_1, ADC_CHANNEL_7, ADC_ATTEN_DB_11, 3072, 4096},\ + {RG_KEY_RIGHT, ADC_UNIT_1, ADC_CHANNEL_5, ADC_ATTEN_DB_11, 0, 1023},\ + {RG_KEY_DOWN, ADC_UNIT_1, ADC_CHANNEL_7, ADC_ATTEN_DB_11, 0, 1023},\ + {RG_KEY_LEFT, ADC_UNIT_1, ADC_CHANNEL_5, ADC_ATTEN_DB_11, 3072, 4096},\ +} + +// KEY Y GPIO4 being held down... +#define RG_GAMEPAD_GPIO_MAP {\ + {RG_KEY_START, .num = GPIO_NUM_0, .pullup = 1, .level = 0},\ + {RG_KEY_A, .num = GPIO_NUM_5, .pullup = 1, .level = 0},\ + {RG_KEY_B, .num = GPIO_NUM_39, .pullup = 1, .level = 0},\ + {RG_KEY_OPTION, .num = GPIO_NUM_9, .pullup = 1, .level = 0},\ +} + +#define RG_GAMEPAD_VIRT_MAP {\ + {RG_KEY_MENU, .src = RG_KEY_OPTION | RG_KEY_START},\ + {RG_KEY_X, .src = RG_KEY_OPTION | RG_KEY_A},\ + {RG_KEY_Y, .src = RG_KEY_OPTION | RG_KEY_B},\ +} + +#define RG_RECOVERY_BTN RG_KEY_OPTION + +// Battery +#define RG_BATTERY_DRIVER 1 +#define RG_BATTERY_ADC_UNIT ADC_UNIT_1 +#define RG_BATTERY_ADC_CHANNEL ADC_CHANNEL_3 +#define RG_BATTERY_CALC_PERCENT(raw) (((raw) * 2.f - 3150.f) / (4100.f - 3150.f) * 100.f) +#define RG_BATTERY_CALC_VOLTAGE(raw) ((raw) * 2.f * 0.001f) + +// Status LED +#define RG_GPIO_LED GPIO_NUM_6 + +// SPI Display +#define RG_GPIO_LCD_MISO GPIO_NUM_NC +#define RG_GPIO_LCD_MOSI GPIO_NUM_11 +#define RG_GPIO_LCD_CLK GPIO_NUM_12 +#define RG_GPIO_LCD_CS GPIO_NUM_10 +#define RG_GPIO_LCD_DC GPIO_NUM_45 +#define RG_GPIO_LCD_BCKL GPIO_NUM_21 +#define RG_GPIO_LCD_RST GPIO_NUM_46 + +// External I2S DAC +#define RG_GPIO_SND_I2S_BCK 41 +#define RG_GPIO_SND_I2S_WS 42 +#define RG_GPIO_SND_I2S_DATA 01 diff --git a/components/retro-go/targets/scratch-arcade/docs/README.md b/components/retro-go/targets/scratch-arcade/docs/README.md new file mode 100644 index 000000000..424411b22 --- /dev/null +++ b/components/retro-go/targets/scratch-arcade/docs/README.md @@ -0,0 +1,25 @@ +# Scratch Arcade (https://arcade.blockcode.fun/#/zh-cn/intro?id=scratch-arcade) +- Status: Completed + +# Hardware info +- ESP32-S3 N8R8 (8MB flash + 8MB PSRAM) +- 2" 320x240 ST7789 display +- 800mAh battery +- USB-C charging port +- Status LED's for charging and RetroGo + +# Images +![device.jpg](device.jpg) + +# Build +`python rg_tool.py build-img --target scratch-arcade --fatsize 2M` +`mkdir -p rootfs/roms/nes` +`cp *.nes rootfs/roms/nes/` +`python $IDF_PATH/components/fatfs/fatfsgen.py --output_file vfs.bin rootfs` + +# Flash +`esptool.py write_flash --flash_size detect 0x0 retro-go_1.xx_scratch-arcade.img` +`esptool.py write_flash --flash_size detect 4587520 vfs.bin` + +# Dev +`python rg_tool.py --target crokpocket --port COM9 run launcher` diff --git a/components/retro-go/targets/scratch-arcade/docs/device.jpg b/components/retro-go/targets/scratch-arcade/docs/device.jpg new file mode 100644 index 000000000..45d26ff9f Binary files /dev/null and b/components/retro-go/targets/scratch-arcade/docs/device.jpg differ diff --git a/components/retro-go/targets/scratch-arcade/env.py b/components/retro-go/targets/scratch-arcade/env.py new file mode 100644 index 000000000..28be1e3df --- /dev/null +++ b/components/retro-go/targets/scratch-arcade/env.py @@ -0,0 +1,4 @@ +import os + +os.environ["IDF_TARGET"] = "esp32s3" +os.environ["FW_FORMAT"] = "none" diff --git a/components/retro-go/targets/scratch-arcade/sdkconfig b/components/retro-go/targets/scratch-arcade/sdkconfig new file mode 100644 index 000000000..49a45aac6 --- /dev/null +++ b/components/retro-go/targets/scratch-arcade/sdkconfig @@ -0,0 +1,177 @@ +# +# Serial flasher config +# +CONFIG_ESPTOOLPY_PORT="/dev/ttyUSB0" +CONFIG_ESPTOOLPY_BAUD_115200B=n +CONFIG_ESPTOOLPY_BAUD_230400B=n +CONFIG_ESPTOOLPY_BAUD_921600B=y +CONFIG_ESPTOOLPY_BAUD_2MB=n +CONFIG_ESPTOOLPY_BAUD=921600 +CONFIG_ESPTOOLPY_COMPRESSED=y +CONFIG_ESPTOOLPY_FLASHMODE="dio" +CONFIG_ESPTOOLPY_FLASHFREQ_80M=y +CONFIG_ESPTOOLPY_FLASHFREQ_40M=n +CONFIG_ESPTOOLPY_FLASHFREQ_26M=n +CONFIG_ESPTOOLPY_FLASHFREQ_20M=n +CONFIG_ESPTOOLPY_FLASHFREQ="80m" +CONFIG_ESPTOOLPY_FLASHSIZE_1MB=n +CONFIG_ESPTOOLPY_FLASHSIZE_2MB=n +CONFIG_ESPTOOLPY_FLASHSIZE_4MB=n +CONFIG_ESPTOOLPY_FLASHSIZE_8MB=y +CONFIG_ESPTOOLPY_FLASHSIZE_16MB=n +CONFIG_ESPTOOLPY_FLASHSIZE="8MB" +CONFIG_ESPTOOLPY_FLASHSIZE_DETECT=y +CONFIG_ESPTOOLPY_FLASHMODE_QIO=y + +# +# Compiler options +# +CONFIG_COMPILER_OPTIMIZATION_DEFAULT=n +CONFIG_COMPILER_OPTIMIZATION_SIZE=y +# IMPORTANT: ENABLE=y adds almost 50K to the executable, can't fit in our current 2.5MB goal... +CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_ENABLE=n +CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_SILENT=y +CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE=n +CONFIG_COMPILER_CXX_EXCEPTIONS=n +CONFIG_COMPILER_STACK_CHECK_MODE_NONE=y +CONFIG_COMPILER_STACK_CHECK_MODE_NORM=n +CONFIG_COMPILER_STACK_CHECK_MODE_STRONG=n +CONFIG_COMPILER_STACK_CHECK_MODE_ALL=n +CONFIG_COMPILER_STACK_CHECK=n + +# +# SPI configuration +# +CONFIG_SPI_MASTER_IN_IRAM=y +CONFIG_SPI_MASTER_ISR_IN_IRAM=y + +# +# ESP32-specific +# +CONFIG_ESP32S3_DEFAULT_CPU_FREQ_40=n +CONFIG_ESP32S3_DEFAULT_CPU_FREQ_160=n +CONFIG_ESP32S3_DEFAULT_CPU_FREQ_240=y +CONFIG_ESP32S3_DEFAULT_CPU_FREQ_MHZ=240 +CONFIG_ESP_SYSTEM_PANIC_PRINT_HALT=n +CONFIG_ESP_SYSTEM_PANIC_PRINT_REBOOT=y +CONFIG_ESP_SYSTEM_PANIC_SILENT_REBOOT=n +CONFIG_ESP_SYSTEM_PANIC_GDBSTUB=n +CONFIG_ESP_DEBUG_OCDAWARE=n +CONFIG_ESP_MAIN_TASK_STACK_SIZE=8192 +CONFIG_ESP_INT_WDT=y +CONFIG_ESP_TASK_WDT=n +CONFIG_NEWLIB_NANO_FORMAT=y + +# +# SPI RAM config +# +CONFIG_ESP32S3_SPIRAM_SUPPORT=y +CONFIG_SPIRAM=y +CONFIG_SPIRAM_BOOT_INIT=y +CONFIG_SPIRAM_IGNORE_NOTFOUND=y +CONFIG_SPIRAM_USE_MEMMAP=n +CONFIG_SPIRAM_USE_CAPS_ALLOC=n +CONFIG_SPIRAM_USE_MALLOC=y +CONFIG_SPIRAM_TYPE_AUTO=y +CONFIG_SPIRAM_TYPE_ESPPSRAM32=n +CONFIG_SPIRAM_TYPE_ESPPSRAM64=n +CONFIG_SPIRAM_SIZE=-1 +CONFIG_SPIRAM_SPEED_40M=n +CONFIG_SPIRAM_SPEED_80M=y +CONFIG_SPIRAM_MEMTEST=y +CONFIG_SPIRAM_MALLOC_ALWAYSINTERNAL=32768 +CONFIG_SPIRAM_MALLOC_RESERVE_INTERNAL=32768 +CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY=y +# CONFIG_SPIRAM_ALLOW_STACK_EXTERNAL_MEMORY=y +CONFIG_SPIRAM_MODE_OCT=y +CONFIG_SPIRAM_CLK_IO=30 +CONFIG_SPIRAM_CS_IO=26 + +# +# FAT Filesystem support +# +CONFIG_FATFS_CODEPAGE_437=y +CONFIG_FATFS_CODEPAGE=437 +CONFIG_FATFS_LFN_NONE=n +CONFIG_FATFS_LFN_HEAP=y +CONFIG_FATFS_LFN_STACK=n +CONFIG_FATFS_MAX_LFN=255 +CONFIG_FATFS_USE_FASTSEEK=y + +# +# FreeRTOS +# +CONFIG_FREERTOS_HZ=100 +CONFIG_FREERTOS_CHECK_STACKOVERFLOW_NONE=n +CONFIG_FREERTOS_CHECK_STACKOVERFLOW_PTRVAL=y +CONFIG_FREERTOS_CHECK_STACKOVERFLOW_CANARY=n +CONFIG_FREERTOS_ASSERT_FAIL_ABORT=y +CONFIG_FREERTOS_ASSERT_FAIL_PRINT_CONTINUE=n +CONFIG_FREERTOS_ASSERT_DISABLE=n +CONFIG_FREERTOS_IDLE_TASK_STACKSIZE=1024 +CONFIG_FREERTOS_USE_TRACE_FACILITY=n +CONFIG_FREERTOS_GENERATE_RUN_TIME_STATS=n +CONFIG_FREERTOS_CHECK_MUTEX_GIVEN_BY_OWNER=n + +# +# Log output +# +CONFIG_LOG_DEFAULT_LEVEL_NONE=n +CONFIG_LOG_DEFAULT_LEVEL_ERROR=n +CONFIG_LOG_DEFAULT_LEVEL_WARN=y +CONFIG_LOG_DEFAULT_LEVEL_INFO=n +CONFIG_LOG_DEFAULT_LEVEL_DEBUG=n +CONFIG_LOG_DEFAULT_LEVEL_VERBOSE=n +CONFIG_LOG_DEFAULT_LEVEL=2 +CONFIG_LOG_COLORS=y + +# +# Misc +# +CONFIG_APP_BUILD_BOOTLOADER=n + +# +# HTTP Server +# +CONFIG_HTTPD_MAX_REQ_HDR_LEN=1024 +CONFIG_HTTPD_MAX_URI_LEN=1024 + +# +# TLS +# +# Not ideal but I don't want to deal with CAs right now :( +CONFIG_ESP_TLS_INSECURE=y +CONFIG_ESP_TLS_SKIP_SERVER_CERT_VERIFY=y + +# +# SPI Flash driver +# +CONFIG_SPI_FLASH_ENABLE_ENCRYPTED_READ_WRITE=n + +# +# Wi-Fi +# +CONFIG_ESP_WIFI_NVS_ENABLED=n + +# +# Ethernet +# +CONFIG_ETH_USE_ESP32_EMAC=n +CONFIG_ETH_USE_SPI_ETHERNET=n +CONFIG_ETH_USE_OPENETH=n + +# +# Silence deprecations because I have no intention of fixing them right now +# +CONFIG_ADC_SUPPRESS_DEPRECATE_WARN=y +CONFIG_I2S_SUPPRESS_DEPRECATE_WARN=y + +# +# Partition table +# +# CONFIG_PARTITION_TABLE_SINGLE_APP is not set +# CONFIG_PARTITION_TABLE_SINGLE_APP_LARGE is not set +# CONFIG_PARTITION_TABLE_TWO_OTA is not set +CONFIG_PARTITION_TABLE_CUSTOM=y +CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="../partitions.csv" +CONFIG_PARTITION_TABLE_FILENAME="../partitions.csv"