⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usb_host_ms_drv.c

📁 MTK平台绝密核心代码之 USB驱动
💻 C
📖 第 1 页 / 共 4 页
字号:
	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 + -