feat(platform): integrate st7789 boot test display and board gpio mapping
This commit is contained in:
@@ -2,14 +2,43 @@
|
||||
|
||||
#include <stdbool.h>
|
||||
|
||||
#include "driver/gpio.h"
|
||||
#include "esp_heap_caps.h"
|
||||
#include "esp_log.h"
|
||||
#include "mbedtls/platform.h"
|
||||
#include "nvs_flash.h"
|
||||
#include "sdkconfig.h"
|
||||
|
||||
static bool s_initialized;
|
||||
static bool s_board_gpio_initialized;
|
||||
static const char *TAG = "platform_bootstrap";
|
||||
|
||||
#ifndef CONFIG_TQ_KEY_PRINT_BOOST_ENABLE_ON_BOOT
|
||||
#define CONFIG_TQ_KEY_PRINT_BOOST_ENABLE_ON_BOOT 1
|
||||
#endif
|
||||
|
||||
#ifndef CONFIG_TQ_KEY_PRINT_BOOST_ACTIVE_HIGH
|
||||
#define CONFIG_TQ_KEY_PRINT_BOOST_ACTIVE_HIGH 1
|
||||
#endif
|
||||
|
||||
#ifndef CONFIG_TQ_SCREEN_BACKLIGHT_ACTIVE_HIGH
|
||||
#define CONFIG_TQ_SCREEN_BACKLIGHT_ACTIVE_HIGH 1
|
||||
#endif
|
||||
|
||||
#if CONFIG_TQ_KEY_PRINT_BOOST_ENABLE_ON_BOOT
|
||||
#if CONFIG_TQ_KEY_PRINT_BOOST_ACTIVE_HIGH
|
||||
#define KEY_PRINT_BOOST_LEVEL 1
|
||||
#else
|
||||
#define KEY_PRINT_BOOST_LEVEL 0
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if CONFIG_TQ_SCREEN_BACKLIGHT_ACTIVE_HIGH
|
||||
#define BOOT_SCREEN_BACKLIGHT_ON_LEVEL 1
|
||||
#else
|
||||
#define BOOT_SCREEN_BACKLIGHT_ON_LEVEL 0
|
||||
#endif
|
||||
|
||||
static void *tls_calloc_prefer_psram(size_t n, size_t size) {
|
||||
void *ptr = heap_caps_calloc(n, size, MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT);
|
||||
if (ptr == NULL) {
|
||||
@@ -22,11 +51,157 @@ static void tls_free(void *ptr) {
|
||||
heap_caps_free(ptr);
|
||||
}
|
||||
|
||||
static esp_err_t board_gpio_config_output(int gpio_num, int level, const char *name) {
|
||||
if (gpio_num < 0) {
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
gpio_config_t cfg = {
|
||||
.pin_bit_mask = 1ULL << gpio_num,
|
||||
.mode = GPIO_MODE_OUTPUT,
|
||||
.pull_up_en = GPIO_PULLUP_DISABLE,
|
||||
.pull_down_en = GPIO_PULLDOWN_DISABLE,
|
||||
.intr_type = GPIO_INTR_DISABLE,
|
||||
};
|
||||
esp_err_t err = gpio_config(&cfg);
|
||||
if (err != ESP_OK) {
|
||||
ESP_LOGE(TAG, "gpio_config output failed: %s pin=%d err=%s", name, gpio_num, esp_err_to_name(err));
|
||||
return err;
|
||||
}
|
||||
err = gpio_set_level(gpio_num, level);
|
||||
if (err != ESP_OK) {
|
||||
ESP_LOGE(TAG, "gpio_set_level failed: %s pin=%d level=%d err=%s", name, gpio_num, level, esp_err_to_name(err));
|
||||
return err;
|
||||
}
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
static esp_err_t board_gpio_config_input(int gpio_num, bool pull_up, const char *name) {
|
||||
if (gpio_num < 0) {
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
gpio_config_t cfg = {
|
||||
.pin_bit_mask = 1ULL << gpio_num,
|
||||
.mode = GPIO_MODE_INPUT,
|
||||
.pull_up_en = pull_up ? GPIO_PULLUP_ENABLE : GPIO_PULLUP_DISABLE,
|
||||
.pull_down_en = GPIO_PULLDOWN_DISABLE,
|
||||
.intr_type = GPIO_INTR_DISABLE,
|
||||
};
|
||||
esp_err_t err = gpio_config(&cfg);
|
||||
if (err != ESP_OK) {
|
||||
ESP_LOGE(TAG, "gpio_config input failed: %s pin=%d err=%s", name, gpio_num, esp_err_to_name(err));
|
||||
return err;
|
||||
}
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
static esp_err_t platform_board_gpio_init(void) {
|
||||
if (s_board_gpio_initialized) {
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
// Must be asserted early to keep the board powered.
|
||||
esp_err_t err = board_gpio_config_output(CONFIG_TQ_POWER_HOLD_PIN, 1, "power_hold");
|
||||
if (err != ESP_OK) {
|
||||
return err;
|
||||
}
|
||||
|
||||
// Default UI GPIO states.
|
||||
err = board_gpio_config_output(CONFIG_TQ_LED_R_PIN, 0, "led_r");
|
||||
if (err != ESP_OK) {
|
||||
return err;
|
||||
}
|
||||
err = board_gpio_config_output(CONFIG_TQ_LED_G_PIN, 0, "led_g");
|
||||
if (err != ESP_OK) {
|
||||
return err;
|
||||
}
|
||||
err = board_gpio_config_output(CONFIG_TQ_SCREEN_CS_PIN, 1, "screen_cs");
|
||||
if (err != ESP_OK) {
|
||||
return err;
|
||||
}
|
||||
err = board_gpio_config_output(CONFIG_TQ_SCREEN_DC_PIN, 0, "screen_dc");
|
||||
if (err != ESP_OK) {
|
||||
return err;
|
||||
}
|
||||
err = board_gpio_config_output(CONFIG_TQ_SCREEN_BACKLIGHT_PIN,
|
||||
BOOT_SCREEN_BACKLIGHT_ON_LEVEL,
|
||||
"screen_backlight");
|
||||
if (err != ESP_OK) {
|
||||
return err;
|
||||
}
|
||||
|
||||
// Key/power/sensor GPIO input defaults.
|
||||
err = board_gpio_config_input(CONFIG_TQ_POWER_KEY_PIN, true, "power_key");
|
||||
if (err != ESP_OK) {
|
||||
return err;
|
||||
}
|
||||
#if CONFIG_TQ_KEY_PRINT_BOOST_ENABLE_ON_BOOT
|
||||
err = board_gpio_config_output(CONFIG_TQ_KEY_PRINT_PIN, KEY_PRINT_BOOST_LEVEL, "key_print_boost");
|
||||
if (err != ESP_OK) {
|
||||
return err;
|
||||
}
|
||||
#else
|
||||
err = board_gpio_config_input(CONFIG_TQ_KEY_PRINT_PIN, true, "key_print");
|
||||
if (err != ESP_OK) {
|
||||
return err;
|
||||
}
|
||||
#endif
|
||||
err = board_gpio_config_input(CONFIG_TQ_MIC_KEY_PIN, true, "mic_key");
|
||||
if (err != ESP_OK) {
|
||||
return err;
|
||||
}
|
||||
err = board_gpio_config_input(CONFIG_TQ_PRINT_PAPER_PIN, true, "print_paper");
|
||||
if (err != ESP_OK) {
|
||||
return err;
|
||||
}
|
||||
err = board_gpio_config_input(CONFIG_TQ_BATTERY_ADC_PIN, false, "battery_adc");
|
||||
if (err != ESP_OK) {
|
||||
return err;
|
||||
}
|
||||
err = board_gpio_config_input(CONFIG_TQ_NTC_ADC_PIN, false, "ntc_adc");
|
||||
if (err != ESP_OK) {
|
||||
return err;
|
||||
}
|
||||
|
||||
ESP_LOGI(TAG,
|
||||
"board gpio mapped: hold=%d pwr_key=%d key_print=%d boost_mode=%d led_r=%d led_g=%d spi(mosi=%d,miso=%d,clk=%d) screen(dc=%d,cs=%d,bk=%d) i2c(sda=%d,scl=%d) i2s(mclk=%d,bclk=%d,ws=%d,di=%d,do=%d) pa=%d",
|
||||
CONFIG_TQ_POWER_HOLD_PIN,
|
||||
CONFIG_TQ_POWER_KEY_PIN,
|
||||
CONFIG_TQ_KEY_PRINT_PIN,
|
||||
#if CONFIG_TQ_KEY_PRINT_BOOST_ENABLE_ON_BOOT
|
||||
1,
|
||||
#else
|
||||
0,
|
||||
#endif
|
||||
CONFIG_TQ_LED_R_PIN,
|
||||
CONFIG_TQ_LED_G_PIN,
|
||||
CONFIG_TQ_SPI_SHARED_MOSI_PIN,
|
||||
CONFIG_TQ_PRINTER_MISO_PIN,
|
||||
CONFIG_TQ_SPI_SHARED_CLK_PIN,
|
||||
CONFIG_TQ_SCREEN_DC_PIN,
|
||||
CONFIG_TQ_SCREEN_CS_PIN,
|
||||
CONFIG_TQ_SCREEN_BACKLIGHT_PIN,
|
||||
CONFIG_TQ_VOICE_I2C_SDA_PIN,
|
||||
CONFIG_TQ_VOICE_I2C_SCL_PIN,
|
||||
CONFIG_TQ_VOICE_I2S_MCLK_PIN,
|
||||
CONFIG_TQ_VOICE_I2S_BCLK_PIN,
|
||||
CONFIG_TQ_VOICE_I2S_WS_PIN,
|
||||
CONFIG_TQ_VOICE_I2S_DIN_PIN,
|
||||
CONFIG_TQ_VOICE_I2S_DOUT_PIN,
|
||||
CONFIG_TQ_VOICE_CODEC_PA_PIN);
|
||||
|
||||
s_board_gpio_initialized = true;
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t platform_bootstrap_init(void) {
|
||||
if (s_initialized) {
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
ESP_ERROR_CHECK(platform_board_gpio_init());
|
||||
|
||||
esp_err_t err = nvs_flash_init();
|
||||
if (err == ESP_ERR_NVS_NO_FREE_PAGES || err == ESP_ERR_NVS_NEW_VERSION_FOUND) {
|
||||
ESP_ERROR_CHECK(nvs_flash_erase());
|
||||
@@ -49,6 +224,21 @@ esp_err_t platform_bootstrap_init(void) {
|
||||
}
|
||||
#endif
|
||||
|
||||
#if CONFIG_TQ_SCREEN_ENABLE
|
||||
err = platform_display_init();
|
||||
if (err != ESP_OK) {
|
||||
ESP_LOGW(TAG, "st7789 init failed: %s", esp_err_to_name(err));
|
||||
}
|
||||
#if CONFIG_TQ_SCREEN_TEST_PATTERN_ON_BOOT
|
||||
else {
|
||||
err = platform_display_show_test_pattern();
|
||||
if (err != ESP_OK) {
|
||||
ESP_LOGW(TAG, "st7789 test pattern failed: %s", esp_err_to_name(err));
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
s_initialized = true;
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user