Práce s CompactFlash nebo HDD v true IDE módu
Následující popis by měl předvést způsob kominikace jednočipu
s CompactFlash kartou v true IDE módu. CF v tomto režimu by měla být plně zaměnitelná
za pevný disk s IDE rozhraním, takže stejným způsobem lze ovládat HDD.
Rozmístění a funkce pinů CF karty
Na obrázku je naznačeno rozmístění pinů na CF kartě a v tabulce jejich názvy. Rozteč pinů u CF
je v 1,27x1,27mm. Konektory pro CF karty jsou celkem drahé. Koupit je lze třeba u firmy
Omnitron.
Rozmístění pinů CF |
Vývod |
Název |
Směr |
|
Vývod |
Název |
Směr |
1 |
GND |
PWR |
|
26 |
CD1 |
OUT |
2 |
D3 |
I/O |
|
27 |
D11 |
I/O |
3 |
D4 |
I/O |
|
28 |
D12 |
I/O |
4 |
D5 |
I/O |
|
29 |
D13 |
I/O |
4 |
D5 |
I/O |
|
29 |
D13 |
I/O |
5 |
D6 |
I/O |
|
30 |
D14 |
I/O |
6 |
D7 |
I/O |
|
31 |
D15 |
I/O |
7 |
CS0 |
IN |
|
32 |
CS1 |
IN |
8 |
A10 |
IN |
|
33 |
VS1 |
OUT |
9 |
ATASEL |
IN |
|
34 |
IORD |
IN |
10 |
A9 |
IN |
|
35 |
IOWR |
IN |
11 |
A8 |
IN |
|
36 |
WE |
IN |
12 |
A7 |
IN |
|
37 |
INTRQ |
OUT |
13 |
VCC |
PWR |
|
38 |
VCC |
PWR |
14 |
A6 |
IN |
|
39 |
CSEL |
IN |
15 |
A5 |
IN |
|
40 |
VS2 |
OUT |
16 |
A4 |
IN |
|
41 |
RESET |
IN |
17 |
A3 |
IN |
|
42 |
IORDY |
OUT |
18 |
A2 |
IN |
|
43 |
INPACK |
OUT |
19 |
A1 |
IN |
|
44 |
REG |
IN |
20 |
A0 |
IN |
|
45 |
DASP |
I/O |
21 |
D0 |
I/O |
|
46 |
PDIAG |
I/O |
22 |
D1 |
I/O |
|
47 |
D8 |
I/O |
23 |
D2 |
I/O |
|
48 |
D9 |
I/O |
24 |
IOCS16 |
OUT |
|
49 |
D10 |
I/O |
25 |
CD1 |
OUT |
|
50 |
GND |
PWR |
Významy pinů uvádím jen u těch, co jsou potřebné pro true IDE mód.
Vývod |
Název |
Směr |
Funkce |
1, 50 |
GND |
PWR |
GND, zapojit raději oba |
13, 38 |
VCC |
PWR |
+5V/+3V3, zapojit raději oba, CF by všechny měly pracovat při +5V,
některé navíc s 3V3 |
25, 26 |
CD1, CD2 |
OUT |
v CF jsou spojeny s GND a slouží jako indikace vložení karty,
piny v konektoru bývají nejkratší, aby se dotkly až jako poslední |
33, 34 |
VS1, VS2 |
OUT |
pinem VS1 v log.0 CF udává, že je schopná pracovat na +3V3,
VS2 je využíván PCMCIA, neuplatňuje se |
24 |
IOCS16 |
OUT |
když je zde log.0, tak CF oznamuje, že očekává 16-bitový přenos |
36 |
WE |
IN |
v true IDE nevyužit, připojit na VCC |
44 |
REG |
IN |
v true IDE nevyužit, připojit na VCC |
9 |
ATA SEL |
IN |
uzemněním se zapne true IDE mód |
18, 19, 20 |
A0 - A2 |
IN |
signály pro výběr registrů řadiče |
8, 10, 11, 12 14, 15, 16, 17 |
A2 - A10 |
IN |
v true IDE nejsou využity, připojit na GND |
7, 32 |
CS0, CS1 |
IN |
spolu s A0 - A2 slouží k výběru registrů řadiče |
2 - 6, 21 - 23
27 - 31, 47 - 49 |
D0 - D15 |
I/O |
datová sběrnice |
39 |
CSEL |
IN |
slouží k výběru MASTER/SLAVE, log.0 je MASTER nebo SINGLE, takže
pro pokud není zapojen, chová se jako SLAVE |
34 |
IORD |
IN |
signál pro čtení dat z bufferu, v klidovém stavu musí být v log.1,
což přepne D0-D15 do vysoké impedance, v log.0 se objeví na D0-D15
data a se vzetupnou hranou se posouvá ukazatel v bufferu |
35 |
IOWR |
IN |
signál pro zápis dat ze sběrnice do bufferu, v klidu v log.1, data jsou
ze sběrnice načteny vzestupnou hranou záporného impulzu |
42 |
IORDY |
OUT |
log.0 indikuje nepřipravenost I/O sběrnice |
41 |
RESET |
IN |
HW reset řadiče, aktivní v log.0 |
37 |
INTRQ |
OUT |
signál pro přerušení po dokončení některých operací |
43 |
INPACK |
OUT |
v true IDE není využit |
45 |
DASP |
I/O |
tento signál slouží patrně pro komunikaci MASTER a SLAVE zařízení |
46 |
PDIAG |
I/O |
tento signál slouží patrně pro komunikaci MASTER a SLAVE zařízení |
Rozmístění a funkce pinů HDD
Rozmístění pinů na HDD konektoru |
Vývod |
Název |
Směr |
|
Vývod |
Název |
Směr |
1 |
RESET |
IN |
|
2 |
GND |
PWR |
3 |
D7 |
I/O |
|
4 |
D8 |
I/O |
5 |
D6 |
I/O |
|
6 |
D9 |
I/O |
7 |
D5 |
I/O |
|
8 |
D10 |
I/O |
9 |
D4 |
I/O |
|
10 |
D11 |
I/O |
11 |
D3 |
I/O |
|
12 |
D12 |
I/O |
13 |
D2 |
I/O |
|
14 |
D13 |
I/O |
15 |
D1 |
I/O |
|
16 |
D14 |
I/O |
17 |
D0 |
I/O |
|
18 |
D15 |
I/O |
19 |
GND |
PWR |
|
20 |
- |
- |
21 |
DMARQ |
OUT |
|
22 |
GND |
PWR |
23 |
IOWR |
IN |
|
24 |
GND |
PWR |
25 |
IORD |
IN |
|
26 |
GND |
PWR |
27 |
IORDY |
OUT |
|
28 |
CSEL |
I/O |
29 |
DMACK |
IN |
|
30 |
GND |
PWR |
31 |
INTRQ |
OUT |
|
32 |
IOCS16 |
OUT |
33 |
A1 |
IN |
|
34 |
PDIAG |
I/O |
35 |
A0 |
IN |
|
36 |
A2 |
IN |
37 |
CS0 |
IN |
|
38 |
CS1 |
IN |
39 |
DASP |
I/O |
|
40 |
GND |
PWR |
Funkce pinů jsou stejné jako u CF. Přibyly pouze signálu DMAx, které se uplatňují pouze
při DMA přenosech, což s jednočipem nehrozí.
Registry řadiče
Veškeré operace s CF/HDD se provádí pomocí těchto registrů.
Příslušný registr se volí pomocí adresových vodičů A0-A2 a CS0 a CS1. Kromě datového registru, který má 16 bitů,
jsou všechny ostatní 8-bitové a používají se jen signály D0-D7. D8-D15 jsou ignorovány.
V tabulce jsou uvedeny adresy jednotlivých registrů.
Adresy registrů |
A2 |
A1 |
A0 |
CS1 |
CS0 |
Při čtení |
Při zápisu |
0 |
0 |
0 |
1 |
0 |
Data register |
Data register |
0 |
0 |
1 |
1 |
0 |
Error register |
Features register |
0 |
1 |
0 |
1 |
0 |
Sector count |
Sector count |
0 |
1 |
1 |
1 |
0 |
Sector number |
Sector number |
1 |
0 |
0 |
1 |
0 |
Cylinder low |
Cylinder low |
1 |
0 |
1 |
1 |
0 |
Cylinder high |
Cylinder high |
1 |
1 |
0 |
1 |
0 |
Drive/Head register |
Drive/Head register |
1 |
1 |
1 |
1 |
0 |
Status registr |
Command registr |
1 |
1 |
0 |
0 |
1 |
Alternate register |
Digital output |
1 |
1 |
1 |
0 |
1 |
Drive adress |
nevyužit |
A teď trochu podrobněji k jednotlivým registrům.
Nebudu popisovat úplně všechny, pouze ty nejdůležitější.
Data register
Tento registr slouží pro zápis a čtení dat z/do interního datového bufferu.
Je to jediný registr, který je 16-bitový.
Sector count register
Tento registr slouží k zadání počtu sektorů, které se budou zapisovat zároveň (respektive číst).
Po každém úspěšném zápisu je hodnota snížena o 1. Registr může obsahovat hodnoty 0-255, přičemž
0 znamená 256 sektorů najednou. První ze skupiny sektorů je zapsán na adresu danou registry
Sector number, Cyl. low, Cyl. high a Drive/head registrem. Nevím sice jak se adresa mění při CHS adresování, ale v LBA módu
se jednoduše inkrementuje.
Ve skutečnosti se nezapisuje/nečte víc sektorů najednou, ale vždy se jeden nahraje do bufferu a pak
zapíše a zase další do bufferu atd. Jediná výhoda je, že není třeba znovu zadávat adresu zápisu. Některé zařízení možná
neprovádí fyzický zápis po každém sektoru a ukládají celý blok do cache, ale mnou testované zapisují po jednom sektoru.
Sector number register
Tento registr udává číslo sektoru pro zápis/čtení v CHS módu nebo
v LBA módu obsahuje část adresy (bity A0-A7).
Cylinder low register
V CHS módu je to nižších 8 bitů z 16-bitového čísla cylindru (stopy).
V LBA módu je to další část adresy, a to bity A8-A15.
Cylinder high register
V CHS módu je to vyšších 8 bitů z 16-bitového čísla cylindru (stopy).
V LBA módu je to další část adresy, a to bity A16-A23.
Drive/head register
V CHS módu nižší 4 bity udávají číslo hlavy (povrchu plotny).
V LBA módu jsou nižší 4 bity poslední část adresy, a to bity A24-A27.
Významy vyšších 4 bitů jsou v tabulce.
Význam bitů v SDH registru |
Bit |
Význam |
7 |
log.0 znamená, že za data bude připojen CRC kontorlní součet,
dnešní řadiče prý mají mít tento bit trvale nastaven, protože používací ECC,
podle jiné dokumentace zese už dnes nemá význam, ale neuškodí ho nastavit |
6 |
log.0 znamená CHS adresování, log.1 LBA adresování |
5 |
dnes již nemá význam (původně spolu s bitem 6 udával velikost sektoru) |
4 |
pokud jsou na sběrnici 2 zařízení, tak tento bit volí mezi MASTER/SLAVE,
log.0 znamená MASTER nebo SINGLE (jen 1 zařízení) |
Vyšší 4 bity tohoto registru musí být obnoveny před každou instrukcí, protože mimo jiné určují,
pro které ze 2 zařízení na sběrnici je příkaz určen!
Status register
Obsahuje některé stavové bity. Význam je uveden v tabulce. Je to jediný registr, ke
kterému lze přistupovat během interních operací. Pokud je aktivní BUSY flag, tak neplatí žádný jiný bit !!!
Význam bitů status registru |
Bit |
Význam |
7 |
Busy flag - log.1 indikuje zaneprázdněnost, nesmí se přistupovat k žádným registrům |
6 |
Drive ready - log.1 indikuje připravenost příjímat instrukci/data, pokud došlo k chybě,
zůstane nastaven až do přístího čtení tohoto registru |
5 |
Drive write fault - log.1 indikuje, že došlo k chybě při zápisu, tento bit zůstává nastaven
až do dalšího čtení tohoto registru |
4 |
Drive seek complete - u HDD je nastaven, jakmile dojde k nastavení hlaviček na zvolenou stopu,
tento bit zůstává nastaven až do dalšího čtení status registru |
3 |
Data request (DRQ)- indikuje připravenost k datovému přenosu |
2 |
Corrected data flag - nastaven pokud došlo k opravě dat |
1 |
Index - u HDD je nastaven 1x za otáčku plotny |
0 |
Error flag - nastaven vždy, když došlo k chybě, pouze když je v log.1, tak platí obsah
Error registru |
Features register
Původní funkci toho to registru neznám, ale u dnešních zařízení se dá použít
jen jako parametr pro instrukci (např. EFh - Set Features).
Command register
Příkazový registr. Vykonávání daného příkazu začíná hned po zápisu do tohoto registru.
Seznam a popis jednotlivých příkazů je uveden dále.
Jednotlivé příkazy pro Command registr
Opět nehodlám popisovat všechny příkazy a jejich paramentry, protože je jich opravdu hodně, ale
pouze ty nejnutnější. Podrobný popis naleznete v některé oficiální dokumentaci k ATA (pár set stran).
Před každým příkazem je třeba nastavit bit MASTER/SLAVE v Drive/Head registru !!!
20h - Read sector
Před každým použitím této instrukce se musí znovu nastavit registry Drive/Head, Cylindr low a high,
Sector number a Sector count! Ihned po zapsání této instrukce se do bufferu načte příslušný sektor
(u HDD se musí čekat na nastavení stopy a "podtočení" plotny pod hlavičky).
Během této chvíle je nastaven příznak BUSY. Hned po načtení dat do bufferu je BUSY příznak vynulován a nastaví se
příznak DRQ. Teď už je možné přečíst 256 wordů (512B) z bufferu. Po přečtení všech 512B dat
je DRQ vynulován.
Pokud byl registr Sector count nastaven na větší počet sektorů než 1 a ještě nebyly všechny přečteny,
znovu se nastaví BUSY flag a načítá se další soktor. Pak je opět nastaven bit DRQ a mohou se číst data.
Takto se pokračuje dokud nejsou přečteny všechny sektory - dokud se hodnota Sector count registru nerovná 0.
Přečíst se musí vždy všech 512B. Po vykonání instrukce je opět
nastaven bit Drive ready ve status registru.
30h - Write sector
Před každým použitím tohoto příkazu se musí znovu nastavit registry Drive/Head, Cylindr low a high,
Sector number a Sector count! Ihned po zapsání instrukce je nastaven příznak DRQ, který indikuje připravenost
CF/HDD přijmout do bufferu 512B dat. Po naplnění bufferu je DRQ příznak vynulován,
a po dobu vlastního zápisu je nastaven BUSY příznak.
Pokud se zapisuje větší počet sektorů najednou, tak se po zapsání (u HDD většinou do cache, takže je zápis velmi rychlý)
opět nastaví DRQ bit a je možné zapsat další sektor do bufferu. Takto se pokračuje do nulové hodnoty Sector count registru.
ECh - Identify drive
Identifikace zařízení. Po zapsání příkazu se buffer naplní 512B
identikačních údajů. Postup čtení je stejný jako u instrukce 20h (čtení sektoru).
V tabulce jsou uvedeny některé informace ubsažené v identifikačním "sektoru".
Data v identifikačním sektoru |
Ofset |
Délka |
Význam |
0B |
2B |
ID word - 16 bitových příznaků, podstatné jsou vpodstatě jen tyto:
bit 15 - non-magnetic drive, podle tohoto bitu se dáurčit HDD/CF
bit 10 - rychlost přenosu > 10MB/s
bit 9 - rychlost přenosu 5-10MB/s
bit 8 - rychlost přenosu < 5MB/s
bit 7 - vyměnitelný disk
bit 6 - nevyměnitelný disk |
+2B |
2B |
počet cylindrů |
+6B |
2B |
počet hlav |
+12B |
2B |
počet sektorů na stopu |
+20B |
20B |
serial number v ASCII, zarovnáno vlevo |
+54B |
40B |
model number v ASCII, zarovnáno vlevo |
+120B |
4B |
celkový počet adresovatelných sektorů v LBA módu (nezbytné pro HDD větší než 8GB) |
Exh - Power commands
Jsou to příkazy pro řízení spotřeby. Mají význam především pro HDD.
Power commands |
Příkaz |
Význam |
E0h |
Standby - u HDD se zastaví plotna a vypnou některé obvody |
E1h |
Idle - normální režim, plotna se točí |
E2h |
Sleep auto power down - tento příkaz slouží k automatickému přechodu do sleep režimu
po uplynutí nastaveného času, před použitím tohoto příkazu se musí do Sector count
registru zapsat čas (1=5s, hodnoty 1-12 jsou přepsány na 60s), probudit ho lze resetem |
E3h |
Idle auto power down - tento příkaz slouží k automatickému přechodu do standby režimu
po uplynutí nastaveného času, před použitím tohoto příkazu se musí do sector count
registru zapsat čas (1=5s, hodnoty 1-12 jsou přepsány na 60s), probudit ho lze resetem |
E6h |
Sleep - okamžitě přejde do sleep módu, vše se vypne a probudit ho lze jen resetem |
EFh - Set features
Slouží k nastavení parametrů CF/HDD. Před použitím tohoto příkazu se nejdřív musí zapsat jeho parametr
do Features registru. Několik z mnoha možných paramtrů je uvedeno v tabulce.
Set features parametry |
Paramtr |
Význam |
01h |
zapne 8-bitový režim přenosu dat |
81h |
vypne 8-bitový režim přenosu dat |
55h |
vypne Read look-ahead (cache) |
AAh |
zapne Read look-ahead (cache) |
V 8-bitovém režimu se přenáší data pouze vodiči D0-D7 a word je přenášen nadvakrát.
Dříve to uměly i pevné disky, ale dnes už ne (některé typy možná ano). Problém ale je, že
tento režim údajně už nepodporují ani některé CF karty, takže jsem se jím vůbec nezabýval. Podrobný popis
8-bitového režimu a dalších Features parametrů pro CF i HDD naleznete v některé oficiální ATA dokumentaci.
91h - Set drive parameters
Nastaví fyzickou geometrii HDD. U většiny HDD je tento příkaz naprosto nezbytný a musí se provést
před prvním čtením/zápisem sektoru. Má 2 parametry. Prvním z nich je registr Sector count, do kterého se musí nahrát počet sektorů na stopu
(cylindr). Druhý parametr je registr Drive/Head. Do části Head (nižší 4 bity) se musí nahrát počet hlav zmenšený o 1! V horní půlce tohoto
registru se musí nastavit, stejně jako u každého jiného příkazu, bit MASTER/SLAVE. Obě hodnoty se musí přečíst z Identifikačního bloku (příkaz ECh).
Po nastavení parametrů se použije příkaz 91h.
Způsoby adresování
První možnost je CHS - Cylinder-Head-Sector adresování. Je to dost stará a nepraktická metoda.
Původně byla vyvinuta pro diskety. Jde vlastně o fyzické adresování HDD. Pomocí registrů se
zvolí hlava (povrch plotny), stopa na plotně (cylindr) a nakonec sektor, což je výseč každé stopy.
Původní CHS omezoval hodnoty C/H/S na 1024/16/63. Za předpokladu, že 1 sektor má 512B, může být adresována
maximálně kapacita 1024*16*64*512=504MB. Tuto limitaci sice odstranil nový bios, ale princip zůstal zachován.
Sektory se počítají od 1 místo od 0, také se zbytečně složitě
nastavují adresy - nelze jednoduše uložit adresu do 1 proměnné, ale musí být rozdělěná do C/H/S.
Každý disk má navíc různé počty C/H/S, takže i obyčejná inkrementace adresy je relativně komplikovaná (rozhodně složitější než u LBA).
I přes to je z důvodů kompatibility tento mód podporován i na nových discích. U disků ale už
dávno není konstantní počet sektorů na stopu (neúsporná metoda), takže si řadič CHS adresu přepočítává stejně jako LBA a s fyzickým adresováním
už dnes CHS nemá nic společného.
Druhou a mnohem lepší metodou je LBA adresování - Logical Block Addressing (někdy se uvádí Linear Block Addressing). U tohoto
způsobu adresování tvoří registry Cylinder, Sector a Head (Dive/Head) dohromady jedno 28-bitové číslo,
které vybírá jeden sektor. Řadič disku si LBA adresu sám přepočte na fyzické adresování.
Při velikosti sektoru 512B může být adresována kapacita až 512*2^28=128GB. Pro vyšší kapcity se používá
48-bitové LBA, ale tím jsem se nezabýval - pro jednočipy by 128GB mohlo stačit. Výhoda tohoto systému je jasná -
celou adresu lze uložit do jedné proměnné a stačí kontrolovat maximální číslo sektoru podle velikosti HDD.
A teď už nekolik konkrétních operací s ukázkovými programy
Pro všechny ukázkové programy bude společné toto univerzální schéma. Jako MCU jsem zvolil ATmega32 z řady AVR.
Tento typ jsem vybral, protože je největší z řady AVR v pouzdře DIL. Pro experimenty s IDE je vhodný díky velké rychlosti (až 16MHz), ale
hlavně díky své relativně velké RAM - 2kB. Bez problému se tak dá pracovat s několika sektory najednou. Do zapojení, jsem ale pro
složitější experimenty přidal ještě statickou RAM o velikosti 512kB (lze ji koupit u GME). Její adresování je provedeno přes rozšiřující
registry IC2 a IC3. Ty adresují mimo SRAM také vývody pro výběr registrů řadiče HDD/CF A0-A2. Vývody CS0 a CS1 jsou
zapojeny fixně na GND a +5V, protože s tímto zapojením je možné bez problému přistupovat ke všem potřebným registrům.
Vývod Reset je nevyužit a je připojen na +5V. Jěště jsem se nesetkal se HDD/CF, který by reset k funkci potřeboval. LED připojená
na vývodu DASP indikuje interní operace HDD/CF.
Díky oddělení adres řadiče je možné
PORTA použít rovněž jako datový a komunikovat tak s IDE zařízením 16-bitově. Dále jsem do zapojení přidal LCD 2x20 znaků
pro přímé zobrazování některých údajú. Poslední součástí je převodník MAX232 pro přenášení většího množství dat do PC rychlostí až 115,2kbd.
Pro rychlejší přenosy ho lze nahradit USB/UART převodníkem FT232BM, který spolu s ATmega32 na 16MHz zvládne přenosovou
rychlost až 2Mbd.
!!! Po zapnutí napájení ... !!!
Ihned po zapnutí napájení musí MCU nastavit piny IOWR a IORD do log.1. Především signál IORD by mohl způsobit nemalé problémy.
Pokud by zůstal v log.0, tak je výstup IDE zařízení aktivní a může se dostat do konfliktu s dalším zařízením na sběrnici. Jednou po
nepovedeném programování se mi díky tomu málem upekla CF karta i s MCU.
Po zapnutí napájení před první instrukcí by se mělo čekat na vynulování "busy" příznaku, a následně na
nastavení "drive ready" příznaku.
Jak na zápis do libovolného registru
Tímto postupem lze zapsat do libovolného z registrů:
1) počkat na "Busy" příznak
2) nastavit adresu vybraného registru signály A0-A2 a CS0, CS1
3) vyslat na datovou sběrnici D0-D7 (nebo D0-D15 při zápisu do datového registru) požadované data
4) generovat záporný impulz na IOWR pinu v délce (pri PIO 0 alespoň 300ns)
Čekání na vynulování příznaku Busy sice není nutné, ale alespoň je jistota, že disk příkaz neignoruje.
Zápis do Data registru lze provádět jen pokud je nasatven bit DRQ!
Jak na čtení registru
Tímto postupem lze číst libovolný:
1) počkat na "Busy" příznak
2) nastavit adresu vybraného registru signály A0-A2 a CS0, CS1
3) nastavit datovou sběrnici MCU jako vstup a všechno ostatní na sběrnici přepnout do vysoké impedance
4) nastavit pin IORD do log.0 a počkat alespoň 300ns
5) přečíst data ze sběrnice D0-D7 nebo D0-D15 (při přenosu z datového registru)
6) IORD zpět do log.1
Čekání na vynulování busy příznaku Busy opět není nezbytné. Z Data registru lze číst jen
pokud je nastaven bit DRQ. Výjimku tvoří Status registr, u kterého se samozřejmě na "Busy" čekat nedá, a měl by se dát číst kdykoliv.
Power commands (pro HDD)
Tato funkce se viditelně projeví jen u HDD. Následujícím postupem se HDD uvede nejprve do režimu
"standby" a po chvíli zase zpět do "idle":
1) zapsat příkaz E0h do Command registru
2) počkat několik vteřin na zastavení plotny
3) zapsat příkaz E1h do Command registru
Ukázkový program provede uvedené kroky a zároveň vypisuje na LCD stav disku.
zdroják a překlad do hex.
Čtení identifikačního bloku
Následujícím způsobem lze přečíst identifikační blok HDD:
1) zapsat do Command registru příkaz ECh
2) čekat, dokud není DRQ příznak v log.1
3) 256x přečíst Data registr (a data někam ukládat)
Následující ukázkový program načte identifikační blok do interní RAM, vypíše na LCD
fyzickou geometrii a také jestli je připojen HDD nebo CF.
zdroják a překlad do hex.
Čtení sektoru
Následujícím způsobem lze přečíst zvolený sektor/sektory v LBA nebo CHS módu:
1) zapsat číslo sektoru nebo LBA A0-A7 do registru Sector number
2) zapsat číslo low část čísla cylindru nebo LBA A8-A15 do registru Cylinder low
3) zapsat číslo high část čísla cylindru nebo LBA A16-A23 do registru Cylinder high
4) zapsat číslo hlavy nebo LBA A24-A27 do nižších 4 bitů registru Drive/Head a ve vyšších 4 bitech
nastavit MASTER/SLAVE bit a LBA/CHS bit podle způsobu adresování.
5) zapsat počet čtených sektorů do registru Sector count (0=256 sektorů)
6) zapsat do Command registru příkaz 20h (čtení sektoru)
7) počkat na nastevení "DRQ" příznaku ve status registru
8) 256x přečíst Data registr (a data někam ukládat)
9) pokud se měl číst jen 1 sektor, tak hotovo, pokud více, tak opakovat postup od bodu 7)
dokud nejsou přečteny všechny sektory
Následující ukázkový program přečte zvolený sektor a odešle ho přes
USART do PC.
zdroják a překlad do hex.
Zápis sektoru
Následujícím způsobem lze zapsat zvolený sektor/sektory v LBA nebo CHS módu:
1) zapsat číslo sektoru nebo LBA A0-A7 do registru Sector number
2) zapsat číslo low část čísla cylindru nebo LBA A8-A15 do registru Cylinder low
3) zapsat číslo high část čísla cylindru nebo LBA A16-A23 do registru Cylinder high
4) zapsat číslo hlavy nebo LBA A24-A27 do nižších 4 bitů registru Drive/Head a ve vyšších 4 bitech
nastavit MASTER/SLAVE bit a LBA/CHS bit podle způsobu adresování.
5) zapsat počet zapisovaných sektorů do registru Sector count (0=256 sektorů)
6) zapsat do Command registru příkaz 30h
7) počkat na nastevení "DRQ" příznaku ve status registru
8) 256x zapsat word do Data registru
9) pokud se měl zapisovat jen 1 sektor, tak hotovo, pokud více, tak opakovat postup od bodu 7)
dokud nejsou zapsány všechny sektory (po dobu zápisu je nastaven "Busy" příznak)
Následující ukázkový program příjme přes USART 512B dat z PC a následné je uloží do zvoleného sektoru.
zdroják a překlad do hex.
Poslední aktualizace: 10.1.2006
|