Files
AI_Printer/components/platform/src/platform_bootstrap.c

245 lines
7.2 KiB
C

#include "platform.h"
#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) {
ptr = heap_caps_calloc(n, size, MALLOC_CAP_INTERNAL | MALLOC_CAP_8BIT);
}
return ptr;
}
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());
err = nvs_flash_init();
}
ESP_ERROR_CHECK(err);
#if CONFIG_SPIRAM_USE_MALLOC
// Keep very small allocations on internal RAM, push larger generic mallocs to PSRAM.
heap_caps_malloc_extmem_enable(4096);
ESP_LOGI(TAG, "extmem malloc threshold set to 4096 bytes");
#endif
#if defined(MBEDTLS_PLATFORM_MEMORY)
int tls_rc = mbedtls_platform_set_calloc_free(tls_calloc_prefer_psram, tls_free);
if (tls_rc == 0) {
ESP_LOGI(TAG, "mbedtls calloc/free redirected to PSRAM-preferred allocator");
} else {
ESP_LOGW(TAG, "mbedtls calloc/free redirect failed: rc=%d", tls_rc);
}
#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;
}