|
|
  |
Mass Storage Device (MSD) на AT91Arm7, Конфигурация USB |
|
|
|
Jan 31 2008, 08:23
|
Местный
  
Группа: Свой
Сообщений: 263
Регистрация: 22-03-05
Из: г. Харьков, Украина
Пользователь №: 3 598

|
Прошу прощения, но есть вопрос - может быть кто-нибудь подскажет? Суть: надо сделать MSD. USB сконфигурировали как в примере от Atmel с двумя конечными точками (не считая нулевой): 1 на выход, 2 на вход. Результат - комп (WinXP) не определяет устройство!? Пошли дальше: через монитор USB просмотрели конфигурацию нескольких Flash накопителей - у всех сконфигурирована еще одна точка на дополнительное прерывание. При подключении к своему MSD дополнительной (3-ей) точки комп начал видеть устройство как MSD. При изучении примера от Keil для LPC2148 обнаружилось следующее: сконфигурированы 2-е конечные точки, но, в чем парадокс, одна и таже точка (№2) сконфигурирована на вход и на выход?! Так вот вопрос: 1. Какое минимальное количество точек необходимо для реализации MSD? 2. Если по доке нельзя использовать одну точку на прием и передачу (Bulk), то что же тогда сделано в проэкте Keil? 3. Примеры от Atmel и Keil вообще работают?
|
|
|
|
|
Jan 31 2008, 09:23
|
Местный
  
Группа: Свой
Сообщений: 263
Регистрация: 22-03-05
Из: г. Харьков, Украина
Пользователь №: 3 598

|
Примеры - это хорошо :-) Вот посмотрел пример от микрчипа для PIC18 - те же самые две точки. А почему же тогда WinXp не видет? Конфигурация один в один с примерами. При инициализации доходит до Set_Configure (эту команду хост уже не отправляет) и замолкает на 20 секунд (за этот период он опять пытается прочитать дескриптор конфигурации). После этого говорит, что девайс не определен :-(
Чтобы не быть голословным - приветду пример заполнения структуры конфигурации:
const char cfgDescriptor[] = { 0x09, // CbLength 0x02, // CbDescriptorType 32, // CwTotalLength 2 EP + Control 0x00, 0x01, // CbNumInterfaces 0x01, // CbConfigurationValue 0x00, // CiConfiguration 0x80, // CbmAttributes 100, // CMaxPower /* Bult-Only data interface discriptor */ 0x09, // bLength 0x04, // bDescriptorType 0x00, // bInterfaceNumber 0x00, // bAlternateSetting 0x02, // bNumEndpoints 8, // bInterfaceClass 6, // bInterfaceSubclass - SCSI 0x50, // bInterfaceProtocol - BULK-only transport 0x00, // iInterface /* Endpoint 1 descriptor */ 0x07, // bLength 0x05, // bDescriptorType 0x81, // bEndpointAddress, Endpoint 01 - in 0x02, // bmAttributes BULK 0x40, // wMaxPacketSize 0x00, 0x00, // bInterval
/* Endpoint 2 descriptor */ 0x07, // bLength 0x05, // bDescriptorType 0x02, // bEndpointAddress, Endpoint 02 - out 0x02, // bmAttributes BULK 0x40, // wMaxPacketSize 0x00, 0x00, // bInterval };
Может это поможет разобраться.
|
|
|
|
|
Feb 3 2008, 20:43
|
Знающий
   
Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640

|
Цитата(IEC @ Jan 31 2008, 12:23)  Примеры - это хорошо :-) Вот посмотрел пример от микрчипа для PIC18 - те же самые две точки. А почему же тогда WinXp не видет? Конфигурация один в один с примерами. При инициализации доходит до Set_Configure (эту команду хост уже не отправляет) и замолкает на 20 секунд (за этот период он опять пытается прочитать дескриптор конфигурации). После этого говорит, что девайс не определен :-( У меня 2 EP и всё работает. Мегабайт в секунду качает. Больше USB 1.1 не позволяет. Сам делал. Давно. Тогда ещё примеров не было. А дескриптор конф-ции у вас похоже правильный. Думаю не в нём дело. Хотя вот интересно. XP обычно конфигурацию за 2 приёма читает (м.б. с SP1 и начиная), а W98 за раз - более килобайта длину запрашивает. А XP 1й раз 9 байт читает - чтоб wTotalLength получить. 2й раз, зная длину, всю читает. Вы оба эти запроса видите? И с помощью чего смотрите? Киньте сюда лог - может там, что видно будет.
|
|
|
|
|
Feb 4 2008, 03:41
|
Участник

Группа: Участник
Сообщений: 47
Регистрация: 30-11-07
Пользователь №: 32 839

|
У меня сейчас похожая проблема. Процессор AT91SAM7A3. Заливаю в него экзампл MSD от кайла. Втыкаю во все компы в конторе - работает на всех, кроме нескольких самых новых из последней партии. "Устройство не опознано" - не прошла энумерация. Начнаю грешить на железо - провода, разъёмы, разводку... Беру экзамплы от атмела (SAM-BA, чисто энумерация, HID и CDC) - если заливаю готовые бинарники, то всё работает на всех компах! Если же пытаюсь сам скомпилировать из сорцов, то нихрена не работает. Играюсь с опциями компилятора - нифига не меняется. Хоть в арм-моде, хоть в тумбе, с частотами (коэффициентами PLL) игрался - нихрена не помогает. Не могу добиться того же результата, что и с готовым бинарником!
|
|
|
|
|
Feb 4 2008, 07:30
|
Местный
  
Группа: Свой
Сообщений: 263
Регистрация: 22-03-05
Из: г. Харьков, Украина
Пользователь №: 3 598

|
Цитата(galjoen @ Feb 3 2008, 23:43)  У меня 2 EP и всё работает. Мегабайт в секунду качает. Больше USB 1.1 не позволяет. Сам делал. Давно. Тогда ещё примеров не было. А дескриптор конф-ции у вас похоже правильный. Думаю не в нём дело. Хотя вот интересно. XP обычно конфигурацию за 2 приёма читает (м.б. с SP1 и начиная), а W98 за раз - более килобайта длину запрашивает. А XP 1й раз 9 байт читает - чтоб wTotalLength получить. 2й раз, зная длину, всю читает. Вы оба эти запроса видите? И с помощью чего смотрите? Киньте сюда лог - может там, что видно будет. Действительно по протоколу и в реальности все так и работает, Хост отвисает после второго запроса. Где то на форуме встречал, что человек жаловался на параметр CbmAttributes (описание режима питания). Жаловался, что со значением 0хС0 не определялся, а с 0х60 - легко. Но это не соответствует доке, т.к. 7 бит должен быть всегда установлен. Но и это предположение проверил - не работает. Сейчас пока перешли на три end point. Когда запустим девайс, тогда будем пытаться разобраться с реалиями. Интересно, что запросы на третью точку не идут. Даже у Flash-памяти.
|
|
|
|
|
Feb 4 2008, 12:02
|
Знающий
   
Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640

|
Цитата(IEC @ Feb 4 2008, 10:30)  Действительно по протоколу и в реальности все так и работает, Хост отвисает после второго запроса. Ну это у вас скорее всего SetAddress не проходит. Щас новые южные мосты пошли. Особенно те, которые с процессором AMD. В частности чипсет VIA (у меня такой есть). Так там эти китайцы на все стандарты наплевали. Мой full speed HID через него 500 кбайт/сек качает, а по стандарту должен токо 64. И другие глюки замечены. И SetAddress мне из-за него изменить пришлось - подглючивал с ним. Я иногда перестал успевать SETUP из EP0 прочесть, а туда уже IN1 приходил (упр-ее чтение). 2 события одновременно получатся стало - не рассчитывал я на это т.к. раньше такого не было. Цитата(IEC @ Feb 4 2008, 10:30)  Где то на форуме встречал, что человек жаловался на параметр CbmAttributes (описание режима питания). Жаловался, что со значением 0хС0 не определялся, а с 0х60 - легко. Но это не соответствует доке, т.к. 7 бит должен быть всегда установлен. Но и это предположение проверил - не работает. Полно китайских флешек встречал, которые пишут, что они с независимым питанием (bmAttributes=0x40), а от USB 0 мА потребляют. А вообще-то я рекомендую MaxPower=98мА ставить (<100 мА). Цитата(IEC @ Feb 4 2008, 10:30)  Сейчас пока перешли на три end point. Когда запустим девайс, тогда будем пытаться разобраться с реалиями. Интересно, что запросы на третью точку не идут. Даже у Flash-памяти. Так 3-я - это Interrupt In. Она только для готовностей - типа дискету вытащили-вставили.
|
|
|
|
|
Feb 4 2008, 15:08
|
Местный
  
Группа: Свой
Сообщений: 263
Регистрация: 22-03-05
Из: г. Харьков, Украина
Пользователь №: 3 598

|
Отклонение от темы: в процессе поиска ответа на вопрос нашел книгу в эл. виде "USB Mass Storage. Designing and Programming Devices and Embedded Hosts" Jan Axelson Выложить на FTP не получилось, поэтому для жилающих даю ссылку: http://www.pcports.ru/Library.php
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|