Проблемы с DMA

Тема в разделе "WASM.NT.KERNEL", создана пользователем AntiB, 23 мар 2007.

  1. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    Пожалуста, помогите - я немогу написать код которой считал бы сектор или кластер. Я читал статью "Винты и флопики. ATA для дZенствующих. Часть 2: PCI DMA", но мне никак невыходит считать сектор (использувал код в статье - почемуто неработает =(), Помогите или кодом или документацыей или хоть обясните что я делаю нетак, буду очень благодарен за любые попытки мне помоч. Зарание СПОСИБО!
     
  2. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    AntiB
    В семейства Win NT работать не будет. Запускаеть надо либы из под эмулятора либы в досе.
    Считать сектор можно по разному.
     
  3. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    Я ето знаю, поетому работаю в Досе, но результатов - нету
     
  4. AntiB

    AntiB New Member

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

    AntiB New Member

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

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    AntiB
    Вот тут можешь почитать статью, там в кратце. Рассказано.
    http://www.wasm.ru/article.php?article=hardzen

    Конфигурационное адресное пространство это 256 байт в каждом PCI устройстве. Предназначенные для идентификации устройства и его настройки. Для доступа к конфигурационное адресному пространству в PC-AT и совместимых машинах выделено два основных порта.
    0CF8h -W порт адреса Address
    0CFCh RW порт данных Data

    Порт адреса представляет из себя следующую 32 битную структуру
    Код (Text):
    1. +---+---------+-------+----------+--------+---------------+-+-+
    2. |31 |30     24|23   16|15      11|10     8|7             2|1|0|
    3. +---+---------+-------+----------+--------+---------------+-+-+
    4. | с | резерв  |шина   |устройство| функция|Индекс регистра|0|0|
    5. +---+---------+-------+----------+--------+---------------+-+-+
    Порт адреса задает шину, устройства, и адрес регистра в конфигурационном пространстве устройства. Грубо говоря, устройство - это физически присутствующее устройство. А функция - это логическое устройство. Пусть вас не удивляет, но большая
    часть PCI устройств это системные устройства, а не платы расширения PCI.
    С - флаг доступа к устройству.
    По окончании работы с устройством следует сбросить флаг доступа. Или просто установить в 0 весь регистр адреса.
    Первые два бита в порту данных всегда 0. А следовательно читать за рас из конфигурационного пространства мы можем только по 32бита(один регистр)

    Далее перебираешь |функция |устройство| шина

    Функции у устройства могут и отсутствовать

    Header Type (тип заголовка) – если бит 7 равен 1 то устройство содержит несколько функций.

    Если устройства нет, то должно вернуться в Vendor ID 0FFFFh
     
  7. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    я ето читал, и написал прогу которая всьо ето делает:
    Код (Text):
    1. use16
    2. org 0x100
    3.  
    4.     jmp     start
    5.  
    6. write_data: times 0x40      db  0x00
    7. file_name                   db  "c:\pci.dat"
    8. handle                      dw  0x00
    9.  
    10. pci:
    11.     mov     dx, 0x0cf8
    12.     xor     eax, eax
    13.     mov     al, bl
    14.     or      ah, 0x80
    15.     shl     eax, 0x10
    16.     mov     ah, bh
    17.     shl     ah, 0x03
    18.     or      ah, cl
    19.     mov     al, ch
    20.     and     al, 0xfc
    21.     out     dx, eax
    22.     mov     dx, 0x0cfc
    23.     in      eax, dx
    24.  
    25.     ret
    26.  
    27. start:
    28.     mov     ah, 0x3c
    29.     mov     cx, 0x00
    30.     mov     dx, file_name
    31.     int     0x21
    32.     mov     [handle], ax
    33.  
    34.     mov     edx, 0x0cf8
    35.     xor     eax, eax
    36.  
    37.     mov     bx, 0x00
    38.     mov     cx, 0x00
    39. cycle1:
    40.     call    pci
    41.     cmp     eax, 0xffffffff
    42.     jz      device_not_found
    43.  
    44.     xor     si, si
    45. cycle2:
    46.     add     ch, 0x04
    47.     mov     [write_data+si], eax
    48.     add     si, 0x04
    49.     call    pci
    50.     cmp     si, 0x40
    51.     jnz     cycle2
    52.     mov     ch, 0x00
    53.  
    54.     push    cx
    55.     push    bx
    56.  
    57.     mov     ah, 0x40
    58.     mov     bx, [handle]
    59.     mov     cx, 0x40
    60.     mov     dx, write_data
    61.     int     0x21
    62.  
    63.     pop     bx
    64.     pop     cx
    65.  
    66. device_not_found:
    67.     inc     bh
    68.     cmp     bh, 0x20
    69.     jnz     cycle1
    70.     mov     bh, 0x00
    71.  
    72.     inc     bl
    73.     cmp     bl, 0xff
    74.     jnz     cycle1
    75.  
    76.     mov     ah, 0x3e
    77.     mov     bx, [handle]
    78.     int     0x21
    79.  
    80.     int     0x20
    ета программа создала файл, но я в етом файле ненашел своево IDE контролера - Class Code: 010180h, 010185h, 01018Ah - значит чтото нетак работает, но немогу понять что? может я в коде зделал ошыбку. Запускалась прога с под Доса. Файл который она создала есть - могу выложыть, помогите пожаулуста
     
  8. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    AntiB
    Так ты функции не перебираешь. Функции это посути тоже устройство. Вот он у тебя IDE/SATA контролеры и не захватывает, да и еще часть других.
    В самом приметивном варианте добавь вот эти строчки там где метка device_not_found
    Код (Text):
    1. device_not_found:
    2. inc     сl
    3. cmp     bh, 7
    4. jnz     cycle1
    5. xor     cl,cl
     
  9. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    Pavia спасибо тебе, я зделал перебор по функцыям и нашел IDE контролер. я подругому зделал:
    Код (Text):
    1. device_not_found:
    2.     inc     cl
    3.     cmp     cl, 0x08
    4.     jnz     cycle1
    5.     xor     cl, cl
    Я перебыраю все функцыи (ето пока что)
    СПАСИБО ТЕБЕ ОГРОМНОЕ