📄 descriptor.c
字号:
/*
;************************************************************************************************************
;* 江西师范大学物理通讯电子学院
;*
;* 创 新 中 心
;*
;*--------------------------------------------- 文件信息 ----------------------------------------------------
;* 文件名称 : 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 + -