nedoPC.org

Community of electronics hobbyists established in 2002

...
Atom Feed | View unanswered posts | View active topics It is currently 13 Dec 2017 14:54



Reply to topic  [ 20 posts ]  Go to page 1, 2  Next
nedoIDE - подключение винтов к недокомпам 
Author Message
Admin
User avatar

Joined: 09 Jan 2003 02:22
Posts: 15910
Location: Colorado
Reply with quote
Стал подробнее разбираться с IDE/ATAPI

http://www.retroleum.co.uk/ide_interface.html

Code:
IDE reg: A0-A2: /CS0: /CS1: Use:

  $0   000    0    1     IDE Data Port
  $1   001    0    1     Read: Error code
  $2   010    0    1     Number Of Sectors To Transfer
  $3   011    0    1     Sector address LBA 0 (0:7)
  $4   100    0    1     Sector address LBA 1 (8:15)
  $5   101    0    1     Sector address LBA 2 (16:23)
  $6   110    0    1     Sector address LBA 3 (24:27) (also see **)
  $7   111    0    1     Read: "Status", Write: Issue command to drive
  $8   000    1    0     Not Important
  $9   001    1    0     Not Important
  $A   010    1    0     Not Important
  $B   011    1    0     Not Important
  $C   100    1    0     Not Important
  $D   101    1    0     Not Important
  $E   110    1    0     Not Important
  $F   111    1    0     Not Important


Как видим не смотря на то, что интерфейс 16-битный, старшие 8 бит используются только по адресу 0, адрес сектора разбит на 4 однобайтовые части и второй набор адресов (/CS1=0) по сути может и не использоваться - отсюда идея: замапить эти адреса не в область портов, а в область памяти! :o

Причём мапить только младший байт у всех адресов кроме 0 - для которого старшую часть замапить на адрес 1, сдвинув "Read: Error code" на адрес 2 при чтении (при записи оно всё также будет "Number Of Sectors To Transfer").

Code:
0 - IDE Data Port (0:7)
1 - IDE Data Port (8:15)
2 - Read: Error code (moved from 1), Write: Number Of Sectors To Transfer (usually 1)
3 - Sector address LBA 0 (0:7)
4 - Sector address LBA 1 (8:15)
5 - Sector address LBA 2 (16:23)
6 - Sector address LBA 3 (24:27) (highest 3 bits must be "1" for LBA)
7 - Read: "Status", Write: Issue command to drive


При чтении данных в IDE интерфейс будет выдаваться строб чтения только при обращении к адресу 0, а адрес 1 будет читать содержимое промежуточного регистра, записанного на предыдущем шаге.

При записи данных в IDE интерфейс будет выдаваться строб записи только при обращении к адресу 1, а адрес 0 будет записывать промежуточный регистр, значение которого будет использоваться при записи в адрес 1.

Для всех остальных адресов стробы чтения и записи будут непосредственно браться с шины.

_________________
:eugeek: https://twitter.com/Shaos1973


Last edited by Shaos on 11 Jul 2013 08:34, edited 1 time in total.



11 Jul 2013 07:10
Profile WWW
Banned
User avatar

Joined: 20 Mar 2005 16:41
Posts: 2152
Location: От туда
Reply with quote
Post 
Здесь применена хитрая мысль инженеров интела. У винта IDE все регистры 8 бит. И только регистр данных 16 бит. И весь прикол состоит в том, что на ISA есть отдельный сигнал CS16, который сигнализирует об 16ти битном обмене. И этот сигнал декодируется полностью из ног состояния процессора, поэтому контроллер IDE на винте, получив этот сигнал, выставляет полные 16 бит данных при обращении к регистру данных, выключая регистр кода ошибки, который по всем правилам адресации должен был всплыть в пару к порту данных. А второй чипсет - это декодирование ячейки 3x6H-3x7H. 3x6H это альтернативное состояние и управление устройством, а 3х7H не используется. Но я не помню, чтобы я их использовал.
Image


11 Jul 2013 07:45
Profile
Admin
User avatar

Joined: 09 Jan 2003 02:22
Posts: 15910
Location: Colorado
Reply with quote
Post 
Вот тут про старшие регистры написано следующее:

Quote:
/CS0=1, /CS1=0, A2..A0=110B: 2nd status register/interrupt and reset register. When read this register gives you the same status byte as the primary (/CS0=0, /CS1=1, A2..A0=111B) status register. The only difference is that reading this register does not clear the interrupt from the IDE device when read. When written you can enable/disable the interrupts the IDE device generates; Also you can give a software reset to the IDE device.

/CS0=1, /CS1=0, A2..A0=111B: active status of the IDE device. In this register (read-only) you can find out if the IDE master or slave is currently active and find the currently selected head number. In a PC environment you can also find out if the floppy is currently in the drive. I have not used this register yet.


т.е. на них смело можно забить...

P.S. Прямая работа с LBA даёт возможность общаться с дисками размером до 128 гигабайт (137.4 если в степенях десятки) - все IDE-винты начиная с 1996 года обязаны уметь LBA).

P.P.S. Для более больших винтов есть 48-bit LBA, но оно мне пока непонятно...

_________________
:eugeek: https://twitter.com/Shaos1973


11 Jul 2013 08:03
Profile WWW
Senior

Joined: 20 Mar 2013 06:36
Posts: 137
Location: Ростов-на-Дону
Reply with quote
Post 
Shaos wrote:
P.P.S. Для более больших винтов есть 48-bit LBA, но оно мне пока непонятно...
Всё просто: http://wiki.osdev.org/ATA_PIO_Mode#48_bit_PIO


11 Jul 2013 10:17
Profile
Senior
User avatar

Joined: 09 Aug 2012 14:20
Posts: 176
Location: 95.135.174.189
Reply with quote
Post 
ОФФТОП!
Вот кто бы S.M.A.R.T спецификацию хотя на русский перевел!?

_________________
Хочу стать всезнайкой ;-)


11 Jul 2013 15:07
Profile
Admin
User avatar

Joined: 09 Jan 2003 02:22
Posts: 15910
Location: Colorado
Reply with quote
Post 
He3HauKo wrote:
ОФФТОП!
Вот кто бы S.M.A.R.T спецификацию хотя на русский перевел!?


Вот это чтоли?

Судя по всему люди просто придумали как по статистике ошибок предсказывать момент, когда хард-драйв должен быть заменён пока он совсем не грохнулся - в случае частных лиц, у которых хард-драйвов меньше десятка, оно не поможет ибо статистика основывается на больших количествах ;)

_________________
:eugeek: https://twitter.com/Shaos1973


11 Jul 2013 15:33
Profile WWW
Senior
User avatar

Joined: 09 Aug 2012 14:20
Posts: 176
Location: 95.135.174.189
Reply with quote
Post 
Прошу прощения!
Немножко ошибся, имелось виду команды управления винчестером такие как: пароль, установка уровня шума, остановка шпинделя и тд.

Вот здесь есть описание стандартов ATA, неплохо заиметь на Русском, хотя бы описание ATA-1 :-?

_________________
Хочу стать всезнайкой ;-)


11 Jul 2013 15:47
Profile
Admin
User avatar

Joined: 09 Jan 2003 02:22
Posts: 15910
Location: Colorado
Reply with quote
Post 
Вычитал, что в регистр 1 можно таки писать - при записи оно называется "Features", но не все драйвы это поддерживают (причём одна из фичей - включение 8-битного обмена)...

Можно прикинуть выгоду от расположения ATA-регистров в области памяти, а не портов. Скажем в случае портов побайтное копирование сектора на ассемблере 8080 выглядело бы так:
Code:
 MVI B,0 ; 256 words
 LXI H,adata
loop:
 MOV A,M ; 7
 OUT R0L ; 10
 INX H ; 5
 MOV A,M ; 7
 OUT R0H ; 10
 INX H ; 5
 DCR B ; 5
 MOV A,B ; 5
 ORA A ; 4
 JNZ loop ; 10

При этом скорость копирования будет 68 такта на слово или 34 такта на байт - для 2.5 МГц это 73 КБ в секунду (если развернуть цикл, то скорость будет выше - 22 такта на байт или 113 КБ в секунду).

Теперь прикинем расположение в памяти (слово отдаётся побайтно):

Code:
 MVI B,0 ; 256 words
 LXI H,adata
loop:
 MOV A,M ; 7
 STA R0L ; 13
 INX H ; 5
 MOV A,M ; 7
 STA R0H ; 13
 INX H ; 5
 DCR B ; 5
 MOV A,B ; 5
 ORA A ; 4
 JNZ loop ; 10


Как видим получается на 6 тактов больше - 74 такта на слово или 37 тактов на байт - 67 КБ в секунду (при развёрнутом цикле 25 тактов на байт или 100 КБ в секунду).

Теперь пересылка словами:

Code:
 MVI B,0 ; 256 words
 LXI H,adata
loop:
 MOV E,M ; 7
 INX H ; 5
 MOV D,M ; 7
 INX H ; 5
 XCHG ; 5
 SHLD R0 ; 16
 XCHG ; 5
 DCR B ; 5
 MOV A,B ; 5
 ORA A ; 4
 JNZ loop ; 10


Получается 74 такта на слово - много (также как и отдельными половинками). Попробуем развернуть цикл:

Code:
 LHLD buffer ; 16
 SHLD R0 ; 16
 LHLD buffer+2
 SHLD R0
 LHLD buffer+4
 SHLD R0
 ...
 LHLD buffer+510
 SHLD R0


Выходит 32 такта на слово или 16 тактов на байт - 152 килобайта в секунду при тактовой 2.5 МГц :o

P.S. Тот же трюк для побайтовых посылок будет длиннее:
LDA buffer ; 13
STA R0L ; 13
LDA buffer+1 ; 13
STA R0H ; 13
т.е. 26 тактов на байт или 20 тактов на байт в случае посылки в порт (OUT на 3 такта быстрее чем STA).

P.P.S. Если же наш буфер будет идти задом-наперёд, то можно сделать ещё быстрее - через стек:
LXI SP,buffer+512
PUSH H ; 11
SHLD R0 ; 16
PUSH H
SHLD R0
...
т.е. 27 тактов на слово или 13.5 тактов на байт - 180 КБ в секунду при 2.5 МГц :o

P.P.P.S. Буржуйский DivIDE обещает пиковую скорость 218 КБ в секунду на Z80 с 3.5 МГц через INI/OUTI - в нашем случае с развёрнутым циклом такты будут теже что и на 8080 - т.е. 16 тактов на байт что по сути тоже самое (218750 байтов в секунду), но через стек будет ещё быстрее - 259259 байтов в секунду!

_________________
:eugeek: https://twitter.com/Shaos1973


Last edited by Shaos on 11 Jul 2013 18:28, edited 3 times in total.



11 Jul 2013 17:32
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 02:22
Posts: 15910
Location: Colorado
Reply with quote
Post 
He3HauKo wrote:
Вот здесь есть описание стандартов ATA, неплохо заиметь на Русском, хотя бы описание ATA-1 :-?


Учись читать по английски ;)

А вообще спектрумисты уже вдоль и поперёк всё по русски пообсуждали в разных спековских изданиях :)

_________________
:eugeek: https://twitter.com/Shaos1973


11 Jul 2013 17:33
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 02:22
Posts: 15910
Location: Colorado
Reply with quote
Post 
А теперь можно прикинуть как нам преобразовать адреса так, чтобы всё заработало как хотелось:
Code:
    | RD | WR |
----+----+----+
000 |000 |000*|
001 |000*|000 |
010 |001 |010 |
011 |011 |011 |
100 |100 |100 |
101 |101 |101 |
110 |110 |110 |
111 |111 |111 |

Для нулевого регистра вёздочкой обозначено когда оно не будет обращаться к IDE интерфейсу, а будет записывать вспомогательные регистры - один на выход по адресу 0 и второй на вход по адресу 1 (при этом обязательно сначала работать с младшим байтом, а потом со старшим).

_________________
:eugeek: https://twitter.com/Shaos1973


11 Jul 2013 21:19
Profile WWW
Banned
User avatar

Joined: 20 Mar 2005 16:41
Posts: 2152
Location: От туда
Reply with quote
Post 
He3HauKo wrote:
Прошу прощения!
Немножко ошибся, имелось виду команды управления винчестером такие как: пароль, установка уровня шума, остановка шпинделя и тд.

Вот здесь есть описание стандартов ATA, неплохо заиметь на Русском, хотя бы описание ATA-1 :-?

Я вас умоляю. Вот вам ATA6 (не весь, правда, но большинство что нужно) и книжка, которая есть у меня в бумажном виде: Программирование дисковых подсистем. Про нее я уже тут говорил, она, как говориться "маст хэв". К ней диск идет, если интересно, могу подкинуть тоже.


11 Jul 2013 21:37
Profile
Retired
User avatar

Joined: 25 Jul 2011 03:14
Posts: 1342
Location: WWW
Reply with quote
Post 
#1
#2


12 Jul 2013 04:41
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 11:08
Posts: 7777
Location: Россия
Reply with quote
А никто не пробовал поиграться вот с такой штукой - IDE2LPT ?

Она как бы известна давно, и ПО её постепенно развивалось...

Сам я не рискнул делать, поскольку пока была необходимость в такой штуке -
с ней пришлось бы таскать отдельный блок питания и драйвер...

А потом уже с ЮСБ-интерфейсом внешние жесткие диски появились.
Но конструкция всё-равно кажется интересной...

_________________
iLavr


12 Jul 2013 07:02
Profile
Retired

Joined: 27 Mar 2013 07:55
Posts: 588
Location: 62.192.229.16
Reply with quote
Post 
Друзья собирали, работало.


12 Jul 2013 07:07
Profile
Admin
User avatar

Joined: 09 Jan 2003 02:22
Posts: 15910
Location: Colorado
Reply with quote
Post 
У меня валяется промышленный LPT2IDE в корпусе куда винт втыкается - с драйверами под дос ;)

Я на нём винт для Спринтера готовил в 2004 году...

_________________
:eugeek: https://twitter.com/Shaos1973


12 Jul 2013 08:44
Profile WWW
Display posts from previous:  Sort by  
Reply to topic   [ 20 posts ]  Go to page 1, 2  Next

Who is online

Users browsing this forum: No registered users and 1 guest


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.