1
0
forked from drath/libratbag

Switch to a .ini-file based device database

The hwdb was a quick and easy way to add entries for new devices but we need
more and more info about the various types of devices. It's better to move
this to a proper database.

Side-effect: this also gives us an easy way to point to the list of devices
supported and makes checking for e.g. missing svgs easier.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
This commit is contained in:
Peter Hutterer
2017-08-24 13:50:18 +10:00
committed by Benjamin Tissoires
parent be624fe943
commit 340e5b7d86
42 changed files with 1064 additions and 111 deletions

211
data/devices/data-parse-test.py Executable file
View File

@@ -0,0 +1,211 @@
#!/usr/bin/env python3
# vim: set expandtab shiftwidth=4 tabstop=4:
#
# Copyright © 2017 Red Hat, Inc.
#
# Permission is hereby granted, free of charge, to any person obtaining a
# copy of this software and associated documentation files (the "Software"),
# to deal in the Software without restriction, including without limitation
# the rights to use, copy, modify, merge, publish, distribute, sublicense,
# and/or sell copies of the Software, and to permit persons to whom the
# Software is furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice (including the next
# paragraph) shall be included in all copies or substantial portions of the
# Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
# DEALINGS IN THE SOFTWARE.
#
# Device data verification script
#
import argparse
import os
import configparser
# Set on commandline with --svg-dir
svg_dirs = []
def check_svg_str(string):
assert(string.endswith('.svg'))
svg_file_found = False
for svg_dir in svg_dirs:
files = os.listdir(svg_dir)
if string in files:
svg_file_found = True
break
assert(svg_file_found)
def check_match_str(string):
bustypes = ['usb', 'bluetooth']
matches = string.split(';')
for match in matches:
if not match: # empty string if trailing ;
continue
parts = match.split(':')
assert(len(parts) == 3)
assert(parts[0] in bustypes)
vid = parts[1]
assert(vid == '{:04x}'.format(int(vid, 16)))
pid = parts[2]
assert(pid == '{:04x}'.format(int(pid, 16)))
def check_section_device(section):
required_keys = ['Name', 'Driver', 'DeviceMatch']
permitted_keys = required_keys + ['Svg']
for key in section.keys():
assert(key in permitted_keys)
for r in required_keys:
assert(r in section)
try:
check_svg_str(section['Svg'])
except KeyError:
pass
check_match_str(section['DeviceMatch'])
def check_dpi_range_str(string):
import re
m = re.search('^([0-9]+):([0-9]+)@([0-9\.]+)$', string)
assert(m is not None)
min = int(m.group(1))
max = int(m.group(2))
steps = float(m.group(3))
assert(min >= 0 and min <= 400)
assert(max >= 2000 and max <= 12000)
assert(steps > 0 and steps <= 100)
if int(steps) == steps:
steps = int(steps)
assert(string == '{}:{}@{}'.format(min, max, steps))
def check_dpi_list_str(string):
entries = string.split(';')
# Remove possible empty last entry if trailing with a ;
if not entries[len(entries) - 1]:
entries = entries[:-1]
for idx, entry in enumerate(entries):
dpi = int(entry)
assert(dpi >= 0 and dpi <= 12000)
if idx > 0:
prev = entries[idx - 1]
prev_dpi = int(prev)
assert(dpi > prev_dpi)
def check_profile_type_str(string):
types = ['G9', 'G500', 'G700']
assert(string in types)
def check_section_hidpp10(section):
permitted = ['Profiles', 'ProfileType', 'DpiRange', 'DpiList', 'DeviceIndex']
for key in section.keys():
assert(key in permitted)
try:
nprofiles = int(section['Profiles'])
# 10 is arbitrarily chosen
assert(nprofiles > 0 and nprofiles < 10)
except KeyError:
pass
try:
index = int(section['DeviceIndex'])
# 10 is arbitrarily chosen
assert(index > 0 and index < 10)
except KeyError:
pass
try:
check_dpi_range_str(section['DpiRange'])
assert('DpiList' not in section.keys())
except KeyError:
pass
try:
check_dpi_list_str(section['DpiList'])
assert('DpiRange' not in section.keys())
except KeyError:
pass
try:
check_profile_type_str(section['ProfileType'])
except KeyError:
pass
def check_section_hidpp20(section):
permitted = ['DeviceIndex']
for key in section.keys():
assert(key in permitted)
try:
index = int(section['DeviceIndex'])
# 10 is arbitrarily chosen
assert(index > 0 and index < 10)
except KeyError:
pass
def check_section_driver(driver, section):
if driver == 'hidpp10':
check_section_hidpp10(section)
elif driver == 'hidpp20':
check_section_hidpp20(section)
else:
assert('Unsupported driver section {}'.format(driver))
def parse_data_file(path):
print('Parsing file {}'.format(path))
data = configparser.ConfigParser(strict=True)
# Don't convert to lowercase
data.optionxform = lambda option: option
data.read(path)
assert('Device' in data.sections())
check_section_device(data['Device'])
driver = data['Device']['Driver']
driver_section = 'Driver/{}'.format(driver)
permitted_sections = ['Device', driver_section]
for s in data.sections():
assert(s in permitted_sections)
if data.has_section(driver_section):
check_section_driver(driver, data[driver_section])
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Device data-file checker")
parser.add_argument('file', nargs='+')
parser.add_argument('--svg-dir', metavar='dir', action='append',
type=str,
help='Directory to check for SVG files (may be given multiple times)')
args = parser.parse_args()
svg_dirs = args.svg_dir
for path in args.file:
parse_data_file(path)

View File

@@ -0,0 +1,49 @@
# Example description file for a libratbag device
#
# Make sure the file has a recognizable name with a '.device' suffix
[Device]
# The kernel name of the device. This name is not used by libratbag, it is
# used by debugging tools.
Name=Logitech Example Device
# DeviceMatch is a triplet of bus:vid:pid, where bus is 'usb' or bluetooth'
# and pid/vid are lowercase 4-digit hexadecimal numbers with preceding
# zeroes.
DeviceMatch=usb:12ab:00f2
# The file name of the SVG file representing this device
Svg=logitech-example.svg
# The libratbag driver backend
Driver=hidpp10
# Only one group of driver-specific properties is permitted and it must be
# [Driver/<drivername>]. It is a bug do have any other [Driver/foo] group in
# a device file, but this example file lists all.
[Driver/hidpp10]
# The number of profiles, must be greater than 0
Profiles=1
# The type of the profile
ProfileType=G9
# The range of available resolutions in the form min:max@step
# Mutually exclusive with DpiList
DpiRange=50:5700@50
# The list of available resolutions, separated by semicolons.
# Mutually exclusive with DpiRange
# Where possible, DpiRange should be preferred
DpiList=50;200;400;800
# The HID++ 1.0 device index
# Should be unset unless required
# DeviceIndex=1
[Driver/hidpp20]
# The HID++ 2.0 device index
# Should be unset unless required
# DeviceIndex=1

View File

@@ -0,0 +1,6 @@
# FIXME: which device is this exactly?
[Device]
Name=Etekcity FIXME
DeviceMatch=usb:1ea7:4011
Driver=etekcity
Svg=etekcity.svg

View File

@@ -0,0 +1,5 @@
# G.Skill MX-780
[Device]
Name=G.Skill MX-780
DeviceMatch=usb:28da:3101
Driver=gskill

View File

@@ -0,0 +1,5 @@
# Logitech M325 over unifying
[Device]
Name=Logitech M325
DeviceMatch=usb:046d:400a
Driver=hidpp20

View File

@@ -0,0 +1,5 @@
# Logitech M570
[Device]
Name=Logitech M570
DeviceMatch=usb:046d:1028
Driver=hidpp10

View File

@@ -0,0 +1,5 @@
# Logitech M705
[Device]
Name=Logitech M705
DeviceMatch=usb:046d:101b
Driver=hidpp10

View File

@@ -0,0 +1,6 @@
# Logitech MX Master
[Device]
Name=Logitech MX Master
DeviceMatch=usb:046d:4041;bluetooth:046d:b012
Driver=hidpp20
Svg=logitech-mx_master.svg

View File

@@ -0,0 +1,5 @@
# Logitech T650 over unifying
[Device]
Name=Logitech T650
DeviceMatch=usb:046d:4101
Driver=hidpp20

View File

@@ -0,0 +1,5 @@
# Logitech Wireless Touchpad (Unifying)
[Device]
Name=Logitech Wireless Touchpad
DeviceMatch=usb:046d:4011
Driver=hidpp20

View File

@@ -0,0 +1,6 @@
# WARNING: this file was automatically converted and has not yet been vetted
[Device]
Name=Logitech G300
DeviceMatch=usb:046d:c246
Driver=logitech_g300
Svg=logitech-g300.svg

View File

@@ -0,0 +1,6 @@
# G303 over USB
[Device]
Name=Logitech Gaming Mouse G303
DeviceMatch=usb:046d:c080
Svg=logitech-g303.svg
Driver=hidpp20

View File

@@ -0,0 +1,6 @@
# Logitech G403 over USB
[Device]
Name=Logitech G403
DeviceMatch=usb:046d:c082
Driver=hidpp20
Svg=logitech-g403.svg

View File

@@ -0,0 +1,9 @@
# Name=Logitech G5 2007
[Device]
Name=Logitech G5
DeviceMatch=usb:046d:c049
Driver=hidpp10
[Driver/hidpp10]
DpiList=400;800;1600;2000
Profiles=1

View File

@@ -0,0 +1,7 @@
[Device]
Name=G5
DeviceMatch=usb:046d:c041
Driver=hidpp10
[Driver/hidpp10]
DpiList=400;800;1600;2000

View File

@@ -0,0 +1,10 @@
[Device]
Name=Logitech G500
DeviceMatch=usb:046d:c068
Driver=hidpp10
Svg=logitech-g500.svg
[Driver/hidpp10]
DpiRange=0:5700@23.53
ProfileType=G500
Profiles=1

View File

@@ -0,0 +1,10 @@
[Device]
Name=Logitech G500s
DeviceMatch=usb:046d:c24e
Driver=hidpp10
Svg=logitech-g500s.svg
[Driver/hidpp10]
DpiRange=0:8200@50
ProfileType=G500
Profiles=1

View File

@@ -0,0 +1,6 @@
# Logitech G502 Proteus Core over USB
[Device]
Name=Logitech G502 Proteus Core
DeviceMatch=usb:046d:c07d
Driver=hidpp20
Svg=logitech-g502.svg

View File

@@ -0,0 +1,6 @@
# Logitech G502 Proteus Spectrum over USB
[Device]
Name=Logitech G502 Proteus Spectrum
DeviceMatch=usb:046d:c332
Driver=hidpp20
Svg=logitech-g502.svg

View File

@@ -0,0 +1,8 @@
# Logitech G602 over wireless USB
[Device]
Name=Logitech G602
DeviceMatch=usb:046d:c537
Driver=hidpp20
[Driver/hidpp20]
DeviceIndex=1

View File

@@ -0,0 +1,9 @@
# Logitech G7
# http://support.logitech.com/en_us/product/g7-laser-cordless-mouse/specs
[Device]
Name=Logitech G7
DeviceMatch=usb:046d:c51a
Driver=hidpp10
[Driver/hidpp10]
Profiles=1

View File

@@ -0,0 +1,12 @@
# Logitech G700 over wireless USB
# http://support.logitech.com/en_us/product/wireless-gaming-mouse-g700/specs
[Device]
Name=Logitech G700
DeviceMatch=usb:046d:c531
Driver=hidpp10
[Driver/hidpp10]
DpiRange=0:5700@23.53
ProfileType=G700
DeviceIndex=1
Profiles=5

View File

@@ -0,0 +1,12 @@
# Logitech G700 over USB
# http://support.logitech.com/en_us/product/wireless-gaming-mouse-g700/specs
[Device]
Name=Logitech G700
DeviceMatch=usb:046d:c06b
Driver=hidpp10
Svg=logitech-g700.svg
[Driver/hidpp10]
DpiRange=0:5700@23.53
ProfileType=G700
Profiles=5

View File

@@ -0,0 +1,13 @@
# Logitech G700s over wireless USB
# http://support.logitech.com/en_us/product/g700s-rechargable-wireless-gaming-mouse/specs
[Device]
Name=Logitech G700s
DeviceMatch=usb:046d:c531
Driver=hidpp10
Svg=logitech-g700.svg
[Driver/hidpp10]
DpiRange=0:8200@50
ProfileType=G700
DeviceIndex=1
Profiles=5

View File

@@ -0,0 +1,12 @@
# Logitech G700s over USB
# http://support.logitech.com/en_us/product/g700s-rechargable-wireless-gaming-mouse/specs
[Device]
Name=Logitech G700s
DeviceMatch=usb:046d:c07c
Driver=hidpp10
Svg=logitech-g700.svg
[Driver/hidpp10]
DpiRange=0:8200@50
ProfileType=G700
Profiles=5

View File

@@ -0,0 +1,11 @@
# Logitech G9
# http://support.logitech.com/en_us/product/g9-laser-mouse/specs
[Device]
Name=Logitech G9
DeviceMatch=usb:046d:c048
Driver=hidpp10
[Driver/hidpp10]
DpiList=0;200;400;600;800;1000;1200;1400;1600;1800;2000;2200;2400;2600;2800;3000;3200
ProfileType=G9
Profiles=5

View File

@@ -0,0 +1,9 @@
# Logitech G900 and G403 over wireless USB
[Device]
Name=Logitech G900, G403
DeviceMatch=usb:046d:c539
Driver=hidpp20
Svg=logitech-g900.svg
[Driver/hidpp20]
DeviceIndex=1

View File

@@ -0,0 +1,6 @@
# Logitech G900 over USB
[Device]
Name=Logitech G900
DeviceMatch=usb:046d:c081
Driver=hidpp20
Svg=logitech-g900.svg

View File

@@ -0,0 +1,11 @@
# Logitech G9x [Call of Duty MW3 Edition]
# http://support.logitech.com/en_us/product/laser-mouse-g9x/specs
[Device]
Name=Logitech G9x [Call of Duty MW3 Edition]
DeviceMatch=usb:046d:c249
Driver=hidpp10
[Driver/hidpp10]
DpiRange=0:5700@23.53
ProfileType=G500
Profiles=5

View File

@@ -0,0 +1,11 @@
# Logitech G9x [Original]
# http://support.logitech.com/en_us/product/g9x-laser-mouse/specs
[Device]
Name=G9x [Original]
DeviceMatch=usb:046d:c066
Driver=hidpp10
[Driver/hidpp10]
DpiRange=0:5700@23.53
ProfileType=G500
Profiles=5

View File

@@ -0,0 +1,5 @@
[Device]
Name=Roccat Kone XTD
DeviceMatch=usb:1e7d:2e22
Driver=roccat
Svg=roccat-kone-xtd.svg