Článok si kladie za cieľ informovať vývojárov
zariadení, ktoré komunikujú s počítačom cez sériový port ako jednoducho do
nich implementovať technológiu “Plug and Play” a tým aj automatickú inštaláciu
napr. pod Windows.
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 je nasledovný:
1)
PC (počítač PC) nastaví DTR=1 , RTS=0
2)
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.
3)
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)
4)
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).
5)
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).
6)
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é).
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_MACHINE\Enum\SERENUM\<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
WINDOWS\INF\Other\<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, SERENUM\APP1234
;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.
Linky:
[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
[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/