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; }
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; }