📄 chap_9.c
字号:
/*************************************************************************
描述: PDIUSBD12 firware for MSP430F149
文件名: chap_9.c 完整注释
修改: Miracle G. Eicont.
日期: 2006-06-08
历史: 2006-06-14
发现并解决了MSP430单片机对描述符结构编译时字对齐的问题
*************************************************************************/
#include <stdio.h>
#include <string.h>
#include <msp430x14x.h> /* special function register declarations */
#include "epphal.h"
#include "d12ci.h"
#include "mainloop.h"
#include "usb100.h"
#include "chap_9.h"
extern CONTROL_XFER ControlData;
//extern IO_REQUEST ioRequest;
extern EPPFLAGS bEPPflags;
//****************************************************
//设备描述符
//****************************************************
const USB_DEVICE_DESCRIPTOR DeviceDescr =
{
sizeof(USB_DEVICE_DESCRIPTOR), //bLength 描述表大小 (18 bytes)
USB_DEVICE_DESCRIPTOR_TYPE, //bDescriptorType 设备描述表类型 1
SWAP(0x0110), //bcdUSB 兼容设备版本号(BCD码)1.1
USB_CLASS_CODE_TEST_CLASS_DEVICE,//bDeviceClass 设备类码 (oxdc诊断设备类)
0, //bDeviceSubClass 子类码
0, //bDeviceProtocol 协议码
EP0_PACKET_SIZE, //bMaxPacketSize0 端点0最大包大小(8,16,32,64)
SWAP(0x0471), //idVendor 厂商ID
SWAP(0x0666), //idProduct 产品ID
SWAP(0x0100), //bcdDevice 设备发行号(BCD码
0, //iManufacturer 厂商信息字符串索引
0, //iProduct 产品信息字符串索引
0, //iSerialNumber 设备序列号字符串索引(不支持设为0)
1 //bNumCinfigurations 配置数量
};
//****************************************************
//配置描述符
//****************************************************
/*
//在枚举中,主机有一个读取描述符集合(配置描述符+接口描述符+端点描述符)的过程,在430的编译器中,
//需要将这些描述符写在一起而C51中不用,这可能由于编译器处理方法不同,因为430的编译器对于不引用的变量不会分配
//空间(这个可以通过LINK后的MAP文件观察到),而在Keil C51可能会根据这几个描述定义的顺序定义他们
//在这一点上,与SMART D12的固件有所不同
//读取配置描述符与读取描述符集合使用的命令是一样的,都用Get Descriptor命令,主机发出的请求格式为:
//读取配置描述符: 80 06 00 02 00 00 09 00
//读取描述符集合: 80 06 00 02 00 00 FF 00
//可见只有要求的长度不一样
//在Chap_9.h文件中专门定义针对D12的描述符集合=(配置描述符+接口描述符+端点描述符(在不同芯片中,端点个数是不定的))
//而不要在USB100.H中改变,因为这个头文件是通用的
//从这里是描述符集的定义,有可能在别的编译器中会可以用,但在MSP430的ICC中是不行的
//const D12_DESCRIPTOR_SET DescriptorSet =
//发现一个大问题*******
//编译连接后,DescriptorSet 占用的字节数不对,以配置描述符来说,本应该占用9个字节,可是现在却占用10个字节
//因为描述符集是用各描述符的结构定义连起来的一种嵌套结构,编译器在每个成员结构后自动补一个0,使每个结构
//占用偶数个字节,这样最后的长度给的不对,所以还是用老办法,直接定义字符集
//可以是因为编译器在定义结构变量时要字对齐
//这样的话,上面的描述符集的定义就没有意义了
//呜呜呜呜呜呜呜呜!
//配置描述符
//注意这种嵌套结构的初始化问题,看来的确是忘了,折腾了近半个小时!!
//*******************************************************************
//以下定义保留,以方便于将来移植
//*************************************************************************
// 定义描述符集合(配置描述符,接口描述符及端点描述符),由C51 D12固件改编而来
//*************************************************************************
这个结构的定义,由于编译器的字对齐方式,会在每个成员结构之后补0,这样总长度会发生变化
typedef struct _D12_DESCRIPTOR_SET
{
USB_CONFIGURATION_DESCRIPTOR ConfigDescr;
USB_INTERFACE_DESCRIPTOR InterfaceDescr ;
USB_ENDPOINT_DESCRIPTOR EP1_TXDescr;
USB_ENDPOINT_DESCRIPTOR EP1_RXDescr;
USB_ENDPOINT_DESCRIPTOR EP2_TXDescr;
USB_ENDPOINT_DESCRIPTOR EP2_RXDescr;
}D12_DESCRIPTOR_SET,*PD12_DESCRIPTOR_SET;
const D12_DESCRIPTOR_SET DescriptorSet =
{
{
sizeof(D12_DESCRIPTOR_SET),//USB_CONFIGURATION_DESCRIPTOR),//bLength 配置描述表长度 9字节
USB_CONFIGURATION_DESCRIPTOR_TYPE, //bDescriptorType 配置描述表类型 配置为2
SWAP(CONFIG_DESCRIPTOR_LENGTH), //wTotalLength 0x2E,配置描述表及附带表长度,配置描述表及附带表长度(配置、接口和端点描述符的大小总和即字节数之和)
1, //bNumInterfaces 接口配置数(此配置所支持的接口数量)
1, //bConfigurationValue配置描述表标识(Set_Configuration命令需要的参数值)
0, //iConfiguration 配置描述表字符串描述表索引
0xa0, //bmAttributes 配置属性 D7为(总线供电为1),D6(1自供电,0总线供电),D5(1支持远程唤醒,0不支持),其余均为0
0x1 //MaxPower 总线供电最大值(*2mA)
},
//接口描述符
// USB_INTERFACE_DESCRIPTOR InterfaceDescr =
//{
sizeof(USB_INTERFACE_DESCRIPTOR), //bLength 接口描述表长度 (9字节)
USB_INTERFACE_DESCRIPTOR_TYPE, //bDescriptorType 接口描述表类型 4
0, //bInterfaceNumber 该接口编号
0, //bAlternateSetting 轮寻设置(0 号端点) 备用接口描述符编号
NUM_ENDPOINTS, //bNumEndpoints 端点数 (4) 该接口使用的端点数,不包括端点0
USB_CLASS_CODE_TEST_CLASS_DEVICE, //bInterfaceClass 接口类属 ===//
USB_SUBCLASS_CODE_TEST_CLASS_D12, //bInterfaceSubClass 子类码 ===//
USB_PROTOCOL_CODE_TEST_CLASS_D12, //bInterfaceProtocol 协议码 ===//
0 //iInterface 接口字符串描述表索引 0表示没使用
},
//端点描述符
// USB_ENDPOINT_DESCRIPTOR EP1_TXDescr =
//{
sizeof(USB_ENDPOINT_DESCRIPTOR), //bLength 端点描述表长度 (7字节)
USB_ENDPOINT_DESCRIPTOR_TYPE, //bDescriptorType 端点描述表类型 5
0x81, //bEndpointAddress 端点地址及输入输出属性 D3~D0为端点号;D7为方向1输出
USB_ENDPOINT_TYPE_INTERRUPT, //bmAttributes 中断传输模式 (0 控制、1 同步、2 批、3 中断传输)
SWAP(EP1_PACKET_SIZE), //wMaxPacketSize 最大包大小(16) D10~D0
1 //bInterval 轮寻时间 同步传输固定为1;批量和控制端点忽略
},
// USB_ENDPOINT_DESCRIPTOR EP1_RXDescr =
//{
sizeof(USB_ENDPOINT_DESCRIPTOR), //bLength 端点描述表长度 (7字节)
USB_ENDPOINT_DESCRIPTOR_TYPE, //bDescriptorType 端点描述表类型 5
0x1, //bEndpointAddress 端点地址及输入输出属性 D3~D0为端点号;D7为方向1输出
USB_ENDPOINT_TYPE_INTERRUPT, //bmAttributes 中断传输模式 (0 控制、1 同步、2 批、3 中断传输)
SWAP(EP1_PACKET_SIZE), //wMaxPacketSize 最大包大小(16) D10~D0
1 //bInterval 轮寻时间 同步传输固定为1;批量和控制端点忽略
},
// USB_ENDPOINT_DESCRIPTOR EP2_TXDescr =
//{
sizeof(USB_ENDPOINT_DESCRIPTOR),
USB_ENDPOINT_DESCRIPTOR_TYPE,
0x82,
USB_ENDPOINT_TYPE_BULK,
SWAP(EP2_PACKET_SIZE),
10
},
// USB_ENDPOINT_DESCRIPTOR EP2_RXDescr =
//{
sizeof(USB_ENDPOINT_DESCRIPTOR),
USB_ENDPOINT_DESCRIPTOR_TYPE,
0x2,
USB_ENDPOINT_TYPE_BULK,
SWAP(EP2_PACKET_SIZE),
10
}
};
以上这些保留,以备将来移植时使用
*/
const char DescriptorSet[] = //配置描述符
{
0x09, //bLength 配置描述表长度 9字节
0x02, //bDescriptorType 配置描述表类型
0x2E,0x00, //wTotalLength 配置描述表及附带表长度,配置描述表及附带表长度(配置、接口和端点描述符的大小总和即字节数之和)
0x01, //bNumInterfaces 接口配置数(此配置所支持的接口数量)
0x01, //bConfigurationValue 配置描述表标识(Set_Configuration命令需要的参数值)
0x00, //iConfiguration 配置描述表字符串描述表索引
0x80, //bmAttributes 配置属性 D7为1,D6(1自供电,0总线供电),D5(1支持远程唤醒,0不支持),其余均为0
0x01, //MaxPower 总线供电最大值(*2mA)
//const USB_INTERFACE_DESCRIPTOR InterfaceDescr = // 接口描述符
0x09, //bLength 接口描述表长度 (9字节)
0x04, //bDescriptorType 接口描述表类型 4
0x00, //bInterfaceNumber 该接口编号
0x00, //bAlternateSetting 轮寻设置(0 号端点) 备用接口描述符编号
NUM_ENDPOINTS, //bNumEndpoints 端点数 (4) 该接口使用的端点数,不包括端点0
0xDC, //bInterfaceClass 接口类属 ===//
0xA0, //bInterfaceSubClass 子类码 ===//
0xB0, //bInterfaceProtocol 协议码 ===//
0x00, //iInterface 接口字符串描述表索引 0表示没使用
//Endpoint1 IN
//const USB_ENDPOINT_DESCRIPTOR EP1_TXDescr = // OUT端点描述符
//{
0x07, //bLength 端点描述表长度 (7字节)
0x05, //bDescriptorType 端点描述表类型 5
0X81, //bEndpointAddress 端点地址及输入输出属性 D3~D0为端点号;D7为方向1输出
USB_ENDPOINT_TYPE_INTERRUPT,//bmAttributes 中断传输模式 (0 控制、1 同步、2 批、3 中断传输)
EP1_PACKET_SIZE, //wMaxPacketSize 最大包大小(16) D10~D0
0x00,
0x0a, //bInterval 轮寻时间 同步传输固定为1;批量和控制端点忽略
//};
//Endpoint1 OUT
//const USB_ENDPOINT_DESCRIPTOR EP1_RXDescr = // IN端点描述符
//{
0x07, //bLength 端点描述表长度 (7字节)
0x05, //bDescriptorType 端点描述表类型 5
0X01, //bEndpointAddress 端点地址及输入输出属性 D3~D0为端点号;D7为方向1输出
USB_ENDPOINT_TYPE_INTERRUPT,//bmAttributes 中断传输模式 (0 控制、1 同步、2 批、3 中断传输)
EP1_PACKET_SIZE, //wMaxPacketSize 最大包大小(16) D10~D0
0x00,
0x0a, //bInterval 轮寻时间 同步传输固定为1;批量和控制端点忽略
//};
//Endpoint2 IN
//const USB_ENDPOINT_DESCRIPTOR EP2_TXDescr =
//{
0x07,
0x05,
0x82,
USB_ENDPOINT_TYPE_BULK,
EP2_PACKET_SIZE,
0x00,
0x00,
//};
//Endpoint2 OUT
//const USB_ENDPOINT_DESCRIPTOR EP2_RXDescr =
//{
0x07,
0x05,
0x02,
USB_ENDPOINT_TYPE_BULK,
EP2_PACKET_SIZE,
0x00,
0x00
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -