/* ESP32-S3 入口。只在 ESP-IDF 目标里编译,宿主机构建不包含本文件。 */ #include #include "esp_log.h" #include "hal_time.h" #include "phonerail.h" #include "rail_cfg.h" static const char *TAG = "phonerail"; /* 启动自检(需求 §10.4):五路的地址 / 位号 / 引脚无重复、无越界, 而且那张五路表和四个驱动自己的表没有分家。 ⚠️ **不过就 abort,不降级。** 这里查的全是编译进固件的常量表, 查不过 = 固件本身写错了,不是硬件坏了 —— §10.10 的降级矩阵管的是后者。 带着一张错表跑起来的样子是「命令发给了另一路」,五台手机全在跑、 一个错误码都不报,谁也不会去怀疑它。 */ static void selftest_or_die(void) { const uint32_t bad = rail_selftest(); if (bad == 0) { ESP_LOGI(TAG, "五路配置表自检通过"); return; } for (uint32_t bit = 1; bit != 0; bit <<= 1) { if ((bad & bit) != 0) { ESP_LOGE(TAG, "自检失败:%s (0x%02x)", rail_selftest_str(bit), (unsigned)bit); } } abort(); } void app_main(void) { ESP_LOGI(TAG, "PhoneRail %s boot, %d rails, t=%u ms", phonerail_version(), PHONERAIL_RAIL_COUNT, (unsigned)hal_time_now_ms()); selftest_or_die(); /* 十根 EN 线配成输出并全部拉低。**先于一切外设**:DAC / eFuse 一上电就有 输出,这两根线这时必须已经确定是低的。 */ const hal_err_t err = rail_en_init(); if (err != HAL_OK) { ESP_LOGE(TAG, "EN 引脚初始化失败:%s", hal_err_str(err)); abort(); } ESP_LOGI(TAG, "五路输出与 VBUS 全部关闭,等待 A8 的任务骨架"); /* 器件初始化与五个任务留到 A8/A15。 */ }