From 19f9a8221d71e1e547cf26fcc3330e072413115b Mon Sep 17 00:00:00 2001 From: Dong Heng Date: Wed, 23 May 2018 15:47:32 +0800 Subject: [PATCH] feat(esp8266): Refactor startup function --- components/esp8266/include/esp_system.h | 3 +- components/esp8266/ld/esp8266.ld | 4 +- components/esp8266/lib/VERSION | 2 +- components/esp8266/lib/libcore.a | Bin 113788 -> 106034 bytes components/esp8266/source/chip_boot.c | 160 ++++++++++++++++++ components/esp8266/source/startup.c | 65 ++++++- .../freertos/port/esp8266/xtensa_vectors.S | 31 +++- 7 files changed, 251 insertions(+), 14 deletions(-) create mode 100644 components/esp8266/source/chip_boot.c diff --git a/components/esp8266/include/esp_system.h b/components/esp8266/include/esp_system.h index 731cb824..6b6421c1 100644 --- a/components/esp8266/include/esp_system.h +++ b/components/esp8266/include/esp_system.h @@ -97,8 +97,9 @@ typedef enum { FLASH_SIZE_32M_MAP_2048_2048, /**< attention: don't support now ,just compatible for nodemcu; Flash size : 32Mbits. Map : 2048KBytes + 2048KBytes */ FLASH_SIZE_64M_MAP_1024_1024, /**< Flash size : 64Mbits. Map : 1024KBytes + 1024KBytes */ - FLASH_SIZE_128M_MAP_1024_1024 /**< Flash size : 128Mbits. Map : 1024KBytes + 1024KBytes */ + FLASH_SIZE_128M_MAP_1024_1024, /**< Flash size : 128Mbits. Map : 1024KBytes + 1024KBytes */ + FALSH_SIZE_MAP_MAX } flash_size_map; /** diff --git a/components/esp8266/ld/esp8266.ld b/components/esp8266/ld/esp8266.ld index a5b2e5a1..5fb13e75 100644 --- a/components/esp8266/ld/esp8266.ld +++ b/components/esp8266/ld/esp8266.ld @@ -20,8 +20,8 @@ MEMORY { dport0_0_seg : org = 0x3FF00000, len = 0x10 - /* All .data/.bss/heap are in this segment. */ - dram0_0_seg : org = 0x3FFE8000, len = 0x18000 + /* All .data/.bss/heap are in this segment. 1024 bytes is for system start and interrupt*/ + dram0_0_seg : org = 0x3FFE8000, len = 0x18000 - 1024 /* Functions which are critical should be put in this segment. */ iram1_0_seg : org = 0x40100000, len = 0x8000 diff --git a/components/esp8266/lib/VERSION b/components/esp8266/lib/VERSION index a606720f..84b4acd4 100644 --- a/components/esp8266/lib/VERSION +++ b/components/esp8266/lib/VERSION @@ -1,7 +1,7 @@ gwen: crypto: 137694e espnow: 137694e - core: a6ca7a1 + core: bc4803f net80211: 34c6b8d pp: 137694e pwm: 0181338 diff --git a/components/esp8266/lib/libcore.a b/components/esp8266/lib/libcore.a index cc372863bb5137fc36ccfc6c74868a66bcdc6283..97f0627627720dc4c4215263a4f6e4b7cffee2d7 100644 GIT binary patch delta 39158 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 delta 44723 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 diff --git a/components/esp8266/source/chip_boot.c b/components/esp8266/source/chip_boot.c new file mode 100644 index 00000000..a8315d3a --- /dev/null +++ b/components/esp8266/source/chip_boot.c @@ -0,0 +1,160 @@ +// Copyright 2018-2019 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "sdkconfig.h" +#include "esp_attr.h" +#include "spi_flash.h" +#include "esp_log.h" +#include "esp_system.h" +#include "esp8266/eagle_soc.h" + +#define PERIPHS_SPI_FLASH_USRREG (0x60000200 + 0x1c) +#define PERIPHS_SPI_FLASH_CTRL (0x60000200 + 0x08) +#define PERIPHS_IO_MUX_CONF_U (0x60000800) + +#define SPI0_CLK_EQU_SYSCLK BIT8 +#define SPI_FLASH_CLK_EQU_SYSCLK BIT12 + +typedef struct flash_hdr { + uint8_t magic; + uint8_t blocks; + uint8_t spi_mode; + uint8_t spi_speed : 4; + uint8_t spi_size_map : 4; + uint32_t entry_addr; +} flash_hdr_t; + +typedef struct boot_hdr { + uint8_t user_bin : 2; + uint8_t boot_status : 1; + uint8_t to_qio : 1; + uint8_t reserve : 4; + + uint8_t version : 5; + uint8_t test_pass_flag : 1; + uint8_t test_start_flag : 1; + uint8_t enhance_boot_flag : 1; + + uint8_t test_bin_addr[3]; + uint8_t user_bin_addr[3]; +} boot_hdr_t; + +extern int ets_printf(const char *fmt, ...); + +static const char *TAG = "chip_boot"; + +/* + * @brief initialize the chip including flash I/O and chip cache according to + * boot parameters which are stored at the flash + */ +void chip_boot(void) +{ + int ret; + int usebin; + uint32_t freqdiv, flash_size, sect_size; + uint32_t freqbits; + uint32_t cache_map; + flash_hdr_t fhdr; + boot_hdr_t bhdr; + + uint32_t flash_map_table[FALSH_SIZE_MAP_MAX] = { + 1 * 1024 * 1024, + 2 * 1024 * 1024, + 4 * 1024 * 1024, + 8 * 1024 * 1024, + 16 * 1024 * 1024 + }; + uint32_t flash_map_table_size = sizeof(flash_map_table) / sizeof(flash_map_table[0]); + + extern void phy_get_bb_evm(void); + extern void cache_init(uint32_t , uint32_t, uint32_t); + extern void user_spi_flash_dio_to_qio_pre_init(void); + extern int esp_get_boot_param(uint32_t, uint32_t, void *, uint32_t); + + phy_get_bb_evm(); + + SET_PERI_REG_MASK(PERIPHS_SPI_FLASH_USRREG, BIT5); + + ret = spi_flash_read(CONFIG_PARTITION_TABLE_CUSTOM_APP_BIN_OFFSET, &fhdr, sizeof(flash_hdr_t)); + if (ret) { + ESP_LOGE(TAG, "SPI flash read result %d\n", ret); + } + + if (3 > fhdr.spi_speed) + freqdiv = fhdr.spi_speed + 2; + else if (0x0F == fhdr.spi_speed) + freqdiv = 1; + else + freqdiv = 2; + + if (fhdr.spi_size_map < flash_map_table_size) { + flash_size = flash_map_table[fhdr.spi_size_map]; + } else { + flash_size = 0; + ESP_LOGE(TAG, "SPI size error is %d\n", fhdr.spi_size_map); + } + sect_size = 4 * 1024; + + if (1 >= freqdiv) { + freqbits = SPI_FLASH_CLK_EQU_SYSCLK; + SET_PERI_REG_MASK(PERIPHS_SPI_FLASH_CTRL, SPI_FLASH_CLK_EQU_SYSCLK); + SET_PERI_REG_MASK(PERIPHS_IO_MUX_CONF_U, SPI0_CLK_EQU_SYSCLK); + } else { + freqbits = ((freqdiv - 1) << 8) + ((freqdiv / 2 - 1) << 4) + (freqdiv - 1); + CLEAR_PERI_REG_MASK(PERIPHS_SPI_FLASH_CTRL, SPI_FLASH_CLK_EQU_SYSCLK); + CLEAR_PERI_REG_MASK(PERIPHS_IO_MUX_CONF_U, SPI0_CLK_EQU_SYSCLK); + } + SET_PERI_REG_BITS(PERIPHS_SPI_FLASH_CTRL, 0xfff, freqbits, 0); + + ret = esp_get_boot_param(flash_size, sect_size, &bhdr, sizeof(boot_hdr_t)); + if (ret) { + ESP_LOGE(TAG, "Get boot parameters %d\n", ret); + } + + if (bhdr.user_bin == 1) { + if (bhdr.boot_status == 1) + usebin = 1; + else + usebin = 0; + } else { + if (bhdr.boot_status == 1) + usebin = 0; + else { + if (bhdr.version == 4) { + bhdr.boot_status = 1; + usebin = 0; + } else + usebin = 1; + } + } + + cache_map = 0; + if (fhdr.spi_size_map == FLASH_SIZE_16M_MAP_1024_1024 + || fhdr.spi_size_map == FLASH_SIZE_32M_MAP_1024_1024 + || fhdr.spi_size_map == FLASH_SIZE_64M_MAP_1024_1024 + || fhdr.spi_size_map == FLASH_SIZE_128M_MAP_1024_1024) { + if (bhdr.version >= 4 + && bhdr.version <= 0x1f) { + if (usebin == 1) + cache_map = 1; + } else { + ESP_LOGE(TAG, "Need boot 1.4+\n"); + } + } + + cache_init(cache_map, 0, 0); + + if (bhdr.to_qio == 0) + user_spi_flash_dio_to_qio_pre_init(); +} diff --git a/components/esp8266/source/startup.c b/components/esp8266/source/startup.c index 7fb364ee..e9aa66fe 100644 --- a/components/esp8266/source/startup.c +++ b/components/esp8266/source/startup.c @@ -1,15 +1,52 @@ #include "sdkconfig.h" #include +#include #include +#include +#include "esp_log.h" +#include "nvs_flash.h" +#include "tcpip_adapter.h" +#include "esp_wifi_osi.h" #include "esp_image_format.h" #define FLASH_MAP_ADDR 0x40200000 +static void user_init_entry(void *param) +{ + void (*func)(void); + + extern void (__init_array_start)(void); + extern void (__init_array_end)(void); + + extern void app_main(void); + + /* initialize C++ construture function */ + for (func = &__init_array_start; func < &__init_array_end; func++) + func(); + + tcpip_adapter_init(); + + app_main(); + + wifi_task_delete(NULL); +} + void call_user_start(void) { int i; - extern void user_start(void); + int *p; + + extern int _bss_start, _bss_end; + + extern void chip_boot(void); + extern int rtc_init(void); + extern int mac_init(void); + extern int base_gpio_init(void); + extern int phy_calibrate(void); + extern int watchdog_init(void); + extern int wifi_timer_init(void); + extern int wifi_nvs_init(void); esp_image_header_t *head = (esp_image_header_t *)(FLASH_MAP_ADDR + CONFIG_PARTITION_TABLE_CUSTOM_APP_BIN_OFFSET); esp_image_segment_header_t *segment = (esp_image_segment_header_t *)((uintptr_t)head + sizeof(esp_image_header_t)); @@ -25,11 +62,31 @@ void call_user_start(void) *dest++ = *src++; } + /* clear bss data */ + for (p = &_bss_start; p < &_bss_end; p++) + *p = 0; + __asm__ __volatile__( + "rsil a2, 2\n" + "movi a1, _chip_interrupt_tmp\n" + "movi a2, 0xffffff00\n" + "and a1, a1, a2\n" "movi a2, 0x40100000\n" "wsr a2, vecbase\n"); - user_start(); + chip_boot(); + + wifi_os_init(); + + assert(nvs_flash_init() == 0); + assert(wifi_nvs_init() == 0); + assert(rtc_init() == 0); + assert(mac_init() == 0); + assert(base_gpio_init() == 0); + assert(phy_calibrate() == 0); + assert(watchdog_init() == 0); + assert(wifi_timer_init() == 0); + assert(wifi_task_create(user_init_entry, "uiT", 512, NULL, wifi_task_get_max_priority()) != NULL); + + wifi_os_start(); } - - \ No newline at end of file diff --git a/components/freertos/port/esp8266/xtensa_vectors.S b/components/freertos/port/esp8266/xtensa_vectors.S index 5b6871c7..424f135a 100644 --- a/components/freertos/port/esp8266/xtensa_vectors.S +++ b/components/freertos/port/esp8266/xtensa_vectors.S @@ -124,6 +124,9 @@ STRUCT_END(HighPriFrame) #define PANIC_STK_FRMSZ 0x60 + +#define CHIP_INTERRUPT_STK_MAX 1024 + .global panicHandler // Allocate save area and stack: @@ -159,6 +162,14 @@ LABEL(_Pri_,_HandlerAddress): .space 4 LABEL(_Pri_,_NMICount): .space 4 #endif + .section .data, "aw" + .global _chip_interrupt_stk, _chip_interrupt_tmp + .align 16 +_chip_interrupt_stk: + .space CHIP_INTERRUPT_STK_MAX +_chip_interrupt_tmp: + .word 0 + /*************************** LoadStoreError Handler **************************/ .section .text @@ -442,7 +453,7 @@ LoadStoreErrorHandler_common: l32i a3, sp, 0x0c l32i a4, sp, 0x10 rsr a1, excsave1 - call0 user_fatal_exception_handler + call0 _xt_ext_panic .balign 4 .LSE_assign_a1: @@ -642,7 +653,7 @@ _DebugExceptionVector: jx a3 #else wsr a0, EXCSAVE+XCHAL_DEBUGLEVEL /* save original a0 somewhere */ - call0 user_fatal_exception_handler /* does not return */ + call0 _xt_ext_panic /* does not return */ rfi XCHAL_DEBUGLEVEL /* make a0 point here not later */ #endif @@ -671,7 +682,7 @@ _DoubleExceptionVector: #if XCHAL_HAVE_DEBUG break 1, 4 /* unhandled double exception */ #endif - call0 user_fatal_exception_handler /* does not return */ + call0 _xt_ext_panic /* does not return */ rfde /* make a0 point here not later */ .end literal_prefix @@ -705,7 +716,7 @@ _xt_kernel_exc: #if XCHAL_HAVE_DEBUG break 1, 0 /* unhandled kernel exception */ #endif - call0 user_fatal_exception_handler /* does not return */ + call0 _xt_ext_panic /* does not return */ rfe /* make a0 point here not there */ @@ -847,7 +858,7 @@ _xt_user_entry1: #if XCHAL_HAVE_DEBUG break 1, 1 /* unhandled user exception */ #endif - call0 user_fatal_exception_handler + call0 _xt_ext_panic /* Handle level 1 interrupts. OK to enable med-pri interrupts now. */ .L_xt_user_int: @@ -909,7 +920,15 @@ _xt_user_entry1: sub a2, a2, a3 /* clear timer int from mask */ #endif 3: + movi a0, _chip_interrupt_tmp + s32i a1, a0, 0 + mov a1, a0 + call0 _xt_isr_handler + + movi a0, _chip_interrupt_tmp + l32i a1, a0, 0 + bnez a2, .Ln_xt_user_int_timer #endif 4: @@ -921,7 +940,7 @@ _xt_user_entry1: break 1, 1 /* unhandled user exception */ /* EXCCAUSE == 4 (level 1 int) */ #endif - call0 user_fatal_exception_handler + call0 _xt_ext_panic /* Done handling after XT_RTOS_INT_ENTER. Give control to RTOS. */ .L_xt_user_done: