Считывание состояния Num, Caps, Scroll через порты I/O

Тема в разделе "WASM.BEGINNERS", создана пользователем Subrealist, 21 сен 2007.

  1. Subrealist

    Subrealist Member

    Публикаций:
    0
    Регистрация:
    17 июл 2006
    Сообщения:
    134
    Здравствуйте!
    Собрал простенький примерчик переключения LEDs индикаторов на клавиатуре. Про то, как это делается, много где написано. Но про то, как считать их состояние, работая с портами ввода/вывода контроллера i8042, для возврата в начальное состояние, никак найти не могу. Программка работает как драйвер режима ядра под NT 5.1. Подскажите, как решить данную задачу, используя порты ввода/вывода или состояние некой ячейки памяти, как это было в в DOS, не прибегая к экспорту каких либо функций.
    С уважением
    Subrealist
     
  2. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    так в ядре можно напрямую использоваться in\out
     
  3. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Здесь задавали подобный вопрос.
     
  4. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    rain
    он про то что в дос был байт состояния индикаторов. in-out не при чем
     
  5. Subrealist

    Subrealist Member

    Публикаций:
    0
    Регистрация:
    17 июл 2006
    Сообщения:
    134
    Mika0x65
    Благодарю за помощь.
    Одно из решений там есть.
    Но оно касается использования функций ядра.
    Хотелось бы, хотя бы из чистого любопытства, узнать, можно ли решить эту задачу не прибегая к импорту
     
  6. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    Great
    невнимательно прочитал, сорри
    Mika0x65
    там не то
    Subrealist
    а почему бы и нет?
    посомотри АРХИТЕКТУРА ВВОДА-ВЫВОДА ПЕРСОНАЛЬНЫХ ЭВМ IBM PC. раздел 6.2 Клавиатура IBM PC AT
     
  7. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Subrealist
    Могу предложить еще вот эту ссылку. Беда в том, что я абсолютно не помню, как читать LEDs, помню только ссылки :dntknw:.
     
  8. Subrealist

    Subrealist Member

    Публикаций:
    0
    Регистрация:
    17 июл 2006
    Сообщения:
    134
    rain
    Mika0x65
    Благодарю
    Ищу по ссылкам. Результат напишу
     
  9. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    ищи там порт 064h, комманда 0edh в файле KeyboardFAQ.zip (The Keyboard Interface Tutorial)
     
  10. Subrealist

    Subrealist Member

    Публикаций:
    0
    Регистрация:
    17 июл 2006
    Сообщения:
    134
    rain
    Команда 0edh на 064h порту переключает светодиоды. В псевдодрайвере я использовал именно её, только на 60h.
    Port 60h is for writing data and is maintained for compatibility with
    earlier models. If the examples using port 64h don't work, try using 60h.
    Переключение работает. Требуется сохранить первоначальное состояние для последующего востановления
     
  11. Subrealist

    Subrealist Member

    Публикаций:
    0
    Регистрация:
    17 июл 2006
    Сообщения:
    134
    Скачал исходник pnpi8042. Попробую разобраться, как это рашается там
     
  12. Subrealist

    Subrealist Member

    Публикаций:
    0
    Регистрация:
    17 июл 2006
    Сообщения:
    134
    Поправте, если я что понял не так
    Как я понял, если и есть возможность считать данные о состоянии светодиодов клавиатуры пользуясь портами ввода/вывода, то найти информацию о ней трудно. Свидетельство тому - масса примеров, как изменить их состояние через запись в порты 60h, 64h команды 0edh, но примеров считывания их состояния через порты мне найти не удалось. В досе для получения их состояния использовалось слово в сегменте данных BIOS по адресу 0417h. В Windows информация о состоянии LEDs храниться в элементе
    Extension->KeyboardIndicators.LedFlags объекта драйвера клавиатуры. Его значение инициализируется данными по умолчанию, используется для установки LEDs и изменяясь драйвером при нажатии соответствующих клавишь, используется для изменения состояния LEDs.
     
  13. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Дык может их просто нельзя прочитать, а только записать через порты? А прочитать через дров можно потому, что он их запоминает при изменении... хотя это лишь гипотеза. лень рыться
     
  14. Subrealist

    Subrealist Member

    Публикаций:
    0
    Регистрация:
    17 июл 2006
    Сообщения:
    134
    Great
    Наверное, так и есть. Драйвер как раз запомненное в его объекте значение и выдаёт. В досе тоже обработчик прерывания клавиатуры с запомненным значением работал. Хотелось более точно определиться с отсутствием такой возможности
     
  15. AndNot

    AndNot New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2007
    Сообщения:
    49
    Все верно. Нельзя прочитать ни состояние светодиодов, но и настроек клавиатуры. Именно поэтому состояние и хранится в памяти.
    Сам одно время искал, как считать статус и настройки, но вообще ничего не нашел, по крайней мере, в официальных доках подобные возможности даже не упоминаются. Да и исследование виндозных дров ничего не дали.
     
  16. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    Subrealist
    Может быть это поможет. "Цветомузыка на CapsLock, NumLock и ScrollLock" в аттаче сорц и ехе