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

📄 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:            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)
{
	INT8U  i = 0;
	INT32U ulTmp = 0;
	INT8U  ucEpState = 0;
	INT32U ulLeftLen = 0;
	
	__usbDevSelectClrIntEndpoint(5);				   		 			/*  选择端点并清除中断   		*/
	
	if (Usb.Cnt >= Usb.Len) {
		return;				  											/*  发送完成后返回 				*/
	}
	
	for (i = 0; i < 2; i++) {
	
		ucEpState = (INT8U)(__usbDevSelectEndpoint(5) & 0x60);
		if (ucEpState == 0x60) {  
			break;														/*  双缓冲区都满则退出	 		*/
		}

		ulLeftLen = Usb.Len - Usb.Cnt;
		if (ulLeftLen > 0) {
							   						 
			if (ulLeftLen >= 64) {												
				ulTmp = usbDevWriteEndpoint(5, 
										    Usb.pbuff + Usb.Cnt, 
										    64);						/*  写64个字节 					*/
			} else {
				ulTmp = usbDevWriteEndpoint(5, 
										    Usb.pbuff + Usb.Cnt, 
										    (INT8U)ulLeftLen);  		/*  写少于64个字节 				*/
			}
																		
			Usb.Cnt += ulTmp;											/*  累加已发送字节数			*/
		}
	}
	
}

/*********************************************************************************************************
** Function name:       __usbDevEp2RxDone
** Descriptions:        逻辑端点2接收数据处理	
** input parameters:    无						
** output parameters:	无
** Returned value:      无
*********************************************************************************************************/
void __usbDevEp2RxDone (void)
{
	INT8U  i = 0;
	INT8U  ucEpState = 0;
	INT32U ulTmp     = 0;
	INT32U ulLeftLen = 0;
	
	__usbDevSelectClrIntEndpoint(4);							 		/*  选择端点并清除中断       	*/
	
	if (Usb.Cnt >= Usb.Len) {
	
		Usb.bRecFinish = 1;												/*  接收完成 					*/
		return; 
	}

	for(i = 0; i < 2; i++) {
	
		ulLeftLen = Usb.Len - Usb.Cnt;
		
		if (ulLeftLen > 0) {
			
			if (ulLeftLen >= 64) {
														
				ulTmp = usbDevReadEndpoint(4, 
										   Usb.pbuff + Usb.Cnt, 
										   64); 						/*  接收 64 个字节 				*/
				Usb.Cnt = Usb.Cnt + 64;
			
			} else {
												
				ulTmp = usbDevReadEndpoint(4, 
										   Usb.pbuff + Usb.Cnt, 
										   (INT8U)ulLeftLen); 			/*  接收少于64个字节 			*/
				Usb.Cnt = Usb.Cnt + ulTmp;	
			}	
		}
		
		ucEpState = (INT8U)(__usbDevSelectEndpoint(4) & 0x60);
		if (ucEpState == 0) {
			break;														/*  无缓冲区满 					*/
		}
	}

	if (Usb.Cnt >= Usb.Len)	{							
		Usb.bRecFinish = 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

⌨️ 快捷键说明

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