Заметил такую штуковину. Написал драйвер PS/2 мышки. Но при этом на моём компьютере есть опция BIOS "USB Mouse Support". Если её поставить в "Enabled", то после попытки включения мыши отваливается PS/2-клавиатура (не приходят прерывания). Если её поставить в "Disabled", то мыша успешно не обнаруживается, и драйвер клавиатуры работает как надо. Собственно, вопрос: при включении мыши я выполняю следующую последовательность команд: Код (Text): TBYTEPort data = FPort[KBC_REG_DATA]; // data = port 0x60 TBYTEPort cmd = FPort[KBC_REG_CMD]; // cmd = port 0x61 TBYTEPort aux = FPort[KBC_REG_AUX]; // aux = port 0x64 TIntHandler::ClearInterrupts(); // cli BYTE old_cmd; // Remember old CMD register WaitController(); aux << KBC_REG_AUX_RD_CMD; // aux << 0x20 data >> old_cmd; // Write command register WaitController(); aux << KBC_REG_AUX_WR_CMD; // aux << 0x60 if (enable) cmd << (old_cmd | 0x02); // setup mouse interrupt else cmd << (old_cmd & 0xfd); // deny mouse interrupt // Allow mouse data transfer WaitController(); aux << KBC_REG_AUX_KBD_TOMOUSE; // aux << 0xd4 WaitController(); if (enable) cmd << PS2MOUSE_ENABLE; // cmd << 0xf4 else cmd << PS2MOUSE_DISABLE; // cmd << 0xf5 TIntHandler::SetupInterrupts(); // sti При этом, эмулируемая как PS/2 USB-мышка не всегда работает. В чём может быть ошибка?
Ты включаешь "USB Mouse Support", и оставляешь мышь в гнезде PS/2? Это бессмысленно, и скорее всего правильно, что глючит.
Нет, у меня USB мышка. И если включить USB Mouse Support, то она ведёт себя как PS/2, но почему-то из-за этого вешается клава. Меня этот вопрос и интересует, собственно. Chizh, я в топике написал USB Mouse -> PS/2 Mouse, думая, что поймёте, что речь идёт о USB Mouse, которая эмулируется как PS/2.
в ответ на Код (Text): aux << KBC_REG_AUX_RD_CMD; // aux << 0x20 data >> old_cmd; придет ответ о приеме команды или не приеме и прочее значения, а не придыдущая команда. Собственно в этом и ошибка дальше логика построенна не верно. Собственно ошибка сточкой ниже Код (Text): aux << KBC_REG_AUX_WR_CMD; // aux << 0x60 if (enable) cmd << (old_cmd | 0x02); // setup mouse interrupt else cmd << (old_cmd & 0xfd); // deny mouse interrupt Я чето ничего не найду про установку мышиных прерываний ты это откуда выкапал?
На самом деле, это команда выдачи содержимого командного регистра. Делал по книжке Кулакова "программирование на аппаратном уровне". Здесь меняется бит командного регистра, отвечающий за прерывания мыши.
SadKo А поня, попутал малость. Бит номер 0 отличает за прерывание от клавиотуры, а 1 на прерывания мыши. Попробуй выставить оба.
Попробовал устанавливать бит 1 при включении и сбрасывать при выключении. Клава в qemu перестала реагировать. Наверное, надо это делать после посылки команды включения/выключения клавиатуры.