МАРСОХОД

Open Source Hardware Project

Проекты Altera Quartus II для платы Марсоход2

USB Трекер (Анализатор)

Есть такие устройства – USB Трекеры (USB Analyzer). Они позволяют перехватить трафик между USB устройством и компьютером, записать его и проанализировать. Трекеры обычно используются разработчиками USB устройств и программистами для отладки оборудования и драйверов. Очень полезная штука, если нужно заниматься проектами связанными с шиной USB.

USB анализаторы протокола

У нас в офисе сейчас есть два таких USB трекера. Первый трекер (беленький), компании Ellisys позволяет работать только с устройствами USB1.1. Когда-то давным давно мы приобретали его за большие деньги, кажется около 600 евро. Уже потом цены на них сильно упали.

Второй трекер Beagle (синенький), компании Total Phase, попал к нам почти случайно. Он уже посовременней, можно прослушивать трафик устройств USB2.0. Понятно, сейчас мы больше пользуемся им.

Несмотря на то, что у нас есть целых 2 фирменных анализатора протокола USB иногда встречаются странные устройства и странные ошибки на шине USB, которые не удается просто диагностировать.

Я предлагаю сделать свой USB анализатор на базе платы Марсоход2. Врядли получится сделать анализатор USB2.0, но уж трекер для USB1.1 сделать точно можно. Это, конечно, серьезное ограничение, но, тем не менее, наш анализатор будет обладать и своими собственными полезными и уникальными свойствами.

Как известно (

), внутри кабеля USB всего 4 провода:

  • Земля (4, обычно черный провод в кабеле);
  • DP (3, обычно зеленый провод в кабеле);
  • DM (2, обычно белый провод в кабеле);
  • +5V (1, обычно красный провод в кабеле).

Трекер-анализатор является «шпионом», прослушивающим линию связи, то есть сигналы DP и DM. Трекер никак не модифицирует передаваемые по шине данные, а только слушает их. Схема прослушки очень простая:

 Схема подключения USB анализатора на основе платы Марсоход2
Собственно нужно изготовить специальный кабель USB, который бы имел отвод трех сигналов DP, DM и GND для подключения к плате Марсоход2.

dongle

Мы сделали вот такой несколько странный переходничек из какой-то старой платки от какого-то старого устройства. На этой платке разъемы audio конечно не нужны, просто не стали их отпаивать. Нам вообще ничего не нужно от этой платки кроме одного разъема USB.

USB трекер (анализатор) на основе платы Марсоход2

Платка подключается к плате Марсоход2 к сигналам IO[9] и IO[11] на гребеночке. Это будут DP и DM соответственно.

В ПЛИС платы Марсоход2 мы загрузим (через встроенный на плату USB JTAG программатор MBFTDI) наш проект, который будет принимать на шине USB все ходящие там пакеты. Встроенный программатор MBFTDI создан на микросхеме FTDI и имеет два канала передачи. Второй канал мы используем как высокоскоростной последовательный порт. Принятые USB данные ПЛИС тут же будет отправлять в текстовом виде через последовательный порт в компьютер для просмотра в обычной программе терминала.

Я собираюсь передавать перехваченные USB данные в компьютер в текстовом виде, чтобы на компьютере не писать программу отображения данных. Упрощаю себе задачу. Принятые данные будут отображаться в обычной программе текстового терминала, например, Putty или TeraTerm.

Перевод двоичных данных в текстовый вид вообще-то делает поток через последовательный порт чрезмерным: вместо одного байта будет отправляться 3 байта.
Например, двоичный байт 0х45 надо отправить как 3 байта текста:

  • 0x34 (код ASCII символа «4»)
  • 0x35 (код ASCII символа «5»)
  • 0x20 (это код пробела)

FullSpeed устройства (такие как USB наушники или колонки) передают данные в USB на частоте 12Мгц.
С другой стороны 12Мгц – это предельная частота приемопередатчика последовательного порта в микросхеме FTDI на плате Марсоход2. Таким образом, вообще-то переводить байты USB трафика в текстовый вид увеличивая поток в три раза – это не очень здоровая идея.. Последовательный порт может не успеть все передать. Буду надеяться, что исследуемые USB устройства не будут занимать всю пропускную способность шины. Поставлю в проекте большое FIFO между USB приемником и передатчиком последовательного порта – оно должно сгладить разницу в скоростях передачи этих модулей.

Вот топ модуль проекта ПЛИС (можно кликнуть по изображению, чтобы увеличить):

Том модуль USB анализатора в проекте Altera Quartus II.
Все довольно просто:

  • Модуль usb_recv принимает прослушиваемые на шине данные.
  • Модуль txtgen переводит байт данных в 3 байта текста. Еще каждый сигнал EOP на штне USB будет транслироваться в 2 байта перевод строки 0x0D 0x0A. Сигнал EOP (End Of Packet) на шине USB завершает каждый пакет передаваемых данных. Так же в случае низкоскоростного устройства EOP посылается в начале каждого фрейма каждую 1 миллисикунду.
  • Модуль myfifo – это буфер между приемником USB и передатчиком передатчиком последовательного порта.
  • Модуль serial читает данные из FIFO и передает их в последовательный порт на скорости 12Мбит/сек.

Весь проект USB трекера для среды Altera Quartus II можно взять вот здесь:

USB Трекер ( 47711 bytes )

Попробуем испытать трекер в работе: нужно подсоединить плату Марсоход2 к ноутбуку, кабель от платки USB разъема так же к ноутбуку или к другому компьютеру. Исследуемую компьютерную USB мышь будем подключать к USB разъему. Главное не запутаться в проводах:

Подключение USB анализатора к ноутбуку

Теперь проект для ПЛИС в среде Altera Quartus II нужно откомпилировать и загрузить в плату Марсоход2.

Еще на ноутбуке запускаем программу терминала Putty. Настраиваем ее на последовательный порт со скоростью 12000000 (12Мбит/сек).

Подключаем USB мышь и видим, как в терминале побежали строки с шестнадцатеричными данными, вот демонстрационное видео:

Посмотрим, например, фрагмент лога инициализации подключенной USB мыши:


RST


80 2D 00 10
80 C3 00 05 01 00 00 00 00 00 EB 25
80 D2
80 69 00 10
80 4B 00 00
80 D2


80 2D 01 E8
80 C3 80 06 00 01 00 00 12 00 E0 F4
80 D2
80 69 01 E8
80 4B 12 01 00 02 00 00 00 08 57 E7
80 D2
80 69 01 E8
80 C3 6D 04 5B C0 00 54 01 02 F1 3E
80 D2
80 69 01 E8
80 4B 00 01 3F 8F
80 D2
80 E1 01 E8
80 4B 00 00
80 D2


 

Все пакеты начинаются с байта 0x80 - это код SYNC. Следующий байт - это так называемый PID - идентификатор команды. Основные команды - это ox2D Setup, 0x69 In, 0xE8 Out, 0x4B или 0хС3 - это данные. PID подтверждения передачи 0xD2 Ack, отсутствие данных у устройства - PID 0x5A NACK.

Протокол довольно сложный и запутанный, но разобраться можно.

Если бы мы использовали для отображения не текстовый терминал, а сами писали бы программу для этого, то можно было бы как-то интеллектуально сгруппировывать пакеты и расшифровывать их. Так делают все произовдители USB трекеров. Их программное обеспечение показывает и расшифровывает USB дескрипторы устройств, используемую конфигурацию, количество edpoints и прочую полезную информацию.

Написание такого ПО - это отдельная и большая задача, не реализованная в рамках этого простого проекта.

Что еще можно увидеть в логе нашего трекера? Ну вот например происходит опрос мыши ноутбуком:


80 69 81 58
80 5A

 

 

 

 

 


80 69 81 58
80 5A

 

 

 

 



80 69 81 58

80 C3 00 01 00 00 00 00 C2 24
80 D2


 

Между пакетами не случайно накие отступы. Каждый USB фрейм каждую 1 миллисекунду для низкоскоростного устройства начинается с EOP, а он у нас передается как перевод строки 0x0D 0x)A. В основном пакеты идут парами: пакет от хоста 0x69 - IN чтение. И обычно устройство отвечает пакетом 0x5A NACK -нет данных. Так происходит всегда, пока мышь находится в покое. Если же ее сдвинуть, то в ответ на запрос 0x69 мышь ответит пакетом данных 0xC3 или 0x4B. Теперь уже хост должен подтвердить своим 0xD2 ACK, что пакет успешно принят.

Этот USB трекер был испытан с разными USB устройствами: мышью, клавиатурой, джойстиком (это низкоскоростные устройства) и с USB наушниками (высокоскоростное устройство).

Конечно, у нашего USB трекера есть недостатки. Главным образом они связаны с тем, что у нас нет собственно анализирующего программного обеспечения на стороне ноутбука. Его можно написать и наверное это сможет сделать тот, кому это действительно будет нужно.

Несомненным плюсом нашего анализатора является то, что мы можем посмотреть вживую на проходящие в шине USB пакеты средствами Altera SignalTap. Модуль SignalTap позволяет посмотреть некоторые сигналы проекта внутри ПЛИС.

Вот,, например, так выглядят пакеты USB в шине (можно кликнуть по изображению, чтобы увеличить):

signaltap

 

 Такой возможности, посмотреть сигнал USB нет в обычных USB трекерах. Вот вам наш плюсик нашего проекта.

 

 

Комментарии  

0 #24 abashin80 04.10.2016 11:23
в модуле usb_recv.v
строка 97:
меняем на
always @(posedge strobe)
begin
if(receiver_enabled)
begin
if(next_bit)
num_ones
0 #23 Roma 22.03.2016 20:03
Я немного изменил модуль textgen. Чтобы увеличить скорость передачи стал передавать непосредственно байтами, а Reset и EOP закодировал с помощью байт-стаффинга. Уже есть кое какой софт для компа. Вот только заставить работать виртуальный COM порт на 12 МГц не получилось - максимум 6. Думаю это не особо критично, если устройство не занимает всю полосу канала.
0 #22 USB 16.11.2015 03:28
>>Врядли получится сделать анализатор USB2.0, но уж трекер для USB1.1 сделать точно можно.
Здравствуйте, а почему USB2.0 врядли можно сделать? Это какие то ограничения налагаемые именно данной моделью ПЛИС?
0 #21 Immortal_Buka 12.11.2015 12:30
ок, 4 или 16?
+1 #20 nckm 12.11.2015 11:24
Цитирую Immortal_Buka:
Это то я догадался. А чему не в 10 раз, например?

делитель на 8 проще, чем делитель на 10 т.к. 8 - это степень двойки.
0 #19 Immortal_Buka 12.11.2015 10:52
Это то я догадался. А чему не в 10 раз, например?
0 #18 nckm 12.11.2015 10:37
Цитирую Immortal_Buka:
Хотел бы уточнить, а почему частота 96МГц для FS?

Это наверное частота в 8 раз выше чем 12МГц, которая нужна для FS
0 #17 Immortal_Buka 10.11.2015 13:46
Хотел бы уточнить, а почему частота 96МГц для FS?
0 #16 Uragan90 28.10.2015 14:08
С этим разобрался!
Теперь новая беда.
В железе собранный агрегат работает чётко с USB1, но когда снимаю скан с USB1.1 - 12mHz иногда бывают проскакивают строчки начинающиеся не с байта синхронизации 80.
Тоесть в основном все строчки идут начиная с 80, но иногда, редко проскакивают строчки начиная например с А5 или 27.
С чем это может быть связанно?
Может стоит поднять частоту скажим не 96mHz, a в двое больше???
Спасибо за рание и за ваши идеи!
Они очень кстати помогают народу, огромный вам РЕСПЕКТ!!!
0 #15 nckm 26.10.2015 19:06
Цитирую Uragan90:
Возможно я как то не правильно моделирую и прочее, хотя модель тут довольно простая. Но у меня именно так и получается что модуль генерирует только первый знак из байта. Получается так:
Модуль берёт байты A6 F4 45 2A, на выходе в asii получаю A F 4 2 .
И даже логически если рассуждать то у вас в модуле всё построенно на шинах wire и нет даже регистра куда бы записывался вначале один полубайт потом второй.
Извените если я в чём то не прав, но скорее всего я прав.

пожалуйста проверяйте свою модель :-)
входной импульс byte_rdy короткий, длительностью один такт. Внутри модуля txtgen из него получается импульс wr длительностью 3 такта с помощью
reg [1:0]byte_rdy_;
always @(posedge clk)
byte_rdy_byte_rdy_ <= {byte_rdy_[0],byte_rdy};
и потом
assign wr = |rst_ | eop_imp0 | eop_imp1 | byte_rdy | byte_rdy_[0] | byte_rdy_[1];
Входной байт подержите подольше, хотя бы один такт после byte_rdy, это важно..
0 #14 Uragan90 26.10.2015 18:17
Возможно я как то не правильно моделирую и прочее, хотя модель тут довольно простая. Но у меня именно так и получается что модуль генерирует только первый знак из байта. Получается так:
Модуль берёт байты A6 F4 45 2A, на выходе в asii получаю A F 4 2 .
И даже логически если рассуждать то у вас в модуле всё построенно на шинах wire и нет даже регистра куда бы записывался вначале один полубайт потом второй.
Извените если я в чём то не прав, но скорее всего я прав.
0 #13 nckm 26.10.2015 17:35
Цитирую Uragan90:
В модуле txtgen допущена ошибка!
Посему модуль не работоспособен, так как на он фактически берёт байт, делит его на две шины для перевода в ASII, конвертирует число старшую часть байта в символ ASII, но забывает о том что конвертировать нужно не только младшую часть байта, но и старшую.
Видимо модуль не проверялся в работе :-*

хм... конечно в проектах возможны ошибки.. всякое бывает.. но Вы точно уверенны в своих выводах?
hex_char вычисляется из four_bits, которая сменяется вместе с сигналом byte_rdy. То есть сперва вычисляется одна половина, потом другая. Обе половины пишутся по сигналу byte_rdy | byte_rdy_[0]
0 #12 Uragan90 26.10.2015 11:44
В модуле txtgen допущена ошибка!
Посему модуль не работоспособен, так как на он фактически берёт байт, делит его на две шины для перевода в ASII, конвертирует число старшую часть байта в символ ASII, но забывает о том что конвертировать нужно не только младшую часть байта, но и старшую.
Видимо модуль не проверялся в работе :-*
0 #11 Chaosorg 19.06.2015 20:59
Цитирую Chaosorg:
можно ли как-то заставить USB2.0 устройство работать как USB1.1 ?

Ответ - можно, но сложно:), как выяснилось. У меня, например, уже нет материнской платы с отключаемым EHCI, т.е. с отключаемым USB 2.0. Придется собирать специально устаревшую машину ради OHCI. Способа как-то иначе "зарезать" передачу данных на 480Мбвсек никто не предложил, поэтому наблюдать трафик флешек с современнымы хостами пока не получается.
0 #10 Chaosorg 19.06.2015 11:08
можно ли как-то заставить USB2.0 устройство работать как USB1.1 ?
0 #9 Chaosorg 19.06.2015 10:54
... и удалось ли кому-то перехватывать трафик флешки или кард-ридера?
0 #8 Chaosorg 19.06.2015 10:45
На рисунке с разноцветными проводами и их обозначениями нарисовано так, что зеленый DP идет на IO11, а в схеме иначе - на IO9. Так как правильно?
0 #7 eugene52 17.09.2013 15:33
Отличный проект Николай!

Я повторил его на Cyclone IV. Development board DE0-nano от Terasic, поэтому пришлось чуть-чуть поправить.

Работает замечательно.
0 #6 perforator2012 12.09.2013 07:44
я думал все намного проще будет)
Тогда вопрос по теме, какой период перепадов уровней сигналов USB?
Какая минимальная выборка должна быть для того чтобы увидеть и различить сигналы на шине?
0 #5 wowa 10.09.2013 07:12
В случае с Cyclone III надо будет делать внешний шилд с физическим слоем шины. Например www.ti.com/product/xio1100или подобные..
0 #4 nckm 09.09.2013 15:58
Цитирую perforator2012:
Извиняюсь за вопрос не по теме, но не могли бы вы сделать простенький проект (мигаем светодиодом) для шины PCIe-x1? :oops:

Сделать PCIe совсем не просто..
0 #3 perforator2012 07.09.2013 14:21
Извиняюсь за вопрос не по теме, но не могли бы вы сделать простенький проект (мигаем светодиодом) для шины PCIe-x1? :oops:
0 #2 nckm 06.09.2013 05:55
Цитирую eugene52:
Сразу скажу что проект не заливал в чип (у меня этой devboard нет), это только теория.

Николай, развейте мои сомнения.

1. На диаграмме из SignalTap перед началом пакета DM - в 1, DP - в 0. Согласно докам это состояние характерно для LowSpeed (1.5 мегабита), а не для FullSpeed (12 мегабит).

2. Файл usb_recv.v , строки

//clock should be 12Mhz
input wire clk,

но если посмотреть на altpll0 , выход c0, то можно увидеть что туда заводится 96Mhz

Я что-то не понимаю?

все правильно. Картинка сигналтапа приведена для lowspeed устройства.
При этом этот же проект будет работать и с FullSpeed. Проект автоматически определяет скорость устройства и соответственно переключает приемник на нее.
Вы можете попробовать перекомпилирова ть проект на любой другой devboard. Нужно только два пина входа для dp/dm и один выход на последовательны й порт.
0 #1 eugene52 05.09.2013 18:03
Сразу скажу что проект не заливал в чип (у меня этой devboard нет), это только теория.

Николай, развейте мои сомнения.

1. На диаграмме из SignalTap перед началом пакета DM - в 1, DP - в 0. Согласно докам это состояние характерно для LowSpeed (1.5 мегабита), а не для FullSpeed (12 мегабит).

2. Файл usb_recv.v , строки

//clock should be 12Mhz
input wire clk,

но если посмотреть на altpll0 , выход c0, то можно увидеть что туда заводится 96Mhz

Я что-то не понимаю?

Добавить комментарий


Защитный код
Обновить


GitHub YouTube Twitter
Вы здесь: Начало Проекты Проект Марсоход2 USB Трекер (Анализатор)