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

📄 usbdevdriver.c

📁 《USB开发指南——基于LPC2400》配套例程
💻 C
字号:
/****************************************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:            usbDevLPC2400 固件程序应用层源文件
**
**--------------------------------------------------------------------------------------------------------
** 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"

INT8U GenEpBuf[EP1_PACKET_SIZE];										/*  逻辑端点 1 接收缓冲区   	*/
INT8U EpBuf[EP2_PACKET_SIZE];											/*  逻辑端点 2 接收缓冲区  		*/

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

/*********************************************************************************************************
** 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:       __usbDevEp1TxDone
** Descriptions:        逻辑端点1发送数据处理	
** input parameters:    无						
** output parameters:	无
** Returned value:      无
*********************************************************************************************************/
void __usbDevEp1TxDone (void)
{
	__usbDevSelectClrIntEndpoint(3);				   		 			/*  选择端点并清除中断  	 	*/
}


/*********************************************************************************************************
** Function name:       __usbDevEp1RxDone
** Descriptions:        逻辑端点1接收数据处理	
** input parameters:    无						
** output parameters:	无
** Returned value:      无
*********************************************************************************************************/
void __usbDevEp1RxDone (void)
{
	INT8U len;

	__usbDevSelectClrIntEndpoint(2);						 			/*  选择端点并清除中断       	*/
	
	len = usbDevReadEndpoint(2,GenEpBuf,sizeof(GenEpBuf)); 				/*  从接收缓冲区中读出数据   	*/

	if(len != 0) {
		bEPPflags.bits.ep1_rxdone = 1;					 				/*  标识该端点收到数据       	*/
	}
}


/*********************************************************************************************************
** Function name:       __usbDevEp2TxDone
** Descriptions:        逻辑端点2发送数据处理	
** input parameters:    无						
** output parameters:	无
** Returned value:      无
*********************************************************************************************************/
void __usbDevEp2TxDone (void)
{
	__usbDevSelectClrIntEndpoint(5);				   		 			/*  选择端点并清除中断   		*/

}

/*********************************************************************************************************
** Function name:       __usbDevEp2RxDone
** Descriptions:        逻辑端点2接收数据处理	
** input parameters:    无						
** output parameters:	无
** Returned value:      无
*********************************************************************************************************/
void __usbDevEp2RxDone (void)
{
	INT8U len;

	__usbDevSelectClrIntEndpoint(4);						 			/*  选择端点并清除中断       	*/
	
	len = usbDevReadEndpoint(4,GenEpBuf,sizeof(GenEpBuf));
	if(len != 0)
		bEPPflags.bits.ep2_rxdone = 1;					 				/* 标识该端点收到数据       	*/
}

/*********************************************************************************************************
** Function name:       __usbDevHPService
** Descriptions:        USB 端点高速中断服务程序	
** input parameters:    无						
** output parameters:	无
** Returned value:      无
*********************************************************************************************************/
void __usbDevHpService (void)
{
	INT32U ep_st;
	
	ep_st = (INT32U)USBEpIntSt;											/*  读端点中断状态寄存器 	 	*/
		
	if(ep_st & USB_ENDP00)
		__usbDevEp0RxDone();											/*  控制端点接收数据处理 	 	*/
	if(ep_st & USB_ENDP01)
		__usbDevEp0TxDone();											/*  控制端点发送数据处理 	 	*/
			
	if(ep_st & USB_ENDP02)
		__usbDevEp1RxDone();											/*  逻辑端点1接收数据处理     	*/	
	if(ep_st & USB_ENDP03)
		__usbDevEp1TxDone();											/*  逻辑端点1发送数据处理    	*/
			
	if(ep_st & USB_ENDP04)
		__usbDevEp2RxDone();											/*  逻辑端点2接收数据处理     	*/	
	if(ep_st & USB_ENDP05)	
		__usbDevEp2TxDone();											/*  逻辑端点2发送数据处理    	*/	
		
	USBDevIntClr = FASTINTERRUPT;
}


/*********************************************************************************************************
** Function name:       __usbDevLPService
** Descriptions:        USB 端点慢速中断服务程序	
** input parameters:    无						
** output parameters:	无
** Returned value:      无
*********************************************************************************************************/
void __usbDevLpService (void)
{ 
	INT32U ep_st;
	
	ep_st = (INT32U)USBEpIntSt;											/*  读端点中断状态寄存器  		*/
		
	if(ep_st & USB_ENDP00)
		__usbDevEp0RxDone();											/*  控制端点接收数据处理 	 	*/
	if(ep_st & USB_ENDP01)
		__usbDevEp0TxDone();											/*  控制端点发送数据处理 	 	*/
			
	if(ep_st & USB_ENDP02)
		__usbDevEp1RxDone();											/*  逻辑端点1接收数据处理     	*/	
	if(ep_st & USB_ENDP03)
		__usbDevEp1TxDone();											/*  逻辑端点1发送数据处理     	*/
			
	if(ep_st & USB_ENDP04)
		__usbDevEp2RxDone();											/*  逻辑端点2接收数据处理     	*/	
	if(ep_st & USB_ENDP05)	
		__usbDevEp2TxDone();											/*  端点2发送数据处理    		*/	

	USBDevIntClr = SLOWINTERRUPT;
}

/*********************************************************************************************************
** Function name:       __usbDevBusReset
** Descriptions:        USB 总线复位处理		
** input parameters:    无						
** output parameters:	无
** Returned value:      无
*********************************************************************************************************/
void __usbDevBusReset (void)
{
	__usbDevIntConfig();
	__usbDevConfigEndpoint();											/*  重新配置所有端点最大包大小 	*/
}

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

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

}

/*********************************************************************************************************
** Function name:		usbDevInit
** Descriptions:        初始化 USB 设备控制器
** input parameters:    无					
** output parameters:	无						
** Returned value:      初始化成功	0
**						初始化失败	错误码
*********************************************************************************************************/
INT8U usbDevInit (void)
{	
	__usbDevHardwareInit();												/*  初始化硬件         	 		*/

	bEPPflags.value = 0;												/*  置USB事件标志为0    		*/
	
	if (__usbDevReadTestRegister() != 0xA50F) {							/*  读测试寄存器        		*/
		return 1;														/*  初始化失败             		*/
	}

	__usbDevIntConfig();												/*  配置中断 		   			*/
	__usbDevConfigEndpoint();											/*  配置端点			   		*/

#if DMA_ENGINE_EN	
	usbDevDMAInit();													/*  初始化USB DMA	  			*/
	__usbDevSetMode(0x28);
#else
	__usbDevSetMode(0x00);												/*  成功传输才产生中断 			*/
#endif
		
	__usbDevHadwareReconnect();
	__usbDevSoftReconnect();											/*  重新连接USB 		  		*/
 	return 0;								   							/*  初始化USB成功 				*/
}

/*********************************************************************************************************
** Function name:       usbDevServe
** Descriptions:        USB 设备控制器事件处理函数
** input parameters:	无						
** output parameters:	无							
** Returned value:      无
*********************************************************************************************************/
void usbDevServe (void)
{
	if (bEPPflags.bits.setup_packet) {
																		/*  收到 SETUP 包   			*/
		IRQ_DISABLE();					
		bEPPflags.bits.setup_packet = 0;
		__usbDevControlHandler();										/*  控制传输处理     			*/
		IRQ_ENABLE();
	} 

	if (bEPPflags.bits.bus_reset) {
																		/*  USB总线复位处理  			*/
		IRQ_DISABLE();
		bEPPflags.bits.bus_reset = 0;
		IRQ_ENABLE();

	} 

	if (bEPPflags.bits.suspend) {
																		/*  USB总线挂起改变处理  		*/
		IRQ_DISABLE();
		bEPPflags.bits.suspend= 0;
		IRQ_ENABLE();
		__usbDevSuspendChange();
	} 
	
	if (bEPPflags.bits.con_change) {
																		/*  USB总线连接改变处理  		*/
		IRQ_DISABLE();
		bEPPflags.bits.con_change = 0;
		IRQ_ENABLE();
		__usbDevConnectChange();
	} 
	
}

/*********************************************************************************************************
** Function name:       USB_Exception
** Descriptions:        USB 中断服务程序
** input parameters:    无						
** output parameters:	无
** Returned value:      无
*********************************************************************************************************/
void __irq usbDevException (void) 
{
	INT32U ulUsbIntState = 0;
	INT32U ulDevIntState = 0;
	INT32U ulDevState    = 0;
	
	bEPPflags.bits.in_isr = 1;											/*  标识程序进入中断     		*/

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

		if ((ulDevState & 0x08) != 0) {
			bEPPflags.bits.suspend = 1;									/*  标识总线挂起改变     		*/
		}

		if ((ulDevState & 0x02) != 0) {
			bEPPflags.bits.con_change = 1;								/*  标识总线连接改变     		*/
		}
		
		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:
	bEPPflags.bits.in_isr = 0;											/*  标识程序退出中断    		*/
   	VICVectAddr = 0x00;													/*  通知LPC23xx中断结束 		*/
}

/*********************************************************************************************************
** Function name:       usbDevGetVer
** Descriptions:        得到 USB Device 软件包版本号
** input parameters:    无							
** output parameters:	无							
** Returned value:      ZLG/USB23xx 软件包版本号
*********************************************************************************************************/
INT16U usbDevGetVer(void)
{
	return 0x0110;
}

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

⌨️ 快捷键说明

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