📄 usb_host_ms_drv.c
字号:
}
}
else
{
/* Prepare to recieve the whole data */
tr_result = USB_HCD_Recv_Req(g_UsbHostMs.ep_in_index, g_UsbHostMs.data_length, g_UsbHostMs.data);
if(tr_result==KAL_TRUE)
{
g_UsbHostMs.sending_data_length = g_UsbHostMs.data_length;
g_UsbHostMs.remain_data_length = 0;
g_UsbHostMs.sent_data_length = 0;
}
else
{
g_UsbHostMs.result = USB_HOST_MS_RESULT_TIMEOUT;
kal_set_eg_events(g_UsbHostMs.event_id, EVENT_USB_MS_DONE, KAL_OR);
}
}
}
else
{
/* Send data*/
if(g_UsbHostMs.data_length > USBMS_MAX_DATA_LENGTH)
{
/* DMA length has limit, so each transfer request should should have size limit */
tr_result = USB_HCD_Send_Req(g_UsbHostMs.ep_out_index, USBMS_MAX_DATA_LENGTH, g_UsbHostMs.data);
if(tr_result==KAL_TRUE)
{
g_UsbHostMs.sending_data_length = USBMS_MAX_DATA_LENGTH;
g_UsbHostMs.remain_data_length = g_UsbHostMs.data_length - USBMS_MAX_DATA_LENGTH;
g_UsbHostMs.sent_data_length = 0;
}
else
{
g_UsbHostMs.result = USB_HOST_MS_RESULT_TIMEOUT;
kal_set_eg_events(g_UsbHostMs.event_id, EVENT_USB_MS_DONE, KAL_OR);
}
}
else
{
/* Send the whole data out */
tr_result = USB_HCD_Send_Req(g_UsbHostMs.ep_out_index, g_UsbHostMs.data_length, g_UsbHostMs.data);
if(tr_result==KAL_TRUE)
{
g_UsbHostMs.sending_data_length = g_UsbHostMs.data_length;
g_UsbHostMs.remain_data_length = 0;
g_UsbHostMs.sent_data_length = 0;
}
else
{
g_UsbHostMs.result = USB_HOST_MS_RESULT_TIMEOUT;
kal_set_eg_events(g_UsbHostMs.event_id, EVENT_USB_MS_DONE, KAL_OR);
}
}
}
/* change to DATA state */
g_UsbHostMs.ms_state = USB_HOST_MS_DATA;
}
else
{
/* CSW state should be the following state */
/* Send CSW */
tr_result = USB_HCD_Recv_Req(g_UsbHostMs.ep_in_index, sizeof(g_UsbHostMs.CSW)/sizeof(kal_uint8), &g_UsbHostMs.CSW);
if(tr_result==KAL_TRUE)
g_UsbHostMs.ms_state = USB_HOST_MS_CSW;
else
{
g_UsbHostMs.result = USB_HOST_MS_RESULT_TIMEOUT;
kal_set_eg_events(g_UsbHostMs.event_id, EVENT_USB_MS_DONE, KAL_OR);
}
}
}
else if(result == USB_HCD_STALL)
{
/* CBW is OUT endpoint, so clear STALL OUT */
g_UsbHostMs.ms_state = USB_HOST_MS_CBW_CLEAR_STALL;
g_UsbHostMs.ms_cmd = USB_HOST_MS_EP0_CMD_CLEAR_STALL_OUT;
/* clear data01 */
USB_HCD_Clear_Data01(g_UsbHostMs.ep_out_index);
USBD_Clear_Stall(g_UsbHostMs.ep_out_num, USB_OUT_EP_TYPE);
}
else
{
if(result==USB_HCD_DETATCH)
{
g_UsbHostMs.result = USB_HOST_MS_RESULT_TIMEOUT;
}
else
{
/* Other error condition, notify application about this error */
g_UsbHostMs.result = USB_HOST_MS_RESULT_TIMEOUT;
}
kal_set_eg_events(g_UsbHostMs.event_id, EVENT_USB_MS_DONE, KAL_OR);
}
}
/* Ctrl EP DATA handler, handle the state mcahine */
static void USB_Host_Ms_DATA_Hdler(USB_HCD_STATUS result, kal_uint32 param)
{
kal_bool tr_result;
if(result==USB_HCD_OK)
{
g_UsbHostMs.sent_data_length+=param;
/* In case some device may return 0 first and then real data, so check sent data length */
if((g_UsbHostMs.sending_data_length!=param) &&(g_UsbHostMs.sent_data_length!=0))
{
/* The real send/receive length is not the expected length */
/* No matter the remaining data length, end the data phase directly*/
/* Send CSW, and enter CSW state */
tr_result = USB_HCD_Recv_Req(g_UsbHostMs.ep_in_index, sizeof(g_UsbHostMs.CSW)/sizeof(kal_uint8), &g_UsbHostMs.CSW);
if(tr_result==KAL_TRUE)
g_UsbHostMs.ms_state = USB_HOST_MS_CSW;
else
{
g_UsbHostMs.result = USB_HOST_MS_RESULT_TIMEOUT;
kal_set_eg_events(g_UsbHostMs.event_id, EVENT_USB_MS_DONE, KAL_OR);
}
}
else
{
/* In case some device may return 0 first and then real data, so check sent data length */
if(g_UsbHostMs.sent_data_length==0)
g_UsbHostMs.remain_data_length+=g_UsbHostMs.sending_data_length;
if(g_UsbHostMs.remain_data_length!=0)
{
/* More data need to send/receive */
if(g_UsbHostMs.data_dir == USB_HOST_MS_DATA_NONE)
EXT_ASSERT(0, g_UsbHostMs.data_dir, g_UsbHostMs.data_length, g_UsbHostMs.remain_data_length);
if(g_UsbHostMs.data_dir ==USB_HOST_MS_DATA_RECV)
{
/* Receive data */
if(g_UsbHostMs.remain_data_length > USBMS_MAX_DATA_LENGTH)
{
/* DMA length has limit, so each transfer request should should have size limit */
tr_result = USB_HCD_Recv_Req(g_UsbHostMs.ep_in_index, USBMS_MAX_DATA_LENGTH, (g_UsbHostMs.data+g_UsbHostMs.sent_data_length));
if(tr_result==KAL_TRUE)
{
g_UsbHostMs.sending_data_length = USBMS_MAX_DATA_LENGTH;
g_UsbHostMs.remain_data_length = g_UsbHostMs.remain_data_length - USBMS_MAX_DATA_LENGTH;
}
else
{
g_UsbHostMs.result = USB_HOST_MS_RESULT_TIMEOUT;
kal_set_eg_events(g_UsbHostMs.event_id, EVENT_USB_MS_DONE, KAL_OR);
}
}
else
{
/* Prepare to recieve the whole data */
tr_result = USB_HCD_Recv_Req(g_UsbHostMs.ep_in_index, g_UsbHostMs.remain_data_length, (g_UsbHostMs.data+g_UsbHostMs.sent_data_length));
if(tr_result == KAL_TRUE)
{
g_UsbHostMs.sending_data_length = g_UsbHostMs.remain_data_length;
g_UsbHostMs.remain_data_length = 0;
}
else
{
g_UsbHostMs.result = USB_HOST_MS_RESULT_TIMEOUT;
kal_set_eg_events(g_UsbHostMs.event_id, EVENT_USB_MS_DONE, KAL_OR);
}
}
}
else
{
/* Send data */
if(g_UsbHostMs.remain_data_length > USBMS_MAX_DATA_LENGTH)
{
/* DMA length has limit, so each transfer request should should have size limit */
tr_result = USB_HCD_Send_Req(g_UsbHostMs.ep_out_index, USBMS_MAX_DATA_LENGTH, (g_UsbHostMs.data+g_UsbHostMs.sent_data_length));
if(tr_result==KAL_TRUE)
{
g_UsbHostMs.sending_data_length = USBMS_MAX_DATA_LENGTH;
g_UsbHostMs.remain_data_length = g_UsbHostMs.remain_data_length - USBMS_MAX_DATA_LENGTH;
}
else
{
g_UsbHostMs.result = USB_HOST_MS_RESULT_TIMEOUT;
kal_set_eg_events(g_UsbHostMs.event_id, EVENT_USB_MS_DONE, KAL_OR);
}
}
else
{
/* Send the whole data out */
tr_result = USB_HCD_Send_Req(g_UsbHostMs.ep_out_index, g_UsbHostMs.remain_data_length, (g_UsbHostMs.data+g_UsbHostMs.sent_data_length));
if(tr_result==KAL_TRUE)
{
g_UsbHostMs.sending_data_length = g_UsbHostMs.remain_data_length;
g_UsbHostMs.remain_data_length = 0;
}
else
{
g_UsbHostMs.result = USB_HOST_MS_RESULT_TIMEOUT;
kal_set_eg_events(g_UsbHostMs.event_id, EVENT_USB_MS_DONE, KAL_OR);
}
}
}
/* Still in DATA state */
g_UsbHostMs.ms_state = USB_HOST_MS_DATA;
}
else
{
/* CSW state should be the following state */
/* Send CSW */
tr_result = USB_HCD_Recv_Req(g_UsbHostMs.ep_in_index, sizeof(g_UsbHostMs.CSW)/sizeof(kal_uint8), &g_UsbHostMs.CSW);
if(tr_result ==KAL_TRUE)
g_UsbHostMs.ms_state = USB_HOST_MS_CSW;
else
{
g_UsbHostMs.result = USB_HOST_MS_RESULT_TIMEOUT;
kal_set_eg_events(g_UsbHostMs.event_id, EVENT_USB_MS_DONE, KAL_OR);
}
}
}
}
else if(result == USB_HCD_STALL)
{
/* Clear data stall acoording to data direction */
if(g_UsbHostMs.data_dir ==USB_HOST_MS_DATA_RECV)
{
g_UsbHostMs.ms_state = USB_HOST_MS_DATA_CLEAR_STALL;
g_UsbHostMs.ms_cmd = USB_HOST_MS_EP0_CMD_CLEAR_STALL_IN;
/* clear data01 */
USB_HCD_Clear_Data01(g_UsbHostMs.ep_in_index);
USBD_Clear_Stall(g_UsbHostMs.ep_in_num, USB_IN_EP_TYPE);
}
else
{
g_UsbHostMs.ms_state = USB_HOST_MS_DATA_CLEAR_STALL;
g_UsbHostMs.ms_cmd = USB_HOST_MS_EP0_CMD_CLEAR_STALL_OUT;
/* clear data01 */
USB_HCD_Clear_Data01(g_UsbHostMs.ep_out_index);
USBD_Clear_Stall(g_UsbHostMs.ep_out_num, USB_OUT_EP_TYPE);
}
}
else
{
if(result==USB_HCD_DETATCH)
{
g_UsbHostMs.result = USB_HOST_MS_RESULT_TIMEOUT;
}
else
{
/* Other error condition, notify application about this error */
g_UsbHostMs.result = USB_HOST_MS_RESULT_TIMEOUT;
}
kal_set_eg_events(g_UsbHostMs.event_id, EVENT_USB_MS_DONE, KAL_OR);
}
}
/* Ctrl EP CSW handler, handle the state mcahine */
static void USB_Host_Ms_CSW_Hdler(USB_HCD_STATUS result, kal_uint32 param)
{
if(result==USB_HCD_OK)
{
/* translate state to be NONE */
g_UsbHostMs.ms_state = USB_HOST_MS_NONE;
/* chek the real received length */
if(param!=USBMS_CSW_LENGTH)
{
//EXT_ASSERT(0, param, 0, 0);
g_UsbHostMs.result = USB_HOST_MS_RESULT_TIMEOUT;
}
else
{
/* Check CSW result */
if(g_UsbHostMs.CSW.bmCSWStatus == KAL_TRUE)
g_UsbHostMs.result = USB_HOST_MS_RESULT_CSW_FAIL;
else
g_UsbHostMs.result = USB_HOST_MS_RESULT_OK;
}
/* Notify application that the whole CBW, DATA, CSW is completed */
kal_set_eg_events(g_UsbHostMs.event_id, EVENT_USB_MS_DONE, KAL_OR);
}
else if(result == USB_HCD_STALL)
{
if(g_UsbHostMs.ms_state == USB_HOST_MS_CSW)
{
/* Receive STALL in the first CSW, clear stall and try CSW again after clear stall */
g_UsbHostMs.ms_state = USB_HOST_MS_CSW_CLEAR_STALL;
g_UsbHostMs.ms_cmd = USB_HOST_MS_EP0_CMD_CLEAR_STALL_IN;
/* clear data01 */
USB_HCD_Clear_Data01(g_UsbHostMs.ep_in_index);
USBD_Clear_Stall(g_UsbHostMs.ep_in_num, USB_IN_EP_TYPE);
}
else if(g_UsbHostMs.ms_state == USB_HOST_MS_CSW_CLEAR_STALL)
{
/* Receive STALL in the second CSW. Do not issue CSW any more
Notify application to handle the STALL result */
g_UsbHostMs.result = USB_HOST_MS_RESULT_STALL;
kal_set_eg_events(g_UsbHostMs.event_id, EVENT_USB_MS_DONE, KAL_OR);
}
}
else
{
if(result==USB_HCD_DETATCH)
{
g_UsbHostMs.result = USB_HOST_MS_RESULT_TIMEOUT;
}
else
{
/* Other error condition, notify application about this error */
g_UsbHostMs.result = USB_HOST_MS_RESULT_TIMEOUT;
}
kal_set_eg_events(g_UsbHostMs.event_id, EVENT_USB_MS_DONE, KAL_OR);
}
}
#endif /* __OTG_ENABLE__ */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -