Работа с COM-портом из драйвера

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

  1. Smoke_man

    Smoke_man New Member

    Публикаций:
    0
    Регистрация:
    19 сен 2006
    Сообщения:
    16
    При запуске драйвера нужно установить в 0 сигнал RTS у COM-порта. В функции DriverEntry следующий код:
    Код (Text):
    1.            _asm
    2.     {  
    3.                    mov dx,03fbh //Установка бита DLAB и настройка скорости порта
    4.             mov al,80h
    5.                                   out dx,al
    6.                                   sub dx,3
    7.             mov al,0ch   // Младшая часть скорости
    8.             out dx,al
    9.             dec dx
    10.             xor al,al    //Старшая часть скорости
    11.             out dx,al
    12.             mov dx,03fbh // Настройка  регистра контроля
    13.             mov al,00011011b
    14.             out dx,al
    15.             mov dx,03f9h  //Настройка прерывания
    16.             mov al,0
    17.             out dx,al
    18.             mov dx,03fch  //Сброс RTS
    19.             mov al,00000000b
    20.             out dx,al
    21.     }
    Но это не работает. Подскажите в чем может быть ошибка? Может есть другое решение этой задачи? Спасибо!
     
  2. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    вместо sub dx,3
    sub dx,2

    вместо mov dx,03fbh // Настройка регистра контроля
    нужно mov dx,03fсh // Настройка регистра контроля

    Перед настройкой прерывания DLAB нужно в 0 установить
     
  3. Smoke_man

    Smoke_man New Member

    Публикаций:
    0
    Регистрация:
    19 сен 2006
    Сообщения:
    16
    В документации по настройке Com-порта написано, что за младшее слово скорости порта отвечает порт с адресом 0x3f8, следовательно 0x3fb-0x3 = 0x3f8.
    Там же написано,что line control register находиться по адресу 0x3fb.
    DLAB я сбрасываю вот этими строчками:
    Код (Text):
    1. mov al,00011011b
    2. out dx,al
    так как DLAB находиться в старшем бите line control register.
     
  4. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Smoke_man
    Коментарии у тебя не охти. Но у тебя после заполнения младшей иде dec dx, а нужно inc а то заприделы уходят.
     
  5. Smoke_man

    Smoke_man New Member

    Публикаций:
    0
    Регистрация:
    19 сен 2006
    Сообщения:
    16
    Вот с этим полностью согласен! Завтра на работе протестирую! Спасибо!
     
  6. Smoke_man

    Smoke_man New Member

    Публикаций:
    0
    Регистрация:
    19 сен 2006
    Сообщения:
    16
    после теста ничего не изменилось, теперь код выглядит так:
    Код (Text):
    1.  _asm
    2.     {  
    3.             mov dx,03fbh //Установка бита DLAB и настройка скорости порта
    4.             mov al,80h
    5.             out dx,al
    6.             sub dx,3
    7.             mov al,0ch   // Младшая часть скорости
    8.             out dx,al
    9.             inc dx       //dec dx
    10.             xor al,al    //Старшая часть скорости
    11.             out dx,al
    12.             mov dx,03fbh // Настройка  регистра контроля
    13.             mov al,00011011b
    14.             out dx,al
    15.             mov dx,03f9h  //Настройка прерывания
    16.             mov al,0
    17.             out dx,al
    18.             mov dx,03fch  //Сброс RTS
    19.             mov al,00000000b
    20.             out dx,al
    21.     }
     
  7. alutov

    alutov New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    5
    http://www.wasm.ru/forum/viewtopic.php?id=8096