понедельник, 6 июля 2009 г.

Почему иногда моя мышь/тач-пад становятся берсерком?

Это перевод Why does my mouse/touchpad sometimes go berzerk?. Автор: Реймонд Чен.

Поток данных оказался рассинхронизированным.

Каждый раз, когда вы двигаете PS/2 мышь, мышь посылает три байта в ваш компьютер. Для простоты объяснения, давайте скажем, что эти байты представляют x, y и кнопки.

Операционная система видит этот поток байт и группирует его в тройки:

x y b x y b x y b x y b

Теперь предположим, что кабель как-то перегнулся и один из y-ков потерялся. Поток данных теряет запись, но операционная система ничего не знает об этом и продолжает группировать байты по тройкам.

x y b x b x y b x y b x

Операционная система теперь не синхронизирована с мышью и начинает неверно интерпретировать поступающие данные. Она принимает "y b x" от мыши и рассматривает байт y как x-смещение, байт b как y-смещение, а x - как состояние кнопок. Результат: указатель мыши сходит с ума.

О, постойте-ка, ведь есть ещё мыши к колёсиком.

Когда операционная система загружается, она пытается определить, имеет ли PS/2 мышь колесо и уговаривает её переключиться в режим с колёсиком (вы можете запустить эти переговоры из Диспетчера Устройств). Если обе стороны согласились с наличием колеса, тогда мышь начинает генерировать четыре байта для каждого движения, которые теперь должны интерпретироваться так:

x y b w x y b w x y b w x y b w

Теперь всё становится действительно интересным, когда вы добавите в эту схему ноутбуки.

Многие ноутбуки имеют порт PS/2 для мыши (прим.пер.: ну, не современные, конечно, а ноутбуки того времени), в который вы можете воткнуть мышь на лету (прим.пер.: вообще-то, спецификация PS/2 не поддерживает горячее подключение). Когда это происходит, встроенное указующее устройство отключается, а вместо него используется PS/2 мышь. Это происходит исключительно внутри прошивки (firmware) ноутбука. Операционная система не имеет об этом никакого представления.

Предположим, что вы включили свой ноутбук с подключенной к PS/2 порту мышью с колёсиком. Вы этом случае, когда операционная система общается с мышью, она видит колесо и переключает мышь в режим с колесом, ожидая (и получая) четырёх-байтовые пакеты.

Теперь вы выдёргиваете мышь и ноутбук переключается на тач-пад (touchpad), и предположим, что ваш тач-пад не имеет колеса. Поэтому тач-пад плюётся трёх-байтовыми мышиными пакетами, когда вы его используете. Ой-ёй, теперь у нас действительно полный хаос.

Тач-пад шлёт трёх-байтовые пакеты, операционная система думает, что она говорит с той самой изначально воткнутой мышью и ждёт четырёх-байтовых пакетов.

Вы можете представить, к какому хаосу это приведёт.

Мораль истории: если вы хотите воткнуть мышь в порт PS/2 при работающем ноутбуке, у вас есть несколько вариантов.
  • Всегда используйте мышь без колеса, так что вы может втыкать и вытыкать её без проблем, потому что и безколёсная мышь и тач-пад будут слать трёх-байтовые пакеты.
  • Если вы включили ноутбук без воткнутой мыши, то просто втыкайте любую мышь. Втыкание безколёсной мыши безопасно, потоу что она генерирует трёх-байтовые пакеты - так же, как и тач-пад. А втыкание мыши с колесом безопасно потому, что мышь не прошла переговоры с операционной системе о наличии колеса и будет работать в режиме совместимости (т.е. она притвориться, что у неё нет колеса). В этом случае, мышь будет работать, но вы теряете колёсико.
  • Если вы включили ноутбук с подключенной мышью с колёсиком - никогда не выдёргивайте её, поскольку тогда получит управление тач-пад, посылающий трёх-байтовые пакеты, и мышь станет берсерком.
Вероятно, простейшим решением будет полностью избегать мыши PS/2 и просто использовать USB-мышь. Это полностью избавляет от проблем с переключением порта PS/2 в ноутбуке.

2 комментария:

  1. Забавно, я не раз встречал упоминания о том, что мышку подключают к PS/2 порту при включенном компьютере, несмотря на то, что спецификация не поддерживает горячей замены. Хотя, мои собственные эксперименты пару раз подвесили компьютер при попытке повторить этот подвиг. =(

    ОтветитьУдалить
  2. Есть мнение, что производители ноутбуков с разъёмом PS/2 просто пошли дальше стандарта.
    Если отсутствие горячего подключение ещё приемлемо для десктопа (ты же не дёргаешь мышь каждый день из порта), то совершенно неприемлемо для ноутбука, потому что ты выдёргиваешь мышь, когда собираешся убрать ноут в сумку.
    В вики есть такие слова про hot swappable:

    Hot swapping PS/2 devices usually does not cause damage due to the fact that more modern microcontrollers tend to have more robust I/O lines built into them which are harder to damage than those of older controllers.
    If they are hotswapped, the devices must be similar enough that the driver running on the host system recognizes, and can be used with the new device. Otherwise, the new device will not function properly. While this is seldom an issue with standard keyboard devices, the host system rarely recognizes the new device attached to the PS/2 mouse port. In practice most keyboards can be hotswapped but this should be avoided.

    Т.е. основная проблема в некачественном железе и отсутствии возможности определить момент втыка для некоторых устройств.

    ОтветитьУдалить

Можно использовать некоторые HTML-теги, например:

<b>Жирный</b>
<i>Курсив</i>
<a href="http://www.example.com/">Ссылка</a>

Вам необязательно регистрироваться для комментирования - для этого просто выберите из списка "Анонимный" (для анонимного комментария) или "Имя/URL" (для указания вашего имени и ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку (поддерживается OpenID).

Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.

Ваше сообщение может быть помечено как спам спам-фильтром - не волнуйтесь, оно появится после проверки администратором.