diff --git a/components/retro-go/README.md b/components/retro-go/README.md index b0889b11..9eb74cef 100644 --- a/components/retro-go/README.md +++ b/components/retro-go/README.md @@ -14,6 +14,7 @@ Retro-Go's shared library (or framework) provides an easy way to port emulators | [fri3d-2024](targets/fri3d-2024/docs/README.md) | | | [mrgc-g32](targets/mrgc-g32/docs/README.md) | Official | | [mrgc-gbm](targets/mrgc-gbm/docs/README.md) | | +| [meowboy](targets/meowboy/config.h) | Experimental | | [nullnano](targets/nullnano/docs/README.md) | | | [odroid-go](targets/odroid-go/docs/README.md) | Official | | [qtpy-gamer](targets/qtpy-gamer/docs/README.md) | Broken | diff --git a/components/retro-go/config.h b/components/retro-go/config.h index ad3b70df..fb89cb07 100644 --- a/components/retro-go/config.h +++ b/components/retro-go/config.h @@ -6,6 +6,8 @@ #include "targets/mrgc-g32/config.h" #elif defined(RG_TARGET_RETRO_ESP32) #include "targets/retro-esp32/config.h" +#elif defined(RG_TARGET_MEOWBOY) +#include "targets/meowboy/config.h" #elif defined(RG_TARGET_RETRO_RULER_V1) #include "targets/retro-ruler-V1/config.h" #elif defined(RG_TARGET_SDL2) @@ -38,6 +40,12 @@ #define RG_TARGET_ODROID_GO #endif +#if defined(RG_TARGET_MEOWBOY) +#undef RG_AUDIO_USE_BUZZER_PIN +#define RG_AUDIO_USE_BUZZER_PIN 14 +#define RG_AUDIO_BUZZER_LEDC_CHANNEL LEDC_CHANNEL_1 +#define RG_AUDIO_BUZZER_LEDC_TIMER LEDC_TIMER_1 +#endif #ifndef RG_PROJECT_NAME #define RG_PROJECT_NAME "Retro-Go" #endif diff --git a/components/retro-go/drivers/audio/buzzer.c b/components/retro-go/drivers/audio/buzzer.c index 9627b88c..409cf612 100644 --- a/components/retro-go/drivers/audio/buzzer.c +++ b/components/retro-go/drivers/audio/buzzer.c @@ -53,9 +53,19 @@ Note that there are some restrictions on how high the PWM frequency can be, and #define SOURCE_CLOCK_MIN_DIVIDER 2 // divider must be [2-65536], according to the docs #define SOURCE_CLOCK_FREQUENCY 80000000 #define SOURCE_CLOCK_MAX_FREQUENCY SOURCE_CLOCK_FREQUENCY/SOURCE_CLOCK_MIN_DIVIDER -#define LEDC_PWM_SPEED_MODE LEDC_LOW_SPEED_MODE -#define LEDC_PWM_CHANNEL LEDC_CHANNEL_0 -#define LEDC_PWM_TIMER LEDC_TIMER_0 +#ifndef RG_AUDIO_BUZZER_LEDC_SPEED_MODE +#define RG_AUDIO_BUZZER_LEDC_SPEED_MODE LEDC_LOW_SPEED_MODE +#endif +#ifndef RG_AUDIO_BUZZER_LEDC_CHANNEL +#define RG_AUDIO_BUZZER_LEDC_CHANNEL LEDC_CHANNEL_0 +#endif +#ifndef RG_AUDIO_BUZZER_LEDC_TIMER +#define RG_AUDIO_BUZZER_LEDC_TIMER LEDC_TIMER_0 +#endif + +#define LEDC_PWM_SPEED_MODE RG_AUDIO_BUZZER_LEDC_SPEED_MODE +#define LEDC_PWM_CHANNEL RG_AUDIO_BUZZER_LEDC_CHANNEL +#define LEDC_PWM_TIMER RG_AUDIO_BUZZER_LEDC_TIMER #define GENERAL_PURPOSE_TIMER_GROUP TIMER_GROUP_0 #define GENERAL_PURPOSE_TIMER TIMER_0 @@ -179,7 +189,7 @@ static bool buzzer_init(int device, int sampleRate) precompute_sine_wave(sampleRate); #endif - sampleQueue = xQueueCreate(cacheSamples*2, sizeof(int16_t*)); + sampleQueue = xQueueCreate(cacheSamples*2, sizeof(int16_t)); if (!sampleQueue) { RG_LOGE("could not create sampleQueue"); return false; diff --git a/components/retro-go/targets/meowboy/config.h b/components/retro-go/targets/meowboy/config.h new file mode 100644 index 00000000..7f741d7b --- /dev/null +++ b/components/retro-go/targets/meowboy/config.h @@ -0,0 +1,87 @@ +// Target definition +#define RG_TARGET_NAME "MEOWBOY" + +// Storage +#define RG_STORAGE_ROOT "/sd" +#define RG_STORAGE_SDSPI_HOST SPI2_HOST +#define RG_STORAGE_SDSPI_SPEED SDMMC_FREQ_DEFAULT +// #define RG_STORAGE_FLASH_PARTITION "vfs" + +// Audio +// The board has a buzzer/speaker on GPIO14. Do not enable DAC audio because +// GPIO25/GPIO26 are exposed on external ports 4/3. +#define RG_AUDIO_USE_BUZZER_PIN 14 +#define RG_AUDIO_USE_INT_DAC 0 // 0 = Disable, 1 = GPIO25, 2 = GPIO26, 3 = Both +#define RG_AUDIO_USE_EXT_DAC 0 // 0 = Disable, 1 = Enable + +// Video +// The panel is driven like an ST7735 160x128 screen. Retro-Go's ILI9341 driver +// is SPI-command based and works for this controller with a target init block. +#define RG_SCREEN_DRIVER 0 // 0 = ILI9341/ST7789-compatible SPI LCD +#define RG_SCREEN_HOST SPI2_HOST +#define RG_SCREEN_SPEED 24000000 +#define RG_SCREEN_BACKLIGHT 1 +#define RG_SCREEN_WIDTH 160 +#define RG_SCREEN_HEIGHT 128 +#define RG_SCREEN_ROTATE 0 +#define RG_SCREEN_VISIBLE_AREA {0, 0, 0, 0} +#define RG_SCREEN_SAFE_AREA {0, 0, 0, 0} +#define RG_SCREEN_INIT() \ + ILI9341_CMD(0x11); \ + rg_usleep(100 * 1000); \ + ILI9341_CMD(0x36, 0x60); \ + ILI9341_CMD(0x3A, 0x05) +#define RG_SCREEN_DEINIT() \ + lcd_set_backlight(0); \ + ILI9341_CMD(0x28) + +// Input +// All physical buttons are active-low. GPIO34 and GPIO35 are input-only and do +// not support internal pullups, so they rely on the board's external pullups. +// Refer to rg_input.h to see all available RG_KEY_* and RG_GAMEPAD_*_MAP types. +#define RG_GAMEPAD_GPIO_MAP {\ + {RG_KEY_UP, .num = GPIO_NUM_2, .pullup = 1, .level = 0},\ + {RG_KEY_DOWN, .num = GPIO_NUM_13, .pullup = 1, .level = 0},\ + {RG_KEY_LEFT, .num = GPIO_NUM_27, .pullup = 1, .level = 0},\ + {RG_KEY_RIGHT, .num = GPIO_NUM_35, .pullup = 0, .level = 0},\ + {RG_KEY_A, .num = GPIO_NUM_34, .pullup = 0, .level = 0},\ + {RG_KEY_B, .num = GPIO_NUM_12, .pullup = 1, .level = 0},\ +} +#define RG_GAMEPAD_VIRT_MAP {\ + {RG_KEY_SELECT, .src = RG_KEY_UP | RG_KEY_DOWN },\ + {RG_KEY_START, .src = RG_KEY_LEFT | RG_KEY_RIGHT},\ + {RG_KEY_MENU, .src = RG_KEY_A | RG_KEY_B },\ + {RG_KEY_OPTION, .src = RG_KEY_UP | RG_KEY_A },\ +} + +// Battery +// Battery measurement is not identified yet, so leave battery reporting disabled. +// #define RG_BATTERY_DRIVER 1 + +// SPI Display +#define RG_GPIO_LCD_MISO GPIO_NUM_19 +#define RG_GPIO_LCD_MOSI GPIO_NUM_23 +#define RG_GPIO_LCD_CLK GPIO_NUM_18 +#define RG_GPIO_LCD_CS GPIO_NUM_5 +#define RG_GPIO_LCD_DC GPIO_NUM_4 +#define RG_GPIO_LCD_BCKL GPIO_NUM_21 +// GPIO2 is shared with the UP key; use software reset to avoid stealing it. +// #define RG_GPIO_LCD_RST GPIO_NUM_2 + +// SPI SD Card +#define RG_GPIO_SDSPI_MISO GPIO_NUM_19 +#define RG_GPIO_SDSPI_MOSI GPIO_NUM_23 +#define RG_GPIO_SDSPI_CLK GPIO_NUM_18 +#define RG_GPIO_SDSPI_CS GPIO_NUM_22 + +// External I2S DAC +#define RG_GPIO_SND_I2S_BCK GPIO_NUM_NC +#define RG_GPIO_SND_I2S_WS GPIO_NUM_NC +#define RG_GPIO_SND_I2S_DATA GPIO_NUM_NC +// #define RG_GPIO_SND_AMP_ENABLE GPIO_NUM_NC + +// Updater +#define RG_UPDATER_ENABLE 1 +#define RG_UPDATER_APPLICATION RG_APP_FACTORY +#define RG_UPDATER_DOWNLOAD_LOCATION RG_STORAGE_ROOT "/meowboy/firmware" + diff --git a/components/retro-go/targets/meowboy/env.py b/components/retro-go/targets/meowboy/env.py new file mode 100644 index 00000000..16ded190 --- /dev/null +++ b/components/retro-go/targets/meowboy/env.py @@ -0,0 +1,9 @@ +# This file is injected late into rg_tool.py, you can run arbitrary python code here +# For example override python variables or set environment variables with os.putenv + +# Espressif chip in the device +IDF_TARGET = "esp32" +# .fw file format, if supported by the device +FW_FORMAT = "none" +# The stock board appears to have 4MB flash, so keep the default image small. +DEFAULT_APPS = "launcher retro-core" diff --git a/components/retro-go/targets/meowboy/sdkconfig b/components/retro-go/targets/meowboy/sdkconfig new file mode 100644 index 00000000..36e0da68 --- /dev/null +++ b/components/retro-go/targets/meowboy/sdkconfig @@ -0,0 +1,191 @@ +# +# Serial flasher config +# +CONFIG_ESPTOOLPY_PORT="COM14" +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=y +CONFIG_ESPTOOLPY_FLASHSIZE_8MB=n +CONFIG_ESPTOOLPY_FLASHSIZE_16MB=n +CONFIG_ESPTOOLPY_FLASHSIZE="4MB" +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_ESP32_REV_MIN_0=n +CONFIG_ESP32_REV_MIN_1=y +CONFIG_ESP32_REV_MIN_2=n +CONFIG_ESP32_REV_MIN_3=n +CONFIG_ESP32_REV_MIN=1 +CONFIG_ESP32_DEFAULT_CPU_FREQ_80=n +CONFIG_ESP32_DEFAULT_CPU_FREQ_160=n +CONFIG_ESP32_DEFAULT_CPU_FREQ_240=y +CONFIG_ESP32_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_ESP32_SPIRAM_SUPPORT=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=n +CONFIG_SPIRAM_CACHE_WORKAROUND=n +CONFIG_SPIRAM_BANKSWITCH_ENABLE=n +CONFIG_SPIRAM_MALLOC_ALWAYSINTERNAL=32768 +CONFIG_SPIRAM_MALLOC_RESERVE_INTERNAL=32768 +CONFIG_SPIRAM_ALLOW_STACK_EXTERNAL_MEMORY=n +CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY=y +CONFIG_SPIRAM_OCCUPY_HSPI_HOST=n +CONFIG_SPIRAM_OCCUPY_VSPI_HOST=y +CONFIG_SPIRAM_OCCUPY_NO_HOST=n + +# +# 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_API_ENCODING_ANSI_OEM=n +CONFIG_FATFS_API_ENCODING_UTF_16=n +CONFIG_FATFS_API_ENCODING_UTF_8=y +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 +# +# ODROID-GO partition table doesn't use any checksum +CONFIG_APP_COMPATIBLE_PRE_V3_1_BOOTLOADERS=y +CONFIG_PARTITION_TABLE_MD5=n +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_ESP32_WIFI_IRAM_OPT=n +CONFIG_ESP32_WIFI_RX_IRAM_OPT=n +CONFIG_ESP32_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"