Учимся Работать С Usb Устройством И Тестируем Систему На Базе Контроллера Fx3

В двух предыдущих статьях мы сделали систему USB 3.0 на базе контроллера FX3. Пришло время научиться работать с ним из программ вашего ПК.

Ну, а заодно понять, насколько полученная система пригодна для практического использования.

Действительно ли ширины канала хватит на весь поток? И не теряются ли отдельные байты из потока? Тот, кто хоть немного работал тестировщиком, не поверит, что если система работает в принципе, значит, она работает в деталях.

А я проработал на этой должности лет пять, не меньше, поэтому привык все проверять на практике.

В любом случае, давайте начнем.



Учимся работать с USB устройством и тестируем систему на базе контроллера FX3

Предыдущие статьи серии:

  1. Начинаем эксперименты с интерфейсом USB 3.0 через контроллер семейства FX3 от Cypress.
  2. Дорабатываем прошивку USB 3.0 с помощью анализатора SignalTap, встроенного в среду разработки Quartus.


1 Теория о методах доступа к USB



1.1 Окна

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

Это связано с тем, что для работы с ней Windows обязательно нужен драйвер.

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

Потому что мне не нужно, чтобы все заснули.

Хочется, чтобы суть была ясна, поэтому ряд скучных деталей придется опустить.



1.1.1 Драйверы, работающие на функциональном уровне

Что такое USB-устройство? Это набор конечных точек.

Но, честно говоря, прикладного программиста эти моменты не интересуют. Давным-давно, еще в прошлом тысячелетии, когда на микросхеме UART16550 были сделаны последовательные порты, для него был сделан функциональный драйвер для Windows, и все прикладные программисты привыкли работать с абстракциями именно этого драйвера.

И с этой привычкой трудно поспорить.

Представим на минутку, что вам придется работать с адаптером USB-COM в стиле USB, на уровне конечной точки.

Существует идеология CDC: две конечные точки туда и обратно, одна точка состояния в режиме прерывания и определенный набор команд, выдаваемых через конечную точку EP0. Это все описано в стандартах USB. Все? Нет, некоторым этого недостаточно! Prolific сделал собственный набор команд для точки EP0, несовместимый с CDC. И FTDI ваш.

Он не совместим ни с CDC, ни с Prolific. Итак, если бы прикладному программисту пришлось работать с адаптерами USB-COM на уровне конечной точки, ему пришлось бы нелегко.

К счастью, Prolific и FTDI предоставляют функциональные драйверы для своих чипов, а для CDC функциональный драйвер был разработан самой Microsoft и включен в состав Windows. Поэтому прикладной программист понятия не имеет, как работать с конкретным адаптером (помнится, мы подписали целый NDA 15 лет назад с FTDI, чтобы получить от них руководство по своим командам, и я сразу отправил им информацию об ошибке в документ, так как мы еще работали бюрократами, то я уже успел все изучить сам с помощью дизассемблера, поэтому сразу нашел несоответствие их описания и моего).

На уровне приложений драйверы всех упомянутых производителей обеспечивают тот же интерфейс, что и при работе со старым добрым UART16550. То же самое касается и USB-накопителей.

Мало кто знает, что физически существует две конечные точки.

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

Еще меньше людей знают, как устранять ошибки.

Все работает через драйвера usbstor.sys , предоставленный Microsoft, который обеспечивает работу точно так же, как и с накопителями, подключенными через локальную шину материнской платы.

Комфортный? Определенно! Но мы сделали свое устройство, которое логически не совместимо ни с одним из стандартных.

Так что же нам теперь делать, нужно ли писать для этого персональный драйвер? Не обязательно.

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

Некоторые из них мы сейчас рассмотрим.



1.1.2 CyUSB

Я познакомился с этим водителем раньше других.

Это было 12 лет назад. Вот с этого я и начну рассказ.

Правда, скажу это вскользь.

Cypress, выпустив замечательные контроллеры FX2LP, просто обязана была сделать драйвер, работающий на уровне конечной точки, чтобы облегчить жизнь своим клиентам.

И она сделала это.

Если кому интересно, поищите CyAPI. Это DLL, предоставляющая ряд функций для прикладного программиста.

Я как системный инженер старался обойтись без DLL, поэтому сделал себе библиотеку, работающую с драйвером на уровне запроса IOCTL. Основным недостатком этой библиотеки является ее лицензионное соглашение.

Его можно использовать только с контроллерами Cypress. А чтобы все было убедительнее, начиная с некоторых версий, драйвер стал просто зависать, если работает с контроллерами других производителей.

По крайней мере старые версии с AT90USB работали, а новые нет. Поэтому я решил, что не буду использовать этот драйвер.

Я даже свою написал.

Но вскоре была обнаружена замечательная готовая версия от Microsoft, и я перешёл на неё.



1.1.3 WinUSB

Этот драйвер уходит корнями в инфраструктуру UMDF. Когда Microsoft работала над возможностью запуска драйверов на индивидуальном уровне защиты, они создали специальный уровень драйверов WinUSB. Но через этот же драйвер можно работать и из обычных прикладных программ, а не только из драйверов UMDF. Если кому интересно, просто введите в поиск.

WinUSB API .

Через этот функционал можно сделать то же самое, что и через CyUSB, но с контроллерами любого производителя.

Сам драйвер входит в состав Windows, поэтому в Win7 его можно было установить без проблем с подписью.

Вы можете создать его по инструкции от Microsoft или найти и скачать готовый inf-файл, изменить в нем VID/PID на свой и установить.

К сожалению, начиная с WIN8 необходимо подписывать не только сам драйвер, но и INF-файл.

Однако никто не мешает вам подправить VID/PID устройства на тот, который будет найден.

У меня есть этот подписанный информационный файл.

Посмотреть инф-файл

   

; ; Android WinUsb driver installation. ; [Version] Signature = "$Windows NT$" Class = AndroidUsbDeviceClass ClassGuid = {3F966BD9-FA04-4ec5-991C-D326973B5128} Provider = %ProviderName% DriverVer = 06/06/2017,2.0.0010.00003 CatalogFile.NTx86 = MT16_x86.cat CatalogFile.NTamd64 = MT16_x64.cat ; ; This section seems to be required for WinUsb driver installation. ; If this section is removed the installer will report an error ; "Required section not found in INF file".

; [ClassInstall32] Addreg = AndroidWinUsbClassReg [AndroidWinUsbClassReg] HKR,,,0,%ClassName% HKR,,Icon,,"-26" [Manufacturer] %ProviderName% = Google, NTx86, NTamd64 [Google.NTx86] %CompositeAdbInterface1% = USB_Install, USB\VID_1234&PID_0001 %CompositeAdbInterface2% = USB_Install, USB\VID_1234&PID_0002 %CompositeAdbInterface3% = USB_Install, USB\VID_1234&PID_0003 %CompositeAdbInterface5% = USB_Install, USB\VID_1234&PID_0005 %OldBox%

Теги: #Программирование микроконтроллеров #Компьютерное оборудование #Системное программирование #FPGA #FPGA #FPGA #FPGA #USB-анализатор #libusb #контроллер FX
Вместе с данным постом часто просматривают: