доспуп к COM порту из драйвера

Тема в разделе "WASM.ELECTRONICS", создана пользователем CodeWorm, 16 дек 2004.

  1. CodeWorm

    CodeWorm New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2004
    Сообщения:
    11
    Адрес:
    Russia
    Подкиньте идейку или ссылку как прочитать регистр статуса модема (0x3FE) из драйвера режима ядра. У меня READ_PORT_UCHAR выдает постоянно 0xFF.

    Заранее спсаибо.
     
  2. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
  3. CodeWorm

    CodeWorm New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2004
    Сообщения:
    11
    Адрес:
    Russia
    valterg, спасибо. Но я наверное неправильно выразился.

    У меня драйвер не может прочитать значение регистра состояния модема. Похоже ядро ОС запрещает доступ к прямому в/в. Функции, описанные Робертсом не помогли :-(. Чего то не то может я наворотил.
     
  4. Kola

    Kola New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2004
    Сообщения:
    69
    Под виндой нужно открыть девайс порта и послать ему запрос

    IOCTL_SERIAL_GET_MODEMSTATUS.
     
  5. The Svin

    The Svin New Member

    Публикаций:
    0
    Регистрация:
    6 июл 2003
    Сообщения:
    665
    Адрес:
    Russia
    Не пойму как ядро что-то запретить может драйверу.

    В любом случае - попробуй просто прочитать в драйвере с помощью IN. И погляди. Может там вообще идёт высокий импенданс. Может порт промаплен по другому адресу(Диагностика\Ресурсы\IO) Я проверил у себя - 3FE читается 34 30 ...
     
  6. CodeWorm

    CodeWorm New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2004
    Сообщения:
    11
    Адрес:
    Russia
    Kola,

    pIrp = IoBuildDeviceIoControlRequest(IOCTL_SERIAL_GET_MODEMSTATUS, pSerialDevice, NULL, 0, &ModemStatus, 4, FALSE, NULL, &Iosb);

    IoCallDriver(pSerialDevice, pIrp);

    меня не устраивает, т.к. код выполняется на IRQL>DISPATCH_LEVEL
     
  7. CodeWorm

    CodeWorm New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2004
    Сообщения:
    11
    Адрес:
    Russia
    The Svin, через in и READ_PORT_UCHAR возвращает 0xFF. Регистр статуса однозначно 0x3FE...
     
  8. The Svin

    The Svin New Member

    Публикаций:
    0
    Регистрация:
    6 июл 2003
    Сообщения:
    665
    Адрес:
    Russia
    Значит FF там и есть.
     
  9. CodeWorm

    CodeWorm New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2004
    Сообщения:
    11
    Адрес:
    Russia
    Может сам UART настроен так? Через IoCallDriver выдает реальное значение, а вот in al,dx - 0xFF.

    В исходнике родного драйвера serial сказано что значение 0xFF возвращается если не было прерывания или занато.

    Что делать?
     
  10. Kola

    Kola New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2004
    Сообщения:
    69
    возможно единственный выход - это редизайн, штобы нужный код (IoCallDriver) вызывался на низком IRQL



    неприятно конечно, но...
     
  11. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
  12. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
  13. The Svin

    The Svin New Member

    Публикаций:
    0
    Регистрация:
    6 июл 2003
    Сообщения:
    665
    Адрес:
    Russia
    Т.е. идёт высокий импенданс как я и предположил.
     
  14. CodeWorm

    CodeWorm New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2004
    Сообщения:
    11
    Адрес:
    Russia
    Спасибо всем огромное.

    С наилучшими пожеланиями CodeWorm.
     
  15. Vitaliy

    Vitaliy New Member

    Публикаций:
    0
    Регистрация:
    24 дек 2005
    Сообщения:
    2
    Адрес:
    Russia
    а можно по поддробней для чайников.

    у меня такая же проблемма. мне в инсте задание дали написать драйвер для прямого доступа к регистрам com-порта а они не читаются (0хff) на всех читаемых портах.

    последнии ссылки из темы пустые.
     
  16. Vitaliy

    Vitaliy New Member

    Публикаций:
    0
    Регистрация:
    24 дек 2005
    Сообщения:
    2
    Адрес:
    Russia
    по моему в порты и запись тоже не происходит по скольку прирывания не происходят
     
  17. Shtasik

    Shtasik New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    13
    ЕЩЕ актуально кому-нибудь?
     
  18. alutov

    alutov New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    5
    Может еще кому-то актуально. Сам когда-то разбирался, но информации нигде не нашел, пришлось копать самому.
    Последовательный порт, в отличие от параллельного, практически на всех машинах поддерживает управление электропитанием. В IDLE MODE последовательный порт выключен, поэтому доступа к его регистрам нет, прерывание порта тоже выключено (точнее не назначено). При открытии порта драйвер SERIAL вызывает драйвер ACPI, который включает порт и назначает прерывание. Простейший вариант - работать через драйвер. Второй вариант - открыть порт через драйвер, работать напрямую, потом закрыть порт. Последний (извращенный, но работающий) вариант,
    когда нужен полный доступ с прерыванием - читаю параметры нужного порта из реестра Registry\Machine\Hardware\Description\System\MultifunctionalAdapter\xxx\SerialController\x\ConfigurationData, получаю вектор прерывания по номеру из реестра (HalGetInterruptVector), подключаюсь к драйверу SERIAL0 или SERIAL1 (IoGetDeviceObjectPointer), посылаю драйверу IRP "SURPRISE_REMOVE"( другие IRP не помогают остановить драйвер мимо диспетчера в/в), потом отключаюсь (ObDereferenceObject). Теперь система порт не видит до следующей перезагрузки, порт, ясное дело, выключен. Только после остановки дравера SERIAL я могу подключиться к прерыванию порта. Осталось только включить порт. Ничего другого не придумал, как работать напрямую с регистрами ACPI. Код может работать не на всех машинах, тем не менее:

    Код (Text):
    1.              mov  edx,2eh            ;адрес регистра ACPI - может быть 370h, 3f0h
    2.     mov  ebx,[PortAddr]   ;адрес com порта
    3.     xor  ecx,ecx              ;логический номер устройства ACPI
    4. PortEnable1:
    5.     inc  cl
    6.     cmp  cl,7                  ; ищем в промежутке 1...7
    7.     jnc  PortEnablex
    8.     mov  al,055h             ; открываем доступ к регистрам ACPI
    9.     out  dx,al                   
    10.     jmp  short $+2
    11.     mov  al,87h
    12.     out  dx,al                   ;reset ACPI
    13.     jmp  short $+2
    14.     out  dx,al                   ;reset ACPI
    15.     jmp  short $+2
    16.     mov  al,7                  ;команда адреса
    17.     out  dx,al 
    18.     jmp  short $+2
    19.     inc  edx                    ;на регистр данных
    20.     mov  al,cl                
    21.     out  dx,al                    ;пишем адрес
    22.     jmp  short $+2
    23.     dec  edx
    24.     mov  al,61h               ;команда младшего адреса порта
    25.     out  dx,al 
    26.     jmp  short $+2
    27.     inc  edx
    28.     in   al,dx                   ;читаем младший адрес
    29.     dec  edx
    30.     cmp  al,bl                 ;совпадает с нашим портом?
    31.     jnz  PortEnable1        ;нет, не наше устройство
    32.     mov  al,60h             ;команда старшего адреса порта
    33.     out  dx,al 
    34.     jmp  short $+2
    35.     inc  edx
    36.     in   al,dx                 ;читаем
    37.     dec  edx
    38.     cmp  al,bh               ;совпадает с нашим портом?
    39.     jnz  PortEnable1       ;нет, не наше устройство
    40. ; устройство найдено
    41.     mov  al,70h             ;команда прерывания порта
    42.     out  dx,al 
    43.     jmp  short $+2
    44.     inc  edx
    45.     mov  eax,[PortInt]    ;номер прерывания из реестра
    46.     out  dx,al                  ;устанавливаем
    47.     jmp  short $+2
    48.     dec  edx
    49.     mov  al,30h             ;команда enable device
    50.     out  dx,al 
    51.     jmp  short $+2
    52.     inc  edx
    53.     mov  al,1               ;открываем устройство
    54.     out  dx,al 
    55.     jmp  short $+2
    56.     dec  edx
    57.     xor  ecx,ecx
    58. PortEnablex:
    59.     mov  al,0aah           ;закрываем доступ к регистрам ACPI
    60.     out  dx,al 
    61.              ret
    Уточнение: это регистры не ACPI, а PNP принадлежат микросхеме ввода-вывода, поэтому могут быть разными на разных чипах.
     
  19. BOFH

    BOFH New Member

    Публикаций:
    0
    Регистрация:
    24 сен 2008
    Сообщения:
    1
    Может кто нибудь подсказать, как с помощью драйвера ACPI включить COM порт и назначить прерывание?

    PS: У меня та же проблема что и у CodeWorm (READ_PORT_UCHAR из регистра 0x3FB порта COM1 выдает 0xFF), но к сожалению ссылки Four-F:

    http://www.wasm.ru/forum/index.php?action=vthread&forum=3&topic=5013

    и

    http://www.wasm.ru/forum/index.php?action=vthread&forum=7&topic=1110
    http://www.wasm.ru/forum/index.php?action=vthread&forum=4&topic=1237
    http://www.wasm.ru/forum/index.php?action=vthread&forum=4&topic=4062

    не работают.

    Заранее благодарю