Цель работы: Изучение принципов работы, устройства и схем дисковых накопителей и интерфейса IDE.
Интерфейс IDE
IDE - Integrated Drive Electronics (устройство со встроенным контроллером)
ATA - AT Attachment 1986 -1990г. Cтандарт комитета Х3Т10
PATA - Parallel ATA
IDE предназначен для подключения не более 2 дисков, но сейчас можно и более 2, т.к. есть 2 по 2 . Контроллеры дисков размещаются на самом диске, а контроллер интерфейсов встраивается.
Адресация
Трехмерная (CHS). Такая адресация позволила адресовать до 137 ГБ (65536(цилиндров)х16(головок)х255(секторов)х512)=137 ГБ
Линейная адресация логических блоков (LBA). Адрес блока - 28-битное число.
В регистре D/H шестой бит L определяет вид адресации.
Физические параметры
Сигналы уровня TLL:
Uвых"1" ³ 2,4 В, Uвых"0" £ 0,5В
Uвх"1" ³ 2,0 В, Uвх"0" £ 0,8В
Разъемы:
40 контактов - SFF 8057
4 контакта - min+12B
2,3 контакта - +5В
Для Ultra DMA - 80-контактный разъем
Для малогабаритных устройств - объединенный 50-контактный разъем SFF8212
Протокол передачи
Хост читает регистр состояния устройства, дожидаясь нулевого бита (BSY-бит в регистре состояния). Если два устройства подсоединились, то к обоим обращается. Состояние будет предаваться последнему выбранному устройству.
Дождавшись освобождения устройства, хост записывает в регистр D/H байт, у которого есть бит DEV и он указывает на адресуемое устройство. Если DEV=0, то это ведущее устройство, если DEV=1, то это ведомое.
Хост читает основной или альтернативный регистр состояния адресуемого устройства. DRDY=1 - признак готовности.
Хост заносит требуемые параметры обмена в блок командных регистров.
Хост записывает код выполненной команды в регистр команд
Устройство устанавливает бит BSY=1 и переходит к выполнению команды.
Интерфейс АТА имеет множество режимов передачи, различающихся скоростями.
Режим |
Uпер. , МБ/с |
Тип интерфейса |
PIO mode 0 3 4 |
3.3 16.6 |
ATA ATA-2 FAST ATA-2 |
Single word DMA mode 0 1 2 |
2.08 8.33 |
ATA ATA ATA |
Multi word mode 0 1 2 |
4.16 16.66 |
ATA-2 ATA-2 FAST AT-A2 |
Ultra DMA mode 0 1 2 3 4 5 |
16.6 100 |
ATA/ATAPI-4 ATA/ATAPI-6 |
Программа записи информации в первый сектор второго жесткого диска
program write_sector;
uses dos;
type address_packet=record
packet_size:byte;
reserved0:byte;
blocks_to_transfer:byte;
reserved1:byte;
host_buffer:pointer;
lba_address:array[0..7] of byte;
end;
var
addr:address_packet;
buffer:array[0..511] of byte;
to_write:string;
i:word;
disk_number:byte;
r:registers;
begin
disk_number:=1;
writeln('Enter string to write:');
readln(to_write);
for i:=1 to length(to_write) do
buffer[i-1]:=ord(to_write[i]);
addr.packet_size:=sizeof(addr);
addr.blocks_to_transfer:=1;
addr.host_buffer:=@buffer;
for i:=0 to 7 do addr.lba_address[i]:=0;
r.ah:=$43;
r.dl:=$80+disk_number;
r.ds:=seg(addr);
r.si:=ofs(addr);
intr($13,r);
if r.ah <> $00 then
begin
writeln('Error: ',r.ah);
exit;
end;
end.
Программа чтения информации
program read_sector;
uses dos;
type address_packet=record
packet_size:byte;
reserved0:byte;
blocks_to_transfer:byte;
reserved1:byte;
host_buffer:pointer;
lba_address:array[0..7] of byte; { Адрес LBA }
end;
var
addr:address_packet;
buffer:array[0..511] of byte;
i,j:word;
cur_byte,disk_number:byte;
r:registers;
begin
disk_number:=1;
addr.packet_size:=sizeof(addr);
addr.blocks_to_transfer:=1;
addr.host_buffer:=@buffer;
for i:=0 to 7 do addr.lba_address[i]:=0;
r.ah:=$42;
r.dl:=$80+disk_number;
r.ds:=seg(addr);
r.si:=ofs(addr);
intr($13,r);
if r.ah <> $00 then
begin
writeln('Error: ',r.ah);
exit;
end;
for i:=0 to 15 do
begin
write(i*16,': ');
for j:=0 to 15 do
begin
cur_byte:=buffer[i*16+j];
if cur_byte < 32 then write('_')
else write(chr(cur_byte));
end;
writeln;
end;
end.
Программа получения параметров устройства
program disk_information;
uses dos;
type disk_info=record
size:word;
information_flags:word;
num_of_cyl:longint;
num_of_heads:longint;
num_of_sec_pt:longint;
num_of_sec:array[0..7] of byte;
bytes_in_sec:word;
dpte_addr:pointer;
dpi:word;
dpi_len:byte;
reserved0:byte;
reserved1:word;
bus_type:array[0..3] of char;
interface_type:array[0..7] of char;
interface_path:array[0..7] of byte;
device_path:array[0..15] of byte;
reserved3:byte;
dpi_csum:byte;
end;
var
info:disk_info;
r:registers;
disk_number:byte;
begin
disk_number:=0;
info.size:=sizeof(info);
r.ah:=$48;
r.dl:=$80+disk_number;
r.ds:=seg(info);
r.si:=ofs(info);
intr($13,r);
if r.ah <> $00 then
begin
writeln('Error: ',r.ah);
exit;
end;
writeln('Cyls: ',info.num_of_cyl);
writeln('Heads: ',info.num_of_heads);
writeln('Sectors per track: ',info.num_of_sec_pt);
writeln('Bytes in sector: ',info.bytes_in_sec);
writeln('Host bus type: ',info.bus_type);
writeln('Interface type: ',info.interface_type);
end.