Отправь команду RESET, после ее успешного выполнения регистры командного блока содержат сигнатуру, по которой можно определить, что подключено к контроллеру -- CD-ROM (точнее, устройство ATAPI), ATA или SATA. Сигнатура ATA: SC = 0x1, SN = 0x1, CL = 0x0, CH = 0x0, DH = 0x0. Сигнатура ATAPI: SC = 0x1, SN = 0x1, CL = 0x14, CH = 0xEB, DH = 0x0. Сигнатура SATA: SC = 0x1, SN = 0x1, CL = 0x69, CH = 0x96, DH = 0x0. Насчет последнего не уверен, т.к. у Гука сказано, что это мультиплексор портов SATA, а не контроллер, но по крайней мере методом исключения можно определить. UPD: Кстати, Pavia уже ответил на этот вопрос в #8.
а можна както по другому определить? так как я хотел попробывать определять устройства методом считывание сектора (по идее должен сработать, хочу попробывать), мне просто нужно определить все логические диски, поетому хочу считать первой сектор - MBR - и если нету тайм-ауту, значит устройство есть иначе нету. Так что есть ищо какието способы ето определить?
AntiB Mika0x65 Наконец, то дошли руки оттестить и проверить, свой код. Заодно перечитал документацию. Так как все это весела немного в подвешенном састоянии. Так вот, помима проверки регистра статуса. Если BSY или DRQ то ошибка, устройства нет. В пративном случаи смотрим регистр ошибки. Если подчиненный диск и в регистр ошибки 01h то устройство есть, в противном случаи нет. Если мастер диск и в регистр ошибки 01h 81h то присутствует. Странно, но практика показала что если есть диск мастер или слейв то возращает 04h. Сори, но код на паскале. Код (Text): Port[d+2]:=0; Port[d+3]:=0; Port[d+4]:=0; Port[d+5]:=0; Port[d+6]:=0+y shl 4; Port[d+7]:=8; {RESET} t:=MemL[0:$46C]; repeat b:=port[d+7]; until( b and $80<>$80) or (MemL[0:$46C]-t>2); if (b and $80=$80) then begin WriteLn(F,'Falid'); exit; end; b:=port[d+1]; if not( (y=0) and((b=4) or (b=1) or (b=$81))or (y=1) and((b=4) or (b=1))) then begin WriteLn(F,'Falid'); exit; end; W:=port[d+4]+port[d+5] shl 8; If W=$EB14 then begin c:=$A1; {IDENTIFY PACKET DEVICE} WriteLn(F,'IDENTIFY PACKET DEVICE') end else begin c:=$EC; {IDENTIFY DEVICE} WriteLn(F,'IDENTIFY DEVICE'); end; // далее идет четение данных о диске. // не много под правил =)
Pavia да всьо норм, я Паскаль тоже знаю. спасибо тебе за помощ, завтра буду пробывать, я написал код - кажется работает, тока нада додалать чтобы SATA понимал и чтобы находило логические диски. насчет дисков кажется всьо гуд, а вот с САТой - нет, кстате а можна определять есть ли устройство или нет - при считывание сектора? и проверять на тайм аут?
AntiB SATA диск может находиться на другом канале. А так должно все находить. У SATA дисков одно существенное отличии в режиме UDMA выставляется/нужновыставлять скорость максимальная. Можешь и начетение попробовать потестировать.Если есть ошибки или их нет.
у меня ищо вопрос по DMA, ето типа нада использовать тот же протокол что у PIO, тока вся разница, что не процесор переносит даные, а DMA контролер? ето типа для етого и есть Bus Master? зарание извиняюсь за ламерськой вопрос - просто такая идея в голову пришла =) всьо время думал что ДМА - ето чтото отдельное (хотя я может ошыбаюсь)
На уровне физических протоколов разница значительна. На уровне логики необходимо дать Bus Master'у описание областей памяти, куда необходимо записать (или откуда необходимо считать) данные. После настроить усторойства на необходимый режим DMA и запустить чтение/запись.
Mika0x65 можеш написать, если не тежело прогу, которая бы считала допустим MBR и записала ево в файл, а то у меня с ДМА ничево невыходить, если конечно есть время и желание, был бы очень благодарен
AntiB Есть три режима работы PIO, DMA и UDMA. В первом случаи ты сам управляешь чтением. Запись в память идет через процессор. Есть DMA, протокол другой. В режиме DMA, запись данных в память идет через контролер DMA минуя процессор. В современных системах старый DMA контролер эмулируется южным мостом устройство LPC. В режиме UDMA сам контролер дисков осуществляет запись в память. Если в режиме DMA диск выступает в качестве ведомого. То в режиме UDMA уже ведущего. Bus Master - способность PCI устройства захватывать шину. Что позволяет им минуя процессора писать в память. PS. Еще раз советую посмотреть Кулакова. У него много всего расписано и куча примеров.