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

📄 usb_host_ms_drv.c

📁 MTK平台绝密核心代码之 USB驱动
💻 C
📖 第 1 页 / 共 4 页
字号:
					}	
				}

				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 + -