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

📄 usbdevdriver.c

📁 SmartARM2400系列开发板全套资料
💻 C
📖 第 1 页 / 共 2 页
字号:
		
	while(1) {
		
		OS_ENTER_CRITICAL();
		
		pstUsb->bTaskWaiting = 0;										/* 任务未进入等待发送状态		*/
		
		for(i = 0;i < ucBufNum;i++) {
    	
			if ((__usbDevSelectEndpoint(ucEpIndex) & 0x60) == 0x60) {  	/* 端点缓冲区满     			*/
				break;
			}
    	    	
    		ulTmp = ulSendLen - ulSendCnt;								/*  计算未发送字节数			*/							
			
			if (ulTmp >= ulPacketSize) {								
				ulTmp = __usbDevWriteEndpoint(ucEpIndex,
											  pucSendBuf + ulSendCnt,
											  (INT8U)ulPacketSize);		/*  发送一包数据				*/
			} else {

				ulTmp = __usbDevWriteEndpoint(ucEpIndex, 
											  pucSendBuf + ulSendCnt,
											  (INT8U)ulTmp);			/*  发送不足一包数据			*/
			}
					
			ulSendCnt = ulSendCnt + ulTmp;								/*  累加已发送字节数			*/
			
			if (ulSendCnt >= ulSendLen) {								/*  发送完成					*/							
																
				OS_EXIT_CRITICAL();
				goto USB_WRITE_END;
			}
		}
		
		OS_EXIT_CRITICAL();
		
		ucErr = __usbDevWaitEpReady(pstUsb,usWaitTime);					/* 等待FIFO中的数据发送到USB主机*/		
		
		if (ucErr != USB_NO_ERR) {
		
			 __usbDevRwResult(ucEpIndex, 
			 				  ucBufNum, 
			 				  pstUsb, 
			 				  0, 
			 				  1);
			 				  
			 return USB_ERR_WR_TIMEOUT;									/*  返回操作超时错误码			*/
		}
	}
	
USB_WRITE_END:

	ucErr = __usbDevWaitEpReady(pstUsb,usWaitTime);						/* 等待FIFO中的数据发送到USB主机*/
	
	__usbDevRwResult(ucEpIndex, 
					 ucBufNum, 
					 pstUsb, 
					 0, 
					 0);												/*  传输结束处理				*/
	
	if (ucErr == OS_TIMEOUT) {
	    return USB_ERR_WR_TIMEOUT;										/*  返回操作超时错误码			*/
	
	} else {
		
		return USB_NO_ERR;												/* 发送成功  					*/
	}
}

#endif

/*********************************************************************************************************
** Function name:		usbDevInit
** Descriptions:        初始化 USB 设备控制器
** input parameters:    ucDevTaskSetupPrio:	SETUP包处理任务优先级					
** output parameters:	无						
** Returned value:      初始化成功	0
**						初始化失败	错误码
*********************************************************************************************************/
INT8U usbDevInit (INT8U ucDevTaskSetupPrio)
{	
	INT8U i = 0; 
	INT8U ucErr = 0;
	
	OS_ENTER_CRITICAL();
	
	__usbDevHardwareInit();												/*  初始化硬件         	 		*/
	bEPPflags.value = 0;												/*  置USB事件标志为0   	 		*/
	
	if (__usbDevReadTestRegister() != 0xA50F) {							/*  读测试寄存器       	  		*/
		
		OS_EXIT_CRITICAL(); 
		return USB_ERR_READ_TESTREG;									/*  初始化失败         	 		*/
	}
	
	__usbDevIntConfig();												/*  配置中断 		  	 		*/
	__usbDevConfigEndpoint();											/*  配置端点			 	  	*/

#if DMA_ENGINE_EN	
	__usbDevDMAInit();													/*  初始化USB DMA	  	 		*/
	__usbDevSetMode(0x28);
#else
	__usbDevSetMode(0x00);												/*  成功传输才产生中断 	  		*/
#endif
	
	pSetup_Event = OSMboxCreate(NULL);				  					/*  SETUP包处理任务信号量  		*/
 	
 	if (pSetup_Event == NULL) {					
 	
	 	OS_EXIT_CRITICAL(); 
 	 	return USB_ERR_CREATE_SEM;										/*  创建失败,返回错误码    		*/
	}

	for(i = 0; i < NUM_ENDPOINTS; i++) {
	
		Ctrl_Usb[i].bEpReady = 0;
		Ctrl_Usb[i].bTaskWaiting = 0;
		Ctrl_Usb[i].Ep_Sem = OSSemCreate(0);
		
		if (Ctrl_Usb[i].Ep_Sem == NULL) {
		
			OS_EXIT_CRITICAL(); 
			return USB_ERR_CREATE_SEM;									/*  创建信号量失败		 		*/
		}				
	}
	
	ucErr = OSTaskCreate(usbDevTaskSetup, 
	                     (void *)0, 
	                     &usbDevTaskSetupStk[127], 
	                     ucDevTaskSetupPrio);							/*  创建SETUP包处理任务			*/
	                     
 	if (ucErr != OS_NO_ERR) {
 	    
 	    __GucDevTaskSetUpPrio = 0;
 	    OS_EXIT_CRITICAL();
 	    return USB_ERR_CREATETASK_FAIL;
 	}
 	
	__usbDevHadwareReconnect();			
	__usbDevSoftReconnect();											/*  重新连接USB 			  	*/
 	
 	OS_EXIT_CRITICAL();
 	
 	__GucDevTaskSetUpPrio = ucDevTaskSetupPrio;     					/*  记录SETUP处理任务的优先级   */

 	return USB_NO_ERR;							   						/*  初始化USB成功    	  		*/
}

/*********************************************************************************************************
** Function name:		usbDevDeInit
** Descriptions:        USB 设备控制器反初始化
** input parameters:    无					
** output parameters:	无						
** Returned value:      TRUE:反初始化成功
*********************************************************************************************************/
INT8U usbDevDeInit (void)
{
    INT8U i = 0;
    INT8U ucErr = 0;
    INT8U ucPrio = 0;
    
    OS_TCB *ptcb = NULL;
    
    OS_ENTER_CRITICAL();
    
    ucPrio = __GucDevTaskSetUpPrio;
    
    OS_EXIT_CRITICAL();
    
    i = 0;
    
    if (ucPrio) {
        
        ptcb = OSTCBPrioTbl[ucPrio];                    				/*  查询枚举任务是否已经存在    */
        
        if (ptcb != NULL) {
            
            OSMboxPost(pSetup_Event, 
            		   (void *)__USB_DEV_SETUP_DELTASK);      			/*  调度任务已存在,申请删除		*/
            		   
            while (OSTCBPrioTbl[ucPrio] != NULL) {          			/*  等待任务删除完毕            */
                OSTimeDly(1);
                if (i++ > 200) {
                    i = 0;
                }
            }
            __GucDevTaskSetUpPrio = 0;
        }
    }
    
    pSetup_Event = OSMboxDel(pSetup_Event, 
    						 OS_DEL_ALWAYS, 
    						 &ucErr);									/*  删除SETUP包处理任务信号量	*/
    						 
	for(i = 0; i < NUM_ENDPOINTS; i++) {
		
		Ctrl_Usb[i].Ep_Sem = OSSemDel(Ctrl_Usb[i].Ep_Sem, 
									  OS_DEL_ALWAYS, 
									  &ucErr);							/*  删除端点控制传输信号量		*/
    }
    
    return TRUE;
}

/*********************************************************************************************************
** Function name:		usbDevTaskSetup
** Descriptions:        USB 设备控制器控制传输处理
** input parameters:    无					
** output parameters:	无						
** Returned value:      该任务的优先级应高于其它任务,才能在任何情况下传输SETUP包
*********************************************************************************************************/
void  usbDevTaskSetup(void *pdata)
{
	INT8U  ucErr = 0;
	INT32U uiMsgCode =0;
	
#if OS_CRITICAL_METHOD == 3      			
	OS_CPU_SR  cpu_sr;
#endif
	
	pdata = pdata;  
	              			
	for (;;) {
	
		uiMsgCode = (INT32U)OSMboxPend(pSetup_Event, 
								       0, 
								       &ucErr);  						/*  等待Setup包		     		*/
		
		if (ucErr == OS_NO_ERR){				            			/*  接收到Setup包 	     		*/
			
			if (uiMsgCode == __USB_DEV_SETUP_NORMAL) {
    			
    			OS_ENTER_CRITICAL();			        				/*  关中断			    		*/
    			__usbDevControlHandler();				        		/*  进行控制传输处理	     	*/
    			OS_EXIT_CRITICAL();			            				/*  开中断			    		*/
		   
		    } else if (uiMsgCode == __USB_DEV_SETUP_DELTASK) {
		        OSTaskDel(OS_PRIO_SELF);								/*  删除SETUP包处理任务			*/
		    }
		}
	}
}

/*********************************************************************************************************
** Function name:       USB_Exception
** Descriptions:        USB 中断服务程序
** input parameters:    无						
** output parameters:	无
** Returned value:      无
*********************************************************************************************************/
void usbDevException (void) 
{
	INT32U ulUsbIntState = 0;
	INT32U ulDevIntState = 0;
	INT32U ulDevState    = 0;
	
	OS_ENTER_CRITICAL();

	ulDevIntState = (INT32U)USBDevIntSt;									/*  读设备中断状态寄存器 		*/
	
	if (ulDevIntState & DEVINT_STATUS_DEVSTAT) {
		
		ulDevState = __usbDevGetDevStatus();
		
		if ((ulDevState & 0x10) != 0) {
			__usbDevBusReset();											/*  总线复位处理 				*/
		}

		if ((ulDevState & 0x08) != 0) {
			__usbDevSuspendChange();										/*  挂起改变处理 				*/
		}

		if ((ulDevState & 0x02) != 0) {
			__usbDevConnectChange();										/*  连接改变处理 				*/
		}
		
		USBDevIntClr = DevStatusInterrupt;
		goto USB_ISR_EXIT;												/*  退出中断服务程序			*/
	}	
	
	ulUsbIntState = (INT32U)(USBIntSt & 0x7);
	
	if (ulUsbIntState != 0) {
		
		if (ulUsbIntState & USBINT_STATUS_HP) {
			__usbDevHpService();					   						/*  高优先级中断处理 			*/
		}
		
		if (ulUsbIntState & USBINT_STATUS_LP) {
			__usbDevLpService();											/*  低优先级中断处理			*/
		}
		
#if DMA_ENGINE_EN		
		
		if (ulUsbIntState & USBINT_STATUS_DMA)
			__usbDevDMAService();											/*  DMA中断处理 				*/
#endif

	}
	
USB_ISR_EXIT:
	OS_EXIT_CRITICAL();
   	VICVectAddr = 0x00;													/*  通知LPC23xx中断结束 		*/
}

/*********************************************************************************************************
** Function name:		usbDevReadPort1
** Descriptions:		从USB Device的逻辑端点1读取数据
** input parameters:	ulReadLen	待读取字节数
**						usWaitTime	等待超时时间,单位Clock Tick						
** output parameters:	pucRcvBuf	接收数据缓冲区指针						
** Returned value:      0:操作成功;>0:操作失败
*********************************************************************************************************/
INT8U usbDevReadPort1 (INT8U *pucRcvBuf,
					   INT32U ulReadLen,
                	   INT16U usWaitTime)
{

#if DMA_ENGINE_EN
	return (__usbDevDMAReadPort (2,
								 1, 
	                             &Ctrl_Usb[0],  
	                             pucRcvBuf, 
	                             ulReadLen,
	                             usWaitTime));							/*  DMA方式读取数据 			*/
#else
	return (__usbDevReadPort(2,  
							 1, 
							 16,
							 &Ctrl_Usb[0], 
							 pucRcvBuf, 
							 ulReadLen,
							 usWaitTime));								/*  非DMA方式读取数据 			*/
#endif

}

/*********************************************************************************************************
** Function name:		usbDevReadPort2
** Descriptions:		从USB Device的逻辑端点2读取数据
** input parameters:	ulReadLen	待读取字节数
**						usWaitTime	等待超时时间,单位Clock Tick					
** output parameters:	pucRcvBuf	接收数据缓冲区指针						
** Returned value:      0:操作成功;>0:操作失败
*********************************************************************************************************/
INT8U usbDevReadPort2 (INT8U *pucRcvBuf,
					   INT32U ulReadLen,
                	   INT16U usWaitTime)
{

#if DMA_ENGINE_EN
	return (__usbDevDMAReadPort (4,
								 2, 
	                             &Ctrl_Usb[2],  
	                             pucRcvBuf, 
	                             ulReadLen,
	                             usWaitTime));							/*  DMA方式读取数据 			*/
#else
	return (__usbDevReadPort(4, 
							 2, 
							 64,
							 &Ctrl_Usb[2], 
							 pucRcvBuf,
							 ulReadLen, 							  
							 usWaitTime));								/*  非DMA方式读取数据 			*/
#endif

}

/*********************************************************************************************************
** Function name:       usbDevWritePort1
** Descriptions:        向USB Device的逻辑端点1写入数据
** input parameters:	pucSendBuf:	待发送数据缓冲区指针
**						ulSendLen:	待发送字节数
**						usWaitTime:	等待超时时间,单位Clock Tick					
** output parameters:	无							
** Returned value:      0:操作成功;>0:操作失败
*********************************************************************************************************/
INT8U usbDevWritePort1(INT8U *pucSendBuf,
					   INT32U ulSendLen,
                       INT16U usWaitTime)
{

#if DMA_ENGINE_EN
	return (__usbDevDMAWritePort(3,
								 1, 
	                             &Ctrl_Usb[1], 
	                             pucSendBuf, 
	                             ulSendLen, 
	                             usWaitTime));							/*  DMA方式写入数据				*/
#else
	return (__usbDevWritePort(3, 
							  1,
							  16,  
							  &Ctrl_Usb[1], 
							  pucSendBuf, 
							  ulSendLen, 
							  usWaitTime));								/*  非DMA方式写入数据 			*/
#endif

}

/*********************************************************************************************************
** Function name:       usbDevWritePort2
** Descriptions:        向USB Device的逻辑端点1写入数据
** input parameters:	pucSendBuf:	待发送数据缓冲区指针
**						ulSendLen:	待发送字节数
**						usWaitTime:	等待超时时间,单位Clock Tick					
** output parameters:	无							
** Returned value:      0:操作成功;>0:操作失败
*********************************************************************************************************/
INT8U usbDevWritePort2(INT8U *pucSendBuf,
					   INT32U ulSendLen,
                       INT16U usWaitTime)
{

#if DMA_ENGINE_EN
	return (__usbDevDMAWritePort(5,
								 2, 
	                             &Ctrl_Usb[3], 
	                             pucSendBuf, 
	                             ulSendLen, 
	                             usWaitTime));							/*  DMA方式写入数据				*/
#else
	return (__usbDevWritePort(5, 
							  2,
							  64,  
							  &Ctrl_Usb[3], 
							  pucSendBuf, 
							  ulSendLen, 
							  usWaitTime));								/*  非DMA方式写入数据 			*/
#endif

}

/*********************************************************************************************************
  END FILE
*********************************************************************************************************/

⌨️ 快捷键说明

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