int main(void) { uint32_t app_main_ptr; vsf_leave_critical(); // system initialize vsf_bufmgr_init(app.bufmgr_buffer, sizeof(app.bufmgr_buffer)); core_interfaces.core.init(NULL); core_interfaces.tickclk.init(); core_interfaces.tickclk.start(); vsftimer_init(); core_interfaces.tickclk.set_callback(app_tickclk_callback_int, NULL); if (app.hwcfg.key.port != IFS_DUMMY_PORT) { core_interfaces.gpio.init(app.hwcfg.key.port); core_interfaces.gpio.config_pin(app.hwcfg.key.port, app.hwcfg.key.port, GPIO_INPU); } if ((IFS_DUMMY_PORT == app.hwcfg.key.port) || core_interfaces.gpio.get(app.hwcfg.key.port, 1 << app.hwcfg.key.pin)) { // key release // load and call application app_main_ptr = *(uint32_t *)APP_MAIN_ADDR; if (app_main_ptr < 128 * 1024) { app_main_ptr += APP_MAIN_ADDR; ((int (*)(struct app_hwcfg_t *hwcfg))app_main_ptr)(&app.hwcfg); } else { goto bootlaoder_init; } } else { // run bootloader bootlaoder_init: } while (1) { vsfsm_poll(); vsf_enter_critical(); if (!vsfsm_get_event_pending()) { // sleep, will also enable interrupt core_interfaces.core.sleep(SLEEP_WFI); } else { vsf_leave_critical(); } } }
// vsfos static vsf_err_t vsfos_thread(struct vsfsm_pt_t *pt, vsfsm_evt_t evt) { struct vsfos_modifs_t *ifs = (struct vsfos_modifs_t *)pt->user_data; vsf_err_t err; vsfsm_pt_begin(pt); vsfhal_core_init(NULL); vsfhal_tickclk_init(); vsfhal_tickclk_start(); // timer VSFPOOL_INIT(&ifs->vsftimer_pool, struct vsftimer_t, VSFOSCFG_VSFSM_PENDSVQ_LEN); vsftimer_init(&ifs->vsftimer_memop); vsfhal_tickclk_config_cb(vsfos_tickclk_callback_int, NULL); // file VSFPOOL_INIT(&ifs->vfsfile_pool, struct vsfile_vfsfile_t, VSFOSCFG_VFS_NO); vsfile_init(&ifs->fs.memop); ifs->caller_pt.state = 0; vsfsm_pt_entry(pt); err = vsfile_addfile(&ifs->caller_pt, evt, NULL, "msc_root", VSFILE_ATTR_DIRECTORY); if (err != 0) return err; ifs->caller_pt.state = 0; vsfsm_pt_entry(pt); err = vsfile_getfile(&ifs->caller_pt, evt, NULL, "/msc_root", &ifs->file); if (err != 0) return err; ifs->caller_pt.state = 0; ifs->caller_pt.user_data = &ifs->mal.fakefat32; err = vsfile_mount(&ifs->caller_pt, evt, (struct vsfile_fsop_t *)&fakefat32_fs_op, ifs->file); if (err != 0) return err; // vsfip { struct vsfip_buffer_t *buffer; int i; buffer = &ifs->tcpip.buffer_pool.buffer[0]; for (i = 0; i < VSFOSCFG_VSFIP_BUFFER_NUM; i++) { buffer->buffer = ifs->tcpip.buffer_mem[i]; buffer++; } } VSFPOOL_INIT(&ifs->tcpip.buffer_pool, struct vsfip_buffer_t, VSFOSCFG_VSFIP_BUFFER_NUM); VSFPOOL_INIT(&ifs->tcpip.socket_pool, struct vsfip_socket_t, VSFOSCFG_VSFIP_SOCKET_NUM); VSFPOOL_INIT(&ifs->tcpip.tcppcb_pool, struct vsfip_tcppcb_t, VSFOSCFG_VSFIP_TCPPCB_NUM); vsfip_init((struct vsfip_mem_op_t *)&ifs->tcpip.mem_op); STREAM_INIT(&ifs->usbd.cdc.stream_rx); STREAM_INIT(&ifs->usbd.cdc.stream_tx); vsfscsi_init(&ifs->mal.scsi_dev); vsfusbd_device_init(&ifs->usbd.device); vsfshell_init(&ifs->shell); vsfos_busybox_init(&ifs->shell); if ((ifs->hwcfg->usbd.pullup.port != IFS_DUMMY_PORT) && (vsfhal_gpio_if != NULL)) { uint8_t port = ifs->hwcfg->usbd.pullup.port; uint8_t pin = ifs->hwcfg->usbd.pullup.pin; vsfhal_gpio_init(port); vsfhal_gpio_clear(port, 1 << pin); vsfhal_gpio_config_pin(port, pin, GPIO_OUTPP); } ifs->usbd.device.drv->disconnect(); vsfsm_pt_delay(pt, 200); if ((ifs->hwcfg->usbd.pullup.port != IFS_DUMMY_PORT) && (vsfhal_gpio_if != NULL)) { uint8_t port = ifs->hwcfg->usbd.pullup.port; uint8_t pin = ifs->hwcfg->usbd.pullup.pin; vsfhal_gpio_set(port, 1 << pin); } ifs->usbd.device.drv->connect(); while (1) { vsfsm_pt_delay(pt, 1000); asm("nop"); vsfsm_pt_delay(pt, 1000); asm("nop"); vsfsm_pt_delay(pt, 1000); asm("nop"); vsfsm_pt_delay(pt, 1000); asm("nop"); vsfsm_pt_delay(pt, 1000); asm("nop"); vsfsm_pt_delay(pt, 1000); asm("nop"); } vsfsm_pt_end(pt); return VSFERR_NONE; }