Mouse PC/2 в зазщищенном режиме

Тема в разделе "WASM.ASSEMBLER", создана пользователем dess, 9 янв 2010.

  1. dess

    dess New Member

    Публикаций:
    0
    Регистрация:
    22 авг 2008
    Сообщения:
    46
    Всем привет!

    Подскажите пожалуйста, как по человечески произвести инициализацию mouse PC/2 и иже с нею связанных устройств, дабы её можно было эксплуатировать в защищенном режиме?

    Ситуация такова: существует маленькая программка на ассемблере запускаемая под MS-DOS, переключающая CPU в защищенный режим и передающая управление сегменту 32-битного кода. В данном сегменте находится самодельный драйвер мыши включающий в себя процедуры инициализации, деинициализации и обработчик прерывания irq12.
    Пример "драйвера" позаимствован из книги Владимира Кулакова "Программирование на аппаратном уровне". Но, похоже, пример сильно урезан, так-как в одном случае он работает, а в другом - нет.
    Понятно, что в данном случае мы имеем дело с контроллером мыши, контроллером клавиатуры (i8042) и контроллером прерываний (i8259).
    Хотелось бы понять, что и в какой последовательности необходимо настроить, чтобы обработчик irq12 начал получать управление и при этом не зависала бы клавиатура!!!

    Заранее благодарен за ответ!!!
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    поправка: в современных компах их уже давно не ставят. см. Local APIC, I/O APIC.
     
  3. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    8042 -- НЕ контроллер клавиатуры. Это контроллер ИНТЕРФЕЙСА PS/2, установленный на материнке. А контроллер клавиатуры находится в самой клавиатуре и НИКАКОГО отношения к 8042 не имеет.

    У Кулакова описание 8042 достаточно кривое. Более-менее приличное я в своё время написал на осдевовской википедии: http://ru.osdev.wikia.com/wiki/Контроллер_интерфейса_PS/2. Мышу я не писал и в обозримом будущем не буду, так что ответить конкретно про неё вряд ли что-то смогу.

    Контроллер прерываний, конечно, стоит АПИК, но он рабтает в режиме совместимости с обычной спаркой 8259, пока его не переключат в собственно АПИКовский режим. Так что пока можно смело опираться на 8259.

    Порядок настройки: 8259, 8042, контроллеры устройств, подключенных через ПС/2 (т.е. клавы и мыши).
     
  4. dess

    dess New Member

    Публикаций:
    0
    Регистрация:
    22 авг 2008
    Сообщения:
    46
    Great и SII
    Благодарю за ответ, начал штудировать приведенные вами ссылочки!
     
  5. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    GreatSII

    А по моему в компе стоят оба APIC и PIC и тригер который переключает между ними. И никакой эмуляции.
     
  6. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    dess
    Мышей много. В Линуксе если не ошибаюсь поддерживается 12 протоколов.
    Клавиатура при правильной настройки не должна зависать. Во общем 8042 проработан хорошо и много нюансов учтено и обрабатываются самим контроллером. Это я к тому что просто так повесить еще постараться надо.
     
  7. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    Pavia
    Нет, стоит только APIC, просто он способен работать в режиме эмуляции. Точней говоря, сам APIC состоит, как Вы знаете, из двух частей. LocalAPIC является частью каждого логического процессора и используется для связи между процессорами, а также для приёма запросов прерываний от I/O APICа. Ну а последний и является заменой традиционному PICу: на его входы поступают запросы прерываний от внешних устройств (линии IRQ), а выходы подаются на входы LocalAPICов. Когда он работает в "родном" режиме, он "разруливает" поступающие запросы между несколькими логическими процессорами, передавая их на обработку разным LocalAPICам, ну а когда в режиме совместимости с PICом -- передаёт все запросы прерываний только одному процессору (тому самому, который выполняет код BIOS при запуске компутера, на котором выполняется код начального загрузчика и т.п.).
     
  8. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    SII
    А если маны почитать? Там негде про эмуляцию не сказано. Так что это ваши фантазии. Там четко говорится о наличии PIC и IO APIC.
     
  9. dess

    dess New Member

    Публикаций:
    0
    Регистрация:
    22 авг 2008
    Сообщения:
    46
    О..., старина Pavia! Рад читать!
    Да, в книжице Кулакова примеры сильно упрощенны. И это мягко сказано :) Почитав труды SII я обнаружил, что опять столкнулся с той же проблемой, что была и с HDD: неправильная интерпретация флагов готовности устройства. В моем случае эти проверки практически отсутствуют и всё возлагается на волю случая. Сейчас я подкорректирую свой код и отпишусь о результатах. Мышь у меня, я так понимаю, обычная, самая дешевая, двухкнопочная с колесиком. Я ожидаю от нее пакет стандартного трехбайтного формата. Но с учетом того, что мышей и форматов много, встает вопрос: а как тогда определить тип подключенного устройства и как добиться от него потока данных в стандартном формате?
     
  10. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Нету там 12 протоколов, их меньше намного.
    Если рассматривать только PS/2 мышь - она ВСЕГДА после сброса работает в стандартном режиме с трёхбайтовыми пакетами.
    Расширенные режимы включаются посылкой "магических" последовательностей команд.
    К примеру у тебя скролл в стандартном режиме будет работать просто как средняя кнопка (нажата/не нажата).
    Чтобы получать состояние скролла как Z-координату надо включить расширенный протокол.
     
  11. dess

    dess New Member

    Публикаций:
    0
    Регистрация:
    22 авг 2008
    Сообщения:
    46
    Пацаны!!! Зашибись! Мне кажется, что всё заработало!

    Огромное спасибо за ваши советы. Мышь успешно доинициализироваллась. Обработчик irq12 завелся с пол-оборота и прекрасно получает данные от мыши. Ни система ни клавиатура не виснут. Не знаю, как на счет универсальности и "полит-корректности", но в моем случае результат достигнут. Еще раз всем спасибо!

    Вот, что я сделал:
    Код (ASM):
    1. ; размаскировал прерывания irq12
    2. in al,0xA1
    3. and al,11101111b
    4. out 0xA1,al
    5. ; разрешил работу мыши и генерацию ею irq12
    6. call <ожидание_освобожнения_буффера>
    7. mov al,0x20
    8. out 0x64,al
    9. call <ожидание_готовности_данных>
    10. in al,0x60
    11. mov ah,al
    12. call <ожидание_освобожнения_буффера>
    13. mov al,0x60
    14. out 0x64,al
    15. call <ожидание_освобожнения_буффера>
    16. mov al,ah
    17. or al,00000010b
    18. and al,11011111b
    19. out 0x60,al
    20. ; раззрешил передачу данных от мыши
    21. call <ожидание_освобожнения_буффера>
    22. mov al,0xD4
    23. out 0x64,al
    24. call <ожидание_освобожнения_буффера>
    25. mov al,0xF4
    26. out 0x60,al
    27. ret
    28. ;ожидание_освобожнения_буффера>:
    29. mov ecx,0xFFFFFFFF
    30. .01:
    31. in al,0x64
    32. test al,2
    33. loopnz .01
    34. jnz <ошибка_таймаута>
    35. ret
    36. ;ожидание_готовности_данных>:
    37. mov ecx,0xFFFFFFFF
    38. .01:
    39. in al,0x64
    40. test al,1
    41. loopz .01
    42. jz <ошибка_таймаута>
    43. ret
     
  12. Andkol

    Andkol New Member

    Публикаций:
    0
    Регистрация:
    24 янв 2023
    Сообщения:
    1
    СПАСИБО ДРУГ ЗА ПРОГРАММКУ.