|
Как начать работу с библиотекой AVR USB
Статьи публикуются по мере поступления. Для упорядоченного тематического
поиска воспользуйтесь блоком "Карта сайта"
Это пакет, содержащий библиотеку подпрограмм (и примеры её использования), которая позволяет с помощью микроконтроллеров семейства AVR (призводитель Atmel) делать низкоскоростные (low-speed, стандарт USB 1.0) USB-устройства. В этих устройствах протокол USB реализован программно - в firmware, прошиваемом в микроконтроллер. Кроме того, пакет AVR-USB содержит пример программ для хоста (компьютер, к которому подключаются USB-устройства), которые реализуют обмен данными с разработанными устройствами USB. Программы для хоста используют, в свою очередь, другую библиотеку - libusb. Libusb доступна на http://libusb.sourceforge.net/ для Unix и http://libusb-win32.sourceforge.net/ для Windows. Будем для простоты называть программы, прошиваемые в микроконтроллер термином firmware, а программы, которые работают на компьютере и общаются с разрабатываемыми нами устройствами USB - термином ПО хоста. Итак, процесс работы с пакетом AVR-USB на платформе Windows по шагам.
1. Для просмотра и редактирования файлов Makefile и исходников нужно обзавестись хорошим текстовым редактором, поддерживающим окончания строк в стиле Unix (для тех, кто в танке - в Windows принято заканчивать строки в текстовых файлах как 0x0D, 0x0A, а в Unix более экономно - 0x0A). Я рекомендую скачать notepad2 - все просто и без затей, программа даже не требует установки. Скачиваем отсюда - http://www.flos-freeware.ch/notepad2.html. Там же описано, как прикрутить notepad2 заместо стандартного notepad.
2. Скачиваем пакет драйвера AVR-USB со странички http://obdev.com/products/avrusb/download.html. Версия пакета представлена в формате avrusb-YYYYMMDD.zip. Скачивайте самую последнюю версию.
3. Распакуйте с любое место папку, содержащуюся в архиве. Я её распаковал в папку c:\avrprj.
4. В папке c:\avrprj находятся примеры firmware и ПО хоста. Там несколько папок, каждая из которых хранит отдельный проект:
custom-class - пример firmware и ПО хоста, показывающую работу с разработанным USB-устройством типа custom class.
hid-custom-rq - пример firmware и ПО хоста, показывающую работу с USB-устройством HID-класса путем отправки ему пользовательских запросов.
hid-data - пример firmware и ПО хоста, также показывающую работу с устройством HID. Демонстрируется метод обмена данными.
hid-mouse - пример firmware, реализующего HID устройство типа мышь
usbtool - пример ПО хоста - универсальная программа, работающая с USB-устройствами
Для компиляции firmware и ПО хоста нужны специальные программные пакеты, установку и использование которых рассмотрим далее.
5. Начнем с firmware. Понадобится либо avr-gcc, либо IAR Embedded Workbench for AVR. В этой статье я рассматриваю установку и работу с avr-gcc. Пакет avr-gcc на платформе Windows входит в состав пакета WinAVR. Скачиваем этот пакет - идем по адресу http://winavr.sourceforge.net/, находим там ссылку на пакет (ссылка для закачки поведет на http://sourceforge.net/), скачиваем. Я скачал обычный инсталлятор. После завершения скачки запускаем его. Выбор языка установки ни на что не влияет, я выбрал русский. Инсталлятор предлагает выбрать папку для установки, я согласился на предлагаемую по умолчанию папку C:\WinAVR- название (к примеру 20080610). Далее запросит установить снять галочки - выбрать состав устанавливаемых компонентов (Install Files, Add Directories to PATH (Recommended), Install Programmers Notepad) - я оставил все компоненты выбранными, как и предлагалось. После установки в переменную окружения Path пропишутся пути C:\WinAVR- название (к примеру 20080610)\bin и C:\WinAVR-название (к примеру 20080610)\utils\bin. Второй путь важен для работы утилиты make. Чтобы изменения для переменной Path вступили в силу для окружения пользователя, нужно перелогиниться (по крайней мере у меня так было под w2k), либо перезапустить экземпляр командного интерпретатора cmd (чтобы обновились для него переменные окружения).
6. Откомпилируем firmware из папки c:\avrprj\avrusb- название (к примеру 20080418) \examples\hid-custom-rq\firmware\. Запустим cmd, перейдем в эту папку (cd c:\avrprj\avrusb- к примеру 20080418\examples\hid-custom-rq\firmware). Введем команду make, которая откроет файл Makefile в текущей папке и выполнит имеющиеся там команды (см. статью "Как устроен Makefile..."). Makefile в текущей папке сделан так, что если ввести просто make без параметров, то выведется подсказка:
C:\avrprj\avrusb- к примеру 20080418\examples\hid-custom-rq\firmware>make
This Makefile has no default rule. Use one of the following:
make hex ....... to build main.hex
make program ... to flash fuses and firmware
make fuse ...... to flash the fuses
make flash ..... to flash the firmware (use this on metaboard)
make clean ..... to delete objects and hex file
Для компиляции firmware нужно ввести make hex, что и сделаем:
c:\avrprj\avrusb- к примеру 20080418\examples\hid-custom-rq\firmware>make hex
cp -r ../../../usbdrv .
avr-gcc -Wall -Os -DF_CPU=16000000 -Iusbdrv -I. -DDEBUG_LEVEL=0 -mmcu=atm-ga168 -c usbdrv/usbdrv.c -o usbdrv/usbdrv.o
avr-gcc -Wall -Os -DF_CPU=16000000 -Iusbdrv -I. -DDEBUG_LEVEL=0 -mmcu=atm-ga168 -x assembler-with-cpp -c usbdrv/usbdrvasm.s -o usbdrv/usbdrvasm.o
avr-gcc -Wall -Os -DF_CPU=16000000 -Iusbdrv -I. -DDEBUG_LEVEL=0 -mmcu=atm-ga168 -c usbdrv/oddebug.c -o usbdrv/oddebug.o
avr-gcc -Wall -Os -DF_CPU=16000000 -Iusbdrv -I. -DDEBUG_LEVEL=0 -mmcu=atm-ga168 -c main.c -o main.o
avr-gcc -Wall -Os -DF_CPU=16000000 -Iusbdrv -I. -DDEBUG_LEVEL=0 -mmcu=atm-ga168 -o main.elf usbdrv/usbdrv.o usbdrv/usbdrvasm.o usbdrv/oddebug.o main.o
rm -f main.hex main.eep.hex
avr-objcopy -j .text -j .data -O ihex main.elf main.hex
avr-size main.hex
text data bss dec hex filename
0 1694 0 1694 69e main.hex
В результате в текущей папке получим файл main.hex, который и является прошивкой для микроконтроллера. Если у Вас подключен программатор avrdude (Makefile настроен на него), то для программирования кристалла просто введите make program.
Я здесь не рассматриваю, каким образом выбирается тактовая частота для микроконтроллера или его тип - это делается путем редактирования содержимого Makefile. Все хорошо расписано как в комментариях Makefile, исходного кода, а также в файлах readme.txt - на английском языке. Переведенный на русский язык пакет AVR-USB скачайте здесь.
7. Теперь займемся ПО хоста. Для его компиляции нам понадобится gcc.exe, который есть в составе пакета MinGW - http://www.mingw.org/. Пакет MinGW - это набор портированных с Unix утилит командной строки. Сайт MinGW несколько запутан, но мы сразу ищем ссылку "HOWTO Install the MinGW (GCC) Compiler Suite" - http://mingw.org/wiki/HOWTO_Install_the_MinGW_GCC_Compiler_Suite. Там есть ссылка на инсталлятор, которая ведет на все тот же http://libusb.sourceforge.net/. Я скачал MinGW-5.1.4.exe, файл размером в 140095 байт. Это хитрый инсталлятор, который при установке скачивает из интернета все необходимое. При запуске он запросит выбрать "Download and install" или "Download only", выбираем "Download and install". Далее спросит, какой пакет устанавливать - Previous, Current или Candidate. Выбираем то, что предлагается по умолчанию - Current. Далее запросят выбрать устанавливаемые компоненты. По умолчанию предлагается только "MinGW base tools", но я еще поставил галочку на всякий случай на "g++ compiler". Утилиту Make выбирать не стал, поскольку она у меня уже работает (поставилась из пакета WinAVR). Далее предложат выбрать папку для установки - C:\MinGW, соглашаемся. Далее предложат выбрать место для ярлыков, потом начнется процесс загрузки. Грузилось у меня долго, около часа, на скорости примерно 22 кбайт/сек (если верить информации инсталлятора). Грузится все в текущую папку, откуда запускали MinGW-5.1.4.exe. После установки gcc.exe оказывается в папке c:\MinGW\bin\, но в переменной Path этот путь не прописан, надо добавить вручную (надеюсь, не надо объяснять, как?).
8. Теперь надо установить библиотеку libusb. Идем по адресу http://libusb-win32.sourceforge.net/#downloads. Там опять все несколько запутано. Ищем "Device Driver Installation" и находим там ссылку для скачки. Качаем libusb-win32-filter-bin-0.1.12.1.exe. Ставим, предлагает по умолчанию в папку "C:\Program Files\LibUSB-Win32", соглашаемся. После установки, создания ярлычков инсталлятор предложит запустить тест-программу ("C:\Program Files\LibUSB-Win32\bin\testlibusb-win.exe"), которая может показать все USB устройства, с которыми можно работать через библиотеку libusb (в принципе, это все устройства USB, которые распознаны системой и имеют установленный драйвер). Программа очень полезная, может пригодиться в дальнейшем для просмотра информации об USB-устройствах.
9. Попробуем откомпилировать c:\avrprj\avrusb- к примеру 20080418\examples\hid-custom-rq\commandline (это ПО хоста, которое может управлять нашим устройством USB). Сначала отредактируем файл c:\asm\avrusb- к примеру 20080512\examples\hid-custom-rq\commandline\Makefile. Эти 2 строки надо закоментировать (коментарий начинается с символа # в начале строки):
#USBFLAGS = `libusb-config --cflags`
#USBLIBS = `libusb-config --libs`
далее, нужно изменить пути до файлов библиотеки. Было так:
USBFLAGS = -I/usr/local/include
USBLIBS = -L/usr/local/lib -lusb
теперь должно быть так (не спрашивайте меня, почему. Это мне стоило нескольких часов "плясок с бубном"):
#USBFLAGS = -I/usr/local/include
USBFLAGS = -I"c:/Program Files/LibUSB-Win32/include"
#USBLIBS = -L/usr/local/lib -lusb
USBLIBS = -L"c:/Program Files/LibUSB-Win32/lib/gcc" -lusb
Все, теперь можно компилировать. Как обычно, запускаем cmd и переходим в нашу папку (cd c:\avrprj\avrusb- к примеру 20080418\examples\hid-custom-rq\commandline). Вводим make, без параметров:
c:\avrprj\avrusb- к примеру 20080418\examples\hid-custom-rq\commandline>make
gcc -I"c:/Program Files/LibUSB-Win32/include" -O -g -Wall -c opendevice.c
gcc -I"c:/Program Files/LibUSB-Win32/include" -O -g -Wall -c set-led.c
gcc -o set-led opendevice.o set-led.o -L"c:/Program Files/LibUSB-Win32/lib/gcc" -lusb
Процесс компиляции закончен, в текущей папке появятся объектные файлы (расширение *.o) и исполняемый файл set-led.exe - этот исполняемый файл и есть та программа, которая работает с разрабатываемым USB-устройством.
10. Теперь нужно собрать USB устройство по одной из схем в папке c:\avrprj\avrusb- к примеру 20080418\circuits\.
11. Теперь нужно прошить программу в микроконтроллер (прошивку c:\avrprj\avrusb- к примеру 20080418\examples\hid-custom-rq\firmware\main.hex). Как это делать, рассказывать не буду, в Интернете полно информации по теме. Ищите по ключевым словам ISP, avrdude, PonyProg, ITAJICE mkII.
12. Подключите Ваше устройство к компьютеру. Если Вы его собрали и прошили правильно, то появится сообщение, что обнаружено новое устройство LEDCtlHID:
а потом еще одно, USB Human Interface Device:
Если посмотреть в Диспетчере Устройств, то в папке Human Interface Devices появится 2 новых устройства:
Если посмотреть свойства USB Human Interface Device, то мы увидим имя LEDCtlHID, которое было задано в макросе USB_CFG_DEVICE_NAME (файл c:\avrprj\avrusb- к примеру 20080513\examples\hid-custom-rq\firmware\usbconfig.h):
Никакие драйвера нам не потребовались - наше устройство USB принадлежит к классу HID!
13. Теперь попробуем поуправлять устройством. Сначала запустим set-led.exe без параметров, выведется подсказка:
c:\avrprj\avrusb-к примеру 20080418\examples\hid-custom-rq\commandline>set-led.exe
usage:
set-led.exe on ....... turn on LED
set-led.exe off ...... turn off LED
set-led.exe status ... ask current status of LED
Теперь мы можем командой "set-led.exe on" зажечь светодиод на макетной плате, а командой "set-led.exe off" его погасить. Наше устройство работает!
Написал microsin 25.09.2008