Väčšinu zariadení s jednočipovými mikropočítačmi je vhodné navrhnúť na komunikáciu s PC. Kvôli jednoduchosti a ľahkej implementácie sa ako komunikačné rozhranie volí sériový port počítača. Na počítačoch je v súčasnosti prevládajúcim operačný systém Windows, preto aj obslužné programy komunikácie sú písané práve pod Windows. Keďže Windows podporujú aj technológiu “Plug and Play” je vhodné aby sme toto využili. Výhodou tejto implementácie “Plug and Play” do zariadenia je najmä pre užívateľa: zapni zariadenie na sériový port – zapni počítač – ohlási sa pripojené zariadenie – nainštaluje sa ovládací softvér. A nezanedbateľnou položkou je aj efekt : nové zariadenie sa ohlási pri štarte a zariadenie bude vidieť v “Správcovi zariadení”.
Postup implementácie do zariadenia je nasledujúci: Zariadenie obsahuje v pamäti štruktúru popisujúcu zariadenie – tzv. “Plug and Play COM Device ID Fields”. V týchto poliach sú podľa špecifikácie zapísané informácie o:
- verzii “Plug and Play”, ktoré zariadenie požaduje: PnP Rev
- identifikátore výrobcu : EISA identifier (prideľuje a určuje EISA): EISA ID
- identifikátor zariadenia (určí výrobca zariadenia): Product ID
- sériové číslo zariadenia: Serial Number
- trieda zariadenia “Plug and Play” (štandardtné triedy alebo vlastná trieda): Class Name
- zoznam kompatibilných zariadení s naším zariadením (možné použiť rovnaký driver): Driver ID
- popis alebo názov zariadenia (zobrazí sa užívateľovi pri nájdení zariadenia): User Name
- kontrolná suma predchádzajúcich polí: Checksum
Plug and Play COM zariadenie by malo oznámiť svoje ID informácie tak ako sú v Tabuľke 1. Prvé pole je rezervované pre staršie sériové myši príp. iné zariadenia, ktoré sami vysielajú znaky po zapnutí. Je lepšie toto pole vôbec neimplementovať. Ďalšie štyri polia sú povinné. Nasledujúce polia nie sú povinné, ale ak sa použijú, tak je požadovaná aj kontrolná suma.
Pre kompatibilitu so staršími ovládačmi myši, zariadenia kompatibilné s myšami (zariadenia pre určenie polohy) musia používať pre všetky polia tzv. sadu 6-bitových znakov, okrem Mouse ID (0x4D). 6-bitové znaky sa dostanú z ASCII znakov 0x20 až 0x5F odčítaním ofsetu 0x20 - teda budú mať rozsah 0x00 až 0x3F.
Či sa použijú 6-bitové znaky, alebo 7-bitové ASCII sa rozhoduje podľa poľa „Begin PnP“ (ak je „Begin PnP“=0x08 použije sa 6-bitové kódovanie znakov, ak je „Begin PnP“=0x28 použije sa 7-bitové ASCII kódovanie znakov).
Tabuľka 1: Plug and Play COM Device ID Fields
Názov poľa | veľkosť | požadované | Popis poľa |
Other ID | <17 | nie | Rezervované pre krátke ne-PnP ID (napr. Mouse ID= "0x4D" ) |
Begin PnP | 1 | áno | Začiatok PnP ID. Znak "(" : buď 0x28 alebo 0x08 |
PnP Rev | 2 | áno | číslo Plug and Play revízie (napr. 0x01,0x24 = verzia 1.00) |
EISA ID | 3 | áno | Jedinečný identifikátor výrobcu (Mfr Identifier) určený organizáciou EISA (obyčajne 3 písmená abecedy) |
Product ID | 4 | áno | Jedinečný identifikátor zariadenia (Product Identifier) určený výrobcom (4 hexa znaky = 16 bitové číslo) |
Extend | 1 | nie | Znak "": buď 0x5C alebo 0x3C. Slúži ako oddeľovač voliteľných polí. (pozri poznámky pod tabuľkou) |
Serial Number | 8 | nie | Sériové číslo zariadenia (8 hexa znakov = 32 bitové číslo) |
Extend | 1 | nie | |
Class Name | <33 | nie | Identifikátor triedy Plug and Play (Class Identifier) (obyčajne podľa štandardu) |
Extend | 1 | nie | |
Driver ID | <41 | nie | Zoznam ID kompatibilných zariadení (Compatible Device IDs). Čiarkou oddelené názvy zariadení kompatibilné s naším (rovnaký ovládač). Každý názov pozostáva z EISA ID + Product ID (napr.: ABC1234, DEF5678) |
Extend | 1 | nie | |
User Name | <41 | nie | Popis zariadenia. Tento reťazec sa zobrazí užívateľovi pri detekcii zariadenia (napr.: Našlo sa zariadenie <USER Name>) |
Checksum | 2 | áno, ak je použité nejaké voliteľné pole |
8-bitová kontrolná suma všetkých znakov od Begin PnP do End PnP vrátane, ale bez samotnej položky Checksum. Je reprezentovaná ako dva hexa znaky (8-bitové číslo). |
End PnP | 1 | áno | Koniec PnP ID. Znak ")": buď 0x29 alebo 0x09 |
- Pozn. 1: Voliteľné polia musia začínať znakom Extend "". Ak niektoré voliteľné pole nie je použité, ale ďalšie áno, tak toto pole by malo byť reprezentované iba znakom "" . "" je kódovaný ako 0x3C (pre 6-bitové znaky) alebo 0x5C (7-bitové ASCII). Ak ďalšie voliteľné polia nie sú použité, potom znak "" môže byť vynechaný.
- Pozn. 2: Celková dĺžka Plug and Play ID polí spolu s oddeľovacími znakmi by nemala prekročiť 256 znakov. Toto opatrenie je kvôli minimalizácii času pri bootovaní systému.
- Pozn. 3: Hodnoty PNP ID polí medzi BeginPnP a EndPnP znakmi by mali byť nemenné pre dané zariadenie (napevno v pamäti ROM).
Podrobnejší popis týchto polí je možné nájsť v “Plug and Play External COM Device Specification rev 1.00”, sekcia 3.2 Definitions . V implementovaní do mikrokontroléra bude kompletné PnP COM ID uložené v ROM pamäti, odkiaľ sa pri PnP procedúre (hľadanie COM PnP zariadení) pošle cez sériovú linku. Teda naraz sa pošlú údaje od „Begin PnP“ až po „End PnP“. Parametre sériovej linky musia byť pri tejto detekcii nastavené v mikrokontroléri napevno: 1200Baud, 7 data bitov, žiadna parita, jeden stop bit (alebo príp. 8 data bitov s MSB nastaveným vždy na 1).
Vysvetlenie poľa „PnP Rev“ – číslo verzie PnP. Sú to dva znaky, ale keďže môžeme byť obmedzení na 6-bitové kódovanie, tak sa z oboch znakov zoberú iba bity 5-0. Takto vznikne 12-bitové číslo v rozmedzí 0 (0x00,0x00) až 4095 (0x3F,0x3F). Toto číslo sa podelí číslom 100, čím dostaneme číslo verzie na dve desatinné miesta. Napr. verzia 1.00 je reprezentovaná PnP Rev = 0x01 , 0x24 (po spojení do jedného 12 bitového čísla je to 0x64 = 100).
V žiadnom z polí nesmie byť znak „End PnP“ ")". Týmto sú napr. vylúčené verzie PnP, ktoré obsahujú 0x29 alebo 0x09 (nemôže existovať napr. verzia 1.05 = 0x01,0x29).
Pri definovaní „EISA ID“ by sme mali mať organizáciou EISA pridelený trojznakový identifikátor spoločnosti, ale pre detekciu to nie je nutné (môžeme si to vymyslieť , napr.: “APP“ = firma Applied Precision).
Pri voľbe „Class Name“ musíme rešpektovať buď štandardizované triedy, alebo ak máme netypické zariadenie použijeme vlastný názov triedy (neodporúča sa). Vhodné je zvoliť triedu najbližšiu nášmu zariadeniu: napr. „Multifunction“ alebo „Other“. Zoznam štandardizovaných tried nájde záujemca v http://www.osr.com/ddk/setup-cls_2i1z.htm (sú tam uvedené aj CLSID k príslušným triedam - bude neskôr spomenuté v popise INF súboru).
Postup detekcie
- PC (počítač PC) nastaví DTR=1 , RTS=0
- PC čaká max. 200ms na DSR=1. Zariadenie musí podľa DTR=1 , RTS=0 zdetekovať, že sa požaduje asi PnP detekcia a musí do 200ms nastaviť signál DSR=1 (indikácia, že je zariadenie zapnuté). Je vhodné dať DSR „natvrdo“ na 1 – bez ovladania z mikrokontroléra (napr. prepojením DTR a DSR). Tým máme zaručené, že prítomnosť zariadenia bude daná jeho zasunutím do sériového portu.
- Počítač si nastaví parametre sériovej linky (1200Baud, 7 data bitov, žiadna parita, jeden stop bit). Nastaví DTR=0, RTS=0 a čaká 200ms. Po tomto čase počítač nastaví DTR=1 a čaká 200ms. Mikrokontrolér si musí zdetekovať zmenu v DTR signále (DTR išiel do 0 a po 200ms späť do 1) a následne počas posledného času čakania počítača nastaviť svoju sériovú linku na rovnaké parametre a potom čakať na RTS=1 (max. 300ms)
- Počítač nastaví RTS=1 (signál DTR=1 zostal) a očakáva PnP COM ID zo zariadenia (max. 200ms na prvý znak alebo 2.2s ak sa prijal prvý znak). Mikrokontrolér teraz vyšle cez sériovú linku svoje PnP COM ID. Mikrokontrolér musí mať stále nastavený signál DSR=1 (je vhodné signál DSR neovládať mikrokontrolérom: „natvrdo“ do 1).
- Ak by zariadenie nevyslalo nič, tak počítač nastaví DTR=0, RTS=0, počká 200ms, opäť nastaví DTR=1, RTS=1 a očakáva PnP COM ID ešte raz (druhý pokus).
- Ak počítač prijme správne PnP COM ID (všetko korektne), tak sa na obrazovke počítača zobrazí „New device found“ (Hardware Wizard pod Windows) a ako názov zariadenia bude reťazec z poľa „User Name“, ktorý si systém vyčítal zo zariadenia. V ďalšom bude systém od nás požadovať ovládač k danému zariadeniu. Musíme mu preto ponúknuť *.INF súbor, ktorý obsahuje údaje potrebné na korektné dokončenie inštalácie. Ovládač zariadenia nie je nutný, ale v *.INF súbore musia byť korektné údaje pre naše zariadenie (popísané neskôr).
V INF súbore budú iba najzákladnejšie potrebné informácie (viď. príklad), ale skúsenejší vývojári si tam môžu doplniť ľahko napr. skopírovanie/inštaláciu potrebného softvéru, pridanie niečo do registrov a pod. INF súbory sú veľmi mocný nástroj na inštaláciu softvéru aj hardvéru. Na internete možno nájsť rôzne generátory INF súborov, väčšinou však iba pre softvér. INF generátor je zahrnutý aj v Microsoft Device Driver Kit (DDK), čo je pre tento účel asi najvhodnejšie. Ďalším zdrojom informácií je špecifikácia INF súboru, ktorá je však veľmi obsiahla (INF súbory môžu byť aj veľmi zložité).
Simulácia PnP zariadenia
Pre vyskúšanie funkcie práce s PnP COM ID, príp. pre funkčnosť Vašich INF súborov som urobil program, ktorý simuluje externé COM PnP zariadenie. Program vlastne urobí z počítača COM PnP zariadenie, takže na jeho funkčnosť treba ešte druhý počítač, ktorý ho bude detekovať (a na ktorý sa budú inštalovať programy z popisu INF súboru). V programe vyplníte jednotlivé údaje polí COM PnP ID, zvolíte potrebný COM port a stlačíte tlačítko „Simulate PNP“ (slúži iba na otvorenie portu, po zmene hodnôt polí sa všetko automaticky aktualizuje). Potom prepojte tento počítač s druhým počítačom sériovým káblom. Ale pozor, prepojovací kábel musí byť full null modem, lebo sa tu pracuje aj s riadiacimi signálmi (nie iba s TxD a RxD). A naviac je softvér písaný pre príjem/vysielanie po signáloch zodpovedajúcim full null modemu.
Ak máme na počítači dva sériové porty, je možné použiť jeden port ako simulačný a druhý port ako detekčný. Vtedy nám stačí iba jeden počítač (Windows na obsadených portoch nedetekujú nový hardvér).
Na detekčnom počítači stačí ísť do „Device Manager“ a stlačiť „Refresh“ (nemusíme zakaždým reštartovať Windowsy :-) ). Windows nájdu nový hardvér a ponúkneme im zodpovedajúci INF súbor, ktorý program tiež vygeneroval so zadaných údajov. Potom sa zariadenie zobrazí aj v „Device Manager“. Ak INF súbor nezadáme (ale dokončíme inštaláciu!!! – až do „Finish“ tlačítka), bude pri zariadení otáznik – zariadenie bez korektných informácií (a naviac v sekcii „Other Devices“), ale s vyčítaným menom z poľa „User Name“.
Simulačný program do svojho logovacieho okna vypisuje skutočne vysielané údaje v ASCII aj HEX forme. HEX forma je užitočná ak si zvolíme vysielanie v 6-bitových znakoch (od ASCII odčítané 0x20). Aj keď vysielame v 6-bitových znakoch, vidíme, že Windows to správne dekódujú (aj keď sa vysielajú ne-ASCII).
Program so zadaných údajov generuje aj INF súbor so zvoleným názvom (do rovnakého adresára ako samotný program – ak nezadáme inú cestu). Táto tvorba INF súboru prebehne pri každej detekcii, po poslaní PnP COM ID na sériovú linku (ale dá sa vynútiť aj tlačítkom „Make INF“).
Po správnej detekcii si môžeme aj skontrolovať údaje, ktoré systém vyčítal zo zariadenia (vlastné PnP COM ID údaje a údaje z INF súboru). Tieto údaje sú uložené v registroch pod kľúčom HKEY_LOCAL_MACHINEEnumSERENUM<EISA ID+ProductID>. Ak chceme mať istotu „čistej inštalácie“, alebo po zmene údajov v simulačnom programe, musíme zariadenie odstrániť z „Device Manager“, zmažeme údaje v registroch pod kľúčom <EISA ID+ProductID> a pre istotu vymažeme ešte INF súbor vo WINDOWSINFOther<CompanyName.inf> (Windows si ho vytvárajú automaticky pri inštalácii).
Simulačný program je možné stiahnuť z mojej stránky spolu s ukážkovým INF súborom v zbalenej forme PnPCOMsimulator.zip.
Príklad INF súboru (a vysvetlenie jeho položiek)
[Version]
signature="$CHICAGO$"
;registrovany Class:
;Class=Multifunction
;ClassGuid={4d36e971-e325-11ce-bfc1-08002be10318}
;vymysleny Class:
Class=Dataloggers;ClassGuid nemusi byt uvedeny - ale ak je musi zodpovedat Class podla standardu
;ak sa jedna o standardne zariadenia, ku ktorym su uz priradene
;Class, tak bude nase zariadenie zobrazene v "System Properties"
;v tejto skupine (napr. Class=Multifunction => skupina
;"Multifunction adapters")
;Ak si Class vymyslime, tak bude zobrazena v "System Properties"
;nova skupina s menom Class (nase vymyslene) a v nej nase zariadenie
Provider=%Mfg%[DestinationDirs]
DefaultDestDir=30,MYFOLDER
;do adresara C:MYFOLDER sa bude kopirovat(napr. tu sekcia [COPY_SECTION])[Manufacturer]
%Mfg%=IGOR[IGOR]
%MyDeviceStr%=MyDevice_SEC, SERENUMAPP1234
;na seriovy port musi byt zadane "SERENUM" a za nim <EISA ID>="APP" a
;<Product ID>="1234"
;hodnoty <EISA ID> a <Product ID> sa musia zhodovat s tym, co je vo fyzickom ;zariadeni, teda co sa z neho vycita pri jeho PnP inicializacii (v tomto ;priklade "APP" a "1234")
;ak sa toto nezhoduje, tak sa o tomto INF subore prehlasi, že neobsahuje
;informacie o pripojenom zariadeni;%MyDeviceStr% sa zobrazi v "System Properties" ako nazov zariadenia, ale
;pri detekcii hardware sa najskor zobrazi vycitany udaj "User Name"
;z fyzickeho zariadenia (preto je vhodne aby boli zhodne - aby to uzivatela
;nezmietlo, ked sa instaluje nieco ine ako sa fyzicky naslo)
[MyDevice_SEC]
CopyFiles=COPY_SECTION
DelReg=MyDevice.DelReg
AddReg=MyDevice.AddReg
LogConfig=MyDevice.Config[MyDevice.AddReg]
;tu sa moze nieco pridat do registrov[MyDevice.DelReg]
;tu sa moze nieco zmazat z registrov[MyDevice.Config]
;ConfigPriority=NORMAL
ConfigPriority=HARDWIRED
;IRQConfig=3,4,5,9,10,11
;IOConfig=4@180-1B3%fff0(3::)
;zatial nepouzite a bezvyznamne
[COPY_SECTION]
;MySoftware.exe
;MyFile.txt
;tieto súbory sa skopiruju do adresara ”DefaultDestDir” – pozri
;sekciu [DestinationDirs]
[Strings]
Mfg="Igor Cesko s.r.o."
MyDeviceStr="Igino Cesko na COM porte"
;tu sa nachadzaju substitucne stringy, ktore su v subore uvedene mezi %%
;v tomto priklade sa nahradia %Mfg% a %MyDeviceStr%
Na implementáciu do už vyvinutého zariadenia je potrebné pozmeniť firmware mikrokontroléra, ale je potrebná aj úprava hardvéru. Mikrokontrolér musí totiž mať možnosť čítať stavy signálov DTR a RTS a podľa toho korektne odpovedať. Signál DSR môžeme prepojiť so signálom DTR priamo v konektore k počítaču (ušetríme tým jeden vodič). Teda je nutné rozšíriť komunikačný kábel na signály GND, TxD, RxD, RTS a DTR(+DSR). A naviac treba uvoľniť dva piny mikrokontroléra na čítanie stavov DTR a RTS (cez prevodník úrovní, napr. MAX232).
Plug and Play pre sériový port je snáď najjednoduchšou implementáciou PnP technológie, tak prečo to nevyužiť.!? Pre podnietenie návrhárov: podobne sa dá urobiť aj zariadenie na paralelný port, ale to je už trochu zložitejšia implementácia.
- [1] Plug and Play External COM Device Specification rev 1.00 – špecifikácia COM PnP
- [2] http://www.cesko.host.sk/downloads/PnPCOMsimulator.zip – program na simuláciu PnP COM zariadenia
- PnPCOMsimulator.zip z HW servera - [3] http://www.osr.com/ddk/setup-cls_2i1z.htm – zoznam štandardizovaných tried zariadení (Class Name)
- [4] http://www.osr.com/ddk/inf-format_0igi.htm – linky o štruktúre INF súborov
- [5] http://www.osr.com/ddk/inf-format_7soi.htm
- [6] http://www.osr.com/ddk/inf-format_6xo2.htm
- [7] http://www.osr.com/ddk/inf-format_904y.htm
- [8] http://www.osr.com/ddk/inf-format_1fxu.htm
- [9] http://www.microsoft.com/hwdev/respec/pnpspecs.htm – Plug and Play špecifikácie od Microsoftu
- [10] http://www.microsoft.com/hwdev/busbios/pnpidfrm.htm – informácie o tvorbe EISA ID a Product ID
- [11] ostatné linky z http://www.osr.com/ddk/ a http://www.microsoft.com/hwdev/PlugnPlay/
Komentáře
Reprodukovatelnost
Funguje to? Může někdo potvrdit, že se to podařilo úspěšně zreprodukovat?