Добавяне на сериен номер към USB устройство, avr-working-with-usb, програмиране
Серийният номер за AVR микроконтролери с вграден хардуерен USB заедно с USB стека на Atmel ви дава следните функции:
• Автоматично получаване на уникален сериен номер от 20 знака • Уникален идентификатор (ID) за вашето устройство • Серийният номер се активира и деактивира по време на компилиране
Въпреки че има уникална двойкаVID (ID на доставчика) иPID (ID на продукта), USB устройството може да изисква уникален сериен номер. AVR® USB продуктите ви дават тази възможност и не се нуждаете от външни данни, за да създадете своя сериен номер. Всичко, което е необходимо, е уникален идентификатор, който се записва във FLASH паметта на AVR микроконтролера. За да прочетете този документ, вижте листа с данни на USB софтуерната библиотека за микроконтролери AT90USBxxx [2] (Doc 7675, който може да бъде намерен на CD-ROM & уебсайта на Atmel®) и USB спецификацията (usb.org).

[Функции, необходими за четене на серийния номер ]
След като сте събрали 10 байта, можете да създадете сериен номер за вашето USB устройство. Този сериен номер ще съдържа 20 знака. В този случай всеки байт ще бъде преобразуван в 2 знака. Например байт 0x1A ще даде 2 знака "1" и "A".
[Когато серийният номер е изпратен до USB хоста ]
По време на процедурата по изброяване хостът търси информация за USB дескриптор, която включва дескриптори на низове. Един от тези низови дескриптори съдържа серийния номер, ако има такъв.
Тази заявка се обработва от файла usb_standard_request.c. Имайте предвид, че генерирането на сериен номер може да бъде активирано или деактивирано от кода на фърмуера на вашия микроконтролер. Да позволи илиза да деактивирате генерирането на сериен номер, трябва да зададете правилно конфигурацията в заглавния файл conf_usb.h (в този пример генерирането на сериен номер е разрешено):
Ако опцията USB_DEVICE_SN_USE е деактивирана, тогава серийният номер няма да бъде изпратен до USB хоста. Ако този параметър е активиран, тогава са възможни 2 случая:
• USB_DEVICE_SN_UNIQUE е деактивирано. Това ще зададе серийния номер по подразбиране за USB устройството (ще бъде един и същ за всички устройства). Серийният номер по подразбиране е зададен в заглавния файл usb_descriptors.h:
• USB_DEVICE_SN_UNIQUE е активиран. В този случай ще бъде зададен уникален сериен номер и изпратен до хоста, както е описано по-рано.
На тази екранна снимка серийният номер е присвоен на USB устройството:

На тази екранна снимка на USB устройството е присвоен сериен номер по подразбиране:

Тук USB устройството няма зададен сериен номер:

Моля, обърнете внимание, че серийният номер, показан на последната екранна снимка, се задава автоматично от операционната система Windows®, той не се изпраща от USB устройството (този сериен номер не се съхранява във вашето USB устройство).
Популярните библиотекиV-USB иLUFA също се използват за създаване на USB устройства на AVR микроконтролери. Те могат също така да зададат серийния номер на USB устройството.
[Как да зададете серийния номер на USB устройство във V-USB библиотеката ]
Библиотеката V-USB [3] без съмнение е шедьовър на изкуството на програмирането. Предоставя уникална възможност за създаване на USB устройство на най-често срещания AVR микроконтролер (серия ATmega или ATtiny), който дори няма специален хардуер за това (няма вграден USB контролер). USB D+ и D- физическите сигнали се запитват и обработватмикроконтролер програмно (!).
V-USB библиотеката също така предоставя възможност за генериране на сериен номер за USB устройство. Използването на серийния номер (както и много други характеристики и функции) се разрешава чрез контролиране на съдържанието на конфигурационния файл на проекта usbconfig.h. По-долу е част от този файл, който описва опцията за сериен номер на USB устройство.
Обърнете внимание, че макросът USB_CFG_SERIAL_NUMBER_LEN трябва да указва точно дължината на серийния номер, т.е. броя знаци, посочени в макроса USB_CFG_SERIAL_NUMBER.
Може да е полезно да предоставите серийния номер на устройството не по време на компилиране, а по време на изпълнение на фърмуерната програма. Вижте раздела за дескриптори по-долу (фин контрол върху USB дескриптори) за фин контрол върху USB дескриптори - като дескриптор на низ за сериен номер. В този случай е възможно серийният номер да се постави не във FLASH паметта, а в RAM паметта на микроконтролера, така че да стане възможно генерирането на данни за серийния номер в движение (runtime), като се използва код, работещ в микроконтролера.
[Как се задава серийният номер на USB устройство в библиотеката LUFA ]
Библиотеката LUFA [4] е позиционирана като алтернатива на подобен стек от USB библиотеки от Atmel, предназначена е за AVR микроконтролери, които имат USB хардуерна периферия (контролер) на борда.
Библиотеката LUFA също така предоставя възможност за генериране на сериен номер за USB устройство. За съжаление, опциите за конфигуриране на серийния номер за проект не са зададени толкова прозрачно, колкото са във V-USB библиотеката. За да разрешите серийния номер, вижте съдържанието на файла LUFA\Drivers\USB\Core\AVR8\Device_AVR8.h. Всъщност иматесамо възможността да деактивирате серийния номер, ако зададете макроса NO_INTERNAL_SERIAL в настройките на вашия проект.