diff --git a/components/esp8266/include/esp_phy_init.h b/components/esp8266/include/esp_phy_init.h index fb61519d..b2b770a6 100644 --- a/components/esp8266/include/esp_phy_init.h +++ b/components/esp8266/include/esp_phy_init.h @@ -165,6 +165,11 @@ esp_err_t esp_phy_rf_deinit(phy_rf_module_t module); */ void esp_phy_load_cal_and_init(phy_rf_module_t module); +/** + * @brief Initializing system hardware clock. + */ +void esp_phy_init_clk(void); + #ifdef __cplusplus } #endif diff --git a/components/esp8266/source/phy_init.c b/components/esp8266/source/phy_init.c index b67ff7bb..24247c9f 100644 --- a/components/esp8266/source/phy_init.c +++ b/components/esp8266/source/phy_init.c @@ -394,3 +394,31 @@ int phy_printf(const char *fmt, ...) { return 0; } + +void esp_phy_init_clk(void) +{ + uint8_t buf[128]; + const esp_phy_init_data_t *init_data; +#ifdef CONFIG_CONSOLE_UART_BAUDRATE + const uint32_t uart_baudrate = CONFIG_CONSOLE_UART_BAUDRATE; +#else + const uint32_t uart_baudrate = 74880; // ROM default baudrate +#endif + + init_data = esp_phy_get_init_data(); + if (init_data == NULL) { + ESP_LOGE(TAG, "failed to obtain PHY init data"); + abort(); + } + memcpy(buf, init_data->params, 128); + + uart_tx_wait_idle(0); + uart_div_modify(0, UART_CLK_FREQ / uart_baudrate); + + uart_tx_wait_idle(1); + uart_div_modify(1, UART_CLK_FREQ / uart_baudrate); + + rtc_init_clk(buf); + + esp_phy_release_init_data(init_data); +} diff --git a/components/esp8266/source/startup.c b/components/esp8266/source/startup.c index 14bdae5f..c83f73e0 100644 --- a/components/esp8266/source/startup.c +++ b/components/esp8266/source/startup.c @@ -89,6 +89,8 @@ static void user_init_entry(void *param) esp_wifi_set_rx_pbuf_mem_type(WIFI_RX_PBUF_DRAM); + esp_phy_init_clk(); + #if CONFIG_RESET_REASON esp_reset_reason_init(); #endif