Linux下使用国产品牌数位板

发表于:

用了几年的旧数位板于去年年中寿终就寝,于是去狗东入了一块绘王HC16数位板,150块出头算是相当平价。因为莫得绘画天赋,也就平常写写笔记用。几个月前有了从windows转linux的打算,看到这玩意突然头大。厂家只提供windows和macOS驱动,一想似乎平常数位板用的也不是很多,拔下来吃灰算了。今天翻Arch wiki突然看到关于数位板支持的信息,又顿时有了信心,决定折腾一波。结果 …

插上去之后意外的发现竟然是即插即用,简直比win下还方便,不得不说内心有点小震撼。然而能用不等于用的舒服,接下来就是研究怎么配置。

故事讲完了,正文开始。

选驱动

现在linux下的开源驱动主要有DIGImendOpenTabletDriver(简称OTD)两个,按自己需要选一个就好。DIGImend Arch内置。 因为OTD安装按提示进行几乎不会出现问题,本文主要覆盖DIGImend的安装和配置过程。

注:带*的条目为我主观感觉,仅供参考

DIGImend

OpenTabletDriver

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设置方便很多,甚至还能不同笔刷对应不同的压力曲线。