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

📄 usbchap9.c

📁 开发环境ADS 通过编写一段程序使PC机与实验箱的从USB相连接。连接的时候
💻 C
📖 第 1 页 / 共 2 页
字号:
/************************************************************************
 *File	: Usbchap9.c													*
 *By 	: hugang, hgx2000@mail.china.com								*
 ************************************************************************/ 

#include "armusb.h"
#include "..\inc\44b.h"
#include "..\inc\44blib.h"

#define CONFIG_DESCRIPTOR_LENGTH sizeof(USB_CONFIGURATION_DESCRIPTOR) \
		+ sizeof(USB_INTERFACE_DESCRIPTOR) \
		+ (NUM_ENDPOINTS * sizeof(USB_ENDPOINT_DESCRIPTOR))

extern CONTROL_XFER 	ControlData;
extern IO_REQUEST 		ioRequest;
extern ARMUSBFLAGS 		bUSBFlags;

/******************************************以下为配置描述符**********************************************/

//设备描述符
USB_DEVICE_DESCRIPTOR DeviceDescr =
{
	sizeof(USB_DEVICE_DESCRIPTOR),					// 设备描述符长度,		=0x12
	USB_DEVICE_DESCRIPTOR_TYPE,						// 设备描述符类型,		=0x01
	0x0110,											// 协议版本,				=1.10
	USB_DEVICE_CLASS_RESERVED,						// 设备类型
	0, 												// 设备子类
	0,												// 设备协议
	EP0_PACKET_SIZE,								// 端点0最大数据包大小,	=0x10
	0x0471,											// PHILIPS公司的设备ID
	0x0888,											// 设备制造商定的产品ID
	0x0100,											// 设备系列号
	0,												// iManufacturer
	0,												// iProduct
	0,												// iSerialNumber
	1												// 可能配置数
};

//配置描述符
USB_CONFIGURATION_DESCRIPTOR ConfigDescr =
{
	sizeof(USB_CONFIGURATION_DESCRIPTOR),			// 配置描述符的长度,		=0x09
	USB_CONFIGURATION_DESCRIPTOR_TYPE,				// 配置描述符的类型,		=0x02
	CONFIG_DESCRIPTOR_LENGTH,						// 描述符总长度			=0x2e
	1,												// 只支持1个接口
	1,												// 配置值
	0,												// 字符串描述符指针(无)
	0x40,											// 自供电
	0x32											// 最大功耗(100mA)
};

//接口描述符
USB_INTERFACE_DESCRIPTOR InterfaceDescr =
{
	sizeof(USB_INTERFACE_DESCRIPTOR),				// 接口描述符长度,		=0x09
	USB_INTERFACE_DESCRIPTOR_TYPE,					// 接口描述符类型,		=0x04
	0,												// 接口数,只有1个
	0,												// 可选配置,只有1个
	NUM_ENDPOINTS,									// 除端点0的端点索引数目	=0x04
	USB_CLASS_MASS_STORAGE,							// 设备类型
	USB_SUBCLASS_MASS_STORAGE,						// 子类代码
	USB_PROTOCOL_MASS_STORAGE,						// 协议代码
	0												// 字符串描述符指针(无)
};

//端点1发送描述符
USB_ENDPOINT_DESCRIPTOR EP1_TXDescr =
{
	sizeof(USB_ENDPOINT_DESCRIPTOR),				// 端点描述符长度,		=0x07	
	USB_ENDPOINT_DESCRIPTOR_TYPE,					// 端点描述符类型,		=0x05
	0x81,											// 端点1IN
	USB_ENDPOINT_TYPE_INTERRUPT,					// 中断传输,				=0x03
	EP1_PACKET_SIZE,								// 端点最大包的大小,		=0x10
	10												// 传输间隔时间,			=10ms
};

//端点1接收描述符
USB_ENDPOINT_DESCRIPTOR EP1_RXDescr =
{
	sizeof(USB_ENDPOINT_DESCRIPTOR),				// 端点描述符长度,		=0x07	 
	USB_ENDPOINT_DESCRIPTOR_TYPE,					// 端点描述符类型,		=0x05    
	0x01,											// 端点1OUT                       
	USB_ENDPOINT_TYPE_INTERRUPT,					// 中断传输,				=0x03    
	EP1_PACKET_SIZE,								// 端点最大包的大小,		=0x10    		
	10												// 传输间隔时间,			=10ms    
};

//端点2发送描述符
USB_ENDPOINT_DESCRIPTOR EP2_TXDescr =
{
	sizeof(USB_ENDPOINT_DESCRIPTOR),				// 端点描述符长度,		=0x07	 
	USB_ENDPOINT_DESCRIPTOR_TYPE,					// 端点描述符类型,		=0x05    
	0x82,                         					// 端点2IN                       
	USB_ENDPOINT_TYPE_BULK,        					// 批量传输,				=0x02    
	EP2_PACKET_SIZE,   								// 端点最大包的大小,		=0x40    
	10												// 批量传输时该设置无效
};

//端点2接收描述符
USB_ENDPOINT_DESCRIPTOR EP2_RXDescr =
{
	sizeof(USB_ENDPOINT_DESCRIPTOR),				// 端点描述符长度,		=0x07	 
	USB_ENDPOINT_DESCRIPTOR_TYPE,					// 端点描述符类型,		=0x05    
	0x02,											// 端点2OUT                       
	USB_ENDPOINT_TYPE_BULK,							// 批量传输,				=0x02    
	EP2_PACKET_SIZE,								// 端点最大包的大小,		=0x40    
	10												// 批量传输时该设置无效  
};


USB_TOTAL_DESCRIPTOR TotalDescriptor=
{
	sizeof(USB_CONFIGURATION_DESCRIPTOR),			// 配置描述符的长度,		=0x09
	USB_CONFIGURATION_DESCRIPTOR_TYPE,				// 配置描述符的类型,		=0x02
	CONFIG_DESCRIPTOR_LENGTH,						// 描述符总长度			=0x2e
	1,												// 只支持1个接口
	1,												// 配置值
	0,												// 字符串描述符指针(无)
	0x40,											// 自供电
	0x32,											// 最大功耗(100mA)

	sizeof(USB_INTERFACE_DESCRIPTOR),				// 接口描述符长度,		=0x09
	USB_INTERFACE_DESCRIPTOR_TYPE,					// 接口描述符类型,		=0x04
	0,												// 接口数,只有1个
	0,												// 可选配置,只有1个
	NUM_ENDPOINTS,									// 除端点0的端点索引数目	=0x04
	0xdc,//USB_CLASS_MASS_STORAGE,							// 设备类型
	0xa0,//USB_SUBCLASS_MASS_STORAGE,						// 子类代码
	0xb0,//USB_PROTOCOL_MASS_STORAGE,						// 协议代码
	0,												// 字符串描述符指针(无)

	sizeof(USB_ENDPOINT_DESCRIPTOR),				// 端点描述符长度,		=0x07	
	USB_ENDPOINT_DESCRIPTOR_TYPE,					// 端点描述符类型,		=0x05
	0x81,											// 端点1IN
	USB_ENDPOINT_TYPE_INTERRUPT,					// 中断传输,				=0x03
	EP1_PACKET_SIZE,								// 端点最大包的大小,		=0x10
	10,												// 传输间隔时间,	

	sizeof(USB_ENDPOINT_DESCRIPTOR),				// 端点描述符长度,		=0x07	 
	USB_ENDPOINT_DESCRIPTOR_TYPE,					// 端点描述符类型,		=0x05    
	0x01,											// 端点1OUT                       
	USB_ENDPOINT_TYPE_INTERRUPT,					// 中断传输,				=0x03    
	EP1_PACKET_SIZE,								// 端点最大包的大小,		=0x10    		
	10,												// 传输间隔时间,	
	
	sizeof(USB_ENDPOINT_DESCRIPTOR),				// 端点描述符长度,		=0x07	 
	USB_ENDPOINT_DESCRIPTOR_TYPE,					// 端点描述符类型,		=0x05    
	0x82,                         					// 端点2IN                       
	USB_ENDPOINT_TYPE_INTERRUPT,        			// 中断传输,				=0x03    
	EP2_PACKET_SIZE,   								// 端点最大包的大小,		=0x40    
	10,												// 批量传输时该设置无效

	sizeof(USB_ENDPOINT_DESCRIPTOR),				// 端点描述符长度,		=0x07	 
	USB_ENDPOINT_DESCRIPTOR_TYPE,					// 端点描述符类型,		=0x05    
	0x02,											// 端点2OUT                       
	USB_ENDPOINT_TYPE_INTERRUPT,					// 中断传输,				=0x03    
	EP2_PACKET_SIZE,								// 端点最大包的大小,		=0x40    
	10												// 批量传输时该设置无效
};


/******************************以下为USB标准请求程序调用到的子程序***************************************/

/********************************************************************************************************
 *保留子程序																								*
 ********************************************************************************************************/
void reserved(void)
{
	UsbStallEp0();
}

/********************************************************************************************************
 *类型:1000-0000,0001,0010																				*
 *请求:获取状态																							*
 *值  :0																									*
 *索引:设备,接口,端点																						*
 *长度:2																									*
 *数据:设备,接口或端点的状态																				*
 ********************************************************************************************************/
void UsbClassRequestGetStatus(void)
{
	unsigned char endp, txdat[2];
																// 读取请求类型中的接收方
	unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT_MASK;
	unsigned char c;
	
	if (bRecipient == USB_RECIPIENT_DEVICE) 
	{															// 返回设备状态
		if(bUSBFlags.bits.bRemote_Wakeup == 1)
			txdat[0] = 3;										// 支持远程唤醒,自供电
		else
			txdat[0] = 1;										// 支持自供电
		
		txdat[1]=0;
		UsbSingleTransmit(txdat, 2);
		DEBUGF(USB_CHAP9_DEBUG, ("GetStatus Device\n"));
	}
	else if (bRecipient == USB_RECIPIENT_INTERFACE) 
	{															// 返回接口状态
		txdat[0]=0;
		txdat[1]=0;
		UsbSingleTransmit(txdat, 2);							// 发送数据
		DEBUGF(USB_CHAP9_DEBUG, ("GetStatus Interface\n"));
	}
	else if (bRecipient == USB_RECIPIENT_ENDPOINT) 
	{															// 返回端点状态
		endp = (unsigned char)(ControlData.DeviceRequest.wIndex & USB_ENDPOINT_NUMBER_MASK);
		
		if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
			c = UsbSelectEndpoint(endp*2 + 1); 			// 读取输入端点状态
		else
			c = UsbSelectEndpoint(endp*2); 				// 读取输出端点状态
			
		if(c & USB_D12_STALL)
			txdat[0] = 1;										// 端点禁止
		else

⌨️ 快捷键说明

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