Составное USB устройство (клавиатура + mass storage) нужна помощь.

Пытаюсь создать такое устройство на базе платы EVK1104 c AT32UC2A3256. Признаюсь, что опыта у меня в этом деле совсем мало, но к делу. Пользуюсь AVR Studio 5.1, из ASF взял в качестве образца проект HID(KBD)+MSC для EVK1101. Чуть-чуть изменил проект под 1104, поставил поддержку USB_DEVICE_HS_SUPPORT, для простоты выкинул оттуда SPI и включил компонент VIRTUAL_MEM. Проблема возникла уже на стадии опознания устройства. Не могу понять в чем дело. Прошу тех у кого есть время и желание помочь посмотреть приложенный doc (там картинки из Elisys Visual USB и дополнительные подробности). Заранее всем спасибо.

Вот дескриптор устройства (кстати хочу, чтоб устройство работало на High-Speed, из картинки видно, что оно определяется как High-Speed ):

Вот дескриптор конфигурации :

Интерфейс mass-storage с точками:

Интерфейс клавиатуры с одной IN точкой:

Кстати не знаю, то что я пометил вопросами правильно?

Ну и вот вся картина с «засадой» (как я ее понимаю):

Вот что я вижу (поправьте меня если я не прав). Начиная с запроса GetMaxLun, Windows поняла, что это usb mass-storage и пытается с ним пообщаться. Winows успешно получила количество LUN, получила имя mass-storage (Inquiry), запрос Read Format Capacities не обрабатывается в самом коде приложения для контроллера (и по-моему, Бог с ним). По-моему бред начинается с запроса READ CAPACITY, который успешно отрабатывает и честно возвращает свои 32КБ. А вот запрос READ молчит! Почему??!!

НЕ нашли? Не то? Что вы ищете?

Вот кусок кода из ctrl_access. c

static const struct

{

Ctrl_status (*test_unit_ready)(void);

Ctrl_status (*read_capacity)(U32 *); ß вот READ CAPACITY

bool (*wr_protect)(void);

bool (*removal)(void);

#if ACCESS_USB == true

Ctrl_status (*usb_read_10)(U32, U16); ß вот READ

Ctrl_status (*usb_write_10)(U32, U16);

#endif

#if ACCESS_MEM_TO_RAM == true

Ctrl_status (*mem_2_ram)(U32, void *);

Ctrl_status (*ram_2_mem)(U32, const void *);

#endif

const char *name;

} lun_desc[MAX_LUN] =

……………

CAPACITY работает READ нет. В чем дело? Вот кусок кода из udi_msc. c

bool udi_msc_process_trans(void)

{

Ctrl_status status;

if (!udi_msc_b_trans_req)

return false; // No Transfer request to do

udi_msc_b_trans_req = false;

// Start transfer

if (udi_msc_b_read) {

status = memory_2_usb(udi_msc_cbw. bCBWLUN, udi_msc_addr,

udi_msc_nb_block);

} else {

status = usb_2_memory(udi_msc_cbw. bCBWLUN, udi_msc_addr,

udi_msc_nb_block);

}

// Check status of transfer

switch (status) {

case CTRL_GOOD:

udi_msc_sense_pass();

break;

case CTRL_BUSY:

udi_msc_sense_fail_busy_or_change();

break;

case CTRL_NO_PRESENT:

udi_msc_sense_fail_not_present();

break;

default:

case CTRL_FAIL:

udi_msc_sense_fail_hardware();

break;

}

// Send status of transfer in CSW packet

udi_msc_csw_process();

return true;

}

Memory_2_usb неизменно возвращает CTRL_FAIL.

Похоже я где-то глобально не прав. Помогите пожалуйста понять где!

P. S. Кстати Windows в устройствах mass-storage видит но, разумеется общаться с ним не дает. Клавиатуры не видно вообще.