ßàØÃÂâÕàë áÕÓÞÔÃÂï - Xakep Online
ßàØÃÂâÕàë áÕÓÞÔÃÂï - Xakep Online
ßàØÃÂâÕàë áÕÓÞÔÃÂï - Xakep Online
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
58PHREAKINGХАКЕР 04 /171/ 2013USB_ENDPOINT_IN,DATA_OUT, 0, 0, (char *)buffer,sizeof(buffer), 5000);printf("Got %d bytes: %s\n", nBytes, buffer);// Аргумент in — отправить строку// (следующий аргумент)} else if(strcmp(argv[1], "in") == 0 && argc >2) {nBytes = usb_control_msg(handle,USB_TYPE_VENDOR | USB_RECIP_DEVICE |USB_ENDPOINT_OUT,DATA_IN, 0, 0, argv[2], strlen(argv[2])+1,5000);}if(nBytes < 0) fprintf(stderr, "%s\n",usb_strerror());usb_close(handle); // Закрыть дескрипторreturn 0;}Здесь правит бал функция usb_control_msg, которая объявленаво включаемом файле usb.h. Она имеет кучу параметрови собственно создает те управляющие сообщения, обработкакоторых реализована в прошивке микроконтроллера.СОБИРАЕМ, ПРОШИВАЕМ, ТЕСТИРУЕМНиже приведен небольшой, но очень полезный Makefile, c помощьюкоторого командой make из main.c и usbtest.c легко получитьпрошивку для чипа — main.hex и бинарник утилиты usbtest:CC = avr-gccOBJCOPY = avr-objcopyCFLAGS = -Wall -Os -Iusbdrv -mmcu=attiny2313OBJFLAGS = -j .text -j .data -O ihexOBJECTS = usbdrv/usbdrv.o usbdrv/oddebug.ousbdrv/usbdrvasm.o main.oCMDLINE = usbtest# Цель: собрать всеall: main.hex $(CMDLINE)Работа с программатором avrdude$(CC) $(CFLAGS) $(OBJECTS) -o $@# Сборка файлов библиотеки V-USB$(OBJECTS): usbdrv/usbconfig.h# C в объектный код%.o: %.c$(CC) $(CFLAGS) -c $< -o $@# asm в объектный код%.o: %.S$(CC) $(CFLAGS) -x assembler-with-cpp -c $< -o $@# Сборка утилиты для компьютера$(CMDLINE): usbtest.cgcc -I ./libusb/include -L ./libusb/lib/gcc-O -Wall usbtest.c -o usbtest -lusb# Очистить проект от бинарного кодаclean:$(RM) *.o *.hex *.elf usbdrv/*.o# Получение файла прошивки из elf-файла%.hex: %.elf$(OBJCOPY) $(OBJFLAGS) $< $@# Сборка elf-файлаmain.elf: $(OBJECTS)На уровне логики протоколUSB — это, по сути, многоуровневаяпакетная передачаданных. В этом нетрудноубедиться (а заодно узнатьмного интересного про USB),воспользовавшись анализаторомсетевых протоколовWiresharkЛОЖКА ДЕГТЯСофтовый USB не естьпанацея. Программныереализации обычноимеют ряд упрощений,таких как отсутствиепроверки контрольнойсуммы и симметричностиканала, что отрицательносказывается напомехозащищенности.Также обычно софтовыебиблиотеки используютнизкоскоростныережимы работы USB. Даи код USB-библиотеки«кушает» и без того небольшуюпамять чипа.Чтобы залить прошивку в микроконтроллер с помощью программатораusbtiny, набираем команду:$ sudo avrdude -p t2313 -c usbtiny -e -Uflash:w:main.hex:i -U lfuse:w:0xef:mВ avrdude фьюзы задаются не слишком наглядно, но их можнолегко рассчитать в одном из online-калькуляторов.Подключаем устройство к компьютеру и проверяем, как оноработает (usbtest c параметром out считывает строку, in — записываетуказанную строку в буфер чипа):$ sudo ./usbtest in all_ok$ sudo ./usbtest outПОДГЛЯДЫВАЕМ…На уровне логики протокол USB — это, по сути, многоуровневаяпакетная передача данных. В этом нетрудно убедиться (азаодно узнать много интересного про USB), воспользовавшисьанализатором сетевых протоколов Wireshark. Предварительнонеобходимо загрузить драйвер USB-монитора:$ sudo modprobe usbmonТеперь в списке интерфейсов Wireshark можно выбиратьшины USB. Посмотреть номер шины устройства можно, например,в логах.ЗАКЛЮЧЕНИЕНадеюсь, после того, как ты научился пересылать данныемежду компьютером и микроконтроллером AVR, твоя страстьк электронике разгорится с новой силой, породив немало оригинальныхи полезных устройств. Остается лишь пожелать тебеуспехов на этом сложном, но интересном поприще.