Чтение и запись портов ввода/вывода

Тема в разделе "WASM.NT.KERNEL", создана пользователем NDIS, 7 авг 2008.

  1. NDIS

    NDIS NDIS

    Публикаций:
    0
    Регистрация:
    16 авг 2007
    Сообщения:
    41
    Адрес:
    Москва
    Здравствуйте.

    ОС Windows XP и выше.

    Есть железка, ну пусть это будет какое-либо внешнее устройство. Система назначает этой железке необходимые ресурсы, а именно - порты ввода/вывода и диапазон адресов физической памяти. Вопросы у меня такие:

    1. Как идентифицируются порты? По номеру? По адресу? Ещё как-то? Можно пример идентификации порта на языке C или asm ?
    2. Как прочитать и записать данные в порты ввода/вывода из драйвера режима ядра? Достаточно ли для этого знать идентификатор порта и использовать инструкции __asm in/out или же нужно звать специальные функции ядра и/или HAL ?
    3. Как прочитать или записать данные по назначенным адресам физической памяти? А если железка использует DMA ?
    4. Как осуществить всё вышеперечисленное, если железка подключена через USB ? через COM ? через LPT ? Или это без разницы?

    Сорри, если вопросы слишком простые, но железки программировать ещё не приходилось. Хотелось бы получить развёрнутые ответы на вышепоставленные вопросы, ну или хотя бы ссылки на статьи по теме. Всем заранее большое спасибо! За примеры на C или asm отдельное спасибо!
     
  2. steelfactor

    steelfactor New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    501
    NDIS
    Не зная наперед спецификации железяки, т.е. какие именно ресурсы и главное как она их использует (DMA, BAR'ы или порты ввода-выводы), сообразить драйвер для нее будет ой как непросто. Почитай спецификацию PCI шины, большинство устройств висит на ней. Если постараться, в сети можно найти примеры кода для общего определения PCI-устройств и их ресурсов. Смотри в сторону HalGetBusData, HalAssignSlotResources и т.д.
    И еще. В сети есть книга - "The Windows-2000 device driver book a guide for programmers", там довольно неплохо раскрывается эта тема.
     
  3. NDIS

    NDIS NDIS

    Публикаций:
    0
    Регистрация:
    16 авг 2007
    Сообщения:
    41
    Адрес:
    Москва
    В том-то и дело, что архитектура устройства известна, тут проблемы нет. Какие ресурсы и как она использует - тоже известно. Мне лишь нужно понять, как из драйвера обращаться к этим ресурсам (к портам и к физической памяти), т.е. интересует техническая сторона вопроса.

    Без обид, но вы всё же меня немного не поняли. Мне ничего определять не нужно, ресурсы уже определены системой. Мне лишь нужно эти ресурсы использовать, ничего более. Если так будет понятнее, то я не пишу драйвер под эту железку, железка чужая, мне лишь нужно использовать её ресурсы - порты и память.
     
  4. steelfactor

    steelfactor New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    501
    Возможно.
    Хех, зачем это? =) Уж не к сетевой ли плате?
    Строго говоря - доступ к портам устройства осуществляется командами ввода/вывода (типа in/out для x86). Некоторые PCI микросхемы дублируют такие порты (регистры) ввода/вывода в одном BAR с точно такими же регистрами, но представленными как память, в другом BAR; иногда BAR для портов ввода/вывода можно вообще выключать.
    Доступ к регистрам устройств обычно осуществляется как доступ к
    (BAR + смещение). Здесь самое главное - знать соответствие регистра и
    его битов этому смещению. Иногда производитель просто дает *.h с
    такими смещениями и defines для битов. Иногда такие регистры - это действительно hardware регистры (например, того же DMA контроллера). Иногда - это статическая память, которую микрокод (firmware) внутри микросхемы может трактовать по разному.
    В последнем случае обычно с микрокодом дается *.h файл, в котором по
    крайней мере описаны смещения этих регистров.
     
  5. NDIS

    NDIS NDIS

    Публикаций:
    0
    Регистрация:
    16 авг 2007
    Сообщения:
    41
    Адрес:
    Москва
    Информация интересная, спасибо, но я в этом деле совсем новичёк, поэтому то, что вы написали, - для меня ещё сложновато. Если вас не затруднит, ответьте хотя бы на примитивные вопросы из первого поста, или скажите, где можно почитать об этом. Спасибо!
     
  6. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    NDIS
    1.
    Если это PCI то идентифицируется по коду устройства Vendor ID, Divice ID и тд. Дальше ищется адресс устрйства. И читаются его BAR регистры они содержат адресс памяти или портов. Разумеется для всего этого есть API.
    2. Если знаешь адресс порта то можешь в него писать используя in out, а в память mov. У МС есть обертка под In out. Но если для устройства есть драйвер то нужно использовать его. А не самому писать в порты это может привести к конфликту.
    Такими вещями должен заниматься драйвер устройства. А все остальные должны обращаться через HAL к нему.
    3. Если железяка использует PCI DMA то програмирование зависит от железяки.
    4. Через HAL, идентификация по кодам устройства.

    Лучши взять книжку и почитать. И MSDN / DDK и SDK на твое устройство если оно есть.
     
  7. steelfactor

    steelfactor New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    501
    NDIS
    Начни с "The Windows-2000 device driver book a guide for programmers", хорошая книга