реклама на сайте
подробности

 
 
> EP Descriptors..., лыжи не едут уже несколько дней...
Dron_Gus
сообщение Oct 22 2006, 21:59
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861



Ткните носом, что в этих дескрипторах может не нравится ВинХР? Трижды пытается получить дескриптор конфигурации, после чего "устройство не опознано...". Код рабочий. С одной конечной точкой все работает. При добавлении второй - перестает. Где грабли?

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



Код


[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]


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th July 2025 - 04:56
Рейтинг@Mail.ru


Страница сгенерированна за 0.01353 секунд с 7
ELECTRONIX ©2004-2016