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

📄 usbdevprotocol.c

📁 SmartARM2400系列开发板全套资料
💻 C
📖 第 1 页 / 共 2 页
字号:
/****************************************Copyright (c)****************************************************
**                            Guangzhou ZHIYUAN electronics Co.,LTD.
**                                      
**                                 http://www.embedtools.com
**
**--------------File Info---------------------------------------------------------------------------------
** File name:               usbDevProtocol.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"

CONTROL_XFER ControlData;												/*  定义传输控制结构变量 		*/

/*********************************************************************************************************
  USB 协议层函数
*********************************************************************************************************/

/*********************************************************************************************************
** Function name:       __usbStallEp0
** Descriptions:        使控制端点处于停止状态
** input parameters:    无						
** output parameters:	无
** Returned value:      无
*********************************************************************************************************/
void __usbDevStallEp0 (void)
{
	__usbDevSetEndpointStatus(0, 1);									/*  停止控制OUT端点				*/
	__usbDevSetEndpointStatus(1, 1);									/*  停止控制IN端点				*/
}
   
/*********************************************************************************************************
** Function name:       __usbDevReserved
** Descriptions:        保留子程序
** input parameters:    无						
** output parameters:	无
** Returned value:      无
*********************************************************************************************************/
void __usbDevReserved (void)
{
	__usbDevStallEp0();
}

/*********************************************************************************************************
** Function name:       __usbDevInitUnconfig
** Descriptions:        进入地址状态,禁止 0 除外的所有端点
** input parameters:    无						
** output parameters:	无
** Returned value:      无
*********************************************************************************************************/
void __usbDevInitUnconfig (void)
{
	__usbDevSetEndpointEnable(0);
}

/*********************************************************************************************************
** Function name:       __usbInitConfig
** Descriptions:        配置处理,允许端点收发
** input parameters:    无						
** output parameters:	无
** Returned value:      无
*********************************************************************************************************/
void __usbDevInitConfig (void)
{
	__usbDevSetEndpointEnable(1);
}

/*********************************************************************************************************
** Function name:       __usbDevSingleTransmit
** Descriptions:        通过物理端点 1 发送数据
** input parameters:    pcSendbuf	发送数据指针
**						ucSendlen	发送数据长度						
** output parameters:	无
** Returned value:      无
*********************************************************************************************************/
void __usbDevSingleTransmit (INT8U *pucSendbuf,INT8U ucSendLen)
{																		
	if( ucSendLen <= EP0_PACKET_SIZE) {									/*  不超过端点最大包大小		*/
																		
		usbDevWriteEndpoint(1,
		                    pucSendbuf,
		                    ucSendLen);									/*  向控制IN端点写入1字节数据 	*/
	}
}

/*********************************************************************************************************
** Function name:       __usbDevCodeTransmit
** Descriptions:        通过物理端点 1 发送数据
** input parameters:    pucRomData	发送数据指针
**						usSendLen	发送数据长度						
** output parameters:	无
** Returned value:      无
*********************************************************************************************************/
void __usbDevCodeTransmit(INT8U * pucRomData, INT16U usSendLen)
{
	ControlData.wCount = 0;
	
	if (ControlData.wLength > usSendLen) {
		
		ControlData.wLength = usSendLen;								/*  长度要小于usSendLen			*/
	}

	ControlData.pData = pucRomData;
	
	if (ControlData.wLength >= EP0_PACKET_SIZE) {

		usbDevWriteEndpoint(1, 
							ControlData.pData,
							EP0_PACKET_SIZE );
							  	
		ControlData.wCount += EP0_PACKET_SIZE;							/*  计数器累加 					*/

		IRQ_DISABLE();
		bEPPflags.bits.control_state = USB_TRANSMIT;					/*  标识发送状态 				*/		
		IRQ_ENABLE();
	
	} else {
		
		usbDevWriteEndpoint(1, 
							pucRomData, 
							(INT8U)ControlData.wLength);				/*  将全部数据写入端点 			*/
							  
		ControlData.wCount =(INT16U)(ControlData.wCount 
		                             + ControlData.wLength);			/*  计数器累加 					*/
		
		IRQ_DISABLE();
		bEPPflags.bits.control_state = USB_IDLE;						/*  标识空闲状态 				*/
		IRQ_ENABLE();
	}
}

/*********************************************************************************************************
  USB 标准设备请求服务程序
*********************************************************************************************************/

/*********************************************************************************************************
** Function name:       __usbDevGetStatus
** Descriptions:        主机要求获取状态,设备返回16位的状态描述符给主机
** input parameters:    无											
** output parameters:	无
** Returned value:      无
*********************************************************************************************************/
void __usbDevGetStatus (void)
{
	INT8U ucEpindex   = 0;
	INT8U ucTxdata[2] = {0};
	INT8U ucEpstat    = 0;
	
	INT8U ucRecipient =(INT8U)(ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT);	
																		/*  获取请求类型	 			*/	
	if (ucRecipient == USB_RECIPIENT_DEVICE) { 
	 
		if (bEPPflags.bits.remote_wakeup == 1) {			
			ucTxdata[0] = 3;											/*  支持远程唤醒和自供电	 	*/ 
		} else {
		
			ucTxdata[0] = 1;											/*  不支持以上两个功能 			*/
		}
		
		ucTxdata[1]=0;													/*  高 8 位清 0  				*/
		__usbDevSingleTransmit(ucTxdata, 2);							/*  发送16ibt到USB主机 			*/
	
	} else if (ucRecipient == USB_RECIPIENT_INTERFACE) {

		ucTxdata[0]=0;
		ucTxdata[1]=0;
		__usbDevSingleTransmit(ucTxdata, 2);							/*  发送16ibt到USB主机 			*/
	
	} else if (ucRecipient == USB_RECIPIENT_ENDPOINT) { 
	
		ucEpindex = (INT8U)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
		if (ControlData.DeviceRequest.wIndex & (INT8U)USB_ENDPOINT_DIRECTION_MASK) {
			
			ucEpstat = __usbDevSelectEndpoint((INT8U)(ucEpindex * 2 + 1));
																		/*  读 IN 端点状态 				*/
		} else {
		
			ucEpstat = __usbDevSelectEndpoint((INT8U)(ucEpindex * 2));	/*  读 OUT 端点状态 			*/
		}
		
		if (ucEpstat & USB_STALL) {
			ucTxdata[0] = 1;											/*  端点已被禁止	 			*/
		
		} else {
		
			ucTxdata[0] = 0;											/*  端点已解禁	 				*/
		}
		
		ucTxdata[1] = 0;
		__usbDevSingleTransmit(ucTxdata, 2);							/*  发送16ibt到USB主机 			*/

	} else {
	
		__usbDevStallEp0();												/*  非标准请求,禁止逻辑端点0 	*/
	}
																
}

/*********************************************************************************************************
** Function name:       __usbDevClearFeature
** Descriptions:        清除特性
** input parameters:    无											
** output parameters:	无
** Returned value:      无
*********************************************************************************************************/
void __usbDevClearFeature (void)
{
	INT8U ucEpindex   = 0;
	INT8U ucRecipient = (INT8U)(ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT);
																		/*  获取请求类型				*/
	if (ucRecipient == USB_RECIPIENT_DEVICE					
		&& ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP) {
    	
		IRQ_DISABLE();								
		bEPPflags.bits.remote_wakeup = 0;								/*  清除远程唤醒特性	 		*/	
		IRQ_ENABLE();
		__usbDevSingleTransmit(0, 0);									/*  返回一个空包 				*/
	
	} else if ((ucRecipient == USB_RECIPIENT_ENDPOINT)
	           && (ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL)) {
	
		ucEpindex = (INT8U)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
		if (ControlData.DeviceRequest.wIndex & (INT8U)USB_ENDPOINT_DIRECTION_MASK) {
		
			__usbDevSetEndpointStatus((INT8U)(ucEpindex * 2 + 1), 0);	/*  解禁 IN 端点	 			*/
			
		} else {

			__usbDevSetEndpointStatus((INT8U)(ucEpindex * 2), 0);		/*  解禁 OUT 端点 				*/
		}
		
		__usbDevSingleTransmit(0, 0);									/*  发送空包表示执行成功 		*/
	
	} else {
		
		__usbDevStallEp0();												/*  不成功,禁止逻辑端点0  		*/							
	}
}

/*********************************************************************************************************
** Function name:       __usbDevSetFeature
** Descriptions:        设置特性
** input parameters:    无											
** output parameters:	无
** Returned value:      无
*********************************************************************************************************/
void __usbDevSetFeature (void)
{
	INT8U ucEpindex = 0;											
	INT8U ucRecipient =(INT8U)(ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT);
																		/*  获取请求类型				*/
	if ((ucRecipient == USB_RECIPIENT_DEVICE)							/*  请求设备	 				*/
		&& (ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP)) { 
	
		IRQ_DISABLE();
		bEPPflags.bits.remote_wakeup = 1;								/*  设置远程唤醒标志 			*/
		IRQ_ENABLE();
		__usbDevSingleTransmit(0, 0);									/*  返回一个空包	 			*/
	
	} else if ((ucRecipient == USB_RECIPIENT_ENDPOINT)					/*  请求端点 					*/
		&& (ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL)) {
	
		ucEpindex = (INT8U)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
		
		if (ControlData.DeviceRequest.wIndex & (INT8U)USB_ENDPOINT_DIRECTION_MASK) {
			
			__usbDevSetEndpointStatus((INT8U)(ucEpindex * 2 + 1), 1);	/*  IN 端点被禁止 				*/
		
		} else {		
			
			__usbDevSetEndpointStatus((INT8U)(ucEpindex * 2), 1);		/*  OUT端点被禁止 				*/
		}
		
		__usbDevSingleTransmit(0, 0);									/*  返回一个空包				*/
	
	} else {
		
		__usbDevStallEp0();												/*  非标准请求,禁止逻辑端点0 	*/
	}
}

/*********************************************************************************************************
** Function name:       __usbDevSetAddress
** Descriptions:        设置地址
** input parameters:    无											
** output parameters:	无
** Returned value:      无
*********************************************************************************************************/
void __usbDevSetAddress (void)
{

⌨️ 快捷键说明

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