Ну вот и мой вклад в наше общее дело.
Готова пара драйверов USB (Win/Linux) для SK-MAT91SAM9XE512. Позволяет
организовать прозрачный канал между платой Win32(host) и платой(device)
посредством USB. При старте драйвера на плате монтируется устройство
/dev/bulkusb, и Windows появляется соотв. интерфейс.
Пишем на плате в /dev/bulkusb - читаем на компе из интерфейса (ReadFile)
Пишем в интерфейс (WriteFile) - читаем на плате из /dev/bulkusb.
(Используются два endpoint'а с типом передачи BULK - в один пишем, из другого читаем)
Что в архиве:
Файлы для Win32 и Linux лежат в соотв. каталогах.
Драйвер для Linux.
Лежит в готовом виде в bin/linux
Для запуска необходимо собрать ядро с опциями USB_SUPPORT,CONFIG_USB_GADGET,CONFIG_USB_GADGET_AT91.
Сам драйвер собирается (модулем или статически) с включением опции USB_BULKSB (после замены Makefile и KConfig)
Больше тут описывать нечего.
Драйвер для Win32
Лежит в готовом виде (bulkusb.sys для Windows Vista) в каталоге win/vista.
Для установки необходимо положить его рядом с bulkusb.inf и соединить USB-кабелем
плату и комп. Выскочит Wizard, новое оборудование, далее все стандартно.
Для самостоятельной сборки придется повозиться.
Идем
сюда, регистрируемся
и качаем "WDK for Windows Server 2008 - Build 6001_18002" (iso). Устанавливаем, разбираемся.
Создаем свой подкаталог (в ($WDKROOT/src/usb), переписываем в него src/win/sys.
Запускаем необходимы build environment (в зависимости от версии Windows), из него заходим
в каталог с драйвером и запускам build.exe. В результате получится bulkusb.sys, для запуска
необходимо переписать его в system/32drivers и передернуть кабель к плате.
Библиотека для Win32 (bulkusb.dll + bulkusb.lib)
Лежит в готовом виде в bin/win.
Одна единственная функция (GetBulkUsbDevices) возвращает список подключенных в данный момент устройств (плат).
Собирается из WDK аналогично драйверу.
Тестовое приложение для Win32 (test_app.exe)
Пример использования драйвера и библиотеки. Писал и собирал в VS2008 (необходимо подключить bulkusb.lib)
Собирал в VS2008 (прилагаю весь application).
Теперь детали:
0) Если планируете самостоятельно дорабатывать все это хозяйство, то необходимы базовые знания
об устройстве шины USB (спецификация лежит
тут
)
1) Драйвер под Linux сделан на основе Gadget Zero из ядра 2.6.24. Вырезал лишнее, дописал своего, скомпилял,
отладил. достаточно просто.
2) Драйвер под Win32 сделан из BULKUSB (входит в состав WDK). Основные изменения:
- Отправка ZeroLengthPacket после транзакций, размер которых кратен 64b.
- Принцип чтения данных из устройства (использование буффера)
- Убрал ограничения на макс. размер транзакций
3) Разработка драйверов под Windows - отдельная тема. Прежде чем лезть туда с головой
советую почитать документацию по Windows Driver Model. Тема емкая и сложная.
Microsoft простых путей не ищет, потому будьте готовы лопатить хелп, исходники и гугл.
Для отладки советую взять отдельный компьютер с голой операционкой - быстрее будете
перегружаться после синих экранов. Отладчиками ядра не пользовался, хватило DebugView.exe,
который можно бесплатно скачать
отсюда
На драйвер для Windows ушло 80% всего времени.
4) Каждое USB-устройство идентифицируется парой VendorID/ProductID. В настоящее время задействованы
идентификаторы от Intel 82930 Test Board (BULKUSB из WDK как раз для нее). По этой теме
читать
тут
Если что вспомню - допишу.
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
Отредактированно alexey123 06.03.2009 г. в 16:16:56