Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Программирование клавиатуры  (Прочитано 10833 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« : 12-09-2007 06:44 » 

Думал в какой раздел поместить данную тему и решил в этот, все таки эта тема намного ближе к ассемблеру. Хотя я думаю, что администраторы простят меня за то, что я привожу примеры кода на 'C', т.к. код на 'C' более понятен и в меньшей степени затеняет смысл самого вопроса чем код на ассемблере.

Есть такая функция обрабатывающая прерывание от клавиатуры (IRQ 1):
Код:
void irq_keyboard(void)
{
char scan,tmp;
/* получаем сканкод */
scan = inb(0x60);
/* проводим его обработку */
...
/********************************/
/* вот эта часть мне не понятна */
/********************************/
/* через порт 0x61 отключают клавиатуру */
tmp = inb(0x61);
outb(tmp|0x80,0x61);
/* затем обратно включают */
outb(tmp,0x61);
/********************************/

/* сброс контроллера прерываний */
outb(0x20,0x20);
}
Вопрос вот в чем, зачем через порт 0x61 выключают а затем включают клавиатуру. (Основная цель использования порта 0x61 управление встроеным динамиком.) Ведь он позволяет управлять клавиатурой только для совместимости со старыми моделями. Сейчас для управления клавиатурой используется порт 0x64.

Да и вообще мне непонятна последовательность отключения с последующим включением клавиатуры при обработки полученного от нее прерывания. Я пробовал и без данной последовательности обрабатывать прерывания от нее и не каких различий и артифактов замеченно небыло (что отключай, что не отключай одно и тоже).

И что самое интересное, данная последовательность пресутствует во всех кодах которые я просматривал, даже в ядре Linux-2.4.x . У меня складывается впечетление, что все просто копируют то что видят в linux-0.01 и все.

А может я просто ошибаюсь и эту последовательность действительно желательно производить при обработке прерывания от клавиатуры. Кто знает где здесь истина, подскажите. Еще раз повторюсь, я пробовал обрабатывать прерывания от клавиатуры с отключением и последующим включение так и без онного, РАЗНИЦЫ НЕ КАКОЙ.
Записан
Tuborg
Модератор

ee
Offline Offline

« Ответ #1 : 12-09-2007 07:42 » 

Это управляющий порт. Запись 1 в старший бит порта - блокирует клавиатуру, 0 - разблокирует... на этом управляющем порте также заведены другие устройства (ты упомянул - динамик ). Блокировка здесь происходит в понятии регистра защёлки. То бишь меняя фронт (1/0) ты производишь запись из регистра данных в памяти портов, непосредственно в сам порт. Это всё касаемо AT/XT архитктуры. Сейчас клавиатура работает несколько иначе. Можешь смело обходится без тактирования защёлки, но к чему это приведёт на других клавиатурах - сразу и не скажешь... в линухе не зря эту часть оставили - "разрешили" пользоваться старыми контроллерами клавиатур.
Записан
Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 12-09-2007 08:48 » 

Понятно, значит это используется для совместимости со старым железом. Если старое железо не используется, можно не играть с портом 0x61.
Записан
Tuborg
Модератор

ee
Offline Offline

« Ответ #3 : 12-09-2007 10:49 » 

не используй то что не работает =)
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines