Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: EP Descriptors...
Форум разработчиков электроники ELECTRONIX.ru > Интерфейсы > Форумы по интерфейсам > RS232/LPT/USB/PCMCIA/FireWire
Dron_Gus
Ткните носом, что в этих дескрипторах может не нравится ВинХР? Трижды пытается получить дескриптор конфигурации, после чего "устройство не опознано...". Код рабочий. С одной конечной точкой все работает. При добавлении второй - перестает. Где грабли?

Заранее спасибо за помощь...



Код


[size="1"]

typedef unsigned char uchar;

typedef unsigned short ushort;

typedef unsigned int uint;

typedef unsigned char byte;

#pragma pack(1)

struct usb_st_device_descriptor

{

byte bLength;

byte bDescriptorType;

ushort bscUSB;

byte bDeviceClass;

byte bDeviceSubClass;

byte bDeviceProtocol;

byte bMaxPacketSize0;

ushort idVendor;

ushort idProduct;

ushort bcdDevice;

byte iManufacturer;

byte iProduct;

byte iSerialNumber;

byte bNumConfigurations;

};

struct usb_st_configuration_descriptor

{

byte bLength;

byte bDescriptorType;

ushort wTotalLength;

byte bNumInterfaces;

byte bConfigurationValue;

byte iConfiguration;

byte bmAttibutes;

byte MaxPower;

};

struct usb_st_interface_descriptor

{

byte bLength;

byte bDescriptorType;

byte bInterfaceNumber;

byte bAlternateSetting;

byte bNumEndpoints;

byte bInterfaceClass;

byte bInterfaceSubClass;

byte bInterfaceProtocol;

byte iInterface;

};

struct usb_st_endpoint_descriptor

{

byte bLength;

byte bDescriptorType;

byte bEndpointAddress;

byte bmAttributes;

ushort wMaxPacketSize;

byte bInterval;

};

#pragma pack()

/* Аттрибуты устройства */

#define USB_SPECIFICATION 0x0110

#define DEVICE_CLASS 0xFF

#define DEVICE_SUB_CLASS 0x00

#define DEVICE_PROTOCOL 0x00

#define EP_CONTROL_LENGTH 0x08

#define VENDOR_ID 0x03EB /* Atmel vendor ID = 03EBh */

#define PRODUCT_ID 0x5804 //0x5803

#define RELEASE_NUMBER 0x0100

#define LANG_ID 0x00

#define MAN_INDEX 0x01

#define PRD_INDEX 0x02

#define SRN_INDEX 0x03

#define CONF_LENGTH 32



#define USB_CONFIG_BUSPOWERED 0xC0

#define USB_CONFIG_SELFPOWERED 0x0

#define USB_CONFIG_REMOTEWAKEUP 1<<5

#define CONF_NB 1

#define CONF_ATTRIBUTES USB_CONFIG_BUSPOWERED

#define MAX_POWER 50 /* = 100 mA */

/* INTERFACE 0 DESCRIPTOR */

#define INTERFACE0_CLASS 0x00

#define INTERFACE0_SUB_CLASS 0xFF

#define INTERFACE0_PROTOCOL 0xFF

/* Типы конечных точек */

#define CONTROL 0x00

#define ISOCHRONOUS 0x01

#define BULK 0x02

#define INTERRUPT 0x03

/* для вычисления номера конечной точки */

#define EP_DIRECT_OUT 0x00

#define EP_DIRECT_IN 0x80

/* конечные точки */

#define EP_NUMBER 0x02

#define EP_IN 0x01

#define EP_IN_SIZE 8

#define EP_OUT 0x02

#define EP_OUT_SIZE 8

/* первая конечная точка */

#define EP_1_ADDRESS (EP_IN|EP_DIRECT_IN) /* адрес */

#define EP_1_ATTRIBUTES BULK /* аттрибуты */

/* вторая конечная точка */

#define EP_2_ADDRESS (EP_OUT|EP_DIRECT_OUT) /* адрес */

#define EP_2_ATTRIBUTES BULK /* аттрибуты */

#pragma pack(1)

const struct usb_st_device_descriptor usb_device_descriptor =

{

18,

DEVICE_d, /* =1 */

USB_SPECIFICATION, /* спецификация */

DEVICE_CLASS, /* класс устройства */

DEVICE_SUB_CLASS,

DEVICE_PROTOCOL, /* протокол USB */

EP_CONTROL_LENGTH, /* размер пакета 0-й точки */

VENDOR_ID, /* ID производителя и устройства */

PRODUCT_ID,

RELEASE_NUMBER, /* версия устройства */

MAN_INDEX, /* дескр. строки изготовителя */

PRD_INDEX, /* дескр. строки продукта */

SRN_INDEX, /* дескр. строки серийного ном */

1 /* число конфигураций */

};

struct usb_st_configuration

{

struct usb_st_configuration_descriptor cfg;

struct usb_st_interface_descriptor ifc;

struct usb_st_endpoint_descriptor ep1;

struct usb_st_endpoint_descriptor ep2;

} __packed;

const struct usb_st_configuration usb_configuration =

{

/* CONFIGURATION */

{ 0x9,

CONFIGURATION_d, /* =2 */

CONF_LENGTH, /* длина всех дескрипторов */

1, /* число интерфейсов */

CONF_NB, /* номер конфигурации */

0, /* дескр. строки конфигур */

CONF_ATTRIBUTES, /* аттрибуты */

MAX_POWER /* 100 mA */

},

/* INTERFACE 0 */

{ 0x9,

INTERFACE_d, /* =4 */

0, /* 0-й интерфейс */

0, /* номер альтернативного инт. */

EP_NUMBER, /* 2 конечные точки (кроме 0) */

INTERFACE0_CLASS,

INTERFACE0_SUB_CLASS,

INTERFACE0_PROTOCOL,

0, /* дескр. строки интерфейса */

},

/* Дескриптор первой конечной точки */

{

7,

ENDPOINT_d, /* дескриптор ENDPOINT */

EP_1_ADDRESS, /* номер конечной точки */

EP_1_ATTRIBUTES, /* аттрибуты конечной точки */

EP_IN_SIZE, /* максимальный размер пакета */

0 /* частота опроса */

},

/* Дескриптор второй конечной точки */

{

7,

ENDPOINT_d, /* дескриптор ENDPOINT */

EP_2_ADDRESS, /* номер конечной точки */

EP_2_ATTRIBUTES, /* аттрибуты конечной точки */

EP_OUT_SIZE, /* максимальный размер пакета */

0 /* частота опроса */

}

};

#pragma pack()

[/size]
aaarrr
Дело, видимо, в длине конфигурационного дескриптора - 32 байта. Если в конце не передается Zero Length Packet, то хост не поймет, что передача закончена.
Dron_Gus
Хм... Пойду попробую. Спасибо.
Dron_Gus
Ув. aaarrr, с меня пиво smile.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.