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

📄 usbdevprotocol.c

📁 《USB开发指南——基于LPC2400》配套例程
💻 C
📖 第 1 页 / 共 2 页
字号:
	__usbDevSetAddressEnable((INT8U)(ControlData.DeviceRequest.wValue & DEVICE_ADDRESS_MASK),1);

	__usbDevSingleTransmit(0, 0);										/*  返回一个空包	 			*/
}

/*********************************************************************************************************
** Function name:       __usbDevGetDescriptor
** Descriptions:        获取描述符
** input parameters:    无											
** output parameters:	无
** Returned value:      无
*********************************************************************************************************/
void __usbDevGetDescriptor (void)
{						
	INT8U ucDescriptor =(INT8U)(MSB(ControlData.DeviceRequest.wValue));	/*  取得描述符类型 				*/

	if (ucDescriptor == USB_DEVICE_DESCRIPTOR_TYPE) {
																		/*  获取设备描述符 				*/
		__usbDevCodeTransmit((INT8U *)&DeviceDescr, sizeof(USB_DEVICE_DESCRIPTOR));
	
	} else if (ucDescriptor == USB_CONFIGURATION_DESCRIPTOR_TYPE) {
		 								
		 if (ControlData.DeviceRequest.wLength > CONFIG_DESCRIPTOR_LENGTH) {	
			 
			 ControlData.DeviceRequest.wLength = CONFIG_DESCRIPTOR_LENGTH;
		 }
																		/*  传输描述符内容 				*/
		 __usbDevCodeTransmit((INT8U *)&(usb_descr.ConfigDescr),ControlData.DeviceRequest.wLength);
													
    } else {													
	
		 __usbDevStallEp0();											/* 	禁止逻辑端点0 				*/
	}
}

/*********************************************************************************************************
** Function name:       __usbDevGetConfiguration
** Descriptions:        获取配置
** input parameters:    无											
** output parameters:	无
** Returned value:      无
*********************************************************************************************************/
void __usbDevGetConfiguration (void)
{
	INT8U ucTmp = (INT8U)bEPPflags.bits.configuration;					/*  取得配置值 					*/
		
	__usbDevSingleTransmit(&ucTmp, 1);				   					/*  传输配置值 					*/
}

/*********************************************************************************************************
** Function name:       __usbDevSetConfiguration
** Descriptions:        设置配置
** input parameters:    无											
** output parameters:	无
** Returned value:      无
*********************************************************************************************************/
void __usbDevSetConfiguration (void)
{
	if (ControlData.DeviceRequest.wValue == 0) {
	
		__usbDevSingleTransmit(0, 0);									/*  传输一个空包	 			*/
		IRQ_DISABLE();
		bEPPflags.bits.configuration = 0;								/*  标识设备未配置				*/
		IRQ_ENABLE();
		__usbDevInitConfig();											/*  禁止除0外的所有逻辑端点   	*/
	
	} else if (ControlData.DeviceRequest.wValue == 1) {
	
		__usbDevSingleTransmit(0, 0);									/*  传输一个空包				*/
		__usbDevInitUnconfig();											/*  禁止除0外的所有逻辑端点   	*/
		__usbDevInitConfig();											/*  使能全部端点				*/
		IRQ_DISABLE();
		bEPPflags.bits.configuration = 1;								/*  标识设备已被配置			*/
		IRQ_ENABLE();
	
	} else {														
		 __usbDevStallEp0();											/*  禁止逻辑端点0 				*/
	}
}

/*********************************************************************************************************
** Function name:       __usbDevGetInterface
** Descriptions:        获取接口信息
** input parameters:    无											
** output parameters:	无
** Returned value:      无
*********************************************************************************************************/
void __usbDevGetInterface (void)
{
	INT8U ucTxData = 0;													/*  只有一个接口				*/
	
	__usbDevSingleTransmit(&ucTxData, 1);								/*  传输一个字节 				*/
}

/*********************************************************************************************************
** Function name:       __usbDevSetInterface
** Descriptions:        设置接口信息
** input parameters:    无											
** output parameters:	无
** Returned value:      无
*********************************************************************************************************/
void __usbDevSetInterface (void)
{
	if (ControlData.DeviceRequest.wValue == 0 && ControlData.DeviceRequest.wIndex == 0) {
		
		__usbDevSingleTransmit(0, 0);									/*  返回一个空包,表示执行成功  	*/
	} else {
			
		__usbDevStallEp0();												/*  禁止逻辑端点0 				*/		
	}
}

/*********************************************************************************************************
** Function name:       StandardDeviceRequest
** Descriptions:        USB 标准设备请求入口地址指针表
** input parameters:    无						
** output parameters:	无
** Returned value:      无
*********************************************************************************************************/
void (*StandardDeviceRequest[]) (void) =
{
	__usbDevGetStatus,
	__usbDevClearFeature,
	__usbDevReserved,
	__usbDevSetFeature,
	__usbDevReserved,
	__usbDevSetAddress,
	__usbDevGetDescriptor,
	__usbDevReserved,
	__usbDevGetConfiguration,
	__usbDevSetConfiguration,
	__usbDevGetInterface,
	__usbDevSetInterface,
	__usbDevReserved,
	__usbDevReserved,
	__usbDevReserved,
	__usbDevReserved
};

/*********************************************************************************************************
** Function name:       __usbDevEp0RxDone
** Descriptions:        通过端点索引 0 接收数据
** input parameters:    无											
** output parameters:	无
** Returned value:      无
*********************************************************************************************************/
void __usbDevEp0RxDone (void)
{
	INT8U ucEpState  = 0;
	INT8U ucReadLen = 0;
	INT8U req[sizeof(DEVICE_REQUEST)];

	ucEpState = __usbDevSelectClrIntEndpoint(0);				 		/*  清除该端点的中断		 	*/
	
	if (ucEpState & USB_SETUPPACKET) {									/*  接收到SETUP包		 		*/
														 	
		ControlData.wLength = 0;			 		 
		ControlData.wCount = 0;
		
		if(usbDevReadEndpoint(0,req,sizeof(ControlData.DeviceRequest))  
		   != sizeof(DEVICE_REQUEST)) {	 								/*  从端点 0 读取数据	 		*/
	    
			__usbDevSetEndpointStatus(0, 1);				 			/*  禁止控制端点0		 		*/
			__usbDevSetEndpointStatus(1, 1);			 	 			/*  禁止控制端点1		 		*/
			bEPPflags.bits.control_state = USB_IDLE;	 				/*  标识空闲状态			 	*/
			return;
		}
		
		/*
		 *  接收 SETUP 包成功
		 */
		
		ControlData.DeviceRequest.bmRequestType = req[0];
		ControlData.DeviceRequest.bRequest	    = req[1];
		ControlData.DeviceRequest.wValue 	 	= (INT16U)(req[3] * 256 + req[2]); 
		ControlData.DeviceRequest.wIndex        = (INT16U)(req[5] * 256 + req[4]);
		ControlData.DeviceRequest.wLength       = (INT16U)(req[7] * 256 + req[6]); 
		ControlData.wLength = ControlData.DeviceRequest.wLength;
		
		if (ControlData.DeviceRequest.bmRequestType & (INT8U)USB_ENDPOINT_DIRECTION_MASK) {
																		/*  如果为控制读取	   			*/
			 bEPPflags.bits.setup_packet = 1;
			 bEPPflags.bits.control_state = USB_TRANSMIT;
		
		} else {														/*  如果为控制写 				*/

			 if (ControlData.DeviceRequest.wLength == 0) {
			 	  
				 bEPPflags.bits.setup_packet = 1;
				 bEPPflags.bits.control_state = USB_IDLE;
			 
			 } else {
			 
				 if (ControlData.DeviceRequest.wLength > MAX_CONTROLDATA_SIZE) {
				 	 
					bEPPflags.bits.control_state = USB_IDLE;	
					__usbDevSetEndpointStatus(0, 1);			  	 	/*  禁止控制端点0  				*/
				 	__usbDevSetEndpointStatus(1, 1);			     	/*  禁止控制端点1	 			*/
				 
				 } else {
				 
					bEPPflags.bits.control_state = USB_RECEIVE;  		/*  标识接收状态 				*/
				 }
				 
			 }
		}
	}

	/*
	 *  下面为控制接收数据阶段
	 */
		 
	else if (bEPPflags.bits.control_state == USB_RECEIVE) { 
																	 	/*  如果当前为接收状态 			*/
		ucReadLen = usbDevReadEndpoint(0,
									   ControlData.dataBuffer + ControlData.wCount, 
									   EP0_PACKET_SIZE);			 	/*  从端点 0 读取数据 			*/

		ControlData.wCount = (INT16U)(ControlData.wCount+ucReadLen);
		
		if( ucReadLen != EP0_PACKET_SIZE || ControlData.wCount >= ControlData.wLength) { 
		 		                                                     	/*  完成接收数据 				*/
			bEPPflags.bits.setup_packet = 1;
			bEPPflags.bits.control_state = USB_IDLE;
		}
	
	} else { 
	
		bEPPflags.bits.control_state = USB_IDLE;	
	}
}

/*********************************************************************************************************
** Function name:       __usbDevEp0TxDone
** Descriptions:        通过物理端点 0 发送数据
** input parameters:    无											
** output parameters:	无
** Returned value:      无
*********************************************************************************************************/
void __usbDevEp0TxDone(void)
{
	INT16S i = (INT16S)(ControlData.wLength - ControlData.wCount);

	__usbDevSelectClrIntEndpoint(1); 									/*  清除端点中断标志	 		*/
		
	if (bEPPflags.bits.control_state != USB_TRANSMIT) {	
																		/*  非发送状态 					*/												
		__usbDevSingleTransmit(0, 0);						
		return;															/*  直接返回	 				*/
	}
	
	if( i >= EP0_PACKET_SIZE) { 
																		/*  未发送字节数大于64 			*/
		usbDevWriteEndpoint(1, 
		                    ControlData.pData + ControlData.wCount, 
		                    EP0_PACKET_SIZE);
		                    
		ControlData.wCount += EP0_PACKET_SIZE;
		bEPPflags.bits.control_state = USB_TRANSMIT;	
	
	} else if( i != 0) {
	  																	/*  发送所有未发送的字节		*/
		usbDevWriteEndpoint(1, ControlData.pData + ControlData.wCount,(INT8U)i);
		ControlData.wCount =(INT16U)(ControlData.wCount+i);
		bEPPflags.bits.control_state = USB_IDLE;						/*  置状态为等待状态 			*/
	
	} else if (i == 0) {
	
		usbDevWriteEndpoint(1, 0, 0); 									/*  完成发送,再发送一个空包 	*/
		bEPPflags.bits.control_state = USB_IDLE;
	}
}

/*********************************************************************************************************
** Function name:       __usbDevControlHandler
** Descriptions:        控制传输
** input parameters:    无											
** output parameters:	无
** Returned value:      无
*********************************************************************************************************/
void __usbDevControlHandler (void)
{
	INT8U ucRequesttype  = 0;
	INT8U ucRequestindex = 0;

	ucRequesttype  = (INT8U)(ControlData.DeviceRequest.bmRequestType & USB_REQUEST_TYPE_MASK);
																		/*  读请求类型码			 	*/
	
	ucRequestindex = (INT8U)(ControlData.DeviceRequest.bRequest & USB_REQUEST_MASK);
	
	if (ucRequesttype == USB_STANDARD_REQUEST)
		(*StandardDeviceRequest[ucRequestindex])();						/*  标准请求				 	*/
	//else if (ucRequesttype == USB_VENDOR_REQUEST)						/*  厂商请求					*/
	//	(*VendorDeviceRequest[ucRequestindex])();
	//else if(ucRequesttype == USB_CLASS_REQUEST)
	//	(*ClassDeviceRequest[ucRequestindex])();						/*  类请求				 		*/
	else {
		
		__usbDevStallEp0();												/*  禁止逻辑端点0   			*/		
	}
}

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

⌨️ 快捷键说明

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