Составное 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 видит но, разумеется общаться с ним не дает. Клавиатуры не видно вообще.


