From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Date: Thu, 5 Dec 2002 19:14:18 +0300 From: Sergey Vlasov To: ALT Developers List Message-Id: <20021205191418.4858a798.vsu@altlinux.ru> X-Mailer: Sylpheed version 0.8.6 (GTK+ 1.2.10; i586-alt-linux) Mime-Version: 1.0 Content-Type: text/plain; charset=KOI8-R Content-Transfer-Encoding: 8bit Subject: [devel] USB mouse driver problems Sender: devel-admin@altlinux.ru Errors-To: devel-admin@altlinux.ru X-BeenThere: devel@altlinux.ru X-Mailman-Version: 2.0.9 Precedence: bulk Reply-To: devel@altlinux.ru List-Unsubscribe: , List-Id: List-Post: List-Help: List-Subscribe: , List-Archive: Archived-At: List-Archive: List-Post: 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