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

📄 usbdevdriver.c

📁 SmartARM2400系列开发板全套资料
💻 C
📖 第 1 页 / 共 2 页
字号:
/****************************************Copyright (c)****************************************************
**                            Guangzhou ZHIYUAN electronics Co.,LTD.
**                                      
**                                 http://www.embedtools.com
**
**--------------File Info---------------------------------------------------------------------------------
** File name:               usbDevDriver.c
** Latest modified Date:    2008-05-10
** Latest Version:          1.1
** Descriptions:            ZLG_USB2400 Device 软件包应用层源文件
**
**--------------------------------------------------------------------------------------------------------
** Created by:              ZhengMingyuan
** Created date:            2005-08-08
** Version:                 1.0
** Descriptions:            The original version
**
**--------------------------------------------------------------------------------------------------------
** Modified by:   			LingGuilin          
** Modified date:    		2008-05-10       
** Version:          		1.1       
** Descriptions:      		修改部分代码以适合SmartARM2400 系列开发板
**
*********************************************************************************************************/

#include 	"config.h"

EPPFLAGS bEPPflags;														/*  定义 USB 事件标志变量 		*/

OS_STK  usbDevTaskSetupStk[128];										/*  SETUP包处理任务堆栈  		*/

OS_EVENT *pSetup_Event;													/*  SETUP包处理任务事件指针 	*/

CTRL_USB Ctrl_Usb[NUM_ENDPOINTS];										/*  USB 接收或发送控制块 		*/

INT8U __GucDevTaskSetUpPrio = 0;										/*  SETUP包处理任务优先级		*/

/*********************************************************************************************************
** Function name:       __usbDevConfigEndpoint
** Descriptions:        配置端点的最大包大小	
** input parameters:    无						
** output parameters:	无
** Returned value:      无
*********************************************************************************************************/
void __usbDevConfigEndpoint (void)
{
	__usbDevConfigMaxPaketSize(0,EP0_PACKET_SIZE);						/*  配置各物理端点的最大包大小	*/							
	__usbDevConfigMaxPaketSize(1,EP0_PACKET_SIZE);

	__usbDevConfigMaxPaketSize(2,EP1_PACKET_SIZE);
	__usbDevConfigMaxPaketSize(3,EP1_PACKET_SIZE);
	
	__usbDevConfigMaxPaketSize(4,EP2_PACKET_SIZE);
	__usbDevConfigMaxPaketSize(5,EP2_PACKET_SIZE);
}

/*********************************************************************************************************
** Function name:       __usbDevEpISR
** Descriptions:        端点接收/发送数据处理		
** input parameters:    ucEpIndex:	物理端点索引						
** output parameters:	无
** Returned value:      无
*********************************************************************************************************/
void __usbDevEpISR (INT8U ucEpIndex)
{
	__usbDevSelectClrIntEndpoint(ucEpIndex);							/* 选择端点并清除中断  		    */

#if (!DMA_ENGINE_EN)
	
	if (Ctrl_Usb[ucEpIndex - 2].bTaskWaiting == 0) {					/* 任务未进入等待接收/发送状态  */
		Ctrl_Usb[ucEpIndex - 2].bEpReady = 1;							/* 置位标志 				    */
	} else {
		OSSemPost(Ctrl_Usb[ucEpIndex - 2].Ep_Sem);						/* 使等待接收/发送数据的任务就绪*/
	}
	
#endif

}

/*********************************************************************************************************
** Function name:       __usbDevHpService
** Descriptions:        USB 端点高速中断服务程序	
** input parameters:    无						
** output parameters:	无
** Returned value:      无
*********************************************************************************************************/
void __usbDevHpService (void)
{
	INT8U i = 0;
	unsigned long ulEpstat = 0;
	
	ulEpstat = USBEpIntSt;												/*  读端点中断状态寄存器 		*/

	if(ulEpstat & USB_ENDP00) {
		__usbDevEp0RxDone();											/*  控制端点接收数据处理 		*/
	}
	
	if(ulEpstat & USB_ENDP01) { 
		__usbDevEp0TxDone();											/*  控制端点发送数据处理 		*/
	}

	for (i = 2; i <= 5; i++) {
		
		if ((ulEpstat &(INT32U)(0x01 << i)) != 0) {
			 __usbDevEpISR(i);											/*  其它端点接收/发送数据处理	*/
		}
	}
		
	USBDevIntClr = FASTINTERRUPT;										/*  清除USB器件的快速中断		*/
}

/*********************************************************************************************************
** Function name:       __usbDevLpService
** Descriptions:        USB 端点慢速中断服务程序	
** input parameters:    无						
** output parameters:	无
** Returned value:      无
*********************************************************************************************************/
void __usbDevLpService (void)
{
	INT8U i = 0;
	unsigned long ulEpstat = 0;
	
	ulEpstat = USBEpIntSt;												/*  读端点中断状态寄存器 		*/

	if(ulEpstat & USB_ENDP00) {
		__usbDevEp0RxDone();											/*  控制端点接收数据处理		*/
	}
	
	if(ulEpstat & USB_ENDP01) { 
		__usbDevEp0TxDone();											/*  控制端点发送数据处理		*/
	}

	for (i = 2; i <= 5; i++) {
		
		if ((ulEpstat & (INT32U)(0x01 << i)) != 0) {
			 __usbDevEpISR(i);											/*  其它端点接收/发送数据处理 	*/
		}
	}	

	USBDevIntClr = SLOWINTERRUPT;										/*  清除USB器件的慢速中断		*/
}

/*********************************************************************************************************
** Function name:       __usbDevBusReset
** Descriptions:        USB 总线复位处理		
** input parameters:    无						
** output parameters:	无
** Returned value:      无
*********************************************************************************************************/
void __usbDevBusReset (void)
{
	bEPPflags.value = 0;	                            				/*  置USB事件标志为0   	 		*/
	__usbDevIntConfig();												/*  重新设置USB Device相关中断	*/
	__usbDevConfigEndpoint();											/*  重新配置所有端点最大包大小 	*/
}

/*********************************************************************************************************
** Function name:       __usbDevSuspendChange
** Descriptions:        USB 总线挂起改变处理		
** input parameters:    无						
** output parameters:	无
** Returned value:      无
*********************************************************************************************************/
void __usbDevSuspendChange (void)
{
	
}

/*********************************************************************************************************
** Function name:       _usbDevConnectChange
** Descriptions:        USB 总线连接改变处理		
** input parameters:    无						
** output parameters:	无
** Returned value:      无
*********************************************************************************************************/
void __usbDevConnectChange (void)
{

}

/*********************************************************************************************************
** Function name:       __usbDevRwParam
** Descriptions:        填写USB接收或发送控制块有关参数
** input parameters:    pstUsb:		USB 传输控制块结构体指针
**						pucBuf:		接收或发送数据缓冲区指针	
** output parameters:	无							
** Returned value:      0:操作成功;>0:操作失败
*********************************************************************************************************/
INT8U __usbDevRwParam (CTRL_USB *pstUsb, INT8U *pucBuf)
{
	if (bEPPflags.bits.configuration == 0) {						
		return USB_ERR_NO_CONFIG;										/*  USB总线未配置完成	 		*/
	}

	if (pucBuf == NULL) {
		return USB_ERR_BUFF_INVALID;									/*  缓冲区指针无效错误	   		*/
	}
	
	if (pstUsb->bEpUsed == 1) {
		return USB_ERR_ENDP_OCCUPY;										/*  端点已被其它任务占用  		*/  
	}
		
	pstUsb->bEpUsed = 1;												/*  本任务占用该端点      		*/
					
	return USB_NO_ERR;
}

/*********************************************************************************************************
** Function name:       __usbDevWaitEpReady
** Descriptions:        等待端点就绪
** input parameters:    pstUsb:		USB接收或发送控制块结构体指针
**						usWaitTime:	等待超时时间							
** output parameters:	无
** Returned value:      0:操作成功;>0:操作失败
*********************************************************************************************************/
#if (!DMA_ENGINE_EN)

INT8U __usbDevWaitEpReady (CTRL_USB *pstUsb, INT16U usWaitTime)
{
	INT8U ucErr = 0;

	OS_ENTER_CRITICAL();
	
	if (pstUsb->bEpReady == 1) {									   
														   				/*  端点已就绪   	            */
		pstUsb->bEpReady = 0;
		OS_EXIT_CRITICAL();	
		ucErr = USB_NO_ERR;								   				/*  无须等待					*/
	
	} else {
	
		pstUsb->bTaskWaiting = 1;							   			/*  置位,表示任务进入等待的状态 */
		OSSemPend(pstUsb->Ep_Sem,
				  usWaitTime, 
				  &ucErr); 		   										/*  等待端点就绪(进入等待状态)  */
				  
		OS_EXIT_CRITICAL();
	}
	
	return ucErr;
}

#endif

/*********************************************************************************************************
** Function name:       __usbDevRwResult
** Descriptions:        USB 读写端点结果处理
** input parameters:    ucEpIndex	物理端点索引号2、3、4、5
**						ucBufNum	物理端点的FIFO个数1、2
**						pstUsb		USB传输控制块结构体指针
**						ucRead		是否为读端点操作0:写操作处理;1:读操作处理
**						ucErr		是否存在错误0:无错误;1:由错误						
** output parameters:	无
** Returned value:      0:操作成功;>0:操作失败
**********************************************************************************************************/
#if (!DMA_ENGINE_EN)

void __usbDevRwResult(INT8U ucEpIndex, 
                      INT8U ucBufNum, 
                      CTRL_USB *pstUsb, 
                      INT8U ucRead, 
                      INT8U ucErr)
{	
	INT8U i = 0;
	INT8U ucEpState = 0;
	
	OS_ENTER_CRITICAL();

	if (ucErr == 1) {
	
		for (i = 0; i < ucBufNum; i++) {
		
			ucEpState = __usbDevSelectEndpoint(ucEpIndex);
			
			if ((ucEpState & 0x60) != 0) {								/*  接收/发送缓冲区不空   		*/
															
				if (ucRead == 1) {
		   																/*  当前为接收状态		 		*/			
					__usbDevSelectEndpoint(ucEpIndex);
					__usbDevClearBuffer();								/*  清空OUT 端点缓冲区	 		*/
				} else {
				
			   		__usbDevSetEndpointStatus(ucEpIndex, 0);			/*  解禁 IN 端点			 	*/
			   	}
			}
		}		
	}
	
	pstUsb->bEpUsed = 0;												/*  标识本任务不占用该端点    	*/	
	pstUsb->bTaskWaiting = 0;											/*  标识任务未进入等待状态    	*/
	
	OS_EXIT_CRITICAL();
}

#endif

/*********************************************************************************************************
** Function name:       __usbDevReadPort
** Descriptions:        非DMA模式下,从USB Device的OUT端点FIFO中读取数据	
** input parameters:    ucEpIndex		物理端点索引号2,4等
**						ucBufNum		物理端点缓冲区个数1或2
**						ulPacketSize	物理端点最大包大小
**						pstUsb			指向物理端点传输控制块结构体的指针	
**						pucRcvBuf		接收数据缓冲区指针
**						ulReadLen		待读取字节数
**						usWaitTime		超时等待时间ms,为0时无限等待
** output parameters:	无
** Returned value:      0:操作成功;>0:操作失败
*********************************************************************************************************/
#if (!DMA_ENGINE_EN)

INT8U __usbDevReadPort(INT8U ucEpIndex, 
                       INT8U ucBufNum,
                       INT32U ulPacketSize, 
                       CTRL_USB *pstUsb, 
                       INT8U *pucRcvBuf,
                       INT32U ulReadLen, 
                       INT16U usWaitTime)
{
	INT8U ucErr = 0;
	INT8U i = 0;
	INT32U ulReadCnt = 0;
	INT32U ulTmp = 0;	
	
	OS_ENTER_CRITICAL();
	
	ucErr = __usbDevRwParam(pstUsb,pucRcvBuf);						   	/*  检查参数正确性  		    */
	
	if (ucErr != USB_NO_ERR) {
		
		OS_EXIT_CRITICAL();
		OSTimeDly(1);
		return ucErr;											   		/*  返回错误码     				*/
	}
	
	OS_EXIT_CRITICAL();	
	
	while(1) {
		
		ucErr = __usbDevWaitEpReady(pstUsb,usWaitTime);					/*  等待端点收到数据			*/	

		if (ucErr == OS_NO_ERR) {
		
			OS_ENTER_CRITICAL();
			
			for(i = 0; i < ucBufNum; i++) {
    		
    			if ((__usbDevSelectEndpoint(ucEpIndex) & 0x60) == 0) {
					break;									   			/*  缓冲区为空 					*/
				}
								
    			ulTmp = ulReadLen - ulReadCnt;							/*  计算未读取字节数			*/
				
				if (ulTmp >= ulPacketSize) {						   					
					ulTmp = __usbDevReadEndpoint(ucEpIndex, 
												 pucRcvBuf + ulReadCnt,
												 (INT8U)ulPacketSize);	/*  读取一包数据				*/
				} else {
					ulTmp = __usbDevReadEndpoint(ucEpIndex, 
												 pucRcvBuf + ulReadCnt,
												 (INT8U)ulTmp);			/*  读取不足一包数据			*/
				}
					
				ulReadCnt = ulReadCnt + ulTmp;							/*  累加已读取字节数			*/
				
				if (ulReadCnt >= ulReadLen) {							/*  接收完成 					*/
															   			
					OS_EXIT_CRITICAL();
					
					__usbDevRwResult(ucEpIndex, 
									 ucBufNum, 
									 pstUsb, 
									 1, 
									 0);								/*  传输结束处理				*/
									 
					return USB_NO_ERR;
				}
			}

			pstUsb->bTaskWaiting = 0;							    	/*  任务未进入等待接收状态      */
			
			OS_EXIT_CRITICAL();
			
		} else {
		
			__usbDevRwResult(ucEpIndex, 
							 ucBufNum, 
							 pstUsb, 
							 1, 
							 1);										/*  传输结束处理				*/
							 
			return USB_ERR_WR_TIMEOUT;									/*  返回操作超时错误码			*/
		}
	}
}

#endif

/*********************************************************************************************************
** Function name:       __usbDevWritePort
** Descriptions:        非DMA模式下,向USB Device的IN端点FIFO中写入数据
** input parameters:    ucEpIndex		物理端点索引号2,4等
**						ulPacketSize	物理端点最大包大小
**						ucBufNum		物理端点缓冲区个数1或2	
**						pstUsb			指向物理端点传输控制块结构体的指针	
**						pucSendBuf		发送数据缓冲区	
**						ulSendLen		待发送字节数
**						usWaitTime		超时等待时间ms,为0时无限等待
** output parameters:	无
** Returned value:      0:操作成功;>0:操作失败
*********************************************************************************************************/
#if (!DMA_ENGINE_EN)

INT8U __usbDevWritePort (INT8U ucEpIndex, 
                    	 INT8U ucBufNum,
                    	 INT32U ulPacketSize, 
                    	 CTRL_USB *pstUsb, 
                    	 INT8U *pucSendBuf, 
                    	 INT32U ulSendLen, 
                    	 INT16U usWaitTime)
{
	INT8U ucErr = 0;
	INT8U i = 0;
	INT32U ulSendCnt = 0;
	INT32U ulTmp = 0;
	
	OS_ENTER_CRITICAL();
	
	ucErr = __usbDevRwParam(pstUsb,pucSendBuf);							/*  检查参数正确性  	 		*/
	
	if (ucErr != USB_NO_ERR) {
	
		OS_EXIT_CRITICAL();
		OSTimeDly(1);
		return ucErr;
	}
	
	OS_EXIT_CRITICAL();

⌨️ 快捷键说明

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