Example #1
0
vsf_err_t vsfusbh_add_device(struct vsfusbh_t *usbh,
		struct vsfusbh_device_t *dev)
{
	uint8_t i, j, k, claimed = 0;
#if 0
	uint8_t rejected = 0;
#endif

	vsfsm_crit_init(&dev->ep0_crit, VSFSM_EVT_EP0_CRIT);

	for (i = 0; i < dev->actconfig->bNumInterfaces; i++)
	{
		if (dev->actconfig->interface[i].driver == NULL)
		{
			if (vsfusbh_find_intrface_driver(usbh, dev, i) == VSFERR_NONE)
				claimed++;
#if 0
			else
				rejected++;
#endif
		}
	}

	// clear all 'extra' pointer
	// free config_buffer
	if (dev->config != NULL)
	{
		for (i = 0; i < dev->num_config; i++)
		{
			//dev->config[i].extra = NULL;
			if (dev->config[i].interface != NULL)
			{
				struct usb_interface_desc_t *altsetting =
							dev->config[i].interface->altsetting;
				if (altsetting != NULL)
				{
					for (j = 0; j < dev->config[i].interface->num_altsetting;
							j++)
					{
						altsetting[j].extra = NULL;
						if (altsetting[j].ep_desc != NULL)
						{
							for (k = 0; k < altsetting[j].bNumEndpoints; k++)
							{
								altsetting[j].ep_desc[k].extra = NULL;
							}
						}
					}
				}
			}

			if (dev->config[i].config_buffer != NULL)
				vsf_bufmgr_free(dev->config[i].config_buffer);
			dev->config[i].config_buffer = NULL;
		}
	}

#if 0
	if (rejected); // unhandled interfaces on device
#endif

	if (claimed == 0)
		return VSFERR_NOT_SUPPORT;
	else
		return VSFERR_NONE;
}
Example #2
0
static struct vsfsm_state_t *
vsfshell_evt_handler(struct vsfsm_t *sm, vsfsm_evt_t evt)
{
	struct vsfshell_t *shell = (struct vsfshell_t *)sm->user_data;
	
	switch (evt)
	{
	case VSFSM_EVT_INIT:
		shell->prompted = false;
		shell->output_interrupted = false;
		shell->tbuffer.buffer.buffer = (uint8_t *)shell->cmd_buff;
		shell->tbuffer.buffer.size = sizeof(shell->cmd_buff);
		shell->tbuffer.position = 0;
		vsfsm_crit_init(&shell->output_crit, VSFSHELL_EVT_OUTPUT_CRIT_AVAIL);
		
		shell->stream_rx->callback_rx.param = shell;
		shell->stream_rx->callback_rx.on_inout = vsfshell_streamrx_on_in;
		shell->stream_rx->callback_rx.on_connect = vsfshell_streamrx_on_txconn;
		shell->stream_tx->callback_tx.param = shell;
		shell->stream_tx->callback_tx.on_inout = vsfshell_streamtx_on_out;
		shell->stream_tx->callback_tx.on_connect = vsfshell_streamtx_on_rxconn;
		
		// shell->output_pt is only called by shell->input_pt
		shell->output_pt.thread = (vsfsm_pt_thread_t)vsfshell_output_thread;
		shell->output_pt.sm = sm;
		shell->output_pt.user_data = shell;
		// shell->input_pt is used to hanlde the events from stream_rx
		shell->input_pt.thread = vsfshell_input_thread;
		shell->input_pt.sm = sm;
		shell->input_pt.user_data = shell;
		shell->input_pt.state = 0;
		shell->input_pt.thread(&shell->input_pt, VSFSM_EVT_INIT);
		// default input sm is shell itself
		shell->input_sm = &shell->sm;
		
		stream_connect_rx(shell->stream_rx);
		stream_connect_tx(shell->stream_tx);
		break;
	case VSFSHELL_EVT_STREAMRX_ONCONN:
		break;
	case VSFSHELL_EVT_STREAMTX_ONCONN:
		// pass to shell->input_pt
		shell->input_pt.thread(&shell->input_pt, evt);
		break;
	case VSFSHELL_EVT_STREAMRX_ONIN:
		if (shell->input_sm == &shell->sm)
		{
			// pass to shell->input_pt
			shell->input_pt.thread(&shell->input_pt, evt);
		}
		else if (shell->input_sm != NULL)
		{
			vsfsm_post_evt(shell->input_sm, evt);
		}
		break;
	case VSFSHELL_EVT_STREAMTX_ONOUT:
		if (shell->output_sm == &shell->sm)
		{
			// pass to shell->input_pt
			shell->input_pt.thread(&shell->input_pt, evt);
		}
		else if (shell->output_sm != NULL)
		{
			vsfsm_post_evt(shell->output_sm, evt);
		}
		break;
	}
	
	return NULL;
}