|
Где-то когда-то я читал, что создатели первой спецификации USB намеревались сделать этот стандарт простым для реализации в железе за счет усложнения программного обеспечения. Таким образом цель была максимально удешевить производство и сделать USB устройства очень доступными. Сейчас можно сказать, что чипмейкерам это удалось, но так ли уж прост для реализации в железе этот стандарт? Боюсь, что ответ не очевиден.

Предположим мне нужно сделать свое простое USB устройство. Какие у меня есть варианты? Вариантов несколько: 1. Использование внешних специальных микросхем, например, преобразователей USB-to-Serial. Уж пользоваться последовательным портом могут все. Компания FTDI выпускает такие микросхемы. Это и FT232R USB-UART и FT245R USB-FIFO. Использование этих микросхем делает разработку устройства очень простой, но немного увеличивает его стоимость. 2. Использование микроконтроллеров с встроенным интерфейсом USB. Такие микросхемы выпускает например Atmel (например микросхема AT90USB82). Хорошее решение, требует знания системы команд AVR и вообще микропроцессора AVR. 3. Использование микроконтроллеров AVR с программной эмуляцией USB интерфейса. Это знаменитая библиотека V-USB. Нужно заметить, что выбирая любой из этих трех путей мы сильно упрощаем себе жизнь и на самом деле остаемся в неведении: «Трудно ли реализовать USB в железе?» Здесь, под реализацией «в железе» я подразумеваю самый низкий уровень проектирования — схемотехнику. Мне захотелось проверить саму возможность реализвации USB в «домашних условиях». Дело оказалось сильно не простым, но получилось!

Для своей реализации USB я взял плату Марсоход с ПЛИС Altera EPM240T100C5 (240 логических элементов). Ее схема вот. Среда разработки Altera Quartus II v9.
Были написаны на языке Verilog: модуль приемника и передатчика, ядро USB — модуль решающий когда и что посылать. Все пакеты и дескрипторы были размещены во встроенной флеш памяти чипа CPLD.
Для своего устройства я взял idVendor=0x9FB компании Альтера (надеюсь они меня простят?) и idProduct=0x60A5 (с потолка).
Драйвер для Windows я не писал — взял из комплекта Microsoft Windows Driver Developer Kit пример драйвера BULKUSB.SYS и просто откомпилировал его. А вот INF файл пришлось менять — указывать свои ID производителя и ID продукта.
Программу для работы с устройством конечно пришлось писать.

Она может читать из устройства один байт и писать в устройство один байт. На плате Марсоход есть 8 светодиодов — теперь я могу их зажигать програмно. Еще на плате есть 4 кнопочки — теперь я могу программно читать из устройства их состояние. Немного, правда? Но эта штука уже реально может заменить, например, параллельный или последовательный порт — можно подключить какую нибудь самодельную «лампу настроения» или еще что-то.
Все исходные тексты программ, драйвера и проект для CPLD можно взять здесь.
Итого, мое простое устройство заняло в чипе CPLD 215 логических элементов.
Конечно, я не слишком следовал стандарту USB — я не делал проверку контрольных сумм принятых пакетов или проверку четности toggle. Тем не менее испытания показали вполне стабильную работу устройства в течении длительного времени.
Пользовался я своим старым цифровиком длительное время, но недавно он сломался. Это послужило выбором нового фотоаппарата, свой выбор остановил на фотоаппаратах панасоник. Фотографии сделанные данными цифровиками являются очень качественными. Советую купить фотоаппарат panasonic. |