void start_cmd(void *dummy) { #ifndef V7_NO_FS #ifndef DISABLE_OTA fs_init(get_fs_addr(), FS_SIZE); #else fs_init(FS_ADDR, FS_SIZE); #endif #endif init_v7(&dummy); #if !defined(NO_PROMPT) uart_main_init(0); #endif #ifndef V7_NO_FS init_smartjs(); #endif #ifndef DISABLE_OTA finish_update(); #endif #if !defined(NO_PROMPT) sj_prompt_init(v7); #endif }
/* * SmartJS initialization; for non-RTOS env, called as an SDK timer callback * (`os_timer_...()`). For RTOS env, called by the dispatcher task. */ 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 */ uart_debug_init(0, 0); uart_redirect_debug(1); cs_log_set_level(LL_ERROR); #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 init_v7(&dummy); /* disable GC during further initialization */ v7_set_gc_enabled(v7, 0); #if !defined(NO_PROMPT) uart_main_init(0); #endif #ifndef V7_NO_FS init_smartjs(); #endif #if !defined(NO_PROMPT) sj_prompt_init(v7); #endif #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 /* SJS initialized, enable GC back, and trigger it */ v7_set_gc_enabled(v7, 1); v7_gc(v7, 1); }
void start_cmd(void *dummy) { #ifndef V7_NO_FS fs_init(); #endif init_v7(&dummy); #if !defined(NO_PROMPT) uart_main_init(0); #endif #ifndef V7_NO_FS init_smartjs(); #endif #if !defined(NO_PROMPT) sj_prompt_init(v7); #endif }
static enum cc3200_init_result cc3200_init(void *arg) { mongoose_init(); if (miot_uart_init(0, miot_uart_default_config(), NULL, NULL) == NULL) { return CC3200_INIT_UART_INIT_FAILED; } if (miot_uart_init(1, miot_uart_default_config(), NULL, NULL) == NULL) { return CC3200_INIT_UART_INIT_FAILED; } if (strcmp(MIOT_APP, "mongoose-iot") != 0) { LOG(LL_INFO, ("%s %s (%s)", MIOT_APP, build_version, build_id)); } LOG(LL_INFO, ("Mongoose IoT Firmware %s (%s)", mg_build_version, mg_build_id)); LOG(LL_INFO, ("RAM: %d total, %d free", miot_get_heap_size(), miot_get_free_heap_size())); int r = start_nwp(); if (r < 0) { LOG(LL_ERROR, ("Failed to start NWP: %d", r)); return CC3200_INIT_FAILED_TO_START_NWP; } g_boot_cfg_idx = get_active_boot_cfg_idx(); if (g_boot_cfg_idx < 0 || read_boot_cfg(g_boot_cfg_idx, &g_boot_cfg) < 0) { return CC3200_INIT_FAILED_TO_READ_BOOT_CFG; } LOG(LL_INFO, ("Boot cfg %d: 0x%llx, 0x%u, %s @ 0x%08x, %s", g_boot_cfg_idx, g_boot_cfg.seq, g_boot_cfg.flags, g_boot_cfg.app_image_file, g_boot_cfg.app_load_addr, g_boot_cfg.fs_container_prefix)); if (g_boot_cfg.flags & BOOT_F_FIRST_BOOT) { /* Tombstone the current config. If anything goes wrong between now and * commit, next boot will use the old one. */ uint64_t saved_seq = g_boot_cfg.seq; g_boot_cfg.seq = BOOT_CFG_TOMBSTONE_SEQ; write_boot_cfg(&g_boot_cfg, g_boot_cfg_idx); g_boot_cfg.seq = saved_seq; } r = cc3200_fs_init(g_boot_cfg.fs_container_prefix); if (r < 0) { LOG(LL_ERROR, ("FS init error: %d", r)); return CC3200_INIT_FS_INIT_FAILED; } else { /* * We aim to maintain at most 3 FS containers at all times. * Delete inactive FS container in the inactive boot configuration. */ struct boot_cfg cfg; int inactive_idx = (g_boot_cfg_idx == 0 ? 1 : 0); if (read_boot_cfg(inactive_idx, &cfg) >= 0) { fs_delete_inactive_container(cfg.fs_container_prefix); } } #if MIOT_ENABLE_UPDATER if (g_boot_cfg.flags & BOOT_F_FIRST_BOOT) { LOG(LL_INFO, ("Applying update")); r = miot_upd_apply_update(); if (r < 0) { LOG(LL_ERROR, ("Failed to apply update: %d", r)); return CC3200_INIT_UPDATE_FAILED; } } #endif enum miot_init_result ir = mg_init(); if (ir != MIOT_INIT_OK) { LOG(LL_ERROR, ("%s init error: %d", "MG", ir)); return CC3200_INIT_MG_INIT_FAILED; } #if MIOT_ENABLE_JS struct v7 *v7 = s_v7 = init_v7(&arg); ir = miot_init_js_all(v7); if (ir != MIOT_INIT_OK) { LOG(LL_ERROR, ("%s init error: %d", "JS", ir)); return CC3200_INIT_MG_INIT_JS_FAILED; } #endif #if MIOT_ENABLE_JS miot_prompt_init(v7, get_cfg()->debug.stdout_uart); #endif return CC3200_INIT_OK; }
/* * 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 }
static int sj_init() { struct v7 *v7 = s_v7; LOG(LL_INFO, ("Mongoose IoT Firmware %s", build_id)); LOG(LL_INFO, ("RAM: %d total, %d free", sj_get_heap_size(), sj_get_free_heap_size())); int r = start_nwp(); if (r < 0) { LOG(LL_ERROR, ("Failed to start NWP: %d", r)); return 0; } int boot_cfg_idx = get_active_boot_cfg_idx(); if (boot_cfg_idx < 0) return 0; struct boot_cfg boot_cfg; if (read_boot_cfg(boot_cfg_idx, &boot_cfg) < 0) return 0; LOG(LL_INFO, ("Boot cfg %d: 0x%llx, 0x%u, %s @ 0x%08x, %s", boot_cfg_idx, boot_cfg.seq, boot_cfg.flags, boot_cfg.app_image_file, boot_cfg.app_load_addr, boot_cfg.fs_container_prefix)); uint64_t saved_seq = 0; if (boot_cfg.flags & BOOT_F_FIRST_BOOT) { /* Tombstone the current config. If anything goes wrong between now and * commit, next boot will use the old one. */ saved_seq = boot_cfg.seq; boot_cfg.seq = BOOT_CFG_TOMBSTONE_SEQ; write_boot_cfg(&boot_cfg, boot_cfg_idx); } r = init_fs(boot_cfg.fs_container_prefix); if (r < 0) { LOG(LL_ERROR, ("FS init error: %d", r)); if (boot_cfg.flags & BOOT_F_FIRST_BOOT) { revert_update(boot_cfg_idx, &boot_cfg); } return 0; } if (boot_cfg.flags & BOOT_F_FIRST_BOOT) { LOG(LL_INFO, ("Applying update")); if (apply_update(boot_cfg_idx, &boot_cfg) < 0) { revert_update(boot_cfg_idx, &boot_cfg); } } mongoose_init(); #ifndef CS_DISABLE_JS v7 = s_v7 = init_v7(&v7); /* Disable GC during JS API initialization. */ v7_set_gc_enabled(v7, 0); sj_gpio_api_setup(v7); sj_i2c_api_setup(v7); sj_wifi_api_setup(v7); sj_timers_api_setup(v7); #endif sj_v7_ext_api_setup(v7); sj_init_sys(v7); sj_wifi_init(v7); #ifndef DISABLE_C_CLUBBY sj_clubby_init(); #endif sj_http_api_setup(v7); #if !defined(DISABLE_C_CLUBBY) && !defined(CS_DISABLE_JS) sj_clubby_api_setup(v7); #endif /* Common config infrastructure. Mongoose & v7 must be initialized. */ init_device(v7); sj_updater_post_init(v7); #ifndef DISABLE_C_CLUBBY init_updater_clubby(v7); #endif #ifndef CS_DISABLE_JS /* SJS initialized, enable GC back, and trigger it */ v7_set_gc_enabled(v7, 1); v7_gc(v7, 1); v7_val_t res; if (v7_exec_file(v7, "sys_init.js", &res) != V7_OK) { fprintf(stderr, "Error: "); v7_fprint(stderr, v7, res); } #endif LOG(LL_INFO, ("%s init done, RAM: %d free", "Sys", sj_get_free_heap_size())); if (!sj_app_init(v7)) { LOG(LL_ERROR, ("App init failed")); abort(); } LOG(LL_INFO, ("%s init done, RAM: %d free", "App", sj_get_free_heap_size())); if (boot_cfg.flags & BOOT_F_FIRST_BOOT) { boot_cfg.seq = saved_seq; commit_update(boot_cfg_idx, &boot_cfg); clubby_updater_finish(0); } else { /* * If there is no update reply state, this will just be ignored. * But if there is, then update was rolled back and reply will be sent. */ clubby_updater_finish(-1); } #ifndef CS_DISABLE_JS sj_prompt_init(v7); #endif return 1; }
static void uart_int() { int c = UARTCharGet(CONSOLE_UART); struct prompt_event pe = {.type = PROMPT_CHAR_EVENT, .data = (void *) c}; osi_MsgQWrite(&s_v7_q, &pe, OSI_NO_WAIT); MAP_UARTIntClear(CONSOLE_UART, UART_INT_RX); } void sj_prompt_init_hal(struct v7 *v7) { (void) v7; } static void v7_task(void *arg) { struct v7 *v7 = s_v7; printf("\n\nSmart.JS for CC3200\n"); osi_MsgQCreate(&s_v7_q, "V7", sizeof(struct prompt_event), 32 /* len */); osi_InterruptRegister(CONSOLE_UART_INT, uart_int, INT_PRIORITY_LVL_1); MAP_UARTIntEnable(CONSOLE_UART, UART_INT_RX); sl_Start(NULL, NULL, NULL); v7 = s_v7 = init_v7(&v7); sj_init_timers(v7); sj_init_v7_ext(v7); init_wifi(v7); if (init_fs(v7) != 0) { fprintf(stderr, "FS initialization failed.\n"); } mongoose_init(); sj_init_http(v7); init_i2cjs(v7); /* Common config infrastructure. Mongoose & v7 must be initialized. */ init_device(v7); v7_val_t res; if (v7_exec_file(v7, "sys_init.js", &res) != V7_OK) { fprintf(stderr, "Error: "); v7_fprint(stderr, v7, res); } sj_prompt_init(v7); while (1) { struct prompt_event pe; mongoose_poll(MONGOOSE_POLL_LENGTH_MS); if (osi_MsgQRead(&s_v7_q, &pe, V7_POLL_LENGTH_MS) != OSI_OK) continue; switch (pe.type) { case PROMPT_CHAR_EVENT: { sj_prompt_process_char((char) ((int) pe.data)); break; } case V7_INVOKE_EVENT: { struct v7_invoke_event_data *ied = (struct v7_invoke_event_data *) pe.data; _sj_invoke_cb(v7, ied->func, ied->this_obj, ied->args); v7_disown(v7, &ied->args); v7_disown(v7, &ied->this_obj); v7_disown(v7, &ied->func); free(ied); break; } } } } /* Int vector table, defined in startup_gcc.c */ extern void (*const g_pfnVectors[])(void); void device_reboot(void) { sj_system_restart(); } int main() { MAP_IntVTableBaseSet((unsigned long) &g_pfnVectors[0]); MAP_IntEnable(FAULT_SYSTICK); MAP_IntMasterEnable(); PRCMCC3200MCUInit(); cc3200_leds_init(); /* Console UART init. */ MAP_PRCMPeripheralClkEnable(CONSOLE_UART_PERIPH, PRCM_RUN_MODE_CLK); MAP_PinTypeUART(PIN_55, PIN_MODE_3); /* PIN_55 -> UART0_TX */ MAP_PinTypeUART(PIN_57, PIN_MODE_3); /* PIN_57 -> UART0_RX */ MAP_UARTConfigSetExpClk( CONSOLE_UART, MAP_PRCMPeripheralClockGet(CONSOLE_UART_PERIPH), CONSOLE_BAUD_RATE, (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE)); MAP_UARTFIFODisable(CONSOLE_UART); setvbuf(stdout, NULL, _IONBF, 0); setvbuf(stderr, NULL, _IONBF, 0); VStartSimpleLinkSpawnTask(8); osi_TaskCreate(v7_task, (const signed char *) "v7", V7_STACK_SIZE + 256, NULL, 3, NULL); osi_TaskCreate(blinkenlights_task, (const signed char *) "blink", 256, NULL, 9, NULL); osi_start(); return 0; }
static void uart_int() { int c = UARTCharGet(CONSOLE_UART); struct prompt_event pe = {.type = PROMPT_CHAR_EVENT, .data = (void *) c}; osi_MsgQWrite(&s_v7_q, &pe, OSI_NO_WAIT); MAP_UARTIntClear(CONSOLE_UART, UART_INT_RX); } void sj_prompt_init_hal(struct v7 *v7) { (void) v7; } static void v7_task(void *arg) { struct v7 *v7 = s_v7; printf("\n\nSmart.JS for CC3200\n"); osi_MsgQCreate(&s_v7_q, "V7", sizeof(struct prompt_event), 32 /* len */); osi_InterruptRegister(CONSOLE_UART_INT, uart_int, INT_PRIORITY_LVL_1); MAP_UARTIntEnable(CONSOLE_UART, UART_INT_RX); sl_Start(NULL, NULL, NULL); v7 = s_v7 = init_v7(&v7); sj_timers_api_setup(v7); sj_v7_ext_api_setup(v7); sj_init_sys(v7); init_wifi(v7); if (init_fs(v7) != 0) { fprintf(stderr, "FS initialization failed.\n"); } mongoose_init(); sj_http_api_setup(v7); sj_i2c_api_setup(v7); /* Common config infrastructure. Mongoose & v7 must be initialized. */ init_device(v7); v7_val_t res; if (v7_exec_file(v7, "sys_init.js", &res) != V7_OK) { fprintf(stderr, "Error: "); v7_fprint(stderr, v7, res); } sj_prompt_init(v7); while (1) { struct prompt_event pe; mongoose_poll(MONGOOSE_POLL_LENGTH_MS); if (osi_MsgQRead(&s_v7_q, &pe, V7_POLL_LENGTH_MS) != OSI_OK) continue; switch (pe.type) { case PROMPT_CHAR_EVENT: { sj_prompt_process_char((char) ((int) pe.data)); break; } case V7_INVOKE_EVENT: { struct v7_invoke_event_data *ied = (struct v7_invoke_event_data *) pe.data; _sj_invoke_cb(v7, ied->func, ied->this_obj, ied->args); v7_disown(v7, &ied->args); v7_disown(v7, &ied->this_obj); v7_disown(v7, &ied->func); free(ied); break; } } } } /* Int vector table, defined in startup_gcc.c */ extern void (*const g_pfnVectors[])(void); void device_reboot(void) { sj_system_restart(0); }