Linux下使用国产品牌数位板
用了几年的旧数位板于去年年中寿终就寝,于是去狗东入了一块绘王HC16数位板,150块出头算是相当平价。因为莫得绘画天赋,也就平常写写笔记用。几个月前有了从windows转linux的打算,看到这玩意突然头大。厂家只提供windows和macOS驱动,一想似乎平常数位板用的也不是很多,拔下来吃灰算了。今天翻Arch wiki突然看到关于数位板支持的信息,又顿时有了信心,决定折腾一波。结果 …
插上去之后意外的发现竟然是即插即用,简直比win下还方便,不得不说内心有点小震撼。然而能用不等于用的舒服,接下来就是研究怎么配置。
故事讲完了,正文开始。
选驱动
现在linux下的开源驱动主要有DIGImend和OpenTabletDriver(简称OTD)两个,按自己需要选一个就好。DIGImend Arch内置。 因为OTD安装按提示进行几乎不会出现问题,本文主要覆盖DIGImend的安装和配置过程。
注:带*的条目为我主观感觉,仅供参考
DIGImend
- 内核级驱动(kernel driver)
- *延时低
- 配置相对复杂,需要写配置文件
- 还需要一个X.Org的驱动来处理输入
- 2013年至今,但项目仍然活跃
OpenTabletDriver
- 软件
- *延时相对较高
- 配置简单,有GUI(gtk3)
- 有插件系统(似乎打OSU有个平滑插件挺好用的)
- OSU!Lazer内嵌OTD设置(当然DIGImend也不是不能用)
- 比较新的项目,repo创建于2019年
DIGImend
驱动安装
DIGImend项目提供了对很多不同品牌数位板的驱动支持,大部份国产数位板驱动都在这里了。先别着急安装,首先lsusb
Bus 001 Device 016: ID 256c:006d HUION Huion Tablet
ID 后面为<VENDOR_ID>:<MODEL_ID> <PROCUDT_NAME> ,先记下,后面需要。对照支持列表查询。如果能搜到的话且状态为Supported的话,恭喜。我手里的这款HC16查询显示名字为HuionHS610,状态为Unsupported。然而实际测试发现只是侧面电容式滚轮没反应,其他功能都正常。所以Unknown或者Unsupported的话也可以按照该教程试一试,说不定也能成功呢。
BTW, Arch的话,可以直接跳过驱动安装这一步。Arch kernel已经自带了必要的驱动。其他发行版用户可以按照github repo的教程来走。
安装驱动之后,连接数位板。这时拿笔划一下,应该已经有反应了。
手动指定X.Org输入驱动
在/etc/X11/xorg.conf.d/
下创建50-tablet.conf
(没花时间了解X.Org配置的不建议随便修改名字)。复制粘贴下面的几行配置文件
Section "InputClass"
Identifier "Graphics tablet pen"
MatchIsTablet "on"
MatchProduct "HUION Huion Tablet Pen"
MatchDevicePath "/dev/input/event*"
Driver "libinput"
EndSection
MatchProduct后面的字符串需要改成你自己的<PRODUCT_NAME>,我这里为"HUION Huion Tablet Pen"
。至于X.Org输入驱动,DIGImend官网教程在这里使用的是evdev
,实际测试使用libinput
也可以,而且方便后面配置长宽比。
查询发现libinput
算是evdev
/xorg-input-evdev
的替代品,所以换掉也算是个正确的选择。
修改后为方便之后测试建议重启X Server以应用设置,重启或者登出(ctrl+alt+backspace)即可。
长宽比和屏幕范围 变换矩阵计算
回来之后xinput
获取设备id,注意插拔或重启后id可能会有变动。
⎡ Virtual core pointer id=2 [master pointer (3)]
⎜ ↳ HUION Huion Tablet Pad id=11 [slave pointer (2)]
⎜ ↳ HUION Huion Tablet Pen Pen (0) id=17 [slave pointer (2)]
⎣ Virtual core keyboard id=3 [master keyboard (2)]
↳ HUION Huion Tablet Pen id=10 [slave keyboard (3)]
发现会有一个设备多个名字或ID的情况,影响不大,大不了换一个ID再试。找到你的数位板的指针设备(必须是笔/Pen而不是Pad),后面的id带入xinput list-props <id>
,确认设备有"libinput
Calibration Matrix"或"Coordinate Transformation Matrix"属性。
Device 'HUION Huion Tablet Pen':
Device Enabled (154): 1
Coordinate Transformation Matrix (156): 1.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 1.000000
libinput Calibration Matrix (311): 0.571429, 0.000000, 0.000000, 0.000000, 2.370370, -0.500000, 0.000000, 0.000000, 1.000000
libinput Calibration Matrix Default (312): 0.571429, 0.000000, 0.000000, 0.000000, 2.370370, -0.500000, 0.000000, 0.000000, 1.000000
libinput Send Events Modes Available (274): 1, 0
libinput Send Events Mode Enabled (275): 0, 0
libinput Send Events Mode Enabled Default (276): 0, 0
Device Node (277): "/dev/input/event21"
Device Product ID (278): 9580, 109
这里显示的是我修改过的数值,默认应该是1 0 0 0 1 0 0 0 1,写成矩阵形式:
⎡ c0 c1 c2 ⎤ ⎡ 1 0 0 ⎤
⎜ c3 c4 c5 ⎥ = ⎜ 0 1 0 ⎥
⎣ c6 c7 c8 ⎦ ⎣ 0 0 1 ⎦
具体计算:
⎡ x' ⎤ ⎡ c0 c1 c2 ⎤ ⎡ x ⎤
⎜ y' ⎥ = ⎜ c3 c4 c5 ⎥ * ⎜ y ⎥
⎣ 1 ⎦ ⎣ c6 c7 c8 ⎦ ⎣ w ⎦
写成线性方程比较好理解
x' = (c0x + c1y + c2) / w'
y' = (c3x + c4y + c5) / w'
w' = (c6x + c7y + c8) = 1
易知,c0和c4分别代表x,y座标的缩放,c2和c5分别为x,y座标的偏移,c6,c7,c8一直是0,0,1。
对具体计算感兴趣的可以参考下这两个posts:ubuntuforums.orgaskubuntu.com。
然后介绍下懒人方法(是的这堆确实没必要提)
xrestrict一键设置座标变换矩阵
Aur:
yay -S xrestrict
0 votes,0 popularity,好的吧,反正能用。
其他发行版请参考xrestrict项目readme
xrandr
获取显示信息:
Screen 0: minimum 8 x 8, current 4480 x 1080, maximum 32767 x 32767
DVI-D-0 connected 1920x1080+2560+0 (normal left inverted right x axis y axis) 509mm x 286mm
1920x1080 60.00*+
HDMI-0 connected primary 2560x1080+0+0 (normal left inverted right x axis y axis) 798mm x 334mm
2560x1080 59.98 + 74.99* 59.94 50.00
我的大概就是这样(有删改),一个1920*1080,一个2560*1080。主屏是这块25:9的带鱼屏,比数位板的原始长宽比可差远了,肯定需要缩放。
xrestrict -d <DEVIDE_ID> -c <DISPLAY_INDEX>
<DEVICE_ID>是之前数位板(笔)的设备ID,但愿你还记得。<DISPLAY_INDEX>是显示器的id,第一块屏幕就是0,后面依次递增。我这里执行xrestrict -d 17 -c 0
,发现屏幕区域和长宽比配置都没问题。就是默认只用数位板的上半块,手需要够着不是很方便,稍作调整。
执行xinput list-props <DEVICE_ID>
获取修改过的变换矩阵:
Coordinate Transformation Matrix (156): 0.571429, 0.000000, 0.000000, 0.000000, 2.370370, 0.000000, 0.000000, 0.000000, 1.000000
前面知道c5(注意是第六个数)代表y轴偏移,改成-0.5。
xinput set-prop <DEVIDE_ID> --type=float "Coordinate Transformation Matrix" 0.571429, 0.000000, 0.000000, 0.000000, 2.370370, -0.5, 0.000000, 0.000000, 1.000000
发现数位板上对应区域刚好在中间,完美。这时候千万不要待机/重启/插拔设备,刚才的修改在驱动重新加载时都不会保存。
保存变换矩阵信息
官网方法
如果之前你按照官网使用了evdev
输入驱动,则只能使用该方法。请按照官网教程(靠后)写一个这样的script然后设置开机运行:
#!/bin/bash
xinput set-prop "device name" --type=float "Coordinate Transformation Matrix" 0.571429, 0.000000, 0.000000, 0.000000, 2.370370, -0.5, 0.000000, 0.000000, 1.000000
因为重启之后设备id可能会变,这里就只能用名字。开机运行的问题就在于只是开机的时候修改设备设置,待机/插拔设备信息都会丢失,就比较麻烦。
udev
此方法仅限libinput
驱动用户。 在/etc/udev/rules.d/
下创建99-tablet.conf
文件(还是不推荐改名字),复制粘贴:
ENV{ID_VENDOR_ID}=="256c",ENV{ID_MODEL_ID}=="006d",ENV{LIBINPUT_CALIBRATION_MATRIX}="0.571429 0 0 0 2.370370 -0.5 0 0 1"
对应两个ID修改成你自己的,忘记请看本文开头。前面的名字不要改。后面LIBINPUT_CALIBRATION_MATRIX
值改成上一步修改好的变换矩阵,",“替换为空格。
重启或root下执行udevadm control --reload-rules && udevadm trigger
重新加载udev规则。插拔设备测试。
不出意外的话连接设备后配置还在(实际上是连接设备时自动再次配置)。
实体键
这里暂时没有需求,所以也没有测试。有需求的读者可以参考官网教程(最结尾)。
OpenTabletDriver
OpenTabletDriver的本质就是一个把/dev/input
转换成按键输入的后台程序。安装后只需要启用systemd服务就可以开始使用。OTD
daemon检测到设备改动会自动对应支持列表寻找对应的mappings。安装不出意外应该没什么大问题,也就不在这里废话了。
链接:
测试
OSU! Lazer
不是音游人,但2.x星难度还是接受的。个人体验DIGImend+libinput比OpenTabletDriver要流畅。
Krita
绘图软件基本都内置压力曲线设定,而且比在libinput设置方便很多,甚至还能不同笔刷对应不同的压力曲线。