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

📄 chap_9.c

📁 msp430单片机与pdiusbd12接口的固件程序
💻 C
📖 第 1 页 / 共 2 页
字号:
/*************************************************************************
描述: 	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 + -