void init_v7(void *stack_base) { struct v7_create_opts opts; v7_val_t dht11, debug; opts.object_arena_size = 164; opts.function_arena_size = 26; opts.property_arena_size = 400; opts.c_stack_base = stack_base; v7 = v7_create_opt(opts); v7_set_method(v7, v7_get_global(v7), "dsleep", dsleep); v7_set_method(v7, v7_get_global(v7), "crash", crash); #if V7_ESP_ENABLE__DHT11 dht11 = v7_create_object(v7); v7_set(v7, v7_get_global(v7), "DHT11", 5, 0, dht11); v7_set_method(v7, dht11, "read", DHT11_read); #else (void) dht11; #endif /* V7_ESP_ENABLE__DHT11 */ debug = v7_create_object(v7); v7_set(v7, v7_get_global(v7), "Debug", 5, 0, debug); v7_set_method(v7, debug, "mode", Debug_mode); v7_set_method(v7, debug, "print", Debug_print); sj_init_timers(v7); sj_init_v7_ext(v7); init_gpiojs(v7); init_adcjs(v7); init_i2cjs(v7); init_pwm(v7); init_spijs(v7); init_wifi(v7); mongoose_init(); sj_init_http(v7); sj_init_ws_client(v7); /* NOTE(lsm): must be done after mongoose_init(). */ init_device(v7); #ifndef DISABLE_OTA init_updater(v7); #endif #ifndef DISABLE_C_CLUBBY sj_init_clubby(v7); #endif v7_gc(v7, 1); }
/* * SmartJS initialization, called as an SDK timer callback (`os_timer_...()`). */ void sjs_init(void *dummy) { /* * In order to see debug output (at least errors) during boot we have to * initialize debug in this point. But default we put debug to UART0 with * level=LL_ERROR, then configuration is loaded this settings are overridden */ { struct esp_uart_config *u0cfg = esp_sj_uart_default_config(0); #if ESP_DEBUG_UART == 0 u0cfg->baud_rate = ESP_DEBUG_UART_BAUD_RATE; #endif esp_uart_init(u0cfg); struct esp_uart_config *u1cfg = esp_sj_uart_default_config(1); /* UART1 has no RX pin, no point in allocating a buffer. */ u1cfg->rx_buf_size = 0; #if ESP_DEBUG_UART == 1 u1cfg->baud_rate = ESP_DEBUG_UART_BAUD_RATE; #endif esp_uart_init(u1cfg); fs_set_stdout_uart(0); fs_set_stderr_uart(ESP_DEBUG_UART); setvbuf(stdout, NULL, _IONBF, 0); setvbuf(stderr, NULL, _IONBF, 0); cs_log_set_level(LL_DEBUG); os_install_putc1(dbg_putc); system_set_os_print(1); #ifdef ESP_ENABLE_HEAP_LOG uart_initialized = 1; #endif } init_v7(&dummy); /* disable GC during further initialization */ v7_set_gc_enabled(v7, 0); esp_sj_uart_init(v7); #ifndef V7_NO_FS #ifndef DISABLE_OTA fs_init(get_fs_addr(get_current_rom()), get_fs_size(get_current_rom())); finish_update(); #else fs_init(FS_ADDR, FS_SIZE); #endif #endif sj_common_api_setup(v7); sj_common_init(v7); sj_init_sys(v7); mongoose_init(); /* NOTE(lsm): must be done after mongoose_init(). */ if (!init_device(v7)) { LOG(LL_ERROR, ("init_device failed")); abort(); } esp_print_reset_info(); #ifndef DISABLE_OTA init_updater(v7); #endif LOG(LL_INFO, ("Sys init done, SDK %s", system_get_sdk_version())); if (!sj_app_init(v7)) { LOG(LL_ERROR, ("App init failed")); abort(); } LOG(LL_INFO, ("App init done")); /* SJS initialized, enable GC back, and trigger it */ v7_set_gc_enabled(v7, 1); v7_gc(v7, 1); #ifndef V7_NO_FS run_init_script(); #endif /* Install prompt if enabled in the config and user's app has not installed * a custom RX handler. */ if (get_cfg()->debug.enable_prompt && v7_is_undefined(esp_sj_uart_get_recv_handler(0))) { sj_prompt_init(v7); esp_sj_uart_set_prompt(0); } #ifdef ESP_UMM_ENABLE /* * We want to use our own heap functions instead of the ones provided by the * SDK. * * We have marked `pvPortMalloc` and friends weak, so that we can override * them with our own implementations, but to actually make it work, we have * to reference any function from the file with our implementation, so that * linker will not garbage-collect the whole compilation unit. * * So, we have a call to the no-op `esp_umm_init()` here. */ esp_umm_init(); #endif }
void init_device() { PCONP_bit.PCUART0 = 0; PCONP_bit.PCPWM1 = 0; PCONP_bit.PCI2C0 = 0; PCONP_bit.PCSSP1 = 0; PCONP_bit.PCAN1 = 0; PCONP_bit.PCAN2 = 0; PCONP_bit.PCI2C1 = 0; PCONP_bit.PCSSP0 = 0; PCONP_bit.PCTIM2 = 0; PCONP_bit.PCTIM3 = 0; PCONP_bit.PCUART2 = 0; PCONP_bit.PCI2C2 = 0; PCONP_bit.PCI2S = 0; PCONP_bit.PCGPDMA = 0; PCONP_bit.PCENET = 0; init_timer0(); init_at25df(); init_led(); init_updater(); init_tasks(); init_app_settings(); create_ring_buff(pointerRingBuff, ring_buff, sizeof(ring_buff)); init_uart0(57600, 3); INT_UART0RX_ON; init_irq(); // Testing main pin (for locked mode) if (FIO2PIN_bit.P2_10 == 0) { return; } // Fork if (is_need_update() == TRUE_T) { DEBUG_PRINTF("BL:enable_update_task()\n\r"); enable_update_task(); } else { if (*((uint32_t *)(IAP_MAIN_SECT_ADDR + SHIFT_FW_VALID_FLG)) != IAP_VALID_DATA) { DEBUG_PRINTF("BL:repair_flash_iap()\n\r"); repair_flash_iap(); } uint32_t success_count = 0; const uint32_t fw_size = *((uint32_t *)(IAP_MAIN_SECT_ADDR + SHIFT_FW_SIZE_ADDR)); const uint32_t fw_crc = *((uint32_t *)(IAP_MAIN_SECT_ADDR + SHIFT_FW_CRC_ADDR)); DEBUG_PRINTF("BL:fw_size=0x%8x, fw_crc=0x%8x\n\r", fw_size, fw_crc); for (uint32_t i = 0; i < 3; i++) { uint8_t * pFw = (uint8_t *)FW_START_ADDRESS; uint32_t crc = 0; for (uint32_t k = 0; k < fw_size; k++) { crc += (uint32_t)(*pFw++); } crc = 0UL - crc; DEBUG_PRINTF("BL:compute crc=0x%8x\n\r", crc); if (fw_crc == crc) { success_count++; break; } } if (success_count > 0 && fw_crc) { DEBUG_PRINTF("BL:run_main_firmware()\n\r"); waite_tx_all_uart0(); run_main_firmware(); } } }