static vsf_err_t vsfusbd_MSCBOT_class_init(uint8_t iface, struct vsfusbd_device_t *device) { struct interface_usbd_t *drv = device->drv; struct vsfusbd_config_t *config = &device->config[device->configuration]; struct vsfusbd_MSCBOT_param_t *param = (struct vsfusbd_MSCBOT_param_t *)config->iface[iface].protocol_param; uint8_t i; if ((NULL == param) || // minium ep size of MSCBOT is 32 bytes, // so that CBW and CSW can be transfered in one package (drv->ep.get_IN_epsize(param->ep_in) < 32) || (drv->ep.get_OUT_epsize(param->ep_in) < 32) || vsfusbd_set_IN_handler(device, param->ep_in, vsfusbd_MSCBOT_IN_hanlder) || vsfusbd_set_OUT_handler(device, param->ep_out, vsfusbd_MSCBOT_OUT_hanlder) || drv->ep.enable_OUT(param->ep_out)) { return VSFERR_FAIL; } param->idle = true; param->poll = false; param->bot_status = VSFUSBD_MSCBOT_STATUS_IDLE; for (i = 0; i <= param->max_lun; i++) { SCSI_Init(¶m->lun_info[i]); } return VSFERR_NONE; }
static struct vsfsm_state_t * vsfusbd_CDCData_evt_handler(struct vsfsm_t *sm, vsfsm_evt_t evt) { struct vsfusbd_CDC_param_t *param = (struct vsfusbd_CDC_param_t *)sm->user_data; struct vsfusbd_device_t *device = param->device; switch (evt) { case VSFSM_EVT_INIT: param->stream_tx->callback_rx.param = param; param->stream_tx->callback_rx.on_inout = vsfusbd_CDCData_streamtx_on_in; param->stream_tx->callback_rx.on_connect = vsfusbd_CDCData_streamtx_on_txconn; param->stream_rx->callback_tx.param = param; param->stream_rx->callback_tx.on_inout = vsfusbd_CDCData_streamrx_on_out; param->stream_rx->callback_tx.on_connect = vsfusbd_CDCData_streamrx_on_rxconn; param->out_enable = false; param->in_enable = false; break; case VSFUSBD_CDC_EVT_STREAMTX_ONCONN: vsfusbd_set_IN_handler(device, param->ep_in, vsfusbd_CDCData_IN_hanlder); break; case VSFUSBD_CDC_EVT_STREAMRX_ONCONN: vsfusbd_set_OUT_handler(device, param->ep_out, vsfusbd_CDCData_OUT_hanlder); vsfsm_post_evt(sm, VSFUSBD_CDC_EVT_STREAMRX_ONOUT); break; case VSFUSBD_CDC_EVT_STREAMTX_ONIN: if (!param->in_enable) { param->in_enable = true; vsfusbd_CDCData_IN_hanlder(param->device, param->ep_in); } break; case VSFUSBD_CDC_EVT_STREAMRX_ONOUT: if (!param->out_enable && (stream_get_free_size(param->stream_rx) >= device->drv->ep.get_OUT_epsize(param->ep_out))) { param->out_enable = true; device->drv->ep.enable_OUT(param->ep_out); } break; } return NULL; }
static vsf_err_t vsfusbd_CDCData_class_init(uint8_t iface, struct vsfusbd_device_t *device) { struct vsfusbd_config_t *config = &device->config[device->configuration]; struct vsfusbd_CDC_param_t *param = (struct vsfusbd_CDC_param_t *)config->iface[iface].protocol_param; if ((NULL == param) || (NULL == param->stream_tx) || (NULL == param->stream_rx) || vsfusbd_set_IN_handler(device, param->ep_in, vsfusbd_CDCData_IN_hanlder) || device->drv->ep.set_IN_count(param->ep_in, 0) || vsfusbd_set_OUT_handler(device, param->ep_out, vsfusbd_CDCData_OUT_hanlder)) { return VSFERR_FAIL; } param->out_enable = false; return VSFERR_NONE; }