123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241 |
- /******************************************************************************
- * Copyright 2013-2014 Espressif Systems (Wuxi)
- *
- * FileName: user_main.c
- *
- * Description: entry file of user application
- *
- * Modification history:
- * 2014/1/1, v1.0 create this file.
- *******************************************************************************/
- #include "lua.h"
- #include "platform.h"
- #include "c_string.h"
- #include "c_stdlib.h"
- #include "c_stdio.h"
- #include "vfs.h"
- #include "flash_api.h"
- #include "user_interface.h"
- #include "user_exceptions.h"
- #include "user_modules.h"
- #include "ets_sys.h"
- #include "driver/uart.h"
- #include "task/task.h"
- #include "mem.h"
- #include "espconn.h"
- #ifdef LUA_USE_MODULES_RTCTIME
- #include "rtc/rtctime.h"
- #endif
- static task_handle_t input_sig;
- /* Contents of esp_init_data_default.bin */
- extern const uint32_t init_data[];
- extern const uint32_t init_data_end[];
- __asm__(
- /* Place in .text for same reason as user_start_trampoline */
- ".section \".text\"\n"
- ".align 4\n"
- "init_data:\n"
- ".incbin \"" ESP_INIT_DATA_DEFAULT "\"\n"
- "init_data_end:\n"
- ".previous\n"
- );
- /* Note: the trampoline *must* be explicitly put into the .text segment, since
- * by the time it is invoked the irom has not yet been mapped. This naturally
- * also goes for anything the trampoline itself calls.
- */
- void TEXT_SECTION_ATTR user_start_trampoline (void)
- {
- __real__xtos_set_exception_handler (
- EXCCAUSE_LOAD_STORE_ERROR, load_non_32_wide_handler);
- #ifdef LUA_USE_MODULES_RTCTIME
- // Note: Keep this as close to call_user_start() as possible, since it
- // is where the cpu clock actually gets bumped to 80MHz.
- rtctime_early_startup ();
- #endif
- /* Re-implementation of default init data deployment. The SDK does not
- * appear to be laying down its own version of init data anymore, so
- * we have to do it again. To see whether we need to, we read out
- * the flash size and do a test for esp_init_data based on that size.
- * If it's missing, we need to initialize it *right now* before the SDK
- * starts up and gets stuck at "rf_cal[0] !=0x05,is 0xFF".
- * If the size byte is wrong, then we'll end up fixing up the init data
- * again on the next boot, after we've corrected the size byte.
- * Only remaining issue is lack of spare code bytes in iram, so this
- * is deliberately quite terse and not as readable as one might like.
- */
- SPIFlashInfo sfi;
- SPIRead (0, (uint32_t *)(&sfi), sizeof (sfi)); // Cache read not enabled yet, safe to use
- if (sfi.size < 2) // Compensate for out-of-order 4mbit vs 2mbit values
- sfi.size ^= 1;
- uint32_t flash_end_addr = (256 * 1024) << sfi.size;
- uint32_t init_data_hdr = 0xffffffff;
- uint32_t init_data_addr = flash_end_addr - 4 * SPI_FLASH_SEC_SIZE;
- SPIRead (init_data_addr, &init_data_hdr, sizeof (init_data_hdr));
- if (init_data_hdr == 0xffffffff)
- {
- SPIEraseSector (init_data_addr);
- SPIWrite (init_data_addr, init_data, 4 * (init_data_end - init_data));
- }
- call_user_start ();
- }
- // +================== New task interface ==================+
- static void start_lua(task_param_t param, uint8 priority) {
- char* lua_argv[] = { (char *)"lua", (char *)"-i", NULL };
- NODE_DBG("Task task_lua started.\n");
- lua_main( 2, lua_argv );
- // Only enable UART interrupts once we've successfully started up,
- // otherwise the task queue might fill up with input events and prevent
- // the start_lua task from being posted.
- ETS_UART_INTR_ENABLE();
- }
- static void handle_input(task_param_t flag, uint8 priority) {
- (void)priority;
- lua_handle_input (flag);
- }
- bool user_process_input(bool force) {
- return task_post_low(input_sig, force);
- }
- void nodemcu_init(void)
- {
- NODE_ERR("\n");
- // Initialize platform first for lua modules.
- if( platform_init() != PLATFORM_OK )
- {
- // This should never happen
- NODE_DBG("Can not init platform for modules.\n");
- return;
- }
- #if defined(FLASH_SAFE_API)
- if( flash_safe_get_size_byte() != flash_rom_get_size_byte()) {
- NODE_ERR("Self adjust flash size.\n");
- // Fit hardware real flash size.
- flash_rom_set_size_byte(flash_safe_get_size_byte());
- system_restart ();
- // Don't post the start_lua task, we're about to reboot...
- return;
- }
- #endif // defined(FLASH_SAFE_API)
- #if defined ( CLIENT_SSL_ENABLE ) && defined ( SSL_BUFFER_SIZE )
- espconn_secure_set_size(ESPCONN_CLIENT, SSL_BUFFER_SIZE);
- #endif
- #ifdef BUILD_SPIFFS
- if (!vfs_mount("/FLASH", 0)) {
- // Failed to mount -- try reformat
- c_printf("Formatting file system. Please wait...\n");
- if (!vfs_format()) {
- NODE_ERR( "\n*** ERROR ***: unable to format. FS might be compromised.\n" );
- NODE_ERR( "It is advised to re-flash the NodeMCU image.\n" );
- }
- // Note that fs_format leaves the file system mounted
- }
- // test_spiffs();
- #endif
- // endpoint_setup();
- if (!task_post_low(task_get_id(start_lua),'s'))
- NODE_ERR("Failed to post the start_lua task!\n");
- }
- #ifdef LUA_USE_MODULES_WIFI
- #include "../modules/wifi_common.h"
- void user_rf_pre_init(void)
- {
- //set WiFi hostname before RF initialization (adds ~479 us to boot time)
- wifi_change_default_host_name();
- }
- #endif
- /******************************************************************************
- * FunctionName : user_rf_cal_sector_set
- * Description : SDK just reversed 4 sectors, used for rf init data and paramters.
- * We add this function to force users to set rf cal sector, since
- * we don't know which sector is free in user's application.
- * sector map for last several sectors : ABCCC
- * A : rf cal
- * B : rf init data
- * C : sdk parameters
- * Parameters : none
- * Returns : rf cal sector
- *******************************************************************************/
- uint32
- user_rf_cal_sector_set(void)
- {
- enum ext_flash_size_map size_map = system_get_flash_size_map();
- uint32 rf_cal_sec = 0;
- switch (size_map) {
- case FLASH_SIZE_4M_MAP_256_256:
- rf_cal_sec = 128 - 5;
- break;
- case FLASH_SIZE_8M_MAP_512_512:
- rf_cal_sec = 256 - 5;
- break;
- case FLASH_SIZE_16M_MAP_512_512:
- case FLASH_SIZE_16M_MAP_1024_1024:
- rf_cal_sec = 512 - 5;
- break;
- case FLASH_SIZE_32M_MAP_512_512:
- case FLASH_SIZE_32M_MAP_1024_1024:
- case FLASH_SIZE_32M_MAP_2048_2048:
- rf_cal_sec = 1024 - 5;
- break;
- case FLASH_SIZE_64M_MAP:
- rf_cal_sec = 2048 - 5;
- break;
- case FLASH_SIZE_128M_MAP:
- rf_cal_sec = 4096 - 5;
- break;
- default:
- rf_cal_sec = 0;
- break;
- }
- return rf_cal_sec;
- }
- /******************************************************************************
- * FunctionName : user_init
- * Description : entry of user application, init user function here
- * Parameters : none
- * Returns : none
- *******************************************************************************/
- void user_init(void)
- {
- #ifdef LUA_USE_MODULES_RTCTIME
- rtctime_late_startup ();
- #endif
- UartBautRate br = BIT_RATE_DEFAULT;
- input_sig = task_get_id(handle_input);
- uart_init (br, br, input_sig);
- #ifndef NODE_DEBUG
- system_set_os_print(0);
- #endif
- system_init_done_cb(nodemcu_init);
- }
|