определения всех HDD в системе

Тема в разделе "WASM.OS.DEVEL", создана пользователем AntiB, 19 апр 2007.

  1. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Отправь команду 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.
     
  2. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    а можна както по другому определить? так как я хотел попробывать определять устройства методом считывание сектора (по идее должен сработать, хочу попробывать), мне просто нужно определить все логические диски, поетому хочу считать первой сектор - MBR - и если нету тайм-ауту, значит устройство есть иначе нету. Так что есть ищо какието способы ето определить?
     
  3. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    AntiB
    Mika0x65

    Наконец, то дошли руки оттестить и проверить, свой код. Заодно перечитал документацию. Так как все это весела немного в подвешенном састоянии.
    Так вот, помима проверки регистра статуса. Если BSY или DRQ то ошибка, устройства нет.
    В пративном случаи смотрим регистр ошибки. Если подчиненный диск и в регистр ошибки 01h то устройство есть, в противном случаи нет. Если мастер диск и в регистр ошибки 01h 81h то присутствует.
    Странно, но практика показала что если есть диск мастер или слейв то возращает 04h.


    Сори, но код на паскале.
    Код (Text):
    1. Port[d+2]:=0;
    2. Port[d+3]:=0;
    3. Port[d+4]:=0;
    4. Port[d+5]:=0;
    5. Port[d+6]:=0+y shl 4;
    6. Port[d+7]:=8; {RESET}
    7. t:=MemL[0:$46C];
    8. repeat
    9. b:=port[d+7];
    10. until( b and $80<>$80) or (MemL[0:$46C]-t>2);
    11. if (b and $80=$80) then
    12.  begin
    13.  WriteLn(F,'Falid');
    14.  exit;
    15.  end;
    16. b:=port[d+1];
    17. if not( (y=0) and((b=4) or (b=1) or (b=$81))or
    18.    (y=1) and((b=4) or (b=1))) then
    19.  begin
    20.  WriteLn(F,'Falid');
    21.  exit;
    22.  end;
    23.  
    24.  W:=port[d+4]+port[d+5] shl 8;
    25.  If W=$EB14 then
    26.   begin
    27.    c:=$A1; {IDENTIFY PACKET DEVICE}
    28.    WriteLn(F,'IDENTIFY PACKET DEVICE')
    29.   end  else
    30.   begin
    31.    c:=$EC;  {IDENTIFY DEVICE}
    32.    WriteLn(F,'IDENTIFY DEVICE');
    33.   end;
    34. // далее идет четение данных о диске.
    // не много под правил =)
     
  4. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    Pavia да всьо норм, я Паскаль тоже знаю. спасибо тебе за помощ, завтра буду пробывать, я написал код - кажется работает, тока нада додалать чтобы SATA понимал и чтобы находило логические диски. насчет дисков кажется всьо гуд, а вот с САТой - нет, кстате а можна определять есть ли устройство или нет - при считывание сектора? и проверять на тайм аут?
     
  5. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    AntiB
    SATA диск может находиться на другом канале. А так должно все находить. У SATA дисков одно существенное отличии в режиме UDMA выставляется/нужновыставлять скорость максимальная.

    Можешь и начетение попробовать потестировать.Если есть ошибки или их нет.
     
  6. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    у меня ищо вопрос по DMA, ето типа нада использовать тот же протокол что у PIO, тока вся разница, что не процесор переносит даные, а DMA контролер? ето типа для етого и есть Bus Master? зарание извиняюсь за ламерськой вопрос - просто такая идея в голову пришла =) всьо время думал что ДМА - ето чтото отдельное (хотя я может ошыбаюсь)
     
  7. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    На уровне физических протоколов разница значительна. На уровне логики необходимо дать Bus Master'у описание областей памяти, куда необходимо записать (или откуда необходимо считать) данные. После настроить усторойства на необходимый режим DMA и запустить чтение/запись.
     
  8. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    Mika0x65 можеш написать, если не тежело прогу, которая бы считала допустим MBR и записала ево в файл, а то у меня с ДМА ничево невыходить, если конечно есть время и желание, был бы очень благодарен
     
  9. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    AntiB
    Есть три режима работы PIO, DMA и UDMA. В первом случаи ты сам управляешь чтением. Запись в память идет через процессор. Есть DMA, протокол другой. В режиме DMA, запись данных в память идет через контролер DMA минуя процессор. В современных системах старый DMA контролер эмулируется южным мостом устройство LPC.
    В режиме UDMA сам контролер дисков осуществляет запись в память. Если в режиме DMA диск выступает в качестве ведомого. То в режиме UDMA уже ведущего.

    Bus Master - способность PCI устройства захватывать шину. Что позволяет им минуя процессора писать в память.

    PS. Еще раз советую посмотреть Кулакова. У него много всего расписано и куча примеров.
     
  10. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    Pavia можеш сказать что кугда точно пхать, алгоритм целый чтобы я понял как ето делать?