📄 usb_host_ms_drv.c
字号:
ms class ep0 class specific functions (Control endpoint functions)
*************************************************************/
/* class specific Get LUN request.
It is a block function, the transfer is completed when return
Note that this function must be used in task contex */
void USB_Host_Ms_Get_LUN(void)
{
kal_uint32 event_group;
gUsbHost.ep0_status.setup_cmd.bmRequestType = USB_CMD_CLASSIFIN;
gUsbHost.ep0_status.setup_cmd.bRequest = USB_MS_GETMAXLUN;
gUsbHost.ep0_status.setup_cmd.wValue = 0;
gUsbHost.ep0_status.setup_cmd.wIndex = 0;
gUsbHost.ep0_status.setup_cmd.wLength = 1;
gUsbHost.ep0_state = USBD_EP0_SETUP;
gUsbHost.ep0_status.data_ptr= &g_UsbHostMs.total_lun;
gUsbHost.ep0_status.ep0_data_dir = USBD_EP0_DATA_RECV;
gUsbHost.ep0_status.sofar = 0;
gUsbHost.ep0_status.todo = 1;
g_UsbHostMs.ms_cmd = USB_HOST_MS_EP0_CMD_GET_LUN;
USB_HCD_EP0_Setup_Req(8, &gUsbHost.ep0_status.setup_cmd);
if(g_UsbHostMs.dev_attatch == KAL_TRUE)
{
/* wait for transfer complete */
/* LUN number information is stored in g_UsbHostMs when event is retrieved*/
kal_retrieve_eg_events(g_UsbHostMs.event_id, EVENT_USB_MS_DONE|EVENT_USB_MS_DETATCH,
KAL_OR_CONSUME, &event_group, KAL_SUSPEND);
/* Device status is error if result not OK in EP0 command */
if(g_UsbHostMs.result != USB_HOST_MS_RESULT_OK)
g_UsbHostMs.dev_state = USB_HOST_MS_DEV_STATE_ERROR;
else
g_UsbHostMs.dev_state = USB_HOST_MS_DEV_STATE_READY;
}
}
/* class specific reset request, not the whole device reset */
void USB_Host_Ms_Reset(void)
{
kal_uint32 event_group;
gUsbHost.ep0_status.setup_cmd.bmRequestType = USB_CMD_CLASSIFOUT;
gUsbHost.ep0_status.setup_cmd.bRequest = USB_MS_RESET;
gUsbHost.ep0_status.setup_cmd.wValue = 0;
gUsbHost.ep0_status.setup_cmd.wIndex = 0;
gUsbHost.ep0_status.setup_cmd.wLength = 0;
gUsbHost.ep0_state = USBD_EP0_SETUP;
gUsbHost.ep0_status.data_ptr= &g_UsbHostMs.total_lun;
gUsbHost.ep0_status.ep0_data_dir = USBD_EP0_DATA_NULL;
gUsbHost.ep0_status.sofar = 0;
gUsbHost.ep0_status.todo = 0;
g_UsbHostMs.ms_cmd = USB_HOST_MS_EP0_CMD_RESET;
USB_HCD_EP0_Setup_Req(8, &gUsbHost.ep0_status.setup_cmd);
if(g_UsbHostMs.dev_attatch== KAL_TRUE)
{
/* wait for transfer complete */
kal_retrieve_eg_events(g_UsbHostMs.event_id, EVENT_USB_MS_DONE|EVENT_USB_MS_DETATCH,
KAL_OR_CONSUME, &event_group, KAL_SUSPEND);
/* Device status is error if result not OK in EP0 command */
if(g_UsbHostMs.result != USB_HOST_MS_RESULT_OK)
g_UsbHostMs.dev_state = USB_HOST_MS_DEV_STATE_ERROR;
else
g_UsbHostMs.dev_state = USB_HOST_MS_DEV_STATE_READY;
}
}
/************************************************************
ms class state functions (Bulk endpoint functions)
*************************************************************/
/* REQUEST SENSE command (03h)*/
USB_HOST_MS_RESULT USB_Host_Ms_Request_Sense(kal_uint8 lun)
{
kal_bool b_send_result;
kal_uint32 event_group;
USB_HOST_MS_MEDIA_STATE media_state = g_UsbHostMs.media_info[lun].state;
kal_mem_set(g_usb_ms_cmd, 0, USBMS_MAX_CMD_LEN);
g_usb_ms_cmd[0] = USBMS_REQUESTSENSE;
g_usb_ms_cmd[4] = USBMS_REQUESTSENSE_DATA_LEN;
g_UsbHostMs.ms_cmd_data.lun = lun;
g_UsbHostMs.ms_cmd_data.cmd_len = USBMS_REQUESTSENSE_CMD_LEN;
g_UsbHostMs.ms_cmd_data.cmd_buff = g_usb_ms_cmd;
g_UsbHostMs.ms_cmd_data.data_len = USBMS_REQUESTSENSE_DATA_LEN;
g_UsbHostMs.ms_cmd_data.data_buff = g_usb_ms_data;
g_UsbHostMs.ms_cmd_data.data_dir = USB_HOST_MS_DATA_RECV;
b_send_result = USB_Host_Ms_Send_Cmd(&g_UsbHostMs.ms_cmd_data);
if((b_send_result==KAL_TRUE) && (g_UsbHostMs.dev_attatch== KAL_TRUE))
{
/* when event is retrived, result has been got in data buffer */
kal_retrieve_eg_events(g_UsbHostMs.event_id, EVENT_USB_MS_DONE|EVENT_USB_MS_DETATCH,
KAL_OR_CONSUME, &event_group, KAL_SUSPEND);
if(g_UsbHostMs.result == USB_HOST_MS_RESULT_OK)
{
/* translate sense data to media state */
if(g_usb_ms_data[2] ==0x00)
{
if(g_UsbHostMs.media_info[lun].state!=USB_HOST_MS_MEDIA_STATE_WR_PROTECT)
g_UsbHostMs.media_info[lun].state = USB_HOST_MS_MEDIA_STATE_READY;
}
else if(g_usb_ms_data[2] ==0x06)
{
g_UsbHostMs.media_info[lun].state = USB_HOST_MS_MEDIA_STATE_CHANGED;
/* update sector size to 0, it should be set in next read capacify command */
/* it is used in case test unit ready change state to USB_HOST_MS_MEDIA_STATE_READY,
but read capacity is not yet issued */
g_UsbHostMs.media_info[lun].sec_size = 0;
}
else if(g_usb_ms_data[2] ==0x02)
{
g_UsbHostMs.media_info[lun].state = USB_HOST_MS_MEDIA_STATE_ABSENT;
/* update sector size to 0, it should be set in next read capacify command */
g_UsbHostMs.media_info[lun].sec_size = 0;
}
else
{
g_UsbHostMs.media_info[lun].state = USB_HOST_MS_MEDIA_STATE_ERROR;
/* update sector size to 0, it should be set in next read capacify command */
g_UsbHostMs.media_info[lun].sec_size = 0;
}
}
else if(g_UsbHostMs.result == USB_HOST_MS_RESULT_CSW_FAIL)
{
/* Do not request sense again to avoid looping */
}
/* else USB_HOST_MS_RESULT_TIMEOUT and USB_HOST_MS_RESULT_STALL do not handle it*/
if(media_state!=g_UsbHostMs.media_info[lun].state)
{
//g_UsbHostMs.b_state_change = KAL_TRUE;
g_UsbHostMs.media_state_change |= (1<<lun);
}
}
else
{
g_UsbHostMs.result = USB_HOST_MS_RESULT_TIMEOUT;
}
return g_UsbHostMs.result;
}
/* INQUIRY command (12h)*/
USB_HOST_MS_RESULT USB_Host_Ms_Inquiry(kal_uint8 lun)
{
kal_bool b_send_result;
kal_uint32 event_group;
kal_mem_set(g_usb_ms_cmd, 0, USBMS_MAX_CMD_LEN);
g_usb_ms_cmd[0] = USBMS_INQUIRY;
g_usb_ms_cmd[4] = USBMS_INQUIRY_DATA_LEN;
g_UsbHostMs.ms_cmd_data.lun = lun;
g_UsbHostMs.ms_cmd_data.cmd_len = USBMS_INQUIRY_CMD_LEN;
g_UsbHostMs.ms_cmd_data.cmd_buff = g_usb_ms_cmd;
g_UsbHostMs.ms_cmd_data.data_len = USBMS_INQUIRY_DATA_LEN;
g_UsbHostMs.ms_cmd_data.data_buff = g_usb_ms_data;
g_UsbHostMs.ms_cmd_data.data_dir = USB_HOST_MS_DATA_RECV;
b_send_result = USB_Host_Ms_Send_Cmd(&g_UsbHostMs.ms_cmd_data);
if((b_send_result==KAL_TRUE)&&(g_UsbHostMs.dev_attatch== KAL_TRUE))
{
/* when event is retrived, result has been got in data buffer */
kal_retrieve_eg_events(g_UsbHostMs.event_id, EVENT_USB_MS_DONE|EVENT_USB_MS_DETATCH,
KAL_OR_CONSUME, &event_group, KAL_SUSPEND);
if(g_UsbHostMs.result == USB_HOST_MS_RESULT_OK)
{
kal_mem_cpy(g_UsbHostMs.media_info[lun].vendor_info, &g_usb_ms_data[8], USBMS_INQUIRY_VENDOR_INFO_LEN);
kal_mem_cpy(g_UsbHostMs.media_info[lun].product_iden, &g_usb_ms_data[16], USBMS_INQUIRY_PRODUCT_IDEN_LEN);
kal_mem_cpy(g_UsbHostMs.media_info[lun].product_rev, &g_usb_ms_data[32], USBMS_INQUIRY_PRODUCT_REV_LEN);
}
else if(g_UsbHostMs.result == USB_HOST_MS_RESULT_CSW_FAIL)
{
/* reset venfor and product string info as 0*/
kal_mem_set(g_UsbHostMs.media_info[lun].vendor_info, 0, USBMS_INQUIRY_VENDOR_INFO_LEN);
kal_mem_set(g_UsbHostMs.media_info[lun].product_iden, 0, USBMS_INQUIRY_PRODUCT_IDEN_LEN);
kal_mem_set(g_UsbHostMs.media_info[lun].product_rev, 0, USBMS_INQUIRY_PRODUCT_REV_LEN);
/* translate result to request sense result */
/* application can treat it as result OK is request sense reault is OK */
g_UsbHostMs.result = USB_Host_Ms_Request_Sense(lun);
}
/* else USB_HOST_MS_RESULT_TIMEOUT and USB_HOST_MS_RESULT_STALL do not handle it */
}
else
{
g_UsbHostMs.result = USB_HOST_MS_RESULT_TIMEOUT;
}
return g_UsbHostMs.result;
}
/* READ FORMAT CAPACITY command (23h)*/
USB_HOST_MS_RESULT USB_Host_Ms_Read_Format_Capacity(kal_uint8 lun)
{
kal_bool b_send_result;
kal_uint32 event_group;
kal_mem_set(g_usb_ms_cmd, 0, USBMS_MAX_CMD_LEN);
g_usb_ms_cmd[0] = USBMS_READ_FORMATCAPACITY;
g_usb_ms_cmd[8] = USBMS_READ_FORMATCAPACITY_DATA_LEN;
g_UsbHostMs.ms_cmd_data.lun = lun;
g_UsbHostMs.ms_cmd_data.cmd_len = USBMS_READ_FORMATCAPACITY_CMD_LEN;
g_UsbHostMs.ms_cmd_data.cmd_buff = g_usb_ms_cmd;
g_UsbHostMs.ms_cmd_data.data_len = USBMS_READ_FORMATCAPACITY_DATA_LEN;
g_UsbHostMs.ms_cmd_data.data_buff = g_usb_ms_data;
g_UsbHostMs.ms_cmd_data.data_dir = USB_HOST_MS_DATA_RECV;
b_send_result = USB_Host_Ms_Send_Cmd(&g_UsbHostMs.ms_cmd_data);
if((b_send_result==KAL_TRUE)&&(g_UsbHostMs.dev_attatch== KAL_TRUE))
{
/* when event is retrived, result has been got in data buffer */
kal_retrieve_eg_events(g_UsbHostMs.event_id, EVENT_USB_MS_DONE|EVENT_USB_MS_DETATCH,
KAL_OR_CONSUME, &event_group, KAL_SUSPEND);
if(g_UsbHostMs.result == USB_HOST_MS_RESULT_CSW_FAIL)
{
/* translate result to request sense result */
/* application can treat it as result OK is request sense reault is OK */
g_UsbHostMs.result = USB_Host_Ms_Request_Sense(lun);
}
/* else USB_HOST_MS_RESULT_TIMEOUT and USB_HOST_MS_RESULT_STALL do not handle it */
}
else
{
g_UsbHostMs.result = USB_HOST_MS_RESULT_TIMEOUT;
}
return g_UsbHostMs.result;
}
/* READ CAPACITY command (25h)*/
USB_HOST_MS_RESULT USB_Host_Ms_Read_Capacity(kal_uint8 lun)
{
kal_bool b_send_result;
kal_uint32 event_group;
kal_mem_set(g_usb_ms_cmd, 0, USBMS_MAX_CMD_LEN);
g_usb_ms_cmd[0] = USBMS_READ_CAPACITY;
g_UsbHostMs.ms_cmd_data.lun = lun;
g_UsbHostMs.ms_cmd_data.cmd_len = USBMS_READ_CAPACITY_CMD_LEN;
g_UsbHostMs.ms_cmd_data.cmd_buff = g_usb_ms_cmd;
g_UsbHostMs.ms_cmd_data.data_len = USBMS_READ_CAPACITY_DATA_LEN;
g_UsbHostMs.ms_cmd_data.data_buff = g_usb_ms_data;
g_UsbHostMs.ms_cmd_data.data_dir = USB_HOST_MS_DATA_RECV;
b_send_result = USB_Host_Ms_Send_Cmd(&g_UsbHostMs.ms_cmd_data);
if((b_send_result==KAL_TRUE)&&(g_UsbHostMs.dev_attatch== KAL_TRUE))
{
/* when event is retrived, result has been got in data buffer */
kal_retrieve_eg_events(g_UsbHostMs.event_id, EVENT_USB_MS_DONE|EVENT_USB_MS_DETATCH,
KAL_OR_CONSUME, &event_group, KAL_SUSPEND);
if(g_UsbHostMs.result == USB_HOST_MS_RESULT_OK)
{
/* store sector size and sector number info */
g_UsbHostMs.media_info[lun].sec_num = (g_usb_ms_data[0]<<24) + (g_usb_ms_data[1]<<16)
+ (g_usb_ms_data[2]<<8) + (g_usb_ms_data[3]<<0);
g_UsbHostMs.media_info[lun].sec_num++;
g_UsbHostMs.media_info[lun].sec_size = (g_usb_ms_data[4]<<24) + (g_usb_ms_data[5]<<16)
+ (g_usb_ms_data[6]<<8) + (g_usb_ms_data[7]<<0);
/* Add error check */
if(g_UsbHostMs.media_info[lun].sec_num>=0x400000)
{
g_UsbHostMs.media_info[lun].sec_num = 0;
g_UsbHostMs.media_info[lun].sec_size = 0;
g_UsbHostMs.media_info[lun].state = USB_HOST_MS_MEDIA_STATE_ABSENT;
g_UsbHostMs.result = USB_HOST_MS_RESULT_FORMAT_ERROR;
}
}
else if(g_UsbHostMs.result == USB_HOST_MS_RESULT_CSW_FAIL)
{
g_UsbHostMs.media_info[lun].sec_num = 0;
g_UsbHostMs.media_info[lun].sec_size = 0;
/* translate result to request sense result */
/* application can treat it as result OK is request sense reault is OK */
g_UsbHostMs.result = USB_Host_Ms_Request_Sense(lun);
}
/* else USB_HOST_MS_RESULT_TIMEOUT and USB_HOST_MS_RESULT_STALL do not handle it */
}
else
{
g_UsbHostMs.result = USB_HOST_MS_RESULT_TIMEOUT;
}
return g_UsbHostMs.result;
}
/* TEST UNIT READY command (00h)*/
USB_HOST_MS_RESULT USB_Host_Ms_Test_Unit_Ready(kal_uint8 lun)
{
kal_bool b_send_result;
kal_uint32 event_group;
USB_HOST_MS_MEDIA_STATE media_state = g_UsbHostMs.media_info[lun].state;
kal_mem_set(g_usb_ms_cmd, 0, USBMS_MAX_CMD_LEN);
g_usb_ms_cmd[0] = USBMS_TEST_UNIT_READY;
g_UsbHostMs.ms_cmd_data.lun = lun;
g_UsbHostMs.ms_cmd_data.cmd_len = USBMS_TEST_UNIT_READY_CMD_LEN;
g_UsbHostMs.ms_cmd_data.cmd_buff = g_usb_ms_cmd;
g_UsbHostMs.ms_cmd_data.data_len = USBMS_TEST_UNIT_READY_DATA_LEN;
g_UsbHostMs.ms_cmd_data.data_buff = g_usb_ms_data;
g_UsbHostMs.ms_cmd_data.data_dir = USB_HOST_MS_DATA_NONE;
b_send_result = USB_Host_Ms_Send_Cmd(&g_UsbHostMs.ms_cmd_data);
if((b_send_result==KAL_TRUE)&&(g_UsbHostMs.dev_attatch== KAL_TRUE))
{
/* when event is retrived, result has been got in data buffer */
kal_retrieve_eg_events(g_UsbHostMs.event_id, EVENT_USB_MS_DONE|EVENT_USB_MS_DETATCH,
KAL_OR_CONSUME, &event_group, KAL_SUSPEND);
if(g_UsbHostMs.result == USB_HOST_MS_RESULT_OK)
{
/* If data state is USB_HOST_MS_MEDIA_STATE_WR_PROTECT, it means data state is not changed,
do not change it to ready state */
if(g_UsbHostMs.media_info[lun].state!=USB_HOST_MS_MEDIA_STATE_WR_PROTECT)
g_UsbHostMs.media_info[lun].state = USB_HOST_MS_MEDIA_STATE_READY;
}
else if(g_UsbHostMs.result == USB_HOST_MS_RESULT_CSW_FAIL)
{
/* translate result to request sense result */
/* application can treat it as result OK is request sense reault is OK */
/* media state will be changed in request sense handler */
g_UsbHostMs.result = USB_Host_Ms_Request_Sense(lun);
}
/* else USB_HOST_MS_RESULT_TIMEOUT and USB_HOST_MS_RESULT_STALL do not handle it */
if(media_state!=g_UsbHostMs.media_info[lun].state)
{
//g_UsbHostMs.b_state_change = KAL_TRUE;
g_UsbHostMs.media_state_change |= (1<<lun);
}
}
else
{
g_UsbHostMs.result = USB_HOST_MS_RESULT_TIMEOUT;
}
return g_UsbHostMs.result;
}
/* MODE SENSE6 command (1ah)*/
USB_HOST_MS_RESULT USB_Host_Ms_Mode_Sense6(kal_uint8 lun)
{
kal_bool b_send_result;
kal_uint32 event_group;
USB_HOST_MS_MEDIA_STATE media_state = g_UsbHostMs.media_info[lun].state;
kal_mem_set(g_usb_ms_cmd, 0, USBMS_MAX_CMD_LEN);
g_usb_ms_cmd[0] = USBMS_MODE_SENSE6;
g_usb_ms_cmd[2] = 0x1c;
g_usb_ms_cmd[4] = USBMS_MODE_SENSE6_DATA_LEN;
g_UsbHostMs.ms_cmd_data.lun = lun;
g_UsbHostMs.ms_cmd_data.cmd_len = USBMS_MODE_SENSE6_CMD_LEN;
g_UsbHostMs.ms_cmd_data.cmd_buff = g_usb_ms_cmd;
g_UsbHostMs.ms_cmd_data.data_len = USBMS_MODE_SENSE6_DATA_LEN;
g_UsbHostMs.ms_cmd_data.data_buff = g_usb_ms_data;
g_UsbHostMs.ms_cmd_data.data_dir = USB_HOST_MS_DATA_RECV;
b_send_result = USB_Host_Ms_Send_Cmd(&g_UsbHostMs.ms_cmd_data);
if((b_send_result==KAL_TRUE)&&(g_UsbHostMs.dev_attatch == KAL_TRUE))
{
/* when event is retrived, result has been got in data buffer */
kal_retrieve_eg_events(g_UsbHostMs.event_id, EVENT_USB_MS_DONE|EVENT_USB_MS_DETATCH,
KAL_OR_CONSUME, &event_group, KAL_SUSPEND);
if(g_UsbHostMs.result == USB_HOST_MS_RESULT_OK)
{
/* determine it is write protect or not */
if((g_usb_ms_data[2]&0x80)!=0)
g_UsbHostMs.media_info[lun].state = USB_HOST_MS_MEDIA_STATE_WR_PROTECT;
else
g_UsbHostMs.media_info[lun].state = USB_HOST_MS_MEDIA_STATE_READY;
}
else if(g_UsbHostMs.result == USB_HOST_MS_RESULT_CSW_FAIL)
{
/* translate result to request sense result */
/* application can treat it as result OK is request sense reault is OK */
g_UsbHostMs.result = USB_Host_Ms_Request_Sense(lun);
}
/* else USB_HOST_MS_RESULT_TIMEOUT and USB_HOST_MS_RESULT_STALL do not handle it */
if(media_state!=g_UsbHostMs.media_info[lun].state)
{
//g_UsbHostMs.b_state_change = KAL_TRUE;
g_UsbHostMs.media_state_change |= (1<<lun);
}
}
else
{
g_UsbHostMs.result = USB_HOST_MS_RESULT_TIMEOUT;
}
return g_UsbHostMs.result;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -