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

📄 usb_function.c

📁 TMS320VC5509设备端USB设备驱动程序源文件
💻 C
📖 第 1 页 / 共 3 页
字号:
			usbflag = USB_CTRL0_READ;
			CtrlDataLen = USB0_SetupPkt.wLength;
			break;	
 		default:
 			break;
 	}
}

/****************************************************************/
/*	函数名:		InPackage_Hndler() 								*/
/* 	功能:		对输出设置包中断事件进行处理					*/
/*  参数:														*/
/* 				无												*/
/****************************************************************/
void InPackage_Hndler(void)
{
	Uint16 i,j;
	
	switch (USB0_SetupPkt.bRequest)
	{	
		case  01:							// CLEAR_FEATURE
			break;
			
		case  02:							// RESERVED
			break;
			
		case  04:							// RESERVED		 
			USB_stallEndpt(&EndptObjOut0);	// 系统未定义,取消
			break;
			
		case  06:							// GET_DESCRIPTION
			switch((USB0_SetupPkt.wValue >>8) & 0xFF)
			{
				case  01:					// DEVICE
					j = 0;
					for(i = 0;i<20;)
					{
						usbbuffer[j] = (Device_Description[i]<<8) + Device_Description[i=i+1];
						j=j+1;
						i=i+1; 
					}
					USB_postTransaction(&EndptObjIn0,0x12,(Uint16 *)&usbbuffer,USB_IOFLAG_SWAP);
							
					/* 结束数据传送状态,发出一个OUT型的数据包 */
					USB_postTransaction( &EndptObjOut0,0,NULL,USB_IOFLAG_NONE);
					break;
					
				case  02:					// CONFIGURATION
					if(USB0_SetupPkt.wLength<=DSCR_CONFIG_LEN)
					{
						/* 发送Device_config描述表 */
						USB_postTransaction( &EndptObjIn0,DSCR_CONFIG_LEN,
										   (Uint16 *)&usb_configuration_link,USB_IOFLAG_LNK);
								
						/* 结束数据传送状态,发出一个OUT型的数据包 */
				  		USB_postTransaction( &EndptObjOut0,0,NULL,USB_IOFLAG_NONE);	
					}
					if(USB0_SetupPkt.wLength > DSCR_CONFIG_LEN)
					{
						/* 发送Device_Allconfig描述表 */
						USB_postTransaction( &EndptObjIn0,DSCR_CONFIG_LEN,(Uint16 *)&usb_configuration_link,
											USB_IOFLAG_LNK |USB_IOFLAG_CAT |USB_IOFLAG_EOLL);
						
						/* 结束数据传送状态,发出一个OUT型的数据包 */
				  		USB_postTransaction( &EndptObjOut0,0,NULL,USB_IOFLAG_NONE);	
					}
					break;
					
				case  03:					// 自举的时候系统自动获取字符描述表	
					/* 发送描述表 */
					if((USB0_SetupPkt.wValue & 0xff) ==0)
					{
						/* 发送Device_String描述表 */
						USB_postTransaction( &EndptObjIn0,0x4,(Uint16 *)&String_descriptor_langid,USB_IOFLAG_NONE );
						
						/* 结束数据传送状态,发出一个OUT型的数据包 */
				  		USB_postTransaction( &EndptObjOut0,0,NULL,USB_IOFLAG_NONE);	
					}
					else
					{
						/* 编辑发送描述表 */
						j = 0;
						for(i = 0;i<40;)
						{
							usbbuffer[j] = (String_descriptor1[i]<<8) + String_descriptor1[i=i+1];
							j=j+1;
							i=i+1; 
						}
						/* 发送Device_String描述表 */
						USB_postTransaction( &EndptObjIn0,38,(Uint16 *)&usbbuffer,USB_IOFLAG_SWAP );
								
						/* 结束数据传送状态,发出一个OUT型的数据包 */
				  		USB_postTransaction( &EndptObjOut0,0,NULL,USB_IOFLAG_NONE);	
					}
					break;
					
				case  04:					// INTERFACE		
					break;
					
				case  05:					// ENDPOINT	
					break;
					
				case  06:					// DEVICE_QUALIFIER
					j = 0;
					for(i = 0;i<11;)
					{
						usbbuffer[j] = (Device_Qualifier[i]<<8) + Device_Qualifier[i=i+1];
						j=j+1;
						i=i+1; 
					}
					USB_postTransaction(&EndptObjIn0,0x12,(Uint16 *)&usbbuffer,USB_IOFLAG_SWAP);
							
					/* 结束数据传送状态,发出一个OUT型的数据包 */
					USB_postTransaction( &EndptObjOut0,0,NULL,USB_IOFLAG_NONE);
					break;
					
				default:
				break;
			}
			break;
			
		case 0x8:							// GET_CONFIGURATION
			usbbuffer[0] = 0;
			usbbuffer[1] = 1;
					
			/* 发送Device_Allconfig描述表 */
			USB_postTransaction( &EndptObjIn0,1,(Uint16 *)&usbbuffer,USB_IOFLAG_NONE);
					
			/* 结束数据传送状态,发出一个OUT型的数据包 */
			USB_postTransaction( &EndptObjOut0,0,NULL,USB_IOFLAG_NONE);	
			break;
			
		case 0xa:							// GET_INTERFACE
			usbbuffer[0] = 0;
			usbbuffer[1] = 1;
					
			/* 发送Device_Allconfig描述表 */
			USB_postTransaction( &EndptObjIn0,1,(Uint16 *)&usbbuffer,USB_IOFLAG_NONE);
					
			/* 结束数据传送状态,发出一个OUT型的数据包 */
			USB_postTransaction( &EndptObjOut0,0,NULL,USB_IOFLAG_NONE);	
			break;
			
		case 0xb0:							// 用户自定义的Setup包
			/* 用户自定义的Setup包,用于测试 */
			if(USB0_SetupPkt.wValue == 0x1)
			{
				usbbuffer[0] =0x0;
				usbbuffer[1] =0x0301;
				usbbuffer[2] =0x0705;
				usbbuffer[3] =0x0b09;
				usbbuffer[4] =0x0f0d;	
			}
			if(USB0_SetupPkt.wValue == 0x2)
			{
				usbbuffer[0] =0x0;
				usbbuffer[1] =0x0200;
				usbbuffer[2] =0x0604;
				usbbuffer[3] =0x0a08;
				usbbuffer[4] =0x0e0c;
			}
			/* 发送数据 */
			USB_postTransaction( &EndptObjIn0,8,(Uint16 *)&usbbuffer,USB_IOFLAG_NONE);
					
			/* 结束数据传送状态,发出一个OUT型的数据包 */
			USB_postTransaction( &EndptObjOut0,0,NULL,USB_IOFLAG_NONE);
			break;
			
		case 0xb3:						// 为用户开辟
			usbflag = USB_CTRL0_WRITE;
			CtrlDataLen = USB0_SetupPkt.wLength;
			break;						
		default :
			break;
	}	
}

/****************************************************************/
/*	函数名:		Endpt0EvHndler() 								*/
/* 	功能:		对控制节点的中断事件进行处理					*/
/*  参数:														*/
/* 				无												*/
/****************************************************************/
void Endpt0EvHndler(void)
{
	/* 获取当前的中断状态,即判断中断类型 */
	USB_EVENT_MASK mask = 0;
	mask = USB_getEvents((USB_EpHandle)&EndptObjOut0);
	
	if(mask & USB_EVENT_RESET)		// 如果是USB总线复位
	{	
		/* 终止所有的数据传输 */
		while(!(USB_TRUE ==USB_abortAllTransaction(USB0)))
		{
			USB_abortAllTransaction(USB0);	
		};
		
		/* 重新进行USB的初始化 */
		while(!(USB_init(USB0,hEpObjArray,0) == USB_TRUE)){};	
		
		/* 调用使能USB单元的函数 */
		USB_connectDev(USB0);	
		
		/* 使能块输出节点中断 */
		USB_EnableDInt(hEpObjArray);
	}
	
	if(mask & USB_EVENT_SETUP)		// 如果接收到Setup包
	{
		/* 接收新的Setup包 */
		if(USB_getSetupPacket(USB0, &USB0_SetupPkt) != USB_TRUE)
 		{	
 			// 失败马上返回 
 			return;					
 		}
 		
 		/* OUT类型的Setup包 */
 		if((USB0_SetupPkt.bmRequestType & 0x80) == 0x0)		
 		{	
 			// OUT型的输出处理
 			OutPackage_Hndler();	
 		}
 		
 		/* IN类型的Setup包 */
 		if((USB0_SetupPkt.bmRequestType & 0x80) == 0x80)
 		{	
 			// IN型的设置包处理	
 			InPackage_Hndler();		
 		}		
	}
	
	if(mask & USB_EVENT_RESUME)		// 如果是唤醒总线
	{
		/* 设置中断标志,进行USB状态的处理 */
		usbflag = USB_EVENT_RESUME;
	}
	
	if(mask & USB_EVENT_SUSPEND)	// 如果是挂起总线
	{
		usbflag = USB_EVENT_SUSPEND;
		/* 设置中断标志,进行USB状态的处理 */
	}
	
	if(mask & USB_EVENT_SOF)		// 如果是帧开始
	{
		/* 设置中断标志,进行USB状态的处理 */
		usbflag = USB_EVENT_SOF;	
	}
}

/****************************************************************/
/*	函数名:		EndptIn1EvHndler() 								*/
/* 	功能:		对5509片上的USB节点In1的中断事件进行处理		*/
/*  参数:														*/
/* 				无												*/
/****************************************************************/
void EndptIn1EvHndler(void)
{
	/* 获取当前的中断状态 */
	//USB_EVENT_MASK mask;
	//mask = USB_getEvents((USB_EpHandle)&EndptObjIn1);

	// 没有使能中断,如果用户使能了块输入节点中断,那么可以在这添加中断处理函数
}

/****************************************************************/
/*	函数名:		EndptOut1EvHndler() 							*/
/* 	功能:		对5509片上的USB节点Out1的中断事件进行处理		*/
/*  参数:														*/
/* 				无												*/
/****************************************************************/
void EndptOut1EvHndler(void)
{
	USB_EVENT_MASK mask;
	mask = USB_getEvents((USB_EpHandle)&EndptObjOut1);
	
	if(mask & USB_EVENT_EOT)
	{
		mask = 0;
		usbflag = USB_BULK1_READ;
	}
}

/****************************************************************/
/*	函数名:		EndptIn2EvHndler() 								*/
/* 	功能:		对5509片上的USB节点In2的中断事件进行处理		*/
/*  参数:														*/
/* 				无												*/
/****************************************************************/
void EndptIn2EvHndler(void)
{
	/* 获取当前的中断状态 */
	//USB_EVENT_MASK mask;
	//mask = USB_getEvents((USB_EpHandle)&EndptObjIn2);
	
	// 没有使能中断,如果用户使能了块输入节点中断,那么可以在这添加中断处理函数
}

/****************************************************************/
/*	函数名:		EndptOut2EvHndler() 							*/
/* 	功能:		对5509片上的USB节点Out2的中断事件进行处理		*/
/*  参数:														*/
/* 				无												*/
/****************************************************************/
void EndptOut2EvHndler(void)
{
	USB_EVENT_MASK mask;
	mask = USB_getEvents((USB_EpHandle)&EndptObjOut2);
	
	if(mask & USB_EVENT_EOT)
	{
		mask = 0;
		usbflag = USB_BULK2_READ;
	}
}

/****************************************************************/
/*	函数名:		EndptIn3EvHndler() 								*/
/* 	功能:		对5509片上的USB节点In3的中断事件进行处理		*/
/*  参数:														*/
/* 				无												*/
/****************************************************************/
void EndptIn3EvHndler(void)
{
	/* 获取当前的中断状态 */
	//USB_EVENT_MASK mask;
	//mask = USB_getEvents((USB_EpHandle)&EndptObjIn3);
	
	// 没有使能中断,如果用户使能了块输入节点中断,那么可以在这添加中断处理函数
}

/****************************************************************/
/*	函数名:		EndptOut3EvHndler() 							*/
/* 	功能:		对5509片上的USB节点Out3的中断事件进行处理		*/
/*  参数:														*/
/* 				无												*/
/****************************************************************/
void EndptOut3EvHndler(void)
{
	USB_EVENT_MASK mask;
	mask = USB_getEvents((USB_EpHandle)&EndptObjOut3);
	
	if(mask & USB_EVENT_EOT)
	{
		mask = 0;
		usbflag = USB_BULK3_READ;
	}
}

/****************************************************************/
/*	函数名:		EndptIn4EvHndler() 								*/
/* 	功能:		对5509片上的USB节点In4的中断事件进行处理		*/
/*  参数:														*/
/* 				无												*/
/****************************************************************/
void EndptIn4EvHndler(void)
{
	/* 获取当前的中断状态 */
	//USB_EVENT_MASK mask;
	//mask = USB_getEvents((USB_EpHandle)&EndptObjIn4);
	
	// 没有使能中断,如果用户使能了块输入节点中断,那么可以在这添加中断处理函数
}

/****************************************************************/
/*	函数名:		EndptOut4EvHndler() 							*/
/* 	功能:		对5509片上的USB节点Out4的中断事件进行处理		*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -