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

📄 descriptor.c

📁 USB通信测试软件 -- 与S3C44B0的下位机通信的软件. XP驱动------------ PDIUSBD12的PC机驱动程序.USB_Test---------S3C44B0X板的USB固件程
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
;************************************************************************************************************
;*									  	 江西师范大学物理通讯电子学院
;*
;*                                     	      创  新  中  心
;*
;*--------------------------------------------- 文件信息 ----------------------------------------------------                                      
;* 文件名称 : Descriptor.c
;* 文件功能 : USB协议层,PDIUSBD12所有描述取值
;* 补充说明 : 
;*-------------------------------------------- 最新版本信息 -------------------------------------------------
;* 修改作者 : zhouhong
;* 修改日期 : 2006-11-5 
;* 版本声明 : V1.0.0
;*-------------------------------------------- 历史版本信息 -------------------------------------------------
;* 文件作者 : zhouhong   
;* 创建日期 : 2006-11-5  
;* 版本声明 : V1.0.0     
;*-----------------------------------------------------------------------------------------------------------
;************************************************************************************************************                         
;*/
#ifndef _Descriptor_C_
#define _Descriptor_C_

#include "..\INC\D12Config.h"
#include "..\INC\Descriptor.h"
#include "..\INC\D12Int.h"
#include "..\..\Uart_driver\inc\Uart_driver.h"

/*
*************************************************************************************************************
*---------------------------------------  USB设备相关描述信息   ---------------------------------------------
*************************************************************************************************************
*/
//
//  PDIUSBD12设备描述符取值
//
const USB_DEVICE_DESCRIPTOR DeviceDescr=
{
	sizeof(USB_DEVICE_DESCRIPTOR),					//设备描述符长度,=12H
	USB_DEVICE_DESCRIPTOR_TYPE,					    //设备描述符类型=01H
	0x110,											//协议版本,=1.10						
	USB_CLASS_CODE_TEST_CLASS_DEVICE,				//测试设备类型,=0DCH
	0,0,											//设备子类,设备协议
	EP0_PACKET_SIZE	,								//端点0最大数据包大小,=10h
	0x471,											//PHLIPS公司的设备ID
	0x1801,											//设备制造商定的产品ID,222
	0x113,											//设备系列号
	0, 0, 0,										//索引
	1												//可能的配置数
};

//
//  PDIUSBD12配置描述符、接口描述符、端点描述符
//
const USB_DESCRIPTOR usb_descr=
{
	//配置描述符
	{
		sizeof(USB_CONFIGURATION_DESCRIPTOR),		//配置描述符长度=09H
		USB_CONFIGURATION_DESCRIPTOR_TYPE,		    //配置描述符类型=02H
		U16TO2U8(USB_TOTAL_CFG_DESCSIZE),					//描述符总长度(低位),
		1,											//支持接口数1
		1,											//配置值
		0,											//字符串描述符的索引(无)
		0x60,										//自供电,支持远程唤醒
		0x32										//最大功耗(100mA)
	},
	//接口描述符
	{
		sizeof(USB_INTERFACE_DESCRIPTOR),			//接口描述符长度,=09H
		USB_INTERFACE_DESCRIPTOR_TYPE,				//接口描述符类型=04H
		0,											//接口数,只有1个
		0,											//可选配置,只有1个
		NUM_ENPOINTS,								//除端点0的端点数目,=4H
		USB_CLASS_CODE_TEST_CLASS_DEVICE,			//测试设备类型,=0DCH
		USB_SUBCLASS_CODE_TEST_CLASS_D12,			//子类型代码,=0A0H
		USB_PROTROCOL_CODE_TEST_CLASS_D12,		    //协议代码,=0B0H
		0											//字符串描述符索引
	},
	//端点描述符,端点1输入
	{
		sizeof(USB_ENDPOINT_DESCRIPTOR),			//端点描述符长度,=07H
		USB_ENDPOINT_DESCRIPTOR_TYPE,				//端点描述符类型,=05H
		0x81,										//端点1 IN
		USB_ENDPOINT_TYPE_INTERRUPT,				//中断传输,=03H
		U16TO2U8(EP1_PACKET_SIZE),							//端点最大包的大小,=0010H
		10											//传输间隔时间,=10ms		
	},
	//端点描述符,端点1输出
	{
		sizeof(USB_ENDPOINT_DESCRIPTOR),			//端点描述符长度,=07H
		USB_ENDPOINT_DESCRIPTOR_TYPE,				//端点描述符类型,=05H
		0x01,										//端点1 OUT
		USB_ENDPOINT_TYPE_INTERRUPT,				//中断传输,=03H
		U16TO2U8(EP1_PACKET_SIZE),							//端点最大包的大小,=0010H
		10											//传输间隔时间,=10ms		
	},
	//端点描述符,端点2输入
	{
		sizeof(USB_ENDPOINT_DESCRIPTOR),			//端点描述符长度,=07H
		USB_ENDPOINT_DESCRIPTOR_TYPE,				//端点描述符类型,=05H
		0x82,										//端点2 IN
		USB_ENDPOINT_TYPE_BULK,						//批量传输,=02H
		U16TO2U8(EP2_PACKET_SIZE),					//端点最大包的大小,=0040H
		10											//传输间隔时间,=10ms		
	},
	//端点描述符,端点2输出
	{
		sizeof(USB_ENDPOINT_DESCRIPTOR),			//端点描述符长度,=07H
		USB_ENDPOINT_DESCRIPTOR_TYPE,				//端点描述符类型,=05H
		0x2,										//端点1 IN
		USB_ENDPOINT_TYPE_BULK,						//批量传输,=02H
		U16TO2U8(EP2_PACKET_SIZE),							//端点最大包的大小,=0040H
		10											//传输间隔时间,=10ms		
	}
};
/*
*************************************************************************************************************
*-------------------------------------  USB设备相关描述信息结束  --------------------------------------------
*************************************************************************************************************
*/
		
/*
*************************************************************************************************************
*            以下为USB 标志请求函数 standard device request
*************************************************************************************************************
*/
static INT8U usb_remote_wake;						//远程唤醒标志
extern INT8U * usb_send_ptr;						//USB 发送的数据的指针
extern INT16U usb_send_remain;						//USB还没有发送的数据个数
static INT8U usb_ISconfig;							//USB是否配置标志位

/*
*************************************************************************************************************
************************这个函数是为了输出相应描述符的数据.在调试中用到.*************************************
*
void printf_Descriptor(void)
{
	INT8U i;
	INT8U * p;
	printf("\n设备描述符:%x :",sizeof(USB_DEVICE_DESCRIPTOR));
	p=(INT8U *)(&DeviceDescr);
	for(i=0;i<sizeof(USB_DEVICE_DESCRIPTOR);i++)
		printf("%x  ",*(p+i));
	printf("\n配置描述符:%x :",sizeof(USB_CONFIGURATION_DESCRIPTOR));
	p=(INT8U *)(&usb_descr);
	for(i=0;i<sizeof(USB_CONFIGURATION_DESCRIPTOR);i++)
		printf("%x  ",*(p+i));
	printf("\n接口描述符:%x :",sizeof(USB_INTERFACE_DESCRIPTOR));
	printf("\n端点描述符:%x :",sizeof(USB_ENDPOINT_DESCRIPTOR));
}
*************************************************************************************************************
*/

/*
*************************************************************************************************************
- 函数名称 : USB_Get_Status(USB_DEVICE_REQUEST *sDeviceRequest)
- 函数说明 : 获取状态函数
- 输入参数 : sDeviceRequest:设备请求数据包指针                 
- 输出参数 : 返回一个状态.STATUS_OK表示正常,STATUS_ERR表示异常 
*************************************************************************************************************
*/
INT8U USB_Get_Status(USB_DEVICE_REQUEST *sDeviceRequest)
{
	INT8U endp,txdat[2],c;
	INT8U bRecipient=(*sDeviceRequest).bmRequestType&USB_RT_RECIPIENT_MASK;			//读取请求类型中的接收方

	#if USB_DEBUG
		printf("\nUSB_Get_Status()  ");
	#endif
	//设备请求
	if(bRecipient==USB_RT_RECIPIENT_DEVICE)
	{
		if(usb_remote_wake==1)
			txdat[0]=USB_DEVICE_STATUS_SELF_POWERED | USB_DEVICE_STATUS_REMOTE_WAKEUP;	//自供电,支持远程唤醒
		else
			txdat[0]=USB_DEVICE_STATUS_SELF_POWERED;		//自供电,不支持远程唤醒
		txdat[1]=0;											//高8位为0
	}
	else if(bRecipient==USB_RT_RECIPIENT_INTERFACE)			//对接口请求
	{
		txdat[0]=0;
		txdat[1]=0;
	}
	else if(bRecipient==USB_RT_RECIPIENT_ENDPOINT)			//对端口请求
	{
		endp=(INT8U)((*sDeviceRequest).wIndex & MAX_ENPOINTS);
		if((*sDeviceRequest).wIndex & (INT8U) USB_ENDPOINT_DIRECTION_MASK)
			c=D12_SelectEndpoint(endp*2+1);					//清除控制输入端点STALL特性
		else
			c=D12_SelectEndpoint(endp*2);					//清除控制输出端点STALL特性
		if(c & USB_ENDPOINT_STALL)
			txdat[0]=1;										//端点禁止
		else
			txdat[0]=0;										//端点有效
		txdat[1]=0;											//高8位为0
	}
	else
	{
		stall_ep0();		
		return STATUS_ERR;
	}
	D12_WriteEndpoint(USB_ENDPOINT_CONTROL_IN,2,txdat);    //发送16位的状态到主机
	return STATUS_OK;
}

/*
*************************************************************************************************************
- 函数名称 : USB_Clear_Feature()
- 函数说明 : 清除一个指定的特性. 函数中使用了外部变量sDeviceRequest
- 输入参数 : sDeviceRequest:设备请求数据包指针                 
- 输出参数 : 返回一个状态.STATUS_OK表示正常,STATUS_ERR表示异常 
*************************************************************************************************************
*/
INT8U USB_Clear_Feature(USB_DEVICE_REQUEST *sDeviceRequest)
{
	INT8U endp;
	INT8U bRecipient=(*sDeviceRequest).bmRequestType&USB_RT_RECIPIENT_MASK;	//读取请求类型中的接收方

	#if USB_DEBUG	
		printf("  USB_Clear_Feature()");
	#endif
	//设备请求
	if(bRecipient==USB_RT_RECIPIENT_DEVICE && (*sDeviceRequest).wValue==USB_FEATURE_REMOTE_WAKEUP)
	{
		usb_remote_wake=0;								//清0 远程唤醒标志
	}
	//对端点请求
	else if(bRecipient==USB_RT_RECIPIENT_ENDPOINT && (*sDeviceRequest).wValue==USB_FEATURE_ENDPOINT_STALL)
	{
		endp=(INT8U)((*sDeviceRequest).wIndex & MAX_ENPOINTS);
		if((*sDeviceRequest).wIndex & (INT8U) USB_ENDPOINT_DIRECTION_MASK)
			D12_SetEndpointStatus(endp*2+1,0);			//清除控制输入端点STALL特性
		else
			D12_SetEndpointStatus(endp*2,0);			//清除控制输出端点STALL特性

⌨️ 快捷键说明

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