Hallo Gemeinde!
Ich besitze schon seit knapp 2 Jahren ein SHIFTbook (bzw. SHIFT13mi), und die fehlende Funktion des Lagesensors unter Linux hat mich immer schon gestört. Da ich heute etwas Zeit hatte, habe ich mich mal reingehangen und geschaut, woran's lag.
Das Problem lag an sich an einer falschen Hardware-ID. Der Kernel liest beim Starten den DSDT aus, um die Geräte, die im Rechner verbaut sind, zu identifizieren. Diese werden anschließend dem Betriebssystem zur Verfügung gestellt, und udev ordnet den modalias-Pseudonamen die richtigen Module zu.
Der im SHIFTbook verbaute Lagesensor, ein STM LSM6DSO, ist im DSDT des Gerätes als
Wenn wir uns mal den Quelltext des Sensor-Kommunikationsmoduls im Linux-Kernel anschauen, merken wir aber:
Der Linux-Treiber erkennt nur Geräte mit der ID
Man muss nun den Struct
Wenn man nun die relevante Source-datei st_lsm6dsx_i2c.c in ein Modul kompiliert, dieses anschließend zstd-komprimiert und das alte Modul überschreibt, funktioniert auch der Lagesensor so halb, erkennt aber noch nicht die richtige Bildschirmorientierung. Wenn man das Tablet normal hält, denkt der Sensor, dass das Gerät auf dem Kopf steht und dreht den Bildschirm entsprechend.
Um diesen Fehler zu beheben, muss man noch die Rotationsmatrix ändern. Die sorgt dafür, dass der Sensor richtig erkennt, wo oben und unten sind. Diese sind eigentlich schon im DSDT vorhanden, werden aber nicht ausgelesen, da diese nicht standardisiert sind. Zum beheben dieses Problems muss man im Verzeichnis /etc/udev/hwdb.d/ eine neue hwdb-Datei erstellen. Ich habe meine ganz simpel
Damit wird udev mitgeteilt, wie die Orientierungsdaten des Beschleunigungssensors zu interpretieren sind. Anschließend über
Ich habe ein Ubuntu-Paket erstellt, welches den Rotationssensor unter Ubuntu wieder zum Laufen bringt. Installationsanleitung ist weiter unten in einer Antwort. Dieses Paket ist nur wichtig, solange das Kernel-Patch noch nicht veröffentlicht wurde.
Hier einmal der Buildprozess für Arch Linux:
0. Erst einmal die relevanten Pakete installieren:
und anschließend in ein sauberes Arbeitsverzeichnis wechseln.
1. Einmal die relevante Dateien heruntergeladen:
WICHTIG: Ersetzt bitte die Version (aktuell 6.19.8) durch eure eigene. Führt dafür einmal
Heißt also:
2. Mit dem Texteditor deiner Wahl die Datei
3. Eine Datei namens ”Makefile” erstellen und mit einem Texteditor folgenden Inhalt einfügen:
WICHTIG: Die Indents müssen durch Tab erzeugt werden, nicht durch Leerzeichen. Die Forumsformatierung könnte das etwas kaputtmachen. Ersetzt daher bitte bei Fehlern die Einrückungen durch Tab-Einrückungen.
4. Die geänderte Datei kompilieren:
5. Das fertige Modul installieren:
6. Neue Datei
WICHTIG: Das erste Leerzeichen in der zweiten Zeile muss ein Leerzeichen sein.
Jetzt könnt ihr entweder das Tablet neu starten oder diese Befehle ausführen:
(7). Das alte laufende Modul neu laden:
(8). Alle wichtigen Dienste neustarten:
Anschließend sollte der Lagesensor wieder ohne Probleme funzen.
WICHTIG: Diese Methode ist NICHT permanent und muss nach jedem Kernel-Update neu durchgeführt werden, oder so lange, bis diese Änderung im Mainline-Kernel angekommen ist.
Ich kann leider nichts über den Build-Prozess auf anderen Distros sagen, da ich persönlich nur Arch Linux nutze. Ich werde aber mal einen Kernel-Patch bemühen, über den auch der Lagesensor im Shiftbook erkannt werden sollte. Ist ja, wie man oben sieht, nur ein simpler Einzeiler ohne großartige Änderungen.
Getestet wurde dieser Fix auf Arch Linux mit KDE Plasma.
Lasst gerne Feedback da.
Ich besitze schon seit knapp 2 Jahren ein SHIFTbook (bzw. SHIFT13mi), und die fehlende Funktion des Lagesensors unter Linux hat mich immer schon gestört. Da ich heute etwas Zeit hatte, habe ich mich mal reingehangen und geschaut, woran's lag.
Das Problem lag an sich an einer falschen Hardware-ID. Der Kernel liest beim Starten den DSDT aus, um die Geräte, die im Rechner verbaut sind, zu identifizieren. Diese werden anschließend dem Betriebssystem zur Verfügung gestellt, und udev ordnet den modalias-Pseudonamen die richtigen Module zu.
Der im SHIFTbook verbaute Lagesensor, ein STM LSM6DSO, ist im DSDT des Gerätes als
SMOCF00 vermerkt.Wenn wir uns mal den Quelltext des Sensor-Kommunikationsmoduls im Linux-Kernel anschauen, merken wir aber:
static const struct acpi_device_id st_lsm6dsx_i2c_acpi_match[] = { { "SMO8B30", ST_LSM6DS3TRC_ID, }, { }};Der Linux-Treiber erkennt nur Geräte mit der ID
SMO8B30 als Lagesensor. Dadurch wird der eingebaute Lagesensor nicht als solcher erkannt und ignoriert.Man muss nun den Struct
acpi_device_id ändern, damit der Treiber auch wirklich den Sensor identifizieren kann. Das ist relativ simpel. Der geänderte Struct ist:static const struct acpi_device_id st_lsm6dsx_i2c_acpi_match[] = { { "SMO8B30", ST_LSM6DS3TRC_ID, }, { "SMOCF00", ST_LSM6DSO_ID, }, { }};Wenn man nun die relevante Source-datei st_lsm6dsx_i2c.c in ein Modul kompiliert, dieses anschließend zstd-komprimiert und das alte Modul überschreibt, funktioniert auch der Lagesensor so halb, erkennt aber noch nicht die richtige Bildschirmorientierung. Wenn man das Tablet normal hält, denkt der Sensor, dass das Gerät auf dem Kopf steht und dreht den Bildschirm entsprechend.
Um diesen Fehler zu beheben, muss man noch die Rotationsmatrix ändern. Die sorgt dafür, dass der Sensor richtig erkennt, wo oben und unten sind. Diese sind eigentlich schon im DSDT vorhanden, werden aber nicht ausgelesen, da diese nicht standardisiert sind. Zum beheben dieses Problems muss man im Verzeichnis /etc/udev/hwdb.d/ eine neue hwdb-Datei erstellen. Ich habe meine ganz simpel
10-sensor-shiftbook.hwdb genannt. In diese muss nun:sensor:modalias:acpi:SMOCF00:* ACCEL_MOUNT_MATRIX=1, 0, 0; 0, -1, 0; 0, 0, 1Damit wird udev mitgeteilt, wie die Orientierungsdaten des Beschleunigungssensors zu interpretieren sind. Anschließend über
systemd-hwdb update und udevadm trigger die neuen Parameter einlernen und evtl. noch den iio-Service neustarten.Ich habe ein Ubuntu-Paket erstellt, welches den Rotationssensor unter Ubuntu wieder zum Laufen bringt. Installationsanleitung ist weiter unten in einer Antwort. Dieses Paket ist nur wichtig, solange das Kernel-Patch noch nicht veröffentlicht wurde.
Hier einmal der Buildprozess für Arch Linux:
0. Erst einmal die relevanten Pakete installieren:
# pacman -S linux-headers iio-sensor-proxyund anschließend in ein sauberes Arbeitsverzeichnis wechseln.
1. Einmal die relevante Dateien heruntergeladen:
WICHTIG: Ersetzt bitte die Version (aktuell 6.19.8) durch eure eigene. Führt dafür einmal
uname -r aus und fügt dann die Version OHNE den letzten Strich und ohne 1 ein.Heißt also:
6.19.8-arch1-1 wird zu 6.19.8-arch1$ curl -O "https://raw.githubusercontent.com/archlinux/linux/v6.19.8-arch1/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_i2c.c"$ curl -O "https://raw.githubusercontent.com/archlinux/linux/v6.19.8-arch1/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h"$ curl -O "https://raw.githubusercontent.com/archlinux/linux/v6.19.8-arch1/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c"$ curl -O "https://raw.githubusercontent.com/archlinux/linux/v6.19.8-arch1/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_buffer.c"$ curl -O "https://raw.githubusercontent.com/archlinux/linux/v6.19.8-arch1/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_shub.c"2. Mit dem Texteditor deiner Wahl die Datei
st_lsm6dsx_i2c.c bearbeiten. Relevant sind die Zeilen 145-148. Wie oben schon erwähnt, einmal die weitere Zeile einfügen.3. Eine Datei namens ”Makefile” erstellen und mit einem Texteditor folgenden Inhalt einfügen:
obj-m += st_lsm6dsx.o st_lsm6dsx_i2c.ost_lsm6dsx-objs := st_lsm6dsx_core.o st_lsm6dsx_buffer.o st_lsm6dsx_shub.oall: make -C /usr/lib/modules/$(shell uname -r)/build M=$(PWD) modulesinstall: zstd -f st_lsm6dsx_i2c.ko -o st_lsm6dsx_i2c.ko.zst cp st_lsm6dsx_i2c.ko.zst /usr/lib/modules/$(shell uname -r)/kernel/drivers/iio/imu/st_lsm6dsx/ depmod -Aclean: make -C /usr/lib/modules/$(shell uname -r)/build M=$(PWD) cleanWICHTIG: Die Indents müssen durch Tab erzeugt werden, nicht durch Leerzeichen. Die Forumsformatierung könnte das etwas kaputtmachen. Ersetzt daher bitte bei Fehlern die Einrückungen durch Tab-Einrückungen.
4. Die geänderte Datei kompilieren:
# make5. Das fertige Modul installieren:
# make install6. Neue Datei
/etc/udev/hwdb.d/10-sensor-shiftbook.hwdb erzeugen und den folgenden Inhalt mit einem Texteditor einfügen:sensor:modalias:acpi:SMOCF00:* ACCEL_MOUNT_MATRIX=1, 0, 0; 0, -1, 0; 0, 0, 1WICHTIG: Das erste Leerzeichen in der zweiten Zeile muss ein Leerzeichen sein.
Jetzt könnt ihr entweder das Tablet neu starten oder diese Befehle ausführen:
(7). Das alte laufende Modul neu laden:
# modprobe -r st_lsm6dsx_i2c# modprobe st_lsm6dsx_i2c(8). Alle wichtigen Dienste neustarten:
# systemd-hwdb update# udevadm trigger# systemctl restart iio-sensor-proxyAnschließend sollte der Lagesensor wieder ohne Probleme funzen.
WICHTIG: Diese Methode ist NICHT permanent und muss nach jedem Kernel-Update neu durchgeführt werden, oder so lange, bis diese Änderung im Mainline-Kernel angekommen ist.
Ich kann leider nichts über den Build-Prozess auf anderen Distros sagen, da ich persönlich nur Arch Linux nutze. Ich werde aber mal einen Kernel-Patch bemühen, über den auch der Lagesensor im Shiftbook erkannt werden sollte. Ist ja, wie man oben sieht, nur ein simpler Einzeiler ohne großartige Änderungen.
Getestet wurde dieser Fix auf Arch Linux mit KDE Plasma.
Lasst gerne Feedback da.
Zuletzt bearbeitet: