[devel] USB mouse driver problems

Sergey Vlasov =?iso-8859-1?q?vsu_=CE=C1_altlinux=2Eru?=
Чт Дек 5 19:14:18 MSK 2002


Hello!

Итак, я попытался разобраться в ситуации с драйверами USB-мышей.
Выяснилось, что в этой области имеются серьезные проблемы.

Для начала немного теории из спецификации протокола HID
(http://www.usb.org/developers/data/devclass/HID1_11.pdf).  Устройства,
необходимые для загрузки либо для эмуляции legacy-устройств (клавиатура
и мышь), имеют два режима работы: полнофункциональный (Report Mode) и
упрощенный (Boot Mode).  Протокол выбирается запросом Set_Protocol; по
умолчанию устройство устанавливается в Report Mode.  Формат пакетов от
устройства для Boot Mode фиксированный; для Report Mode - определяется
HID-дескриптором, выдаваемым устройством по соответствующему запросу.

В ядре для HID-устройств имеются три драйвера: полнофункциональный
драйвер hid (обслуживающий клавиатуры, мыши и прочие HID-устройства) и
два упрощенных драйвера usbkbd и usbmouse, которые якобы должны работать
соответственно с клавиатурами и мышами в Boot Mode.  Дальнейший текст в
основном относится к драйверам usbmouse и hid (usbkbd мне не с чем было
проверить).

В настоящее время в дистрибутивах для USB-мышей по умолчанию
используется драйвер usbmouse.  Однако обнаружилось, что этот драйвер не
работает с некоторыми моделями мышей.  Примером такого устройства
является мышь Genius PowerScroll USB (механическая, с колесом) со
следующими данными:

T:  Bus=01 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#=  2 Spd=1.5 MxCh= 0
D:  Ver= 1.10 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 8 #Cfgs=  1
P:  Vendor=0458 ProdID=0018 Rev= 1.00
S:  Manufacturer=KYE
S:  Product=WebScroll
C:* #Ifs= 1 Cfg#= 1 Atr=a0 MxPwr=100mA
I:  If#= 0 Alt= 0 #EPs= 1 Cls=03(HID  ) Sub=01 Prot=02 Driver=hid
E:  Ad=81(I) Atr=03(Int.) MxPS=   5 Ivl= 10ms

Видимый эффект на этой модели: перемещение мыши по вертикали
игнорируется, перемещение по горизонтали двигает курсор по вертикали,
нажатия кнопок приводят либо к перемещению по горизонтали, либо к
странным эффектам.  Это наблюдается только с драйвером usbmouse - с
драйвером hid мышь работает нормально.

Для сравнения использовалась мышь Logitech (оптическая с колесом,
надписи внизу: Wheel Mouse, M/N: M-BD58, P/N: 830386-0000):

T:  Bus=01 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#=  2 Spd=1.5 MxCh= 0
D:  Ver= 1.10 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 8 #Cfgs=  1
P:  Vendor=0458 ProdID=0018 Rev= 1.00
S:  Manufacturer=KYE
S:  Product=WebScroll
C:* #Ifs= 1 Cfg#= 1 Atr=a0 MxPwr=100mA
I:  If#= 0 Alt= 0 #EPs= 1 Cls=03(HID  ) Sub=01 Prot=02 Driver=hid
E:  Ad=81(I) Atr=03(Int.) MxPS=   5 Ivl= 10ms

С этой мышью все работало как с драйверами usbmouse, так и hid (включая
колесо).

Анализ кода драйвера usbmouse показал, что этот драйвер не выполняет
установку протокола (Boot Mode).  Поскольку по умолчанию устройство
устанавливается в Report Mode, получается, что этот драйвер пытается
разбирать пакеты HID, пользуясь форматом для Boot Mode - что совершенно
неправильно и работало только благодаря тому, что большинство мышей
использовало практически одинаковый формат пакетов.  Очевидно, Genius
PowerScroll использует другой формат в режиме Report Mode, поэтому
драйвер usbmouse в текущем состоянии не способен работать с этим
устройством.

Очевидно, что отсутствие установки протокола является ошибкой и
нуждается в исправлении, что и было проделано.  После добавления
установки протокола драйвер usbmouse заработал с обоими устройствами.
Однако перестало работать колесо, что полностью согласуется со
спецификацией Boot Mode (в формате пакетов для этого режима
предусмотрено только две оси и три кнопки).  Вообще непонятно, откуда в
драйвере usbmouse взялся код, обрабатывающий колесо и дополнительные
кнопки - такое впечатление, что его писали не по спецификациям
протокола, а путем анализа пакетов от каких-то конкретных мышей.

Драйвер hid тоже не устанавливает протокол, причем в нем соответствующий
вызов есть в исходном тексте, но отключен с комментарием:

/*
 * Some devices don't like this and crash. I don't know of any devices
 * needing this, so it is disabled for now.
 */

Однако отсутствие этого вызова приводит к неработоспособности устройств
в случае, когда перед этим они обслуживались драйвером usbmouse (или
usbkbd); в этом случае придется перетыкать устройство для его сброса.
Здесь я тоже не согласен с автором драйвера (вместо того, чтобы
выключать установку протокола, рекомендуемую в спецификации, следовало
бы добавить blacklist для тех устройств, которые не переносят эту
команду, и параметр для принудительной отмены установки протокола (один
аналогичный параметр там уже есть)).  Сейчас, если так сделать, придется
ждать багрепортов и составлять по ним этот blacklist.


Итак, резюме:

1. Драйвер usbmouse надо исправлять.  Но в результате исправления с ним
перестанет работать колесо (при использовании Boot mode так и должно
быть, и код для поддержки колеса и дополнительных кнопок следует оттуда
выбросить).

2. Драйвер hid в принципе тоже надо исправлять - но тогда есть
вероятность, что у кого-то возникнут проблемы с какими-то старыми
устройствами.

3. После исправления драйвера usbmouse в инсталятор придется вносить
изменения для поддержки USB-мышей с колесом. :-(

-- 
Sergey Vlasov



Подробная информация о списке рассылки Devel