11.07.2015 Views

ПРИНТЕРЫ СЕГОДНЯ - Xakep Online

ПРИНТЕРЫ СЕГОДНЯ - Xakep Online

ПРИНТЕРЫ СЕГОДНЯ - Xakep Online

SHOW MORE
SHOW LESS

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, твоя страстьк электронике разгорится с новой силой, породив немало оригинальныхи полезных устройств. Остается лишь пожелать тебеуспехов на этом сложном, но интересном поприще.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!