我最近将我的联想 Ideapad Miix 510 从 16.04 升级到了 18.04,惊喜地发现之前无法使用的屏幕自动旋转功能在升级后开始正常工作。不幸的是,除非我锁定旋转,否则自动旋转始终相对于平板电脑的实际方向逆时针旋转 90 度。此外,如果我过于频繁地调整平板电脑方向而不锁定屏幕旋转,屏幕就会变成纯灰色,整个系统就会挂起。
设置 -> 显示没有方向或旋转部分,大概是因为自动旋转。使用 xrandr 和 -o 或 --rotate 会产生
MIT-MAGIC-COOKIE-1 密钥无效无法打开显示:0
有没有办法让自动旋转保持启用状态,但告诉 Ubuntu 始终将屏幕显示为其认为应有的方向的顺时针 90 度?
答案1
我自己刚刚运行了 MIIX 510。它们是一款很棒的小型 Surface Pro 类设备,在 Ubuntu 18.04 下运行良好。
我设法解决了 Ubuntu 下的屏幕旋转问题。出厂时我的显示器顺时针旋转了 90 度,但可以通过映射传感器数据来修复。显然,需要转换硬件加速度计数据才能使屏幕旋转正常工作。
有关所需的 MIIX 510 硬件加速度计映射的完整且更准确匹配的详细信息,请参见此处: https://npm.pkg.github.com/systemd/systemd/blob/master/hwdb/60-sensor.hwdb
以下步骤将在 Ubuntu 18.04 下正确映射 MIIX 510 屏幕旋转的数据:
1)如果已删除 iio-sensor-proxy,请安装它
2) 通过破解传感器匹配和映射来解决问题,方法是使用以下文件 /etc/udev/hwdb.d/60-sensor.hwdb 创建文件,内容如下:
sensor:modalias:*
ACCEL_MOUNT_MATRIX=0, -1, 0; -1, 0, 0; 0, 0, 1
3)运行命令:
sudo systemd-hwdb 更新
4)重启
答案2
偶尔会看到这个问题。
我的修复已合并到 systemd 中,此问题应该在 systemd>=240 上得到修复
答案3
只是为了根据我的经验为像我这样的非编码员/数学家扩展接受的答案......
我是如何到达那里的
(绕着房屋和花园小径)
我犯了很多错误,想知道为什么当我尝试改变传感器矩阵中的值时什么都没有发生。错误一是研究旋转矩阵(这是关于方向而不是旋转),错误二是没有注意缩进和空格,这是极其重要的。
设置
方向数据由加速度计生成,即报告哪个方向向上的传感器。i2c 传感器总线可以接受 3 轴陀螺仪、加速度计和指南针,但我们只对加速度计感兴趣。这由 iio-sensor-proxy.service 处理并在 中配置/usr/lib/udev/hwdb.d/60.sensor.hwdb
。检查此文件以查看设备是否已列出。如果没有,此文件包含有关如何使用 中的配置文件进行自定义的有用信息/etc/udev/hwdb.d/61-sensor.hwdb
。此文件将附加系统文件(在初始化硬件数据库时读取它之后)并将在任何系统更新后保留。
识别平板电脑和传感器
我的平板电脑外壳背面写着“东芝 WT10a 102“。要查找设备的完整 DMI 字符串或模式别名,请使用cat /sys/class/dmi/id/modalias
。这将返回:
dmi:bvnToshiba:bvr2.00:bd01/09/2015:br2.0:efr19.0:svnTOSHIBA:pnTOSHIBAWT10-A-102:pvrPDWOBE-00800TEN:rvnType2-BoardManufacturer:rnType2-BoardProductNAme:rvrType2-BoardVersion:cvnChasisManufacturer:ct10:cvrChassisVersion:
要查找传感器的详细信息,请使用udevadm info -q path -n /dev/iio:device*
。这将返回:
/devices/platform/80860F41:02/i2c-2/i2c-INVN6500:00/iio:device0
这可用于在传感器父级中查找设备模式别名cat /sys/`udevadm info -q path -n /dev/iio:device0`/../modalias
。这将返回:
acpi:INVN6500:
设备标签(如果存在)可以在传感器的标签文件中找到cat /sys/`udevadm info -q path -n /dev/iio:device0`/label
。 在我的例子中,这将返回:
cat: 'sys/devices/platform/80860F41:02/i2c-2/i2c-INVN6500:00/iio:device0/label': No such file or directory
hwdb.d 文件
查看 hwdb.d 文件中是否存在类似的配置很有用cat /usr/lib/udev/hwdb.d/60-sensor.hwdb | grep -i -A1 'toshiba'
。这将返回:
# Toshiba
#########################################
--
# Toshiba Encore WT10A tablet
sensor:modalalias:acpi:INV6500*:dmi:*:svnTOSHIBA:pnTOSHIBAWT10-A-103:*
ACCEL_MOUNT_MATRIX=0, -1, 0; -1, 0, 0; 0, 0, 1
格式为:
sensor:modalias:<parent modalias pattern>:dmi:<dmi pattern>
or
sensor:<label>:modalias:<parent modalias pattern>:dmi:<dmi pattern>
此处匹配的是acpi:INV6500*
(传感器父模式加通配符)和:svnTOSHIBA:pnTOSHIBAWT10-A-103:
(dmi 系统供应商和产品名称被通配符包围)。供应商和产品名称周围的冒号显得多余。矩阵描述了交换和反转 x 和 y 方向。
好吧,我很幸运,结果很接近。对产品名称和更新进行简单的编辑可能会让我成功。本来可以的,但是一个拼写错误(是的,其中一个空格)意味着我无法解决这个问题,所以我进一步尝试找出矩阵。
矩阵
方向矩阵用于考虑在设备中安装加速度计时可能出现的变化。3 x 3 矩阵中的可能值为 1、0 和 -1。对于加速度计的每个轴,矩阵中的一行定义了到输出轴的映射。矩阵的第一行(hwdb.d 文件的前 3 个数字)定义加速度计 x 轴的数据是否通过 1(选择)、0(忽略)或 -1(否定)分配给输出的 x、y 或 z 轴。每行应该只有一个输出。
经过几次失败的尝试,我终于理解了矩阵。我认为矩阵是一系列开关,将输入映射到输出,如下所示。
来自加速度计的输入 | X | 是 | 是 | 矩阵的输出 |
---|---|---|---|---|
输入(X) | 出 | 你出局 | 出 | 输出(X) |
输入(是) | 出 | 你出局 | 出 | 输出(是) |
输入(是) | 出 | 你出局 | 出 | 输出(是) |
在哪里
X | 是 | 是 | ||
---|---|---|---|---|
x 在 | 1 | 0 | 0 | X出去 |
是 | 0 | 1 | 0 | 是出去 |
进 | 0 | 0 | 1 | 是出去 |
是单位矩阵,即没有变化。如果X输入为 1Xout 等于 1,依此类推。
在 hwdb.d 文件中,应写为1,0,0;0,1,0;0,0,1
X | 是 | 是 | ||
---|---|---|---|---|
x 在 | 0 | 0 | 1 | 是出去 |
是 | 0 | -1 | 0 | -y出去 |
进 | 1 | 0 | 0 | X出去 |
掉期X和是并否定了是值。
在 hwdb.d 文件中,这将写为0,0,1;0,-1,0;1,0,0
我认为从数学上更正确的理解是矩阵是一种逻辑矩阵被称为置换矩阵在...方面向量空间方向这里第一个矩阵的列数必须等于第二个矩阵的行数,且相乘的结果与第一个矩阵的行数相同,与第二个矩阵的列数相同。
X已启动 | 是已启动 | 是已启动 | 乘以 | 结果是 | |||||||
---|---|---|---|---|---|---|---|---|---|---|---|
X | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | ||
是 | 0 | 1 | 0 | 0 | -1 | 0 | 0 | -1 | 0 | ||
是 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 0 |
乘法的工作原理是将第二矩阵中第一行的数字与第一列的数字相乘,然后相加,然后将第一行与第二列相加,依此类推。由于第一个矩阵是恒等矩阵,没有 -1 值,矩阵中只有 -1、0、1 值,每行或每列只有一个条目,因此实际上只需在第一个矩阵的行中找到 1,然后选择第二个矩阵相应列中的数字,然后填充零即可。结果始终与方向矩阵相同。
测试平板电脑
在互联网上搜索了一下,我发现该芯片是 InvenSense.TDK 的 MPU-6050,甚至找到了显示轴的规格。
使用以下诊断程序进行测试的时间https://gitlab.freedesktop.org/hadess/iio-sensor-proxy.monitor-sensor
报告传感器的一些详细信息,然后在您移动平板电脑设备时继续报告其输出。
由此可以看出,x 和 y 需要交换并取反,即x = -y和y=-x和是没有方位,所以可以保持不变。这可以写成:
X | 是 | 是 | ||
---|---|---|---|---|
X在 | 0 | -1 | 0 | -y出去 |
是在 | -1 | 0 | 0 | -X出去 |
是在 | 0 | 0 | 1 | 是出去 |
交换和否定X和是树叶是不变。
在 hwdb.d 文件中,应将其写为0,-1,0;-1,0,0;0,0,1
.....这与 hwdb.d 中现有的东芝条目完全相同。哎呀!
创建 hwdb.d 条目
建议在文件中添加条目/etc/udev/hwdb.d/61-sensor.hwdb
,将您的规则附加到已有的规则中/user/lib/udev/hwdb.d/60-sensor.hwdb
。复制粘贴时要小心,确保所有正确位置都有空格,不要多余!sudo nano /etc/udev/hwdb.d/60-sensor.hwdb
或sudo gedit /etc/udev/hwdb.d/60-sensor.hwdb
添加必要的行,例如:
#########################################
# Toshiba
#########################################
# Toshiba Encore WT10-A-102 tablet
sensor:modalalias:acpi:INV6500*:dmi:*svnTOSHIBA:pnTOSHIBAWT10-A-102*
ACCEL_MOUNT_MATRIX=0, -1, 0; -1, 0, 0; 0, 0, 1
建议通过提供您的配置来为 github 上的 systemd 项目做出贡献。在这种情况下,可能适用更通用的规则来捕获文件中的 102 和 103 个 tablet,/user/lib/udev/hwdb.d/60-sensor.hwdb
如下所示:
#########################################
# Toshiba
#########################################
# Toshiba Encore WT10-A type 102 and 103 tablets
sensor:modalalias:acpi:INV6500*:dmi:*svnTOSHIBA:pnTOSHIBAWT10-A-10*
ACCEL_MOUNT_MATRIX=0, -1, 0; -1, 0, 0; 0, 0, 1
使用新设置重新启动
要使更改生效,必须更新硬件数据库并重新启动传感器服务。这可以通过以下方式完成:
sudo systemd-hwdb update
sudo udevadm trigger -v -p DEVNAME=/dev/iio:device0
sudo systemctl restart iio-sensor-proxy.service
命令
cat /sys/class/dmi/id/modalias
或者
cat /sys/devices/virtual/dmi/id/modalias
查看平板电脑的完整 dmi
bvn = (BIOS 供应商)
bvr = (BIOS 版本)
bd = (BIOS 日期)
br = (BIOS 版本)
efr = (EC 固件版本)
svn = (系统供应商)
pn = (产品名称)
pvr = (产品版本)
rvn = (主板供应商)
rn = (主板名称)
rvr = (主板版本)
cvn = (机箱供应商)
ct = (机箱类型)
cvr = (机箱版本)
sku = (产品 SKU)
cat /usr/lib/udev/hwdb.d/60-sensor.hwdb
查看整个配置文件
cat /usr/lib/udev/hwdb.d/60-sensor.hwdb | grep -ignore-case --after-context=1 'toshiba'
过滤到平板电脑制造商加上一行尾随上下文
udevadm info --query all --name /dev/iio:device*
在本例中为传感器 内核设备节点名“device0”在“INVN6500”上
udevadm info --export-db
验证是否检测到传感器,返回所有 udev 设备的平台、名称等
udevadm info --export-db | grep iio
过滤到传感器
cat /sys/`udevadm info --query path --name /dev/iio:device*`/../modalias
返回传感器父模态别名
cat /sys/`udevadm info --query path --name /dev/iio:device*`/label
返回传感器标签(如果存在)
gdbus introspect --system --dest net.hadess.SensorProxy --object-path /net/hadess/SensorProxy
检查是否检测到传感器
monitor-sensor
检查传感器输出
sudo dmesg | grep --ignore-case toshiba
平板电脑制造商的诊断消息(报告“dmi: TOSHIBA TOSHIBA WT10-A-102/Type2”)
sudo dmesg | grep --ignore-case invn6500
传感器的诊断消息(报告传感器使用的是单位矩阵,即没有变化)
sudo systemd-hwdb update
使用对配置所做的任何更改更新系统 使用对配置
sudo udevadm trigger --verbose --property-match DEVNAME=/dev/iio:device0
所做的任何更改更新系统
sudo systemctl restart iio-sensor-proxy.service
重新启动服务以查看对配置所做的任何更改的效果
有用的网站
- https://gitlab.freedesktop.org/hadess/iio-sensor-proxy
- https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/firmware/dmi-id.c
- https://github.com/systemd/systemd
- https://www.freedesktop.org/software/systemd/man/hwdb.html
- https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=dfc57732ad38f93ae6232a3b4e64fd077383a0f1
- https://people.skolelinux.org/pere/blog/Modalias_strings___a_practical_way_to_map__stuff__to_hardware.html
- https://en.wikipedia.org/wiki/Orientation_(vector_space)
- https://en.wikipedia.org/wiki/Logical_matrix
- https://en.wikipedia.org/wiki/Permutation_matrix