Всем привет! Подскажите пожалуйста, как по человечески произвести инициализацию mouse PC/2 и иже с нею связанных устройств, дабы её можно было эксплуатировать в защищенном режиме? Ситуация такова: существует маленькая программка на ассемблере запускаемая под MS-DOS, переключающая CPU в защищенный режим и передающая управление сегменту 32-битного кода. В данном сегменте находится самодельный драйвер мыши включающий в себя процедуры инициализации, деинициализации и обработчик прерывания irq12. Пример "драйвера" позаимствован из книги Владимира Кулакова "Программирование на аппаратном уровне". Но, похоже, пример сильно урезан, так-как в одном случае он работает, а в другом - нет. Понятно, что в данном случае мы имеем дело с контроллером мыши, контроллером клавиатуры (i8042) и контроллером прерываний (i8259). Хотелось бы понять, что и в какой последовательности необходимо настроить, чтобы обработчик irq12 начал получать управление и при этом не зависала бы клавиатура!!! Заранее благодарен за ответ!!!
8042 -- НЕ контроллер клавиатуры. Это контроллер ИНТЕРФЕЙСА PS/2, установленный на материнке. А контроллер клавиатуры находится в самой клавиатуре и НИКАКОГО отношения к 8042 не имеет. У Кулакова описание 8042 достаточно кривое. Более-менее приличное я в своё время написал на осдевовской википедии: http://ru.osdev.wikia.com/wiki/Контроллер_интерфейса_PS/2. Мышу я не писал и в обозримом будущем не буду, так что ответить конкретно про неё вряд ли что-то смогу. Контроллер прерываний, конечно, стоит АПИК, но он рабтает в режиме совместимости с обычной спаркой 8259, пока его не переключат в собственно АПИКовский режим. Так что пока можно смело опираться на 8259. Порядок настройки: 8259, 8042, контроллеры устройств, подключенных через ПС/2 (т.е. клавы и мыши).
GreatSII А по моему в компе стоят оба APIC и PIC и тригер который переключает между ними. И никакой эмуляции.
dess Мышей много. В Линуксе если не ошибаюсь поддерживается 12 протоколов. Клавиатура при правильной настройки не должна зависать. Во общем 8042 проработан хорошо и много нюансов учтено и обрабатываются самим контроллером. Это я к тому что просто так повесить еще постараться надо.
Pavia Нет, стоит только APIC, просто он способен работать в режиме эмуляции. Точней говоря, сам APIC состоит, как Вы знаете, из двух частей. LocalAPIC является частью каждого логического процессора и используется для связи между процессорами, а также для приёма запросов прерываний от I/O APICа. Ну а последний и является заменой традиционному PICу: на его входы поступают запросы прерываний от внешних устройств (линии IRQ), а выходы подаются на входы LocalAPICов. Когда он работает в "родном" режиме, он "разруливает" поступающие запросы между несколькими логическими процессорами, передавая их на обработку разным LocalAPICам, ну а когда в режиме совместимости с PICом -- передаёт все запросы прерываний только одному процессору (тому самому, который выполняет код BIOS при запуске компутера, на котором выполняется код начального загрузчика и т.п.).
SII А если маны почитать? Там негде про эмуляцию не сказано. Так что это ваши фантазии. Там четко говорится о наличии PIC и IO APIC.
О..., старина Pavia! Рад читать! Да, в книжице Кулакова примеры сильно упрощенны. И это мягко сказано Почитав труды SII я обнаружил, что опять столкнулся с той же проблемой, что была и с HDD: неправильная интерпретация флагов готовности устройства. В моем случае эти проверки практически отсутствуют и всё возлагается на волю случая. Сейчас я подкорректирую свой код и отпишусь о результатах. Мышь у меня, я так понимаю, обычная, самая дешевая, двухкнопочная с колесиком. Я ожидаю от нее пакет стандартного трехбайтного формата. Но с учетом того, что мышей и форматов много, встает вопрос: а как тогда определить тип подключенного устройства и как добиться от него потока данных в стандартном формате?
Нету там 12 протоколов, их меньше намного. Если рассматривать только PS/2 мышь - она ВСЕГДА после сброса работает в стандартном режиме с трёхбайтовыми пакетами. Расширенные режимы включаются посылкой "магических" последовательностей команд. К примеру у тебя скролл в стандартном режиме будет работать просто как средняя кнопка (нажата/не нажата). Чтобы получать состояние скролла как Z-координату надо включить расширенный протокол.
Пацаны!!! Зашибись! Мне кажется, что всё заработало! Огромное спасибо за ваши советы. Мышь успешно доинициализироваллась. Обработчик irq12 завелся с пол-оборота и прекрасно получает данные от мыши. Ни система ни клавиатура не виснут. Не знаю, как на счет универсальности и "полит-корректности", но в моем случае результат достигнут. Еще раз всем спасибо! Вот, что я сделал: Код (ASM): ; размаскировал прерывания irq12 in al,0xA1 and al,11101111b out 0xA1,al ; разрешил работу мыши и генерацию ею irq12 call <ожидание_освобожнения_буффера> mov al,0x20 out 0x64,al call <ожидание_готовности_данных> in al,0x60 mov ah,al call <ожидание_освобожнения_буффера> mov al,0x60 out 0x64,al call <ожидание_освобожнения_буффера> mov al,ah or al,00000010b and al,11011111b out 0x60,al ; раззрешил передачу данных от мыши call <ожидание_освобожнения_буффера> mov al,0xD4 out 0x64,al call <ожидание_освобожнения_буффера> mov al,0xF4 out 0x60,al ret ;ожидание_освобожнения_буффера>: mov ecx,0xFFFFFFFF .01: in al,0x64 test al,2 loopnz .01 jnz <ошибка_таймаута> ret ;ожидание_готовности_данных>: mov ecx,0xFFFFFFFF .01: in al,0x64 test al,1 loopz .01 jz <ошибка_таймаута> ret