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.

56PHREAKINGХАКЕР 04 /171/ 2013РАЗНООБРАЗНЫЕ ГАДЖЕТЫУ тебя есть идея какого-нибудь устройства? Не спеши паять икодить, а поищи, возможно, кто-то подобное уже делал. Еслине получится воспользоваться готовыми схемами и исходниками,то хотя бы не придется начинать все с нуля.Например, проект V-USB благодаря лицензионной политикенакопил приличную базу готовых (в том числе и свободнораспространяемых) решений. Здесь можно найти различныереализации клавиатур, USB-адаптеров для джойстиков,геймпадов (в том числе и раритетных, например SNES/NES,Nintendo 64, ZX Spectrum джойстик, Sony PlayStation 1/2)и тому подобное. Адаптеры DMX, виртуальные порты COMи UART, i2c, Servo, беспроводные интерфейсы DCF77, IR —все, что поможет подключить к ПК больше новых устройств.Логгеры, платформы для датчиков и сенсоров, адаптеры дляLCD-дисплеев, программаторы и загрузчики также могутоказаться полезными в хозяйстве.#define USB_CFG_VENDOR_ID 0xc0, 0x16#define USB_CFG_DEVICE_ID 0xdc, 0x05#define USB_CFG_VENDOR_NAME 'n','e','t','s','4','g','e','e','k','s','.','c','o','m'#define USB_CFG_VENDOR_NAME_LEN 14#define USB_CFG_DEVICE_NAME 'U','S','B','e','x','a','m','p','l','e'#define USB_CFG_DEVICE_NAME_LEN 10ПРОГРАММА ДЛЯ ЧИПА — ЭЛЕМЕНТАРНО!При взаимодействии по шине USB компьютер — это главноеустройство, которое периодически отправляет управляющиесообщения-запросы. Контроллер, соответственно, подчиненноеи должен отвечать на запросы. Формат управляющегосообщения определяется структурой usbRequest_t из файлаusbdrv.h:typedef struct usbRequest {uchar bmRequestType;uchar bRequest;usbWord_t wValue;usbWord_t wIndex;usbWord_t wLength;} usbRequest_t;Создадим файл main.c на одном уровне с папкой usbdrv иопишем в нем необходимые заголовочные файлы, определенияи переменные:#include #include #include #include "usbdrv.h"#define F_CPU 12000000L // Частота МК#include #define DATA_OUT 1 // Команда отправки#define DATA_IN 2 // Команда получения// Буферstatic uchar replyBuf[16] = "Hello World!";static uchar dataLength = 0, dataReceived = 0;<strong>Online</strong>-калькулятор фьюзовWWWСайт проекта V-USB:www.obdev.at/products/vusb/Сайт проекта libusb:www.libusb.orgСайт проекта libusb-win32:goo.gl/osGBSРуководство по V-USBи libusb (англ.):goo.gl/ntlkSСтатья про libusb,часть 1: symmetrica.net/usb/usb1.htmчасть 2: symmetrica.net/usb/usb2.htmУстройства на основеV-USB: goo.gl/5LMasСайт проекта USBtiny:www.ladyada.net/make/usbtinyispСайт проекта AVReAl:real.kiev.ua/avrealОnline-калькуляторфьюзов:www.engbedded.com/fusecalcБлагодаря лицензионной политике проектV-USB накопил приличную базу готовых(в том числе и свободно распространяемых)решенийДалее научим контроллер принимать данные (DATA_IN) и отправлятьих компьютеру (DATA_OUT). Тип запроса указываетсяв поле bRequest управляющего сообщения.В main.c переопределим функцию usbFunctionSetup, котораявызывается автоматически при получении нового запроса:USB_PUBLIC uchar usbFunctionSetup(uchar data[8]) {usbRequest_t *rq = (void *)data;switch(rq->bRequest) {case DATA_OUT: // Обработать команду// отправки данныхusbMsgPtr = replyBuf; // Указать буферreturn sizeof(replyBuf); // Возвратить размер// буфераcase DATA_IN: // Обработка команды получения// данных// Получить длинуdataLength = (uchar)rq->wLength.word;dataReceived = 0; // Вызовов usbFunctionWrite// будет много// Проверка на переполнениеif(dataLength > sizeof(replyBuf))dataLength = sizeof(replyBuf);return USB_NO_MSG; // Возвратить 255}return 0;}Как видно из листинга, самый простой способ отправитьданные компьютеру — установить в usbFunctionSetup значениеуказателя usbMsgPtr на буфер ОЗУ (replyBuf), где находятсяданные, а затем вернуть его длину. Размер буферане должен превышать 254 байта. Для ATtiny2313 c его 128байтами ОЗУ этого достаточно. Для более функциональныхустройств есть второй способ — переопределение функцииusbFunctionRead.Чтобы получить данные, во-первых, нужно в функцииusbFunctionSetup извлечь длину сообщения из поля wLengthзапроса и сохранить ее в глобальной переменной dataLength.Во-вторых, в main.c требуется переопределить функциюusbFunctionWrite, предназначенную для обработки получаемыхданных и вызываемую автоматически (и очевидно, несколькораз), если usbFunctionSetup возвращает значение USB_NO_MSG (255):

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

Saved successfully!

Ooh no, something went wrong!