Lenovo IdeaPad Duet 3 (google-wormdingler)
This device is supported as part of a generic port. Refer to Google Trogdor Chromebook (google-trogdor) for installation instructions and more information. |
![]() Duet 3 running postmarketOS with the GNOME interface | |
Manufacturer | Lenovo |
---|---|
Name | IdeaPad Duet 3 |
Codename | google-wormdingler |
Released | 2021 |
Type | detachable |
Hardware | |
Chipset | Qualcomm Snapdragon 7c Gen 2 (SC7180P) |
CPU |
2x Kryo 468 Gold 6x Kryo 468 Silver |
GPU | Adreno 618 |
Display | 2000x1200 IPS |
Storage | 64/128 GB |
Memory | 4/8 GB |
Architecture | aarch64 |
Software | |
Original software The software and version the device was shipped with. |
ChromeOS |
Extended version The most recent supported version from the manufacturer. |
ChromeOS |
postmarketOS | |
Category | community |
Mainline Instead of a Linux kernel fork, it is possible to run (Close to) Mainline. |
yes |
Unixbench score Unixbench Whetstone/Dhrystone score. See Unixbench. |
4767.7 |
Generic port | Google Trogdor Chromebook (google-trogdor) |
Device package |
![]() |
Kernel package |
![]() |
USB Networking After connecting the device with USB to your PC, you can connect to it via telnet (initramfs) or SSH (booted system). |
Works
|
---|---|
Internal storage eMMC, SD cards, UFS, ... |
Works
|
Battery Charging and battery level reporting works |
Works
|
Screen Display works. Ideally with sleep mode and brightness control. |
Works
|
Touchscreen |
Works
|
Keyboard Build in physical keyboard |
Works
|
Touchpad Build in Touchpad |
Works
|
Stylus |
Works
|
Multimedia | |
3D Acceleration |
Works
|
Audio Audio playback, microphone, headset and buttons. |
Works
|
Camera |
Broken
|
Connectivity | |
WiFi |
Works
|
Bluetooth |
Works
|
Miscellaneous | |
FDE Full disk encryption and unlocking with unl0kr. |
Works
|
USB OTG USB On-The-Go or USB-C Role switching |
Works
|
HDMI/DP Video and audio output with HDMI or Display Port works. |
Works
|
Sensors | |
Accelerometer Auto screen rotation works in desktops e.g. Phosh or Plasma Mobile |
Works
|
Hall Effect Also known as flip cover sensor |
Works
|
Users owning this device
- Cidra
- Delia (Notes: pmOS with GNOME)
- Diogotavc (Notes: 8+128 variant imported from the UK, running pmos w/gnome-shell)
- Geofferey (Notes: Testing device port)
- Jasedxyz (Notes: Running pmOS)
- JulianGro (Notes: Plasma Mobile)
- Librist (Notes: pmOS with GNOME)
- Motschen (Notes: pmOS + Gnome Mobile Patches)
- Sado1
- Sajattack
Audio
Audio defaults to a non-existent headset due to mismatched alsa UCM configs. You can simply switch to the speakers and ignore the headset, as this does not break functionality.
Screen Rotation
Screen rotation works via accelerometer but is stuck +/- 90 degrees.
You might be able to offset it, by creating an udev rule (/etc/udev/rules.d/61-cros-ec-accel.rules
).
To get it working properly, you have to swap the x and y values, as well as inverting the x-axis:
Create the following file:
# nano /etc/udev/rules.d/61-cros-ec-accel.rules
Insert the following text:
ACTION=="remove", GOTO="sensor_end"
SUBSYSTEM=="iio", KERNEL=="iio*", SUBSYSTEMS=="platform",
ATTRS{modalias}=="platform:cros-ec-accel",
ENV{ACCEL_MOUNT_MATRIX}="0, 1, 0; -1, 0, 0; 0, 0, -1",
GOTO="sensor_end"
LABEL="sensor_end"
Stylus
Unless you're using KDE Plasma, chances are the cursor position is only correctly displayed in portrait orientation. To make the stylus work correctly in any orientation, do the following (source):
Create the following file:
# mkdir /etc/libwacom
# nano /etc/libwacom/google-wormdingler.tablet
Insert the following text:
[Device]
Name=hid-over-i2c 0603:604A Stylus
ModelName=
DeviceMatch=i2c:0603:604a
Class=ISDV4
Width=5.35433
Height=8.54331
IntegratedIn=Display;System
Styli=@generic-no-eraser
[Features]
Stylus=true
Touch=false
And also supplement or create a file:
# nano /etc/libinput/local-overrides.quirks
[Google Chromebook Wormdingler Stylus Digitizer]
MatchUdevType=tablet
MatchDeviceTree=*wormdingler*
MatchBus=i2c
ModelChromebook=1
AttrPressureRange=1100:1000
Small note: The stylus can feel a bit unresponsive, and the palm rejection pretty bad. For that, feel free to tweak or remove values to your liking, as follows:
[Google Chromebook Wormdingler Touch Digitizer]
MatchName=hid-over-i2c 0603:604A
AttrPalmSizeThreshold=14
[Google Chromebook Wormdingler Stylus Digitizer]
MatchUdevType=tablet
MatchDeviceTree=*wormdingler*
MatchBus=i2c
ModelChromebook=1
AttrTabletSmoothing=0
After all this is done, execute this and reboot:
# libwacom-update-db
If, at this stage, you get an error about 1 out of 3 expected values, don't panic. Due to a recent source code change, we have to replace DeviceMatch=i2c:0603:604a
with DeviceMatch=i2c|0603|604a
, in /etc/libwacom/google-wormdingler.tablet
, and run the command again. You can safely ignore complaints about being unable to find udev base directory, and about not being able to find .tablet files in $XDG_CONFIG_HOME/libwacom.
After a reboot, the digitizer should take into account the screen rotation, and will now be able to tweak some values directly in GNOME settings (possibly on other desktops too). Other USI styli may not work (remembering that USI 1.0 pens are completely unsupported for this model due to the in-cell display technology).
Bluetooth
Bluetooth seems to work well overall. Gamepads, earbuds and phone connections seem to work out of the box without issues. However:
Some devices such as gamepads do not work out of box with the default kernel Bluetooth configuration. Required inlining of rfkill + core Bluetooth features instead of modules, even with modules loaded gamepad did not work.
For Bluetooth keyboard and mice to work you must manually load the uhid kernel module via modprobe/insmod or add it to the /etc/modules
file.
Keyboard
If you're unhappy with the current keyboard layout or need a special key, you can disable the cros-keyboard-map service (as it overrides the configuration on each boot) and manually edit the keyd configuration file:
# rc-update del cros-keyboard-map boot
# nano /etc/keyd/default.conf
The configuration file is very readable and easy to digest, although you may want to use keyd monitor
and keyd list-keys
to facilitate the process. Note that you may have to stop and start the keyd service manually for changes to take effect without a reboot.
An example of a keyd configuration file for the Duet 3:
[ids]
k:0000:0000
k:0001:0001
k:18d1:503c
k:18d1:5050
k:18d1:504c
k:18d1:5052
k:18d1:5057
k:18d1:505b
k:18d1:5030
k:18d1:503d
k:18d1:5044
k:18d1:5061
k:18d1:592b
[main]
back = back
refresh = forward
zoom = f11
scale = scale
brightnessdown = brightnessdown
brightnessup = brightnessup
micmute = micmute
mute = mute
volumedown = volumedown
volumeup = volumeup
sleep = delete
backspace = backspace
[meta]
back = f1
refresh = f2
zoom = f3
scale = f4
brightnessdown = f5
brightnessup = f6
micmute = f7
mute = f8
volumedown = f9
volumeup = f10
sleep = f12
[alt]
up = pageup
down = pagedown
left = home
right = end
leftmeta = capslock
[control]
scale = print
[control+alt]
sleep = C-A-delete
back = C-A-f1
refresh = C-A-f2
zoom = C-A-f3
scale = C-A-f4
brightnessdown = C-A-f5
brightnessup = C-A-f6
micmute = C-A-f7
mute = C-A-f8
volumedown = C-A-f9
volumeup = C-A-f10
Quality of Life
Configuring the LED
Since determining whether the device is asleep can be practically impossible, you may want to utilise the LED as a status indicator instead of just a charging light. To achieve this, you can create a script that modifies the LED trigger and set up a service to run the script each time the device boots up. This process is straightforward and, albeit not covered here, allows for extensive customisation, enabling you to display the charging state and other notifications if desired.
Create the script:
$ nano /usr/local/bin/led_control
#!/bin/bash
echo "0 100 0" | sudo tee /sys/class/leds/chromeos\:multicolor\:charging/multi_intensity
echo 1 | sudo tee /sys/class/leds/chromeos\:multicolor\:charging/brightness
# echo "heartbeat" | sudo tee /sys/class/leds/chromeos\:multicolor\:charging/trigger
# this is a built-in pattern you can use, but below is a custom pattern that's a bit nicer
echo "pattern" | sudo tee /sys/class/leds/chromeos\:multicolor\:charging/trigger
echo "1 150 1 0 0 200 0 0 1 150 1 0 0 2500 0 0" | sudo tee /sys/class/leds/chromeos\:multicolor\:charging/pattern
Make sure it's executable.
$ chmod +x /usr/local/bin/led_control
Now create the service that will execute the command on every boot.
# nano /etc/systemd/system/led_control.service
[Unit]
Description=Control Chrome OS Multicolor LED
[Service]
Type=oneshot
ExecStart=/usr/local/bin/led_control
RemainAfterExit=no
[Install]
WantedBy=multi-user.target
Reload and enable the service, and that's it.
# systemctl daemon-reload
# systemctl enable --now led_control
Simply disabling the service and rebooting is enough to fully revert the changes. You may also manually change back the trigger for the LED.
Desktop Environment-specific tweaks
GNOME
Change screen scaling
In the latest versions of gnome-shell, you can set screen scaling values to multiples of 25% by enabling experimental fractional scaling support:
$ gsettings set org.gnome.mutter experimental-features "['scale-monitor-framebuffer']"
Phosh
Change screen scaling
If you don't want to set the screen orientation and the scale new, after every reboot:
# nano /usr/share/phosh/phoc.ini
Insert the following text:
[output:DSI-1]
rotate = 270
scale = 1.5
Reboot.
Allow free-form windows when undocked
When the keyboard is connected, you can switch between "Docked" and "Undocked" from the quick settings. When you disconnect the keyboard, phosh automatically transitions into "Undocked" mode, automatically maximizing all of your windows. To allow free form windows, you can run the following command:
$ gsettings set sm.puri.phoc auto-maximize false
Revert to true to switch back to auto-maximized windows.
Disable pbsplash
The pbsplash works in portrait mode during boot, regardless of the actual orientation of the device. If you are confused by this, you can switch to the option of showing the boot log, which happens in landscape mode (source):
# nano /etc/deviceinfo
Edit the appropriate line, preserving your parameters if they exist:
deviceinfo_kernel_cmdline_append=" PMOS_NOSPLASH console=tty1"
And rebuild the boot kernel image:
# mkinitfs