Пример #1
0
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();
		}
	}
}
Пример #2
0
// 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;
}