Ejemplo n.º 1
0
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(&param->lun_info[i]);
	}
	return VSFERR_NONE;
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
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;
}