USB Mouse -> PS/2 Mouse

Тема в разделе "WASM.OS.DEVEL", создана пользователем SadKo, 16 янв 2008.

  1. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.610
    Адрес:
    г. Санкт-Петербург
    Заметил такую штуковину. Написал драйвер PS/2 мышки. Но при этом на моём компьютере есть опция BIOS "USB Mouse Support". Если её поставить в "Enabled", то после попытки включения мыши отваливается PS/2-клавиатура (не приходят прерывания). Если её поставить в "Disabled", то мыша успешно не обнаруживается, и драйвер клавиатуры работает как надо.
    Собственно, вопрос: при включении мыши я выполняю следующую последовательность команд:
    Код (Text):
    1.         TBYTEPort data  = FPort[KBC_REG_DATA]; // data = port 0x60
    2.         TBYTEPort cmd   = FPort[KBC_REG_CMD]; // cmd = port 0x61
    3.         TBYTEPort aux   = FPort[KBC_REG_AUX]; // aux = port 0x64
    4.    
    5.         TIntHandler::ClearInterrupts(); // cli
    6.        
    7.         BYTE old_cmd;
    8.         // Remember old CMD register
    9.         WaitController();
    10.         aux  << KBC_REG_AUX_RD_CMD; // aux << 0x20
    11.         data >> old_cmd;
    12.    
    13.         // Write command register
    14.         WaitController();
    15.         aux  << KBC_REG_AUX_WR_CMD; // aux << 0x60
    16.         if (enable)
    17.             cmd  << (old_cmd | 0x02); // setup mouse interrupt
    18.         else
    19.             cmd  << (old_cmd & 0xfd); // deny mouse interrupt
    20.        
    21.         // Allow mouse data transfer
    22.         WaitController();
    23.         aux  << KBC_REG_AUX_KBD_TOMOUSE; // aux << 0xd4
    24.         WaitController();
    25.         if (enable)
    26.             cmd  << PS2MOUSE_ENABLE; // cmd << 0xf4
    27.         else
    28.             cmd  << PS2MOUSE_DISABLE; // cmd << 0xf5
    29.        
    30.         TIntHandler::SetupInterrupts(); // sti
    При этом, эмулируемая как PS/2 USB-мышка не всегда работает. В чём может быть ошибка?
     
  2. Chizh

    Chizh New Member

    Публикаций:
    0
    Регистрация:
    10 дек 2007
    Сообщения:
    23
    Ты включаешь "USB Mouse Support", и оставляешь мышь в гнезде PS/2? Это бессмысленно, и скорее всего правильно, что глючит.
     
  3. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.610
    Адрес:
    г. Санкт-Петербург
    Нет, у меня USB мышка. И если включить USB Mouse Support, то она ведёт себя как PS/2, но почему-то из-за этого вешается клава. Меня этот вопрос и интересует, собственно. Chizh, я в топике написал USB Mouse -> PS/2 Mouse, думая, что поймёте, что речь идёт о USB Mouse, которая эмулируется как PS/2.
     
  4. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    в ответ на
    Код (Text):
    1.         aux  << KBC_REG_AUX_RD_CMD; // aux << 0x20
    2.         data >> old_cmd;
    придет ответ о приеме команды или не приеме и прочее значения, а не придыдущая команда. Собственно в этом и ошибка дальше логика построенна не верно. Собственно ошибка сточкой ниже

    Код (Text):
    1.         aux  << KBC_REG_AUX_WR_CMD; // aux << 0x60
    2.         if (enable)
    3.             cmd  << (old_cmd | 0x02); // setup mouse interrupt
    4.         else
    5.             cmd  << (old_cmd & 0xfd); // deny mouse interrupt
    Я чето ничего не найду про установку мышиных прерываний ты это откуда выкапал?
     
  5. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.610
    Адрес:
    г. Санкт-Петербург
    На самом деле, это команда выдачи содержимого командного регистра.

    Делал по книжке Кулакова "программирование на аппаратном уровне".
    Здесь меняется бит командного регистра, отвечающий за прерывания мыши.
     
  6. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    SadKo
    А поня, попутал малость. Бит номер 0 отличает за прерывание от клавиотуры, а 1 на прерывания мыши. Попробуй выставить оба.
     
  7. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.610
    Адрес:
    г. Санкт-Петербург
    Попробовал устанавливать бит 1 при включении и сбрасывать при выключении. Клава в qemu перестала реагировать. Наверное, надо это делать после посылки команды включения/выключения клавиатуры.