012a. Installing Debian on the Lenovo 300e 2nd-gen Chromebook (Intel)

Thu, 11 Jan 2024 04:04:28 +0100, updated Thu, 11 Jan 2024 21:38:02 +0100

Contents

    1. Firmware
      1. Finding System Info
      2. Known Issues
        1. Firmware
      3. Enabling developer mode
      4. Disabling write protect
        1. Types of Firmware
          1. RW_LEGACY
          2. (UEFI) Full ROM
      5. (Back to) Disabling write protect
        1. Disabling write protect via Battery
          1. Step 1: Open the device and disconnect the battery
          2. Step 2: Boot using AC power, and flash.
      6. Flashing Custom Firmware
    2. Installing an OS
      1. Known Issues
        1. Linux
      2. Making a Bootable USB
        1. Flashing with dd (Linux/macOS)
      3. Installing Linux
        1. Recommended Distributions
        2. Installation
        3. Fixing Audio
          1. Fixing Audio
      4. Post Install
        1. Linux
          1. General QOL Fixes
          2. CELES Post Install Workaround
      5. Using Ectool
    3. Conclusions
      1. pog moments
      2. cringe-ass nae-nae baby moments
      3. family guy funny moments

This concerns[orig. arch.]

Release
1 March 2019
OEM
Lenovo
Model
Lenovo 300e Chromebook 2nd Gen (Intel)[orig. arch.]
Code name
Phaser360
Board name(s)
Octopus
Base board
octopus
User ABI
x86_64
Kernel
4.14
Kernel ABI
x86_64
Platform
Gemini Lake
Form Factor
Convertible
First Release
R72

which Lenovo tricked me into getting in 012. Debian on the Lenovo 300e 2nd-gen arm64 Chromebook.

But because it's an Intel platform with a Celeron N4000 and 4G of LPDDR4-2400 you can install Debian on it, at least hypothetically.

Script started on 2022-10-10 19:32:11+02:00 [TERM="xterm" TTY="/dev/pts/1" COLUMNS="170" LINES="48"]
# uname -a
Linux localhost 4.14.290-19334-gd1f3f46afcb0 #1 SMP PREEMPT Wed Oct 5 13:43:48 PDT 2022 x86_64 Intel(R) Celeron(R) N4000 CPU @ 1.10GHz GenuineIntel GNU/Linux
# lscpu
Architecture:                    x86_64
CPU op-mode(s):                  32-bit, 64-bit
Byte Order:                      Little Endian
Address sizes:                   39 bits physical, 48 bits virtual
CPU(s):                          2
On-line CPU(s) list:             0,1
Thread(s) per core:              1
Core(s) per socket:              2
Socket(s):                       1
Vendor ID:                       GenuineIntel
CPU family:                      6
Model:                           122
Model name:                      Intel(R) Celeron(R) N4000 CPU @ 1.10GHz
Stepping:                        1
CPU MHz:                         2517.724
CPU max MHz:                     2600.0000
CPU min MHz:                     800.0000
BogoMIPS:                        2188.80
Virtualization:                  VT-x
L1d cache:                       48 KiB
L1i cache:                       64 KiB
L2 cache:                        4 MiB
Vulnerability Itlb multihit:     Not affected
Vulnerability L1tf:              Not affected
Vulnerability Mds:               Not affected
Vulnerability Meltdown:          Mitigation; PTI
Vulnerability Mmio stale data:   Not affected
Vulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp
Vulnerability Spectre v1:        Mitigation; usercopy/swapgs barriers and __user pointer sanitization
Vulnerability Spectre v2:        Mitigation; Enhanced IBRS, IBPB conditional, RSB filling
Vulnerability Srbds:             Not affected
Vulnerability Tsx async abort:   Not affected
Flags:                           fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 sdbg cx16 xtpr pdcm sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave rdrand lahf_lm 3dnowprefetch cpuid_fault cat_l2 pti cdp_l2 ssbd ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust smep erms mpx rdt_a rdseed smap clflushopt intel_pt sha_ni xsaveopt xsavec xgetbv1 xsaves dtherm ida arat pln pts umip rdpid md_clear arch_capabilities
# cat /proc/cmdline
cros_secure console= loglevel=7 init=/sbin/init cros_secure drm.trace=0x106 root=PARTUUID=4b867d4a-3be5-4e4f-b215-69cb5aa8e633/PARTNROFF=1 rootwait rw dm_verity.error_behavior=3 dm_verity.max_bios=-1 dm_verity.dev_wait=0 dm="1 vroot none ro 1,0 5767168 verity payload=ROOT_DEV hashtree=#_DEV hashstart=5767168 alg=sha256 root_hexdigest=cc2fa57f4ecbb729a7eaf4dfb09b08fbdf81ceeb6405676935640336895953f6 salt=46019327766872fc31e9094de56e080cdd6bd6c3a33f950470861cd7f1faf1e8" noinitrd vt.global_cursor_default=0 kern_guid=4b867d4a-3be5-4e4f-b215-69cb5aa8e633 add_efi_memmap boot=local noresume noswap i915.modeset=1 gsmi.s0ix_logging_enable=1 intel_idle.slp_s0_check=1 intel_idle.slp_s0_seed=15
# findmnt
TARGET                                SOURCE                             FSTYPE    OPTIONS
/                                     /dev/mmcblk0p5                     ext2
|-/dev                                devtmpfs                           devtmpfs  seclabel,size=1946524k,nr_inodes=486631,mode=755
| |-/dev/shm                          tmpfs                              tmpfs     seclabel,size=1948668k
| `-/dev/pts                          devpts                             devpts    seclabel,gid=5,mode=620,ptmxmode=666
|-/proc                               proc                               proc      relatime
|-/sys                                sysfs                              sysfs     seclabel
| |-/sys/fs/selinux                   selinuxfs                          selinuxfs relatime
| |-/sys/fs/pstore                    pstore                             pstore    seclabel
| |-/sys/kernel/tracing               tracefs                            tracefs   seclabel
| |-/sys/kernel/debug                 debugfs                            debugfs   seclabel,gid=605,mode=750
| | `-/sys/kernel/debug/tracing       tracefs                            tracefs   seclabel
| |-/sys/kernel/config                configfs                           configfs  relatime
| `-/sys/fs/cgroup                    none                               tmpfs     seclabel,mode=755
|   |-/sys/fs/cgroup/cpu              cgroup                             cgroup    cpu
|   |-/sys/fs/cgroup/freezer          cgroup                             cgroup    freezer
|   |-/sys/fs/cgroup/devices          cgroup                             cgroup    devices
|   |-/sys/fs/cgroup/cpuacct          cgroup                             cgroup    cpuacct
|   |-/sys/fs/cgroup/cpuset           cgroup                             cgroup    cpuset,noprefix,cpuset_v2_mode
|   `-/sys/fs/cgroup/net_cls          cgroup                             cgroup    net_cls
|-/tmp                                tmpfs                              tmpfs     nosymfollow,seclabel
|-/run                                tmpfs                              tmpfs     seclabel,mode=755
| |-/run/chromeos-config/private      /dev/loop0                         squashfs  seclabel
| |-/run/chromeos-config/v1           /dev/loop0[/v1/chromeos/configs/5] squashfs  seclabel
| |-/run/namespaces                   tmpfs[/namespaces]                 tmpfs     seclabel,mode=755
| | `-/run/namespaces/mnt_chrome      nsfs[mnt:[4026532626]]             nsfs
| |-/run/daemon-store/appsync-consent tmpfs[/daemon-store/appsync-consent]
| |                                                                      tmpfs     seclabel,mode=755
| |-/run/daemon-store/authpolicyd     tmpfs[/daemon-store/authpolicyd]   tmpfs     seclabel,mode=755
| |-/run/daemon-store/cdm-oemcrypto   tmpfs[/daemon-store/cdm-oemcrypto] tmpfs     seclabel,mode=755
| |-/run/daemon-store/chaps           tmpfs[/daemon-store/chaps]         tmpfs     seclabel,mode=755
| |-/run/daemon-store/crash           tmpfs[/daemon-store/crash]         tmpfs     seclabel,mode=755
| |-/run/daemon-store/crosvm          tmpfs[/daemon-store/crosvm]        tmpfs     seclabel,mode=755
| |-/run/daemon-store/debugd          tmpfs[/daemon-store/debugd]        tmpfs     seclabel,mode=755
| |-/run/daemon-store/dlp             tmpfs[/daemon-store/dlp]           tmpfs     seclabel,mode=755
| |-/run/daemon-store/kerberosd       tmpfs[/daemon-store/kerberosd]     tmpfs     seclabel,mode=755
| |-/run/daemon-store/pvm             tmpfs[/daemon-store/pvm]           tmpfs     seclabel,mode=755
| |-/run/daemon-store/session_manager tmpfs[/daemon-store/session_manager]
| |                                                                      tmpfs     seclabel,mode=755
| |-/run/daemon-store/shill           tmpfs[/daemon-store/shill]         tmpfs     seclabel,mode=755
| |-/run/daemon-store/smbfs           tmpfs[/daemon-store/smbfs]         tmpfs     seclabel,mode=755
| |-/run/daemon-store/smbproviderd    tmpfs[/daemon-store/smbproviderd]  tmpfs     seclabel,mode=755
| |-/run/daemon-store/u2f             tmpfs[/daemon-store/u2f]           tmpfs     seclabel,mode=755
| |-/run/daemon-store/uma-consent     tmpfs[/daemon-store/uma-consent]   tmpfs     seclabel,mode=755
| |-/run/daemon-store/usb_bouncer     tmpfs[/daemon-store/usb_bouncer]   tmpfs     seclabel,mode=755
| |-/run/debugfs_gpu                  debugfs[/dri/0]                    debugfs   seclabel,gid=605,mode=750
| |-/run/imageloader                  imageloader                        tmpfs     seclabel,mode=755
| `-/run/netns                        tmpfs[/netns]                      tmpfs     seclabel,mode=755
|   |-/run/netns/connected_netns_0    nsfs[net:[4026532871]]             nsfs      rw
|   `-/run/netns/connected_netns_1    nsfs[net:[4026532944]]             nsfs      rw
|-/mnt/stateful_partition             /dev/mmcblk0p1                     ext4      seclabel,discard,resgid=20119,commit=600,data=ordered
| `-/mnt/stateful_partition/encrypted /dev/mapper/encstateful            ext4      seclabel,discard,commit=600,data=ordered
|-/usr/share/oem                      /dev/mmcblk0p8                     ext4      seclabel,data=ordered
|-/home                               /dev/mmcblk0p1[/home]              ext4      nosymfollow,seclabel,discard,resgid=20119,commit=600,dat
| `-/home/chronos                     /dev/mapper/encstateful[/chronos]  ext4      seclabel,discard,commit=600,data=ordered
|-/var                                /dev/mapper/encstateful[/var]      ext4      seclabel,discard,commit=600,data=ordered
| |-/var/run                          tmpfs                              tmpfs     seclabel,mode=755
| |-/var/lock                         tmpfs[/lock]                       tmpfs     seclabel,mode=755
| `-/var/cache/dlc-images             /dev/mmcblk0p1[/var_overlay/cache/dlc-images]
|                                                                        ext4      seclabel,discard,resgid=20119,commit=600,data=ordered
|-/media                              media                              tmpfs     seclabel
|-/usr/local                          /dev/mmcblk0p1[/dev_image]         ext4      rw,nodev,seclabel,discard,resgid=20119,commit=600,data=ordered
|-/usr/share/chromeos-assets/speech_synthesis/patts
|                                     /dev/loop2                         squashfs  seclabel
|-/usr/share/chromeos-assets/quickoffice/_platform_specific
|                                     /dev/loop3                         squashfs  seclabel
`-/usr/share/cros-camera/libfs        /dev/loop4                         squashfs  seclabel
# df -hT
Filesystem              Type      Size  Used Avail Use% Mounted on
/dev/root               ext2      2.8G  2.4G  358M  88% /
devtmpfs                devtmpfs  1.9G     0  1.9G   0% /dev
tmpfs                   tmpfs     1.9G   60M  1.8G   4% /dev/shm
tmpfs                   tmpfs     1.9G   72K  1.9G   1% /tmp
tmpfs                   tmpfs     1.9G  704K  1.9G   1% /run
/dev/loop0              squashfs  384K  384K     0 100% /run/chromeos-config/private
/dev/mmcblk0p1          ext4       21G  173M   20G   1% /mnt/stateful_partition
/dev/mmcblk0p8          ext4       12M   24K   12M   1% /usr/share/oem
/dev/mapper/encstateful ext4      6.0G   14M  6.0G   1% /mnt/stateful_partition/encrypted
media                   tmpfs     1.9G     0  1.9G   0% /media
none                    tmpfs     1.9G     0  1.9G   0% /sys/fs/cgroup
/dev/loop2              squashfs   98M   98M     0 100% /usr/share/chromeos-assets/speech_synthesis/patts
imageloader             tmpfs     1.9G     0  1.9G   0% /run/imageloader
/dev/loop3              squashfs   10M   10M     0 100% /usr/share/chromeos-assets/quickoffice/_platform_specific
/dev/loop4              squashfs  6.0M  6.0M     0 100% /usr/share/cros-camera/libfs
# lsblk
NAME          MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
loop0           7:0    0  268K  1 loop /run/chromeos-config/private
loop1           7:1    0  6.1G  0 loop
`-encstateful 254:1    0  6.1G  0 dm   /mnt/stateful_partition/encrypted
loop2           7:2    0 97.3M  0 loop /usr/share/chromeos-assets/speech_synthesis/patts
loop3           7:3    0  9.2M  0 loop /usr/share/chromeos-assets/quickoffice/_platform_specific
loop4           7:4    0    6M  1 loop /usr/share/cros-camera/libfs
mmcblk0       179:0    0 29.1G  0 disk
|-mmcblk0p1   179:1    0 20.9G  0 part /mnt/stateful_partition
|-mmcblk0p2   179:2    0   32M  0 part
|-mmcblk0p3   179:3    0    4G  0 part
|-mmcblk0p4   179:4    0   32M  0 part
|-mmcblk0p5   179:5    0    4G  0 part /
|-mmcblk0p6   179:6    0  512B  0 part
|-mmcblk0p7   179:7    0  512B  0 part
|-mmcblk0p8   179:8    0   16M  0 part /usr/share/oem
|-mmcblk0p9   179:9    0  512B  0 part
|-mmcblk0p10  179:10   0  512B  0 part
|-mmcblk0p11  179:11   0    8M  0 part
`-mmcblk0p12  179:12   0   32M  0 part
mmcblk0boot0  179:16   0    4M  1 disk
mmcblk0boot1  179:32   0    4M  1 disk
zram0         253:0    0  5.4G  0 disk [SWAP]
# lsblk -f
NAME          FSTYPE   LABEL  FSAVAIL FSUSE% MOUNTPOINT
loop0         squashfs              0   100% /run/chromeos-config/private
loop1
`-encstateful ext4               5.9G     0% /mnt/stateful_partition/encrypted
loop2         squashfs              0   100% /usr/share/chromeos-assets/speech_synthesis/patts
loop3         squashfs              0   100% /usr/share/chromeos-assets/quickoffice/_platform_specific
loop4         squashfs              0   100% /usr/share/cros-camera/libfs
mmcblk0
|-mmcblk0p1   ext4              19.2G     1% /mnt/stateful_partition
|-mmcblk0p2
|-mmcblk0p3   ext4     ROOT-A
|-mmcblk0p4
|-mmcblk0p5   ext2     ROOT-A  357.3M    87% /
|-mmcblk0p6
|-mmcblk0p7
|-mmcblk0p8   ext4     OEM      11.1M     0% /usr/share/oem
|-mmcblk0p9
|-mmcblk0p10
|-mmcblk0p11
`-mmcblk0p12  vfat     EFI-SYSTEM
mmcblk0boot0
mmcblk0boot1
zram0                                        [SWAP]
# losetup
NAME       AUTOCLEAR RO BACK-FILE                                                 DIO LOG-SEC
/dev/loop1         0  0 /mnt/stateful_partition/encrypted.block                     1     512
/dev/loop4         1  1 /usr/share/cros-camera/g3_libs.squash                       0     512
/dev/loop2         1  0 /usr/share/chromeos-assets/speech_synthesis/patts.squash    0     512
/dev/loop0         1  1 /usr/share/chromeos-config/configfs.img                     0     512
/dev/loop3         1  0 /usr/share/chromeos-assets/quickoffice/quickoffice.squash   0     512
# blkid
/dev/loop0: TYPE="squashfs"
/dev/loop2: TYPE="squashfs"
/dev/loop3: TYPE="squashfs"
/dev/loop4: TYPE="squashfs"
/dev/mmcblk0p1: UUID="b3770f19-2ac7-402d-9e3c-5c04e3e157fa" BLOCK_SIZE="4096" TYPE="ext4" PARTLABEL="STATE" PARTUUID="65aa1ffe-16f2-b94d-a870-7292e5e5ec6f"
/dev/mmcblk0p2: PARTLABEL="KERN-A" PARTUUID="9b216b4b-ac57-c640-8eb7-d356af8426b7"
/dev/mmcblk0p3: LABEL="ROOT-A" SEC_TYPE="ext2" BLOCK_SIZE="4096" TYPE="ext4" PARTLABEL="ROOT-A" PARTUUID="3675549b-e624-9143-b3af-c414e1e02117"
/dev/mmcblk0p4: PARTLABEL="KERN-B" PARTUUID="4b867d4a-3be5-4e4f-b215-69cb5aa8e633"
/dev/mmcblk0p5: LABEL="ROOT-A" BLOCK_SIZE="4096" TYPE="ext2" PARTLABEL="ROOT-B" PARTUUID="6c2204d6-92d1-2d4b-9ce4-1eced2227559"
/dev/mmcblk0p8: LABEL="OEM" UUID="9db5d778-0ac8-43be-b4dd-b8cd77248ba3" BLOCK_SIZE="4096" TYPE="ext4" PARTLABEL="OEM" PARTUUID="c89b9d8a-130a-1c42-903e-4a00373cbe78"
/dev/mmcblk0p11: PARTLABEL="RWFW" PARTUUID="49257a5e-f084-5d40-8655-7b44ce3aa92a"
/dev/mmcblk0p12: SEC_TYPE="msdos" LABEL_FATBOOT="EFI-SYSTEM" LABEL="EFI-SYSTEM" UUID="563B-40A9" BLOCK_SIZE="512" TYPE="vfat" PARTLABEL="EFI-SYSTEM" PARTUUID="e87e055b-5f6a-4647-8176-4f0f50bdadd6"
/dev/mapper/encstateful: UUID="91e91d32-94d2-457f-a4a7-05db62492040" BLOCK_SIZE="4096" TYPE="ext4"
# cat /etc/os-release
ID_LIKE=chromiumos
GOOGLE_CRASH_ID=ChromeOS
NAME=Chrome OS
ID=chromeos
HOME_URL=https://www.chromium.org/chromium-os
BUG_REPORT_URL=https://crbug.com/new
VERSION=106
VERSION_ID=106
BUILD_ID=15054.98.0
# cat /etc/fstab
# ^D

exit

Script done on 2022-10-10 19:37:30+02:00 [COMMAND_EXIT_CODE="0"]

(all the boring common mountopts stripped; note also how the console login is somehow TERM=xterm); the UUIDs amount to

encstateful
91e91d32-94d2-457f-a4a7-05db62492040
mmcblk0p1
b3770f19-2ac7-402d-9e3c-5c04e3e157fa
mmcblk0p8
9db5d778-0ac8-43be-b4dd-b8cd77248ba3
mmcblk0p12
563B-40A9

Chrultrabook lists this device as explicitly supported as

Device Name
Lenovo 300e Chromebook Gen 2/IdeaPad Flex 3
NEC Chromebook Y1
Board Name
PHASER360
RW_LEGACY
Firmware
UEFI Firmware
(Full ROM)
WP Method
CR50 (battery)
Windows Notes
Audio driver is paid.
Linux Notes
Supported
MacOS Notes
No MacOS support.

so this has been done before and this is thus largely a replication post, mirroring the chrultrabook documentation structure:

    Firmware
    1. Finding System Info
    2. Known Issues
      1. Firmware
    3. Enabling developer mode
    4. Disabling write protect
      1. Types of Firmware
        1. RW_LEGACY
        2. (UEFI) Full ROM
    5. (Back to) Disabling write protect
      1. Disabling write protect via Battery
        1. Step 1: Open the device and disconnect the battery
        2. Step 2: Boot using AC power, and flash.
    6. Flashing Custom Firmware
  1. Installing an OS
    1. Known Issues
      1. Linux
    2. Making a Bootable USB
      1. Flashing with dd (Linux/macOS)
    3. Installing Linux
      1. Recommended Distributions
      2. Installation
      3. Fixing Audio
        1. Fixing Audio
    4. Post Install
      1. Linux
        1. General QOL Fixes
        2. CELES Post Install Workaround
    5. Using Ectool
  2. Conclusions
    1. pog moments
    2. cringe-ass nae-nae baby moments
    3. family guy funny moments

# Firmware

# Finding System Info

All of these I found in 012. Debian on the Lenovo 300e 2nd-gen arm64 Chromebook, sections Save me from chromium (chrome os (chromium os(?))) and Take me to hfbitland,
System Architecture
x86_64
Board Name
PHASER360
CPU Model and generation
Intel(R) Celeron(R) N4000 CPU @ 1.10GHz and Geminilake

Why the model is in the uname I cannot tell you, but it is there. As seen above, it matches /proc/cpuinfo.

How to find your architecture and How to find your CPU model similarly recommend ctrl+alt+t to open the "decroded shell". This still doesn't do anything, and ctrl+alt+ (not the arrow key) is required.

How to find your CPU model recommends cat /proc/cpuinfo | grep "model name". Why it's not grep "model name" /proc/cpuinfo is beyond me.

# Known Issues

# Firmware

GeminiLake: Legacy boot mode/alternative firmware menu works but does not show payload list

which is irrelevant.

# Enabling developer mode

has already been done in 012. Debian on the Lenovo 300e 2nd-gen arm64 Chromebook.

# Disabling write protect

Tip
You do not have to disable write protect if flashing RW_Legacy.

# Types of Firmware

# RW_LEGACY
Warning
The RW_LEGACY firmware is for users who want to dual-boot ChromeOS + Linux, or users who want to run Linux without having to open the device/disable the firmware write-protect (and are OK with the accompanying limitations).
# (UEFI) Full ROM
Tip
The (UEFI) Full ROM firmware is the best option for all users who no longer need/want to run ChromeOS (ie, want to run Linux/Windows/macOS exclusively), and who don't mind disabling write-protection on their device.

Unclear to me what "ie" means, but sign me up, brother. Here's hoping it also fixes the scandi keyboard.

# (Back to) Disabling write protect

# Disabling write protect via Battery

# Step 1: Open the device and disconnect the battery

The internal link from within google documentation is a 404. Obviously. Neither the fake nor the real Lenovo product page carry a manual of any sort, but a completely unrelated Lenovo page does, and it also has videos-as-in-37-second-MP4s that show where the latches are, because sexion "1020 Base cover assembly" of the manual says "Pry up latches and remove the base cover assembly." but doesn't show where the latches are. But the video does.

the laptop in question, filleted One of my screws was missing, but another was in a loose insert, and I only broke one tab! And another pile fell out from previous service. it's a staggering pile of plastic
# Step 2: Boot using AC power, and flash.

# Flashing Custom Firmware

  1. Run MrChromebox's firmware utility script within VT-2 (ctrl + alt + f2 (right arrow)).
    • Type cd; curl -LO mrchromebox.tech/firmware-util.sh && sudo bash firmware-util.sh and press Enter.

This is weird and borders on dangerous. Maybe? The website says

IMPORTANT

Due to recent changes in ChromeOS' security settings, you may need to use a new set of commands to run the Firmware Utility Script under ChromeOS. Running it under Linux can use the same old one-line command.
Also, you must execute these commands **as a normal/non-root user**. Running them as root will break things. DO NOT RUN 'SUDO SU' BEFORE RUNNING THE SCRIPT CMD BELOW.


To download and run this script under ChromeOS or Linux, from a terminal/shell type:
cd; curl -LO mrchromebox.tech/firmware-util.sh && sudo bash firmware-util.sh
and press enter.

REALLY READ THIS: Under ChromeOS, starting with R117, this script must be run from a VT2 terminal (from login screen: CTRL+ALT+F2, login 'chronos'); it cannot be run from a crosh shell (CTRL+ALT+T when logged in) due to the removal of sudo, or from a crostini (penguin) terminal; […].

So: Are you supposed to run it as root under sudo? Run it as root straight from login? Or are you to not do that because it'll break your system? How is it gonna flash anything as non-root? If you log in as "chronos" are you supposed to drop the sudo it specs? Why does downstream Chrultrabook not comment on this at all and why does it not say which user you're supposed to log in as if it matters?

According to upstream this is all intentionally misleading, and the purpose of the huge bizarre paragraph with a random user is to find a R/W mountpoint. Just download it and run it as root (copy it off the USB (sure, maybe under ~chronos, or mount -o remount,rw /), since it wants to exclusively mount it) instead of this rigamarole.

I downloaded the thingy (which redirected me twice, last step at pisshub) onto removable media (unclear to me how you'd download it from the target system in a privacy-preserving way):

localhost login: root
Password: root
localhost ~ # mount -r /dev/sda /media/removable
localhost ~ # cp /media/removable/firmware-util.sh ~chronos
'/media/removable/firmware-util.sh' -> '/home/chronos/user/firmware-util.sh'
localhost ~ # umount /media/removable
localhost ~ # ^D
logout

localhost login: chronos
Password:
Login incorrect

localhost login: chronos
Password: chronos

Login incorrect
localhost login: root
Password: root
localhost ~ # chromeos-setdevpassswd
Password: chronos
Verifying - Password: chronos
localhost ~ # ^D
logout

localhost login: chronos
Password: chronos
chronos@localhost ~ $ bash firmware-util.sh
MrChromebox Firmware Utility Script starting up
Downloading supporting files...
Error downloading one or more required files; cannot continue

The most natural question is "how does chromeos-setdevpasswd differ from passwd chronos"? Significantly:

# command -v chromeos-setdevpasswd
/usr/sbin/chromeos-setdevpasswd
# cat /usr/sbin/chromeos-setdevpasswd
PASSWD_FILE=/mnt/stateful_partition/etc/devmode.passwd
pass=$(openssl passwd -1)
mkdir -p "${PASSWD_FILE%/*}"
: > "${PASSWD_FILE}"
chmod 600 "${PASSWD_FILE}"
echo "chronos:${pass}" > "${PASSWD_FILE}"

The next-most natural question is "great.". Which isn't a question but "why the aren't there any errors?" is. Well, "MrChromebox's firmware utility script" is

#where the stuff is
script_url="https://raw.githubusercontent.com/MrChromebox/scripts/master/"

# …

#get support scripts
echo -e "\nDownloading supporting files..."
rm -rf firmware.sh >/dev/null 2>&1
rm -rf functions.sh >/dev/null 2>&1
rm -rf sources.sh >/dev/null 2>&1
$CURL -sLO ${script_url}firmware.sh
rc0=$?
$CURL -sLO ${script_url}functions.sh
rc1=$?
$CURL -sLO ${script_url}sources.sh
rc2=$?
if [[ $rc0 -ne 0 || $rc1 -ne 0 || $rc2 -ne 0 ]]; then
	echo -e "Error downloading one or more required files; cannot continue"
	exit 1
fi

source ./sources.sh
source ./firmware.sh
source ./functions.sh

# …

which raises so many more questions (why are the curls supposed to fail silently? why are the three rms not one? &c. &c. in the trimmed parts), but that's neither here nor there, and just meant I had to download https://raw.githubusercontent.com/MrChromebox/scripts/master/{sources,firmware,functions}.sh, and, since all the other modules also run $CURL -s…, apply

--- firmware.orig/firmware-util.sh
+++ firmware/firmware-util.sh
@@ -16,6 +16,7 @@
 
 #ensure output of system tools in en-us for parsing
 export LC_ALL=C
+curldir="$PWD"
 
 #set working dir
 if grep -q "Chrom" /etc/lsb-release ; then
@@ -31,28 +32,24 @@
 echo -e "\nMrChromebox Firmware Utility Script starting up"
 
 #check for cmd line param, expired CrOS certs
-if ! curl -sLo /dev/null https://mrchromebox.tech/index.html || [[ "$1" = "-k" ]]; then
-	export CURL="curl -k"
-else
-	export CURL="curl"
-fi
+export CURL=curl
+curl() {
+	printf 'curl %s\n' "$*" | tee -a ~chronos/curls
+	OPTIND=1
+	curl_file=
+	while getopts sLOo: curl_flag; do
+		case "$curl_flag" in
+			[sLO]) ;;
+			o) curl_file="$OPTARG" ;;
+		esac
+	done
+	shift "$((OPTIND - 1))"
+	[ -n "$curl_file" ] || curl_file="${1##*/}"
+	[ -s "$curldir/$curl_file" ] && cp -v "$curldir/$curl_file" .
+}
 
-#get support scripts
-echo -e "\nDownloading supporting files..."
-rm -rf firmware.sh >/dev/null 2>&1
-rm -rf functions.sh >/dev/null 2>&1
-rm -rf sources.sh >/dev/null 2>&1
-$CURL -sLO ${script_url}firmware.sh
-rc0=$?
-$CURL -sLO ${script_url}functions.sh
-rc1=$?
-$CURL -sLO ${script_url}sources.sh
-rc2=$?
-if [[ $rc0 -ne 0 || $rc1 -ne 0 || $rc2 -ne 0 ]]; then
-	echo -e "Error downloading one or more required files; cannot continue"
-	exit 1
-fi
 
+cp "$curldir/"{sources,firmware,functions}.sh .
 source ./sources.sh
 source ./firmware.sh
 source ./functions.sh

Which is possible due to the narrow flag vocabulary.

Some parts of flash_rwlegacy(), like the boot order, degrade gracefully, which is not what we want. Similarly, downgrade_touchpad_fw(), which is meant to "offer to downgrade touchpad firmware on EVE" does the same. But my laptop doesn't have "EVE" anywhere in the board name so no issue there. All other curl uses hard-fail, and I turned around twice, for https://www.mrchromebox.tech/files/{util/cbfstool.tar.gz,firmware/full_rom/coreboot_edk2-phaser360-mrchromebox_20231222.rom{,.sha1}}.

The first time I tried this, it told me

WARNING: your device currently has software write-protect enabled.
If you plan to flash the UEFI firmware, you must first disable it and reboot before flashing.
Would you like to disable sofware WP and reboot your device?
Press Y (then enter) to disable software WP and reboot, or just press enter to skip and continue. Y

and, naturally, rebooted instantly, so I lost the transcript.

But after the two expected errors, I got

Script started on 2022-10-06 00:00:07+02:00 [TERM="xterm" TTY="/dev/pts/2" COLUMNS="170" LINES="48"]
chronos@localhost ~  $ bash firmware-util.sh
MrChromebox Firmware Utility Script starting up
Downloading supporting files...
You need to run this script as root; use 'sudo bash <script name>'
chronos@localhost ~  $ sudo bash firmware-util.sh
Password:
MrChromebox Firmware Utility Script starting up

Downloading required tools...
curl -sLO https://www.mrchromebox.tech/files/util/cbfstool.tar.gz
'/home/chronos/user/cbfstool.tar.gz' -> './cbfstool.tar.gz'

Getting device/system info...

Checking WP state...
 ChromeOS Device Firmware Utility Script [2024-01-07]
 (c) Mr Chromebox <mrchromebox@gmail.com>
*********************************************************
**   Device: Lenovo 300e/500e Chromebook 2nd Gen (PHASER360)
** Platform: Intel GeminiLake
**  Fw Type: Stock ChromeOS w/RW_LEGACY
**   Fw Ver: Google_Phaser.11297.342.0 (12/24/2021)
**    Fw WP: Disabled
*********************************************************
**      1) Install/Update RW_LEGACY Firmware
** [WP] 2) Install/Update UEFI (Full ROM) Firmware
** [WP] 3) Set Boot Options (GBB flags)
** [WP] 4) Set Hardware ID (HWID)
*********************************************************
Select a numeric menu option or
R to reboot  P to poweroff  Q to quit
2

Install/Update UEFI Full ROM Firmware

IMPORTANT: flashing the firmware has the potential to brick your device,
requiring relatively inexpensive hardware and some technical knowledge to
recover.Not all boards can be tested prior to release, and even then slight
differences in hardware can lead to unforseen failures.
If you don't have the ability to recover from a bad flash, you're taking a risk.

You have been warned.

Also, flashing Full ROM firmware will remove your ability to run ChromeOS.

Do you wish to continue? [y/N] y

NOTICE: flashing your Chromebook is serious business.
To ensure recovery in case something goes wrong when flashing,
be sure to set the ccd capability 'FlashAP Always' using your
USB-C debug cable, otherwise recovery will involve disassembling
your device (which is very difficult in some cases).

If you wish to continue, type: 'I ACCEPT' and press enter.

I ACCEPT

NOTE: After flashing UEFI firmware, you will need to install a UEFI-compatible
OS; ChromeOS will no longer be bootable. See https://mrchromebox.tech/#faq

Press Y to continue or any other key to abort. Y

Connect the USB/SD device to store the firmware backup and press [Enter]
to continue.  This is non-destructive, but it is best to ensure no other
USB/SD devices are connected.

Devices available:

1) Generic STORAGE_DEVICE (7.4 GB)

Enter the number for the device to be used for firmware backup: 1


Saving firmware backup as stock-firmware-PHASER360-20221006.rom

Firmware backup complete. Remove the USB stick and press [Enter] to continue.



Downloading Full ROM firmware
(coreboot_edk2-phaser360-mrchromebox_20231222.rom)

curl -sLO https://www.mrchromebox.tech/files/firmware/full_rom/coreboot_edk2-phaser360-mrchromebox_20231222.rom
'/home/chronos/user/coreboot_edk2-phaser360-mrchromebox_20231222.rom' -> './coreboot_edk2-phaser360-mrchromebox_20231222.rom'
curl -sLO https://www.mrchromebox.tech/files/firmware/full_rom/coreboot_edk2-phaser360-mrchromebox_20231222.rom.sha1
'/home/chronos/user/coreboot_edk2-phaser360-mrchromebox_20231222.rom.sha1' -> './coreboot_edk2-phaser360-mrchromebox_20231222.rom.sha1'
Persisting device HWID

VPD extracted from current firmware

Disabling software write-protect and clearing the WP range

Installing Full ROM firmware (may take up to 90s)

Full ROM firmware successfully installed/updated.

IMPORTANT:
The first boot after flashing may take substantially
longer than subsequent boots -- up to 30s or more.
Be patient and eventually your device will boot :)

Press [Enter] to return to the main menu.


Q

chronos@localhost ~  $ ^D

exit

Script done on 2022-10-06 00:04:21+02:00 [COMMAND_EXIT_CODE="32"]
Tip
If you unplugged the battery to disable write protect, you can plug it back in now. All subsequent flashing won't require it from now on.
UEFI
It can take up to a minute for display to come up on first POST. Do not interrupt the first boot.

I'm not trying to be flipping the shit running with a cable plugged in, I plugged the battery back after rebooting and proof-booting d-i.

Yeah, it took about that long. But the updater explicitly says it won't boot ChromeOS anymore. So I held off until I had a d-i image.

# Installing an OS

# Known Issues

# Linux

No it doesn't. Pretty sure. No one wants to document what they mean by this. And I got spam-blocked on the forum for no reason.

And by that I mean this is not mentioned in the documentation, and not in one (screenshot), two, three, four, five posts about this from Chrultrabook authors, in a few cases while questioned directly. Do they even know why?

It turns out they do on the sixth attempt: the catchily-designated MR!768 – [x86] Various drivers for ChromeOS devices. A trivial analysis shows this actually wants a kernel at least 6.6.3-1, so at time of writing "current sid", but hopefully it'll be in backports later.

# Making a Bootable USB

# Flashing with dd (Linux/macOS)

I'm snidely avoiding comment on the bit where it specs dd but uses no flags that would make it do anything different than cp.

No syncing of any kind is criminal, though.

# Installing Linux

Tip
Only Linux kernel 6.4 or newer is supported.

It doesn't say why. Well – why? (See above.)

Warning
Debian versions older than Debian 12 (Bookworm) are not supported. Debian 12 (Bookworm) requires a custom kernel, the audio script will automatically install it for you.
  1. No the fuck it won't.
  2. Bookworm ships (at time of writing, from stable-security) 6.1.69-1, and the current d-i image's kernel is branded "6.1.66-1 (2023-12-09)". So it must work. (See above, again.)

If it were up to me, since this is just about some modules, this box would be

Warning
Debian versions older than Debian 12 (Bookworm) are not supported. Debian 12 (Bookworm) itself requires the backports kernel for full functionality.
Danger
On Debian 12 (Bookworm), the audio script will try to download an install a third-party kernel image. Answer N at the "Would you like the script to automatically install this kernel?" prompt!

But for now just install the sid kernel.

# Installation

  1. Install as you would on any other computer.

I'm assuming this means you can safely dump the whole /dev/mmcblk0? Which I had pause about, but clearly I oughtn't've'd.

# Fixing Audio

# Fixing Audio

(yeah there's two nested identical sexions)

Danger
Using AVS on a device with max98357a will blow your speakers. You have been warned.

this machine does have this device (apparently this is the check, and apparently this only affects output to the built-in speakers, and the "audio script" will disable it automatically, maybe), and:

$ grep -w CONFIG_SND_SOC_INTEL_AVS /boot/config-6.1.0-9-amd64 /boot/config-6.6.9-amd64
/boot/config-6.1.0-9-amd64:# CONFIG_SND_SOC_INTEL_AVS is not set
/boot/config-6.6.9-amd64:CONFIG_SND_SOC_INTEL_AVS=m

and, uncharacteristically, Linux doesn't spec what the modules are called, but it looks like snd-soc-avs, so booting the bookworm kernel is safe, but booting a later kernel wants modprobe.blacklist=snd-soc-avs in the cmdline.

So, with no contraindications, and a very peculiar sense of drip

coreboot logo, below it Press ESC for Boot Options/Settings 70s-style text-mode BIOS

(yes, that is a 4:3 EDK2 on an almost-16:9 monitor):

It's GNU GRUB version 2.06-13+deb12u1 booting debian 12

and I installed sid normally. ChromeOS used discard, so I added this to the mount options as well. Installing GRUB into the removable media path was not necessary. This yields #1060325.

Apparently, pressing alt and ˂ or ˃ (the arrow keys) cycles between the available VTs. This is useful because there are no function keys, and alt and or (not the arrow keys) doesn't do anything.

I also persisted the blacklist after first boot and fixed the touchpad because the default decroded-ass no-tap-to-click behaviour is more infuriating than you'd think in a.d. 2023.

chrust$ cat /etc/modprobe.d/avs.conf
# https://docs.chrultrabook.com/docs/installing/installing-linux.html#fixing-audio-1
# DANGER: Using AVS on a device with max98357a will blow your speakers. You have been warned.
blacklist snd-soc-avs
chrust$ cat /etc/X11/xorg.conf.d/touchpad.conf
Section "InputClass"
	Identifier "Touchpads normal"
	MatchIsTouchpad "on"
	Option "Tapping" "on"
EndSection

# Post Install

Tip
Install Chrultrabook Controller for fan controls, keyboard backlight controls, system information and more.

This machine has neither, and the "system information" in the screenshots appears to be the first three lines of dmesg.

# Linux

# General QOL Fixes

Heed the Danger, of course, if you installed Bookworm. The script checks if you have an audio daemon installed (in my case wireplumber), so make sure you do install it first. But, yes, this does work:

chrust:/tmp$ git clone https://github.com/WeirdTreeThing/chromebook-linux-audio
Cloning into 'chromebook-linux-audio'...
Resolving deltas: 100% (256/256), done.
chrust:/tmp$ cd chromebook-linux-audio/
chrust:/tmp/chromebook-linux-audio$ ./setup-audio
[sudo] password for nabijaczleweli:
WARNING: You may run into audio issues, even after running this script. Please report any issues on github.
Installing SOF
Installing SOF firmware
Installing modprobe config
Installing UCM configuration
Cloning into '/tmp/chromebook-ucm-conf'...
Resolving deltas: 100% (614/614), done.
Increasing alsa headroom (fixes instability)
Audio installed successfully! Reboot to finish setup.
chrust:/tmp/chromebook-linux-audio# for f in $(zfs list -t snap -Ho name); do zfs diff -h $f; done
M	/etc/modprobe.d
+	/etc/modprobe.d/snd-sof.conf
+	/etc/wireplumber
+	/etc/wireplumber/main.lua.d
+	/etc/wireplumber/main.lua.d/51-increase-headroom.lua
M	/usr/lib/firmware/intel
M	/usr/share/lintian/overrides
M	/usr/share/alsa/ucm2/codecs
M	/usr/share/alsa/ucm2/codecs/hda
M	/usr/share/alsa/ucm2/common/pcm
M	/usr/share/alsa/ucm2/conf.d
M	/usr/share/alsa/ucm2/conf.d/acp3xalc5682m98
M	/usr/share/alsa/ucm2/conf.d/sof-glkda7219ma
M	/usr/share/alsa/ucm2/platforms
M	/usr/share/alsa/ucm2/AMD/acp3xalc5682m98/acp3xalc5682m98.conf
M	/usr/share/alsa/ucm2/Intel/sof-glkda7219max/sof-glkda7219max.conf
M	/usr/share/alsa/ucm2/codecs/hda/hdmi.conf
M	/usr/share/alsa/ucm2/common/pcm/split.conf
+	/usr/lib/firmware/intel/sof
+ /usr/lib/firmware/intel/sof/community + /usr/lib/firmware/intel/sof/community/sof-apl.ri + /usr/lib/firmware/intel/sof/community/sof-cnl.ri + /usr/lib/firmware/intel/sof/community/sof-icl.ri + /usr/lib/firmware/intel/sof/community/sof-jsl.ri + /usr/lib/firmware/intel/sof/community/sof-tgl-h.ri + /usr/lib/firmware/intel/sof/community/sof-tgl.ri
+ /usr/lib/firmware/intel/sof/intel-signed + /usr/lib/firmware/intel/sof/intel-signed/sof-adl-n.ri + /usr/lib/firmware/intel/sof/intel-signed/sof-adl-s.ri + /usr/lib/firmware/intel/sof/intel-signed/sof-adl.ri + /usr/lib/firmware/intel/sof/intel-signed/sof-apl.ri + /usr/lib/firmware/intel/sof/intel-signed/sof-cnl.ri + /usr/lib/firmware/intel/sof/intel-signed/sof-ehl.ri + /usr/lib/firmware/intel/sof/intel-signed/sof-icl.ri + /usr/lib/firmware/intel/sof/intel-signed/sof-jsl.ri + /usr/lib/firmware/intel/sof/intel-signed/sof-tgl-h.ri + /usr/lib/firmware/intel/sof/intel-signed/sof-tgl.ri
+ /usr/lib/firmware/intel/sof/sof-apl.ldc + /usr/lib/firmware/intel/sof/sof-bdw.ldc + /usr/lib/firmware/intel/sof/sof-bdw.ri + /usr/lib/firmware/intel/sof/sof-byt.ldc + /usr/lib/firmware/intel/sof/sof-byt.ri + /usr/lib/firmware/intel/sof/sof-cht.ldc + /usr/lib/firmware/intel/sof/sof-cht.ri + /usr/lib/firmware/intel/sof/sof-cnl.ldc + /usr/lib/firmware/intel/sof/sof-icl.ldc + /usr/lib/firmware/intel/sof/sof-jsl.ldc + /usr/lib/firmware/intel/sof/sof-tgl-h.ldc + /usr/lib/firmware/intel/sof/sof-tgl.ldc
+ /usr/lib/firmware/intel/sof-ace-tplg + /usr/lib/firmware/intel/sof-ace-tplg/sof-hda-generic-2ch.tplg + /usr/lib/firmware/intel/sof-ace-tplg/sof-hda-generic-4ch.tplg + /usr/lib/firmware/intel/sof-ace-tplg/sof-hda-generic-idisp.tplg + /usr/lib/firmware/intel/sof-ace-tplg/sof-hda-generic.tplg + /usr/lib/firmware/intel/sof-ace-tplg/sof-mtl-cs42l43-l0-cs35l56-l12.tplg + /usr/lib/firmware/intel/sof-ace-tplg/sof-mtl-max98357a-rt5682-ssp2-ssp0-2ch-pdm1.tplg + /usr/lib/firmware/intel/sof-ace-tplg/sof-mtl-max98357a-rt5682-ssp2-ssp0.tplg + /usr/lib/firmware/intel/sof-ace-tplg/sof-mtl-max98357a-rt5682.tplg + /usr/lib/firmware/intel/sof-ace-tplg/sof-mtl-rt1019-rt5682.tplg + /usr/lib/firmware/intel/sof-ace-tplg/sof-mtl-rt1318-l12-rt714-l0.tplg + /usr/lib/firmware/intel/sof-ace-tplg/sof-mtl-rt711-4ch.tplg + /usr/lib/firmware/intel/sof-ace-tplg/sof-mtl-rt711-l0-rt1316-l23-rt714-l1.tplg + /usr/lib/firmware/intel/sof-ace-tplg/sof-mtl-rt712-l0-rt1712-l3.tplg + /usr/lib/firmware/intel/sof-ace-tplg/sof-mtl-rt713-l0-rt1316-l12-rt1713-l3.tplg + /usr/lib/firmware/intel/sof-ace-tplg/sof-mtl-rt713-l0-rt1316-l12.tplg + /usr/lib/firmware/intel/sof-ace-tplg/sof-mtl-rt722-l0.tplg + /usr/lib/firmware/intel/sof-ace-tplg/sof-mtl-sdw-cs42l42-l0-max98363-l2.tplg
+ /usr/lib/firmware/intel/sof-ipc4 + /usr/lib/firmware/intel/sof-ipc4/mtl + /usr/lib/firmware/intel/sof-ipc4/mtl/community + /usr/lib/firmware/intel/sof-ipc4/mtl/community/sof-mtl.ri + /usr/lib/firmware/intel/sof-ipc4/mtl/intel-signed + /usr/lib/firmware/intel/sof-ipc4/mtl/intel-signed/sof-mtl.ri
+ /usr/lib/firmware/intel/sof-tplg + /usr/lib/firmware/intel/sof-tplg/sof-acp.tplg + /usr/lib/firmware/intel/sof-tplg/sof-adl-cs35l41.tplg + /usr/lib/firmware/intel/sof-tplg/sof-adl-es8336-dmic2ch-ssp0.tplg + /usr/lib/firmware/intel/sof-tplg/sof-adl-es8336-dmic2ch-ssp1.tplg + /usr/lib/firmware/intel/sof-tplg/sof-adl-es8336-dmic2ch-ssp2.tplg + /usr/lib/firmware/intel/sof-tplg/sof-adl-es8336-dmic4ch-ssp0.tplg + /usr/lib/firmware/intel/sof-tplg/sof-adl-es8336-dmic4ch-ssp1.tplg + /usr/lib/firmware/intel/sof-tplg/sof-adl-es8336-dmic4ch-ssp2.tplg + /usr/lib/firmware/intel/sof-tplg/sof-adl-es8336-ssp0.tplg + /usr/lib/firmware/intel/sof-tplg/sof-adl-es8336-ssp1-hdmi-ssp02.tplg + /usr/lib/firmware/intel/sof-tplg/sof-adl-es8336-ssp1.tplg + /usr/lib/firmware/intel/sof-tplg/sof-adl-es8336-ssp2.tplg + /usr/lib/firmware/intel/sof-tplg/sof-adl-es8336.tplg + /usr/lib/firmware/intel/sof-tplg/sof-adl-max98357a-rt5682-2way.tplg + /usr/lib/firmware/intel/sof-tplg/sof-adl-max98357a-rt5682-4ch.tplg + /usr/lib/firmware/intel/sof-tplg/sof-adl-max98357a-rt5682-rtnr.tplg + /usr/lib/firmware/intel/sof-tplg/sof-adl-max98357a-rt5682-waves-2way.tplg + /usr/lib/firmware/intel/sof-tplg/sof-adl-max98357a-rt5682-waves.tplg + /usr/lib/firmware/intel/sof-tplg/sof-adl-max98357a-rt5682.tplg + /usr/lib/firmware/intel/sof-tplg/sof-adl-max98360a-da7219.tplg + /usr/lib/firmware/intel/sof-tplg/sof-adl-max98360a-nau8825.tplg + /usr/lib/firmware/intel/sof-tplg/sof-adl-max98360a-rt5682-2way.tplg + /usr/lib/firmware/intel/sof-tplg/sof-adl-max98360a-rt5682-4ch.tplg + /usr/lib/firmware/intel/sof-tplg/sof-adl-max98360a-rt5682-rtnr.tplg + /usr/lib/firmware/intel/sof-tplg/sof-adl-max98360a-rt5682-waves.tplg + /usr/lib/firmware/intel/sof-tplg/sof-adl-max98360a-rt5682.tplg + /usr/lib/firmware/intel/sof-tplg/sof-adl-max98373-nau8825-dts.tplg + /usr/lib/firmware/intel/sof-tplg/sof-adl-max98373-nau8825.tplg + /usr/lib/firmware/intel/sof-tplg/sof-adl-max98390-rt5682-google-aec.tplg + /usr/lib/firmware/intel/sof-tplg/sof-adl-max98390-rt5682-rtnr.tplg + /usr/lib/firmware/intel/sof-tplg/sof-adl-max98390-rt5682.tplg + /usr/lib/firmware/intel/sof-tplg/sof-adl-max98390-ssp2-rt5682-ssp0.tplg + /usr/lib/firmware/intel/sof-tplg/sof-adl-nau8318-nau8825.tplg + /usr/lib/firmware/intel/sof-tplg/sof-adl-nau8825.tplg + /usr/lib/firmware/intel/sof-tplg/sof-adl-nocodec-ci.tplg + /usr/lib/firmware/intel/sof-tplg/sof-adl-nocodec-hdmi-ssp02.tplg + /usr/lib/firmware/intel/sof-tplg/sof-adl-nocodec.tplg + /usr/lib/firmware/intel/sof-tplg/sof-adl-rt1015-nau8825.tplg + /usr/lib/firmware/intel/sof-tplg/sof-adl-rt1019-nau8825.tplg + /usr/lib/firmware/intel/sof-tplg/sof-adl-rt1019-rt5682.tplg + /usr/lib/firmware/intel/sof-tplg/sof-adl-rt1316-l1-mono-rt714-l0.tplg + /usr/lib/firmware/intel/sof-tplg/sof-adl-rt1316-l12-rt714-l0.tplg + /usr/lib/firmware/intel/sof-tplg/sof-adl-rt1316-l2-mono-rt714-l0.tplg + /usr/lib/firmware/intel/sof-tplg/sof-adl-rt1316-l2-mono-rt714-l3.tplg + /usr/lib/firmware/intel/sof-tplg/sof-adl-rt5650.tplg + /usr/lib/firmware/intel/sof-tplg/sof-adl-rt5682.tplg + /usr/lib/firmware/intel/sof-tplg/sof-adl-rt711-4ch.tplg + /usr/lib/firmware/intel/sof-tplg/sof-adl-rt711-l0-rt1308-l12-rt715-l3.tplg + /usr/lib/firmware/intel/sof-tplg/sof-adl-rt711-l0-rt1316-l12-rt714-l3.tplg + /usr/lib/firmware/intel/sof-tplg/sof-adl-rt711-l0-rt1316-l13-rt714-l2.tplg + /usr/lib/firmware/intel/sof-tplg/sof-adl-rt711-l0-rt1316-l2-2ch.tplg + /usr/lib/firmware/intel/sof-tplg/sof-adl-rt711-l0-rt1316-l2-4ch.tplg + /usr/lib/firmware/intel/sof-tplg/sof-adl-rt711-l0-rt1316-l3-2ch.tplg + /usr/lib/firmware/intel/sof-tplg/sof-adl-rt711-l2-rt1316-l01-rt714-l3.tplg + /usr/lib/firmware/intel/sof-tplg/sof-adl-rt711-l2-rt1316-l01.tplg + /usr/lib/firmware/intel/sof-tplg/sof-adl-rt711.tplg + /usr/lib/firmware/intel/sof-tplg/sof-adl-sdw-max98373-rt5682.tplg + /usr/lib/firmware/intel/sof-tplg/sof-apl-da7219.tplg + /usr/lib/firmware/intel/sof-tplg/sof-apl-demux-pcm512x.tplg + /usr/lib/firmware/intel/sof-tplg/sof-apl-es8336-dmic2ch-ssp0.tplg + /usr/lib/firmware/intel/sof-tplg/sof-apl-es8336-dmic2ch-ssp1.tplg + /usr/lib/firmware/intel/sof-tplg/sof-apl-es8336-dmic2ch-ssp2.tplg + /usr/lib/firmware/intel/sof-tplg/sof-apl-es8336-dmic2ch-ssp5.tplg + /usr/lib/firmware/intel/sof-tplg/sof-apl-es8336-dmic4ch-ssp0.tplg + /usr/lib/firmware/intel/sof-tplg/sof-apl-es8336-dmic4ch-ssp1.tplg + /usr/lib/firmware/intel/sof-tplg/sof-apl-es8336-dmic4ch-ssp2.tplg + /usr/lib/firmware/intel/sof-tplg/sof-apl-es8336-dmic4ch-ssp5.tplg + /usr/lib/firmware/intel/sof-tplg/sof-apl-es8336-ssp0.tplg + /usr/lib/firmware/intel/sof-tplg/sof-apl-es8336-ssp1.tplg + /usr/lib/firmware/intel/sof-tplg/sof-apl-es8336-ssp2.tplg + /usr/lib/firmware/intel/sof-tplg/sof-apl-es8336-ssp5.tplg + /usr/lib/firmware/intel/sof-tplg/sof-apl-es8336.tplg + /usr/lib/firmware/intel/sof-tplg/sof-apl-keyword-detect.tplg + /usr/lib/firmware/intel/sof-tplg/sof-apl-nocodec-ci.tplg + /usr/lib/firmware/intel/sof-tplg/sof-apl-nocodec.tplg + /usr/lib/firmware/intel/sof-tplg/sof-apl-pcm512x-master-44100.tplg + /usr/lib/firmware/intel/sof-tplg/sof-apl-pcm512x-master.tplg + /usr/lib/firmware/intel/sof-tplg/sof-apl-pcm512x.tplg + /usr/lib/firmware/intel/sof-tplg/sof-apl-rt298.tplg + /usr/lib/firmware/intel/sof-tplg/sof-apl-tdf8532.tplg + /usr/lib/firmware/intel/sof-tplg/sof-apl-wm8804.tplg + /usr/lib/firmware/intel/sof-tplg/sof-bdw-nocodec.tplg + /usr/lib/firmware/intel/sof-tplg/sof-bdw-rt286.tplg + /usr/lib/firmware/intel/sof-tplg/sof-bdw-rt5640.tplg + /usr/lib/firmware/intel/sof-tplg/sof-bdw-rt5677.tplg + /usr/lib/firmware/intel/sof-tplg/sof-byt-cx2072x-ssp0.tplg + /usr/lib/firmware/intel/sof-tplg/sof-byt-cx2072x.tplg + /usr/lib/firmware/intel/sof-tplg/sof-byt-da7213-ssp0.tplg + /usr/lib/firmware/intel/sof-tplg/sof-byt-da7213.tplg + /usr/lib/firmware/intel/sof-tplg/sof-byt-es8316-ssp0.tplg + /usr/lib/firmware/intel/sof-tplg/sof-byt-es8316.tplg + /usr/lib/firmware/intel/sof-tplg/sof-byt-max98090.tplg + /usr/lib/firmware/intel/sof-tplg/sof-byt-nocodec.tplg + /usr/lib/firmware/intel/sof-tplg/sof-byt-rt5640-ssp0.tplg + /usr/lib/firmware/intel/sof-tplg/sof-byt-rt5640.tplg + /usr/lib/firmware/intel/sof-tplg/sof-byt-rt5645-ssp0.tplg + /usr/lib/firmware/intel/sof-tplg/sof-byt-rt5645.tplg + /usr/lib/firmware/intel/sof-tplg/sof-byt-rt5651-ssp0.tplg + /usr/lib/firmware/intel/sof-tplg/sof-byt-rt5651.tplg + /usr/lib/firmware/intel/sof-tplg/sof-byt-rt5670-ssp0.tplg + /usr/lib/firmware/intel/sof-tplg/sof-byt-rt5670.tplg + /usr/lib/firmware/intel/sof-tplg/sof-byt-rt5682-ssp0.tplg + /usr/lib/firmware/intel/sof-tplg/sof-byt-rt5682.tplg + /usr/lib/firmware/intel/sof-tplg/sof-byt-wm5102-ssp0.tplg + /usr/lib/firmware/intel/sof-tplg/sof-cht-cx2072x.tplg + /usr/lib/firmware/intel/sof-tplg/sof-cht-da7213.tplg + /usr/lib/firmware/intel/sof-tplg/sof-cht-es8316.tplg + /usr/lib/firmware/intel/sof-tplg/sof-cht-max98090.tplg + /usr/lib/firmware/intel/sof-tplg/sof-cht-nau8824.tplg + /usr/lib/firmware/intel/sof-tplg/sof-cht-nocodec.tplg + /usr/lib/firmware/intel/sof-tplg/sof-cht-rt5640.tplg + /usr/lib/firmware/intel/sof-tplg/sof-cht-rt5645.tplg + /usr/lib/firmware/intel/sof-tplg/sof-cht-rt5651.tplg + /usr/lib/firmware/intel/sof-tplg/sof-cht-rt5670.tplg + /usr/lib/firmware/intel/sof-tplg/sof-cht-rt5682.tplg + /usr/lib/firmware/intel/sof-tplg/sof-cml-da7219-max98357a.tplg + /usr/lib/firmware/intel/sof-tplg/sof-cml-da7219-max98390.tplg + /usr/lib/firmware/intel/sof-tplg/sof-cml-demux-rt5682-max98357a.tplg + /usr/lib/firmware/intel/sof-tplg/sof-cml-demux-rt5682.tplg + /usr/lib/firmware/intel/sof-tplg/sof-cml-es8336-dmic2ch-ssp0.tplg + /usr/lib/firmware/intel/sof-tplg/sof-cml-es8336-dmic2ch-ssp1.tplg + /usr/lib/firmware/intel/sof-tplg/sof-cml-es8336-dmic2ch-ssp2.tplg + /usr/lib/firmware/intel/sof-tplg/sof-cml-es8336-dmic4ch-ssp0.tplg + /usr/lib/firmware/intel/sof-tplg/sof-cml-es8336-dmic4ch-ssp1.tplg + /usr/lib/firmware/intel/sof-tplg/sof-cml-es8336-dmic4ch-ssp2.tplg + /usr/lib/firmware/intel/sof-tplg/sof-cml-es8336-ssp0.tplg + /usr/lib/firmware/intel/sof-tplg/sof-cml-es8336-ssp1.tplg + /usr/lib/firmware/intel/sof-tplg/sof-cml-es8336-ssp2.tplg + /usr/lib/firmware/intel/sof-tplg/sof-cml-nocodec.tplg + /usr/lib/firmware/intel/sof-tplg/sof-cml-rt1011-rt5682.tplg + /usr/lib/firmware/intel/sof-tplg/sof-cml-rt5682-kwd.tplg + /usr/lib/firmware/intel/sof-tplg/sof-cml-rt5682-max98357a.tplg + /usr/lib/firmware/intel/sof-tplg/sof-cml-rt5682.tplg + /usr/lib/firmware/intel/sof-tplg/sof-cml-rt700-2ch.tplg + /usr/lib/firmware/intel/sof-tplg/sof-cml-rt700-4ch.tplg + /usr/lib/firmware/intel/sof-tplg/sof-cml-rt700.tplg + /usr/lib/firmware/intel/sof-tplg/sof-cml-rt711-rt1308-mono-rt715.tplg + /usr/lib/firmware/intel/sof-tplg/sof-cml-rt711-rt1308-rt715.tplg + /usr/lib/firmware/intel/sof-tplg/sof-cnl-nocodec.tplg + /usr/lib/firmware/intel/sof-tplg/sof-cnl-rt274.tplg + /usr/lib/firmware/intel/sof-tplg/sof-ehl-nocodec.tplg + /usr/lib/firmware/intel/sof-tplg/sof-ehl-rt5660-nohdmi.tplg + /usr/lib/firmware/intel/sof-tplg/sof-ehl-rt5660.tplg + /usr/lib/firmware/intel/sof-tplg/sof-glk-cs42l42.tplg + /usr/lib/firmware/intel/sof-tplg/sof-glk-da7219-kwd.tplg + /usr/lib/firmware/intel/sof-tplg/sof-glk-da7219.tplg + /usr/lib/firmware/intel/sof-tplg/sof-glk-es8336-dmic2ch-ssp0.tplg + /usr/lib/firmware/intel/sof-tplg/sof-glk-es8336-dmic2ch-ssp1.tplg + /usr/lib/firmware/intel/sof-tplg/sof-glk-es8336-dmic2ch-ssp2.tplg + /usr/lib/firmware/intel/sof-tplg/sof-glk-es8336-dmic2ch-ssp5.tplg + /usr/lib/firmware/intel/sof-tplg/sof-glk-es8336-dmic4ch-ssp0.tplg + /usr/lib/firmware/intel/sof-tplg/sof-glk-es8336-dmic4ch-ssp1.tplg + /usr/lib/firmware/intel/sof-tplg/sof-glk-es8336-dmic4ch-ssp2.tplg + /usr/lib/firmware/intel/sof-tplg/sof-glk-es8336-dmic4ch-ssp5.tplg + /usr/lib/firmware/intel/sof-tplg/sof-glk-es8336-ssp0.tplg + /usr/lib/firmware/intel/sof-tplg/sof-glk-es8336-ssp1.tplg + /usr/lib/firmware/intel/sof-tplg/sof-glk-es8336-ssp2.tplg + /usr/lib/firmware/intel/sof-tplg/sof-glk-es8336-ssp5.tplg + /usr/lib/firmware/intel/sof-tplg/sof-glk-es8336.tplg + /usr/lib/firmware/intel/sof-tplg/sof-glk-nocodec.tplg + /usr/lib/firmware/intel/sof-tplg/sof-glk-rt5682.tplg + /usr/lib/firmware/intel/sof-tplg/sof-hda-generic-1ch-pdm1.tplg + /usr/lib/firmware/intel/sof-tplg/sof-hda-generic-1ch.tplg + /usr/lib/firmware/intel/sof-tplg/sof-hda-generic-2ch-kwd.tplg + /usr/lib/firmware/intel/sof-tplg/sof-hda-generic-2ch-pdm1.tplg + /usr/lib/firmware/intel/sof-tplg/sof-hda-generic-2ch.tplg + /usr/lib/firmware/intel/sof-tplg/sof-hda-generic-3ch.tplg + /usr/lib/firmware/intel/sof-tplg/sof-hda-generic-4ch-kwd.tplg + /usr/lib/firmware/intel/sof-tplg/sof-hda-generic-4ch.tplg + /usr/lib/firmware/intel/sof-tplg/sof-hda-generic-idisp-2ch.tplg + /usr/lib/firmware/intel/sof-tplg/sof-hda-generic-idisp-4ch.tplg + /usr/lib/firmware/intel/sof-tplg/sof-hda-generic-idisp.tplg + /usr/lib/firmware/intel/sof-tplg/sof-hda-generic.tplg + /usr/lib/firmware/intel/sof-tplg/sof-icl-dmic-4ch.tplg + /usr/lib/firmware/intel/sof-tplg/sof-icl-es8336-dmic2ch-ssp0.tplg + /usr/lib/firmware/intel/sof-tplg/sof-icl-es8336-dmic2ch-ssp1.tplg + /usr/lib/firmware/intel/sof-tplg/sof-icl-es8336-dmic2ch-ssp2.tplg + /usr/lib/firmware/intel/sof-tplg/sof-icl-es8336-dmic4ch-ssp0.tplg + /usr/lib/firmware/intel/sof-tplg/sof-icl-es8336-dmic4ch-ssp1.tplg + /usr/lib/firmware/intel/sof-tplg/sof-icl-es8336-dmic4ch-ssp2.tplg + /usr/lib/firmware/intel/sof-tplg/sof-icl-es8336-ssp0.tplg + /usr/lib/firmware/intel/sof-tplg/sof-icl-es8336-ssp1.tplg + /usr/lib/firmware/intel/sof-tplg/sof-icl-es8336-ssp2.tplg + /usr/lib/firmware/intel/sof-tplg/sof-icl-nocodec.tplg + /usr/lib/firmware/intel/sof-tplg/sof-icl-rt5682-kwd.tplg + /usr/lib/firmware/intel/sof-tplg/sof-icl-rt5682.tplg + /usr/lib/firmware/intel/sof-tplg/sof-icl-rt700-2ch.tplg + /usr/lib/firmware/intel/sof-tplg/sof-icl-rt700-4ch.tplg + /usr/lib/firmware/intel/sof-tplg/sof-icl-rt700.tplg + /usr/lib/firmware/intel/sof-tplg/sof-icl-rt711-rt1308-rt715.tplg + /usr/lib/firmware/intel/sof-tplg/sof-imx8-compr-wm8960-mixer.tplg + /usr/lib/firmware/intel/sof-tplg/sof-imx8-cs42888-mixer.tplg + /usr/lib/firmware/intel/sof-tplg/sof-imx8-cs42888.tplg + /usr/lib/firmware/intel/sof-tplg/sof-imx8-drc-wm8960.tplg + /usr/lib/firmware/intel/sof-tplg/sof-imx8-eq-fir-wm8960.tplg + /usr/lib/firmware/intel/sof-tplg/sof-imx8-eq-iir-wm8960.tplg + /usr/lib/firmware/intel/sof-tplg/sof-imx8-nocodec-sai.tplg + /usr/lib/firmware/intel/sof-tplg/sof-imx8-nocodec.tplg + /usr/lib/firmware/intel/sof-tplg/sof-imx8-wm8960-kwd.tplg + /usr/lib/firmware/intel/sof-tplg/sof-imx8-wm8960-mixer.tplg + /usr/lib/firmware/intel/sof-tplg/sof-imx8-wm8960.tplg + /usr/lib/firmware/intel/sof-tplg/sof-imx8mp-compr-wm8960-mixer.tplg + /usr/lib/firmware/intel/sof-tplg/sof-imx8mp-drc-wm8960.tplg + /usr/lib/firmware/intel/sof-tplg/sof-imx8mp-eq-fir-wm8960.tplg + /usr/lib/firmware/intel/sof-tplg/sof-imx8mp-eq-iir-wm8960.tplg + /usr/lib/firmware/intel/sof-tplg/sof-imx8mp-wm8904.tplg + /usr/lib/firmware/intel/sof-tplg/sof-imx8mp-wm8960-kwd.tplg + /usr/lib/firmware/intel/sof-tplg/sof-imx8mp-wm8960-mixer.tplg + /usr/lib/firmware/intel/sof-tplg/sof-imx8mp-wm8960.tplg + /usr/lib/firmware/intel/sof-tplg/sof-imx8ulp-9x9-btsco.tplg + /usr/lib/firmware/intel/sof-tplg/sof-imx8ulp-btsco.tplg + /usr/lib/firmware/intel/sof-tplg/sof-jsl-cs42l42-mx98360a.tplg + /usr/lib/firmware/intel/sof-tplg/sof-jsl-da7219-mx98360a.tplg + /usr/lib/firmware/intel/sof-tplg/sof-tgl-es8336-ssp2.tplg + /usr/lib/firmware/intel/sof-tplg/sof-jsl-da7219.tplg + /usr/lib/firmware/intel/sof-tplg/sof-jsl-es8336-dmic2ch-ssp0.tplg + /usr/lib/firmware/intel/sof-tplg/sof-jsl-es8336-dmic2ch-ssp1.tplg + /usr/lib/firmware/intel/sof-tplg/sof-jsl-es8336-dmic2ch-ssp2.tplg + /usr/lib/firmware/intel/sof-tplg/sof-jsl-es8336-dmic4ch-ssp0.tplg + /usr/lib/firmware/intel/sof-tplg/sof-jsl-es8336-dmic4ch-ssp1.tplg + /usr/lib/firmware/intel/sof-tplg/sof-jsl-es8336-dmic4ch-ssp2.tplg + /usr/lib/firmware/intel/sof-tplg/sof-jsl-es8336-ssp0.tplg + /usr/lib/firmware/intel/sof-tplg/sof-jsl-es8336-ssp1.tplg + /usr/lib/firmware/intel/sof-tplg/sof-jsl-es8336-ssp2.tplg + /usr/lib/firmware/intel/sof-tplg/sof-jsl-nocodec.tplg + /usr/lib/firmware/intel/sof-tplg/sof-jsl-rt5682-mx98360a.tplg + /usr/lib/firmware/intel/sof-tplg/sof-jsl-rt5682-rt1015-xperi.tplg + /usr/lib/firmware/intel/sof-tplg/sof-jsl-rt5682-rt1015.tplg + /usr/lib/firmware/intel/sof-tplg/sof-jsl-rt5682.tplg + /usr/lib/firmware/intel/sof-tplg/sof-mt8186-mt6366-da7219-max98357.tplg + /usr/lib/firmware/intel/sof-tplg/sof-mt8186-mt6366-rt1019-rt5682s.tplg + /usr/lib/firmware/intel/sof-tplg/sof-mt8195-mt6359-max98390-rt5682-google-aec-rtnr.tplg + /usr/lib/firmware/intel/sof-tplg/sof-mt8195-mt6359-max98390-rt5682-rtnr.tplg + /usr/lib/firmware/intel/sof-tplg/sof-mt8195-mt6359-max98390-rt5682.tplg + /usr/lib/firmware/intel/sof-tplg/sof-mt8195-mt6359-rt1019-rt5682-dts.tplg + /usr/lib/firmware/intel/sof-tplg/sof-mt8195-mt6359-rt1019-rt5682.tplg + /usr/lib/firmware/intel/sof-tplg/sof-rn-rt5682-max98360.tplg + /usr/lib/firmware/intel/sof-tplg/sof-rn-rt5682-rt1019.tplg + /usr/lib/firmware/intel/sof-tplg/sof-rpl-nocodec.tplg + /usr/lib/firmware/intel/sof-tplg/sof-rpl-rt1316-l12-rt714-l0.tplg + /usr/lib/firmware/intel/sof-tplg/sof-rpl-rt711-4ch.tplg + /usr/lib/firmware/intel/sof-tplg/sof-rpl-rt711-l0-rt1316-l12-rt714-l3.tplg + /usr/lib/firmware/intel/sof-tplg/sof-rpl-rt711-l0-rt1316-l12.tplg + /usr/lib/firmware/intel/sof-tplg/sof-rpl-rt711-l0-rt1318-l12-rt714-l3.tplg + /usr/lib/firmware/intel/sof-tplg/sof-rpl-rt711-l0-rt1318-l12.tplg + /usr/lib/firmware/intel/sof-tplg/sof-rpl-rt711-l0.tplg + /usr/lib/firmware/intel/sof-tplg/sof-rpl-rt711-l2-rt1316-l01-rt714-l3.tplg + /usr/lib/firmware/intel/sof-tplg/sof-rpl-rt711-l2-rt1316-l01.tplg + /usr/lib/firmware/intel/sof-tplg/sof-rpl-rt711-l2.tplg + /usr/lib/firmware/intel/sof-tplg/sof-rpl-rt711.tplg + /usr/lib/firmware/intel/sof-tplg/sof-smart-amplifier-nocodec.tplg + /usr/lib/firmware/intel/sof-tplg/sof-tgl-es8336-dmic2ch-ssp0.tplg + /usr/lib/firmware/intel/sof-tplg/sof-tgl-es8336-dmic2ch-ssp1.tplg + /usr/lib/firmware/intel/sof-tplg/sof-tgl-es8336-dmic2ch-ssp2.tplg + /usr/lib/firmware/intel/sof-tplg/sof-tgl-es8336-dmic4ch-ssp0.tplg + /usr/lib/firmware/intel/sof-tplg/sof-tgl-es8336-dmic4ch-ssp1.tplg + /usr/lib/firmware/intel/sof-tplg/sof-tgl-es8336-dmic4ch-ssp2.tplg + /usr/lib/firmware/intel/sof-tplg/sof-tgl-es8336-ssp0.tplg + /usr/lib/firmware/intel/sof-tplg/sof-tgl-es8336-ssp1.tplg + /usr/lib/firmware/intel/sof-tplg/sof-tgl-es8336.tplg + /usr/lib/firmware/intel/sof-tplg/sof-tgl-h-nocodec.tplg + /usr/lib/firmware/intel/sof-tplg/sof-tgl-max98357a-rt5682-pdm1-drceq.tplg + /usr/lib/firmware/intel/sof-tplg/sof-tgl-max98357a-rt5682-pdm1-google-aec.tplg + /usr/lib/firmware/intel/sof-tplg/sof-tgl-max98357a-rt5682-pdm1.tplg + /usr/lib/firmware/intel/sof-tplg/sof-tgl-max98357a-rt5682-rtnr.tplg + /usr/lib/firmware/intel/sof-tplg/sof-tgl-max98357a-rt5682.tplg + /usr/lib/firmware/intel/sof-tplg/sof-tgl-max98373-rt5682-igonr.tplg + /usr/lib/firmware/intel/sof-tplg/sof-tgl-max98373-rt5682-xperi.tplg + /usr/lib/firmware/intel/sof-tplg/sof-tgl-max98373-rt5682.tplg + /usr/lib/firmware/intel/sof-tplg/sof-tgl-nocodec-ci.tplg + /usr/lib/firmware/intel/sof-tplg/sof-tgl-nocodec-hdmi-ssp15.tplg + /usr/lib/firmware/intel/sof-tplg/sof-tgl-nocodec.tplg + /usr/lib/firmware/intel/sof-tplg/sof-tgl-rt1011-rt5682.tplg + /usr/lib/firmware/intel/sof-tplg/sof-tgl-rt1308-ssp2-hdmi-ssp15.tplg + /usr/lib/firmware/intel/sof-tplg/sof-tgl-rt5682-ssp0-max98373-ssp2-xperi.tplg + /usr/lib/firmware/intel/sof-tplg/sof-tgl-rt5682-ssp0-max98373-ssp2.tplg + /usr/lib/firmware/intel/sof-tplg/sof-tgl-rt711-4ch.tplg + /usr/lib/firmware/intel/sof-tplg/sof-tgl-rt711-l0-rt1316-l1-mono-rt714-l3.tplg + /usr/lib/firmware/intel/sof-tplg/sof-tgl-rt711-rt1308-2ch.tplg + /usr/lib/firmware/intel/sof-tplg/sof-tgl-rt711-rt1308-4ch.tplg + /usr/lib/firmware/intel/sof-tplg/sof-tgl-rt711-rt1308-mono-rt715.tplg + /usr/lib/firmware/intel/sof-tplg/sof-tgl-rt711-rt1308-rt715.tplg + /usr/lib/firmware/intel/sof-tplg/sof-tgl-rt711-rt1316-rt714.tplg + /usr/lib/firmware/intel/sof-tplg/sof-tgl-rt715-rt711-rt1308-mono.tplg + /usr/lib/firmware/intel/sof-tplg/sof-tgl-sdw-max98373-rt5682.tplg + /usr/lib/firmware/intel/sof-tplg/sof-whl-demux-rt5682.tplg + /usr/lib/firmware/intel/sof-tplg/sof-whl-rt5682-kwd.tplg + /usr/lib/firmware/intel/sof-tplg/sof-whl-rt5682.tplg
+ /usr/share/doc/firmware-sof-signed + /usr/share/doc/firmware-sof-signed/changelog.Debian.gz + /usr/share/doc/firmware-sof-signed/copyright + /usr/share/lintian/overrides/firmware-sof-signed
+ /usr/lib/firmware/intel/sof/community/sof-adl-n.ri + /usr/lib/firmware/intel/sof/community/sof-adl-s.ri + /usr/lib/firmware/intel/sof/community/sof-adl.ri + /usr/lib/firmware/intel/sof/community/sof-cfl.ri + /usr/lib/firmware/intel/sof/community/sof-cml.ri + /usr/lib/firmware/intel/sof/community/sof-ehl.ri + /usr/lib/firmware/intel/sof/community/sof-glk.ri + /usr/lib/firmware/intel/sof/community/sof-rpl-s.ri + /usr/lib/firmware/intel/sof/community/sof-rpl.ri
+ /usr/lib/firmware/intel/sof/intel-signed/sof-cfl.ri + /usr/lib/firmware/intel/sof/intel-signed/sof-cml.ri + /usr/lib/firmware/intel/sof/intel-signed/sof-glk.ri + /usr/lib/firmware/intel/sof/intel-signed/sof-rpl-s.ri + /usr/lib/firmware/intel/sof/intel-signed/sof-rpl.ri
+ /usr/lib/firmware/intel/sof/sof-adl-n.ldc + /usr/lib/firmware/intel/sof/sof-adl-n.ri + /usr/lib/firmware/intel/sof/sof-adl-s.ldc + /usr/lib/firmware/intel/sof/sof-adl-s.ri + /usr/lib/firmware/intel/sof/sof-adl.ldc + /usr/lib/firmware/intel/sof/sof-adl.ri + /usr/lib/firmware/intel/sof/sof-apl.ri + /usr/lib/firmware/intel/sof/sof-cfl.ldc + /usr/lib/firmware/intel/sof/sof-cfl.ri + /usr/lib/firmware/intel/sof/sof-cml.ldc + /usr/lib/firmware/intel/sof/sof-cml.ri + /usr/lib/firmware/intel/sof/sof-cnl.ri + /usr/lib/firmware/intel/sof/sof-ehl.ldc + /usr/lib/firmware/intel/sof/sof-ehl.ri + /usr/lib/firmware/intel/sof/sof-glk.ldc + /usr/lib/firmware/intel/sof/sof-glk.ri + /usr/lib/firmware/intel/sof/sof-icl.ri + /usr/lib/firmware/intel/sof/sof-jsl.ri + /usr/lib/firmware/intel/sof/sof-rpl-s.ldc + /usr/lib/firmware/intel/sof/sof-rpl-s.ri + /usr/lib/firmware/intel/sof/sof-rpl.ldc + /usr/lib/firmware/intel/sof/sof-rpl.ri + /usr/lib/firmware/intel/sof/sof-tgl-h.ri + /usr/lib/firmware/intel/sof/sof-tgl.ri
+ /usr/lib/firmware/intel/sof-ipc4/mtl/sof-mtl.ri
+ /usr/share/alsa/ucm2/conf.d/sof-nau8825 + /usr/share/alsa/ucm2/conf.d/sof-nau8825/HiFi.kano.conf + /usr/share/alsa/ucm2/conf.d/sof-nau8825/HiFi.osiris.conf + /usr/share/alsa/ucm2/conf.d/sof-nau8825/sof-nau8825.conf
+ /usr/share/alsa/ucm2/conf.d/sof-ssp_amp + /usr/share/alsa/ucm2/conf.d/sof-ssp_amp/HiFi.vell.conf + /usr/share/alsa/ucm2/conf.d/sof-ssp_amp/sof-ssp_amp.conf
+ /usr/share/alsa/ucm2/conf.d/sof-bxtda7219ma + /usr/share/alsa/ucm2/conf.d/sof-bxtda7219ma/HiFi.conf + /usr/share/alsa/ucm2/conf.d/sof-bxtda7219ma/sof-bxtda7219ma.conf
+ /usr/share/alsa/ucm2/conf.d/avs_da7219 + /usr/share/alsa/ucm2/conf.d/avs_da7219/HiFi.conf + /usr/share/alsa/ucm2/conf.d/avs_da7219/avs_da7219.conf
+ /usr/share/alsa/ucm2/conf.d/avs_dmic + /usr/share/alsa/ucm2/conf.d/avs_dmic/HiFi.conf + /usr/share/alsa/ucm2/conf.d/avs_dmic/avs_dmic.conf
+ /usr/share/alsa/ucm2/conf.d/avs_max98357a + /usr/share/alsa/ucm2/conf.d/avs_max98357a/HiFi.conf + /usr/share/alsa/ucm2/conf.d/avs_max98357a/avs_max98357a.conf
+ /usr/share/alsa/ucm2/conf.d/avs_max98373 + /usr/share/alsa/ucm2/conf.d/avs_max98373/HiFi.conf + /usr/share/alsa/ucm2/conf.d/avs_max98373/avs_max98373.conf
+ /usr/share/alsa/ucm2/conf.d/avs_max98927 + /usr/share/alsa/ucm2/conf.d/avs_max98927/HiFi.conf + /usr/share/alsa/ucm2/conf.d/avs_max98927/avs_max98927.conf
+ /usr/share/alsa/ucm2/conf.d/avs_nau8825 + /usr/share/alsa/ucm2/conf.d/avs_nau8825/HiFi.conf + /usr/share/alsa/ucm2/conf.d/avs_nau8825/avs_nau8825.conf
+ /usr/share/alsa/ucm2/conf.d/avs_rt5663 + /usr/share/alsa/ucm2/conf.d/avs_rt5663/HiFi.conf + /usr/share/alsa/ucm2/conf.d/avs_rt5663/avs_rt5663.conf
+ /usr/share/alsa/ucm2/conf.d/avs_ssm4567-adi + /usr/share/alsa/ucm2/conf.d/avs_ssm4567-adi/HiFi.conf + /usr/share/alsa/ucm2/conf.d/avs_ssm4567-adi/avs_ssm4567-adi.conf
+ /usr/share/alsa/ucm2/conf.d/hdaudioB0D2 + /usr/share/alsa/ucm2/conf.d/hdaudioB0D2/HiFi.conf + /usr/share/alsa/ucm2/conf.d/hdaudioB0D2/hdaudioB0D2.conf
+ /usr/share/alsa/ucm2/conf.d/sof-rt5682s-rt1 + /usr/share/alsa/ucm2/conf.d/sof-rt5682s-rt1/HiFi.conf + /usr/share/alsa/ucm2/conf.d/sof-rt5682s-rt1/sof-rt5682s-rt1.conf
+ /usr/share/alsa/ucm2/conf.d/sof-cml_max9839 + /usr/share/alsa/ucm2/conf.d/sof-cml_max9839/HiFi.conf + /usr/share/alsa/ucm2/conf.d/sof-cml_max9839/sof-cml_max9839.conf
+ /usr/share/alsa/ucm2/conf.d/sof-cml_rt1011_ + /usr/share/alsa/ucm2/conf.d/sof-cml_rt1011_/HiFi.conf + /usr/share/alsa/ucm2/conf.d/sof-cml_rt1011_/sof-cml_rt1011_.conf
+ /usr/share/alsa/ucm2/conf.d/sof-cmlda7219ma + /usr/share/alsa/ucm2/conf.d/sof-cmlda7219ma/HiFi.conf
+ /usr/share/alsa/ucm2/conf.d/sof-cmlda7219ma/sof-cmlda7219ma.conf + /usr/share/alsa/ucm2/conf.d/sof-glkda7219ma/HiFi.conf
+ /usr/share/alsa/ucm2/conf.d/sof-glkrt5682ma + /usr/share/alsa/ucm2/conf.d/sof-glkrt5682ma/HiFi.conf + /usr/share/alsa/ucm2/conf.d/sof-glkrt5682ma/sof-glkrt5682ma.conf
+ /usr/share/alsa/ucm2/conf.d/sof-da7219max98 + /usr/share/alsa/ucm2/conf.d/sof-da7219max98/HiFi.conf + /usr/share/alsa/ucm2/conf.d/sof-da7219max98/sof-da7219max98.conf
+ /usr/share/alsa/ucm2/conf.d/sof-rt5682s-hs- + /usr/share/alsa/ucm2/conf.d/sof-rt5682s-hs-/HiFi.conf + /usr/share/alsa/ucm2/conf.d/sof-rt5682s-hs-/sof-rt5682s-hs-.conf
+ /usr/share/alsa/ucm2/conf.d/mt8183_da7219_r + /usr/share/alsa/ucm2/conf.d/mt8183_da7219_r/HiFi.conf + /usr/share/alsa/ucm2/conf.d/mt8183_da7219_r/mt8183_da7219_rt1015p.conf
+ /usr/share/alsa/ucm2/conf.d/mt8183_mt6358_t + /usr/share/alsa/ucm2/conf.d/mt8183_mt6358_t/HiFi.conf + /usr/share/alsa/ucm2/conf.d/mt8183_mt6358_t/mt8183_mt6358_ts3a227_max98357.conf
+ /usr/share/alsa/ucm2/conf.d/HD-Audio Generic + /usr/share/alsa/ucm2/conf.d/HD-Audio Generic/HD-Audio Generic.conf + /usr/share/alsa/ucm2/conf.d/HD-Audio Generic/HiFi.conf
+ /usr/share/alsa/ucm2/conf.d/acp3xalc5682101 + /usr/share/alsa/ucm2/conf.d/acp3xalc5682101/HiFi.conf + /usr/share/alsa/ucm2/conf.d/acp3xalc5682101/acp3xalc5682101.conf + /usr/share/alsa/ucm2/conf.d/acp3xalc5682m98/HiFi.conf
+ /usr/share/alsa/ucm2/conf.d/HDA ATI HDMI + /usr/share/alsa/ucm2/conf.d/HDA ATI HDMI/HDA ATI HDMI.conf + /usr/share/alsa/ucm2/conf.d/HDA ATI HDMI/HiFi.conf
+ /usr/share/alsa/ucm2/conf.d/acpd7219m98357 + /usr/share/alsa/ucm2/conf.d/acpd7219m98357/HiFi.conf + /usr/share/alsa/ucm2/conf.d/acpd7219m98357/acpd7219m98357.conf
+ /usr/share/alsa/ucm2/codecs/cs42l42 + /usr/share/alsa/ucm2/codecs/cs42l42/init.conf + /usr/share/alsa/ucm2/codecs/hda/hdmi234.conf + /usr/share/alsa/ucm2/codecs/hda/hdmi2345.conf + /usr/share/alsa/ucm2/codecs/hda/hdmi345.conf + /usr/share/alsa/ucm2/codecs/hda/hdmi567.conf
+ /usr/share/alsa/ucm2/codecs/max98357a + /usr/share/alsa/ucm2/codecs/max98357a/speaker.conf
+ /usr/share/alsa/ucm2/codecs/max98373 + /usr/share/alsa/ucm2/codecs/max98373/init.conf + /usr/share/alsa/ucm2/codecs/max98373/speaker.conf
+ /usr/share/alsa/ucm2/codecs/max98390 + /usr/share/alsa/ucm2/codecs/max98390/init.conf
+ /usr/share/alsa/ucm2/codecs/rt1011 + /usr/share/alsa/ucm2/codecs/rt1011/init.conf + /usr/share/alsa/ucm2/codecs/rt1011/speaker.conf
+ /usr/share/alsa/ucm2/codecs/rt1015 + /usr/share/alsa/ucm2/codecs/rt1015/init.conf + /usr/share/alsa/ucm2/codecs/rt1015/speaker.conf
+ /usr/share/alsa/ucm2/codecs/rt1015p + /usr/share/alsa/ucm2/codecs/rt1015p/speaker.conf
+ /usr/share/alsa/ucm2/codecs/rt1019 + /usr/share/alsa/ucm2/codecs/rt1019/init.conf
+ /usr/share/alsa/ucm2/codecs/rt1019p + /usr/share/alsa/ucm2/codecs/rt1019p/speaker.conf
+ /usr/share/alsa/ucm2/codecs/rt5682s + /usr/share/alsa/ucm2/codecs/rt5682s/headset.conf + /usr/share/alsa/ucm2/codecs/rt5682s/init.conf
+ /usr/share/alsa/ucm2/platforms/intel-sof + /usr/share/alsa/ucm2/platforms/intel-sof/platform.conf
+ /usr/share/alsa/ucm2/conf.d/sof-rt5682 + /usr/share/alsa/ucm2/conf.d/sof-rt5682/HiFi.conf + /usr/share/alsa/ucm2/conf.d/sof-rt5682/codecs.conf + /usr/share/alsa/ucm2/conf.d/sof-rt5682/rt5682-headset.conf + /usr/share/alsa/ucm2/conf.d/sof-rt5682/rt5682-init.conf + /usr/share/alsa/ucm2/conf.d/sof-rt5682/sof-rt5682.conf
+ /usr/share/alsa/ucm2/conf.d/sof-cs42l42 + /usr/share/alsa/ucm2/conf.d/sof-cs42l42/HiFi.conf + /usr/share/alsa/ucm2/conf.d/sof-cs42l42/sof-cs42l42.conf
M /var/cache/apt M /var/cache/apt/archives M /var/cache/apt/archives/partial + /var/cache/apt/archives/firmware-sof-signed_2023.12-1_all.deb + /var/lib/dpkg/info/firmware-sof-signed.md5sums + /var/lib/dpkg/info/firmware-sof-signed.postinst + /var/lib/dpkg/info/firmware-sof-signed.postrm + /var/lib/dpkg/info/firmware-sof-signed.preinst + /var/lib/dpkg/info/firmware-sof-signed.list M /var/log/apt M /var/log/apt/term.log M /var/log/apt/history.log M /var/log/dpkg.log chrust:/tmp/chromebook-linux-audio$ cat /etc/modprobe.d/snd-sof.conf options snd-intel-dspcfg dsp_driver=3 chrust:/tmp/chromebook-linux-audio$ cat /etc/wireplumber/main.lua.d/51-increase-headroom.lua rule = { matches = { { { "node.name", "matches", "alsa_output.*" }, }, }, apply_properties = { ["api.alsa.headroom"] = 4096, }, } table.insert(alsa_monitor.rules,rule)

And after a reboot I could play aloud my album, all without the Dangerous driver.

This is actually much less annoying than the Home/End/PgUp/PgDn situation, which on normal small keyboards is Fn+←/→/↑/↓, but this is not mapped to alt+˂/˃/˄/˅ here, which sucks shit. No Delete is pretty bad as well. The top row is, accd'g to xev,

esc
Escape
XF86Back
XF86Forward
XF86Reload
hollow rectangle with chevrons in the top-left and bottom-right internal corners
nothing?
hollow rectangle, to its right are two vertical stripes
XF86LaunchA
☀️
XF86MonBrightnessDown
☀️
XF86MonBrightnessUp
🔇
XF86AudioMute
🔉
XF86AudioLowerVolume
🔊
XF86AudioRaiseVolume
🔒
XF86Sleep

(🔒 is the Suspend Key and handled by logind by default; to see it you need to unmap it in /etc/systemd/logind.conf; I settled on

[Login]
HandlePowerKey=hibernate
HandleSuspendKey=ignore
HandleSuspendKeyLongPress=ignore

.) Caps Lock is replaced with

🔍
Super_L

Why 🔉/🔊 are on the keyboard when there are physical buttons for them (or vice versa) is beyond me, too.

The upstream instructions say to run install.sh, but on Debian that installs keyd off unchecked HEAD (which until three weeks ago dumped shit into /usr, and the installer checks for /usr/bin/keyd and will do it again; it continues to run unadorned groupadd keyd to add a system group!), first cloning it to no-where, and generates a config with

    # make vivaldi keys act like vivaldi keys when super isn't held
    for scancode in physmap:
        # Map zoom to f11 since most applications wont listen to zoom
        if vivaldi_scancode_to_keyd(scancode) == "zoom":
            mapping = "f11"
        else:
            mapping = vivaldi_scancode_to_keyd(scancode)
        config += f"{vivaldi_scancode_to_keyd(scancode)} = {mapping}\n"

    # map lock button to coffee
    config += "\nf13=coffee\nsleep=coffee\n"

deadass vivaldi

This would be excessive, but we can't actually even see hollow rectangle with chevrons in the top-left and bottom-right internal corners and the standard remapping facilities are insufficiently expressive anyway.

There's a 2024-01-04 ITP for keyd with no linked dsc, but it features on mentors.d.n, which, well, if I posted I could never show my face in public again (and it takes over a minute for one python program at 100% CPU on my big host, so there's no way it'd ever finish building on a shitty Celeron), but this is what mentors is for, so let's accept keyd is not in Debian:

nabijaczleweli@chrust:~$ git clone http://github.com/rvaiya/keyd
Cloning into 'keyd'...
warning: redirecting to https://github.com/rvaiya/keyd/
Resolving deltas: 100% (2214/2214), done.
nabijaczleweli@chrust:~$ sudo mv keyd/ /usr/local/src/
[sudo] password for nabijaczleweli:
nabijaczleweli@chrust:~$ cd /usr/local/src/keyd/
nabijaczleweli@chrust:/usr/local/src/keyd$ git log -1
commit dcbb68b12f71245121035b730b50872802a259b4
Author: Takahashi, Naoki <102382754+tkna91@users.noreply.github.com>
Date:   Wed Dec 20 02:38:10 2023 +0900

    Add description of KEYD_DEBUG
nabijaczleweli@chrust:/usr/local/src/keyd$ CFLAGS=-march=native LDFLAGS=-flto make
mkdir bin
cp scripts/keyd-application-mapper bin/
sed -e 's#@PREFIX@#/usr/local#' keyd.service.in > keyd.service
cc -DVERSION=\"v2.4.3\ \(dcbb68b\)\" -I/usr/local/include -L/usr/local/lib -Wall -Wextra -Wno-unused -std=c11 -DSOCKET_PATH=\"/var/run/keyd.socket\" -DCONFIG_DIR=\"/etc/keyd\" -DDATA_DIR=\"/usr/local/share/keyd\" -D_FORTIFY_SOURCE=2 -D_DEFAULT_SOURCE -Werror=format-security -march=native -O3 src/*.c src/vkbd/uinput.c -lpthread -o bin/keyd -flto
src/daemon.c: In function ‘add_listener’:
src/daemon.c:84:33: warning: ignoring return value of ‘write’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
 84 | write(con, layer->type == LT_LAYOUT ? "/" : "+", 1);
 | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src/daemon.c:85:33: warning: ignoring return value of ‘write’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
 85 | write(con, layer->name, strlen(layer->name));
 | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src/daemon.c:86:33: warning: ignoring return value of ‘write’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
 86 | write(con, "\n", 1);
 | ^~~~~~~~~~~~~~~~~~~
nabijaczleweli@chrust:/usr/local/src/keyd$ sudo make install
mkdir -p /etc/keyd
mkdir -p /usr/local/bin/
mkdir -p /usr/local/share/keyd/
mkdir -p /usr/local/share/keyd/layouts/
mkdir -p /usr/local/share/man/man1/
mkdir -p /usr/local/share/doc/keyd/
mkdir -p /usr/local/share/doc/keyd/examples/
groupadd keyd
install -m755 bin/* /usr/local/bin/
install -m644 docs/*.md /usr/local/share/doc/keyd/
install -m644 examples/* /usr/local/share/doc/keyd/examples/
install -m644 layouts/* /usr/local/share/keyd/layouts
install -m644 data/*.1.gz /usr/local/share/man/man1/
install -m644 data/keyd.compose /usr/local/share/keyd/
nabijaczleweli@chrust:/usr/local/src/keyd$ getent group keyd
keyd:x:1001:
nabijaczleweli@chrust:/usr/local/src/keyd$ sudo delgroup keyd
info: Removing group `keyd' ...
nabijaczleweli@chrust:/usr/local/src/keyd$ sudo addgroup keyd
info: Selecting GID from range 100 to 999 ...
info: Adding group `keyd' (GID 109) ...
 root@chrust:/usr/local/src/keyd# for f in $(zfs list -t snap -Ho name | grep keyd); do zfs diff -h $f; done
M /etc/
M /etc/group-
M /etc/gshadow-
- /etc/group
- /etc/gshadow
+ /etc/group
+ /etc/gshadow
+ /etc/keyd
M /etc/systemd/system/sysinit.target.wants
+ /etc/systemd/system/sysinit.target.wants/keyd.service
M /usr/local/share
M /usr/local/share/man
M /usr/local/bin
M /usr/local/lib
M /usr/local/src
+ /usr/local/src/keyd (&c.)
+ /usr/local/lib/systemd
+ /usr/local/lib/systemd/system
+ /usr/local/lib/systemd/system/keyd.service
+ /usr/local/share/man/man1
+ /usr/local/share/doc/keyd/examples
+ /usr/local/bin/keyd
+ /usr/local/bin/keyd-application-mapper
+ /usr/local/share/keyd/layouts/af
+ /usr/local/share/keyd/layouts/al
+ /usr/local/share/keyd/layouts/am (and hundreds more, elided for brevity here)
+ /usr/local/share/keyd
+ /usr/local/share/keyd/layouts
+ /usr/local/share/doc
+ /usr/local/share/doc/keyd
+ /usr/local/share/doc/keyd/CHANGELOG.md
+ /usr/local/share/doc/keyd/DESIGN.md
+ /usr/local/share/doc/keyd/examples/capslock-esc-basic.conf
+ /usr/local/share/doc/keyd/examples/capslock-escape-with-vim-mode.conf
+ /usr/local/share/doc/keyd/examples/international-glyphs.conf
+ /usr/local/share/doc/keyd/examples/macos.conf
+ /usr/local/share/doc/keyd/examples/meta-esc.conf
+ /usr/local/share/doc/keyd/examples/nav-layer.conf
+ /usr/local/share/man/man1/keyd-application-mapper.1.gz
+ /usr/local/share/man/man1/keyd.1.gz
+ /usr/local/share/keyd/keyd.compose

and

nabijaczleweli@chrust:~$ git clone http://github.com/WeirdTreeThing/cros-keyboard-map
Cloning into 'cros-keyboard-map'...
warning: redirecting to https://github.com/WeirdTreeThing/cros-keyboard-map/
Resolving deltas: 100% (26/26), done.
nabijaczleweli@chrust:~$ cd cros-keyboard-map/
nabijaczleweli@chrust:~/cros-keyboard-map$ git log -1
commit 25b0e9c2a10fc834d414b427c40d572fb38cda14
Author: WeirdTreeThing <bradyn127@protonmail.com>
Date:   Tue Dec 12 17:40:08 2023 -0500

    Add support for Chimera Linux

nabijaczleweli@chrust:~/cros-keyboard-map$ grep -n usr/bin/keyd install.sh
26:if ! [ -f /usr/bin/keyd ]; then
nabijaczleweli@chrust:~/cros-keyboard-map$ sed -i 's:.*usr/bin/keyd.*:if false; then:' install.sh
nabijaczleweli@chrust:~/cros-keyboard-map$ sed -n 26p install.sh
if false; then
nabijaczleweli@chrust:~/cros-keyboard-map$ ./install.sh
Generating config
Installing config
[sudo] password for nabijaczleweli:
Enabling keyd
Created symlink /etc/systemd/system/sysinit.target.wants/keyd.service → /usr/local/lib/systemd/system/keyd.service.
Installing libinput configuration
Done
nabijaczleweli@chrust:~/cros-keyboard-map$ sudo mv $PWD /usr/local/src/
          root@chrust:~/cros-keyboard-map# for f in $(zfs list -t snap -Ho name | grep keymap); do zfs diff -h $f; done
M	/etc/
+	/etc/libinput
+	/etc/libinput/local-overrides.quirks
M	/etc/keyd
+	/etc/keyd/cros.conf
M	/etc/systemd/system/sysinit.target.wants
+	/etc/systemd/system/sysinit.target.wants/keyd.service
M	/usr/local/src
+	/usr/local/src/cros-keyboard-map		(&c.)

Now that we've installed a key- and mouse-logger, it doesn't actually work, Thankfully, there's a monitoring interface in the form of keyd monitor; so, pressing all of the top row, then 🔍, then the side buttons (filtered for down events):

device added: 0001:0001 AT Translated Set 2 keyboard (/dev/input/event0)
device added: 04f3:00be Elan Touchpad (/dev/input/event7)
device added: 06cb:1a10 SYTS7817:00 06CB:1A10 (/dev/input/event9)
+1041019475 ms AT Translated Set 2 keyboard 0001:0001 enter up
+672 ms	AT Translated Set 2 keyboard  0001:0001  esc down
+201 ms	AT Translated Set 2 keyboard  0001:0001  back down
+192 ms	AT Translated Set 2 keyboard  0001:0001  forward down
+149 ms	AT Translated Set 2 keyboard  0001:0001  refresh down
+135 ms	AT Translated Set 2 keyboard  0001:0001  zoom down
+155 ms	AT Translated Set 2 keyboard  0001:0001  scale down
+128 ms	AT Translated Set 2 keyboard  0001:0001  brightnessdown down
+107 ms	AT Translated Set 2 keyboard  0001:0001  brightnessup down
+113 ms	AT Translated Set 2 keyboard  0001:0001  mute down
+175 ms	AT Translated Set 2 keyboard  0001:0001  volumedown down
+139 ms	AT Translated Set 2 keyboard  0001:0001  volumeup down
+519 ms	AT Translated Set 2 keyboard  0001:0001  sleep down

+191 ms	AT Translated Set 2 keyboard  0001:0001  leftmeta down

+173 ms	AT Translated Set 2 keyboard  0001:0001  volumedown down
+480 ms	AT Translated Set 2 keyboard  0001:0001  volumeup down

# systemctl start keyd

device added: 0fac:0ade keyd virtual keyboard (/dev/input/event14)
device added: 0fac:1ade keyd virtual pointer (/dev/input/event15)
+324 ms	keyd virtual keyboard  0fac:0ade  esc down
+157 ms	keyd virtual keyboard  0fac:0ade  back down
+141 ms	keyd virtual keyboard  0fac:0ade  forward down
+124 ms	keyd virtual keyboard  0fac:0ade  refresh down
+87 ms	keyd virtual keyboard  0fac:0ade  f11 down
+104 ms	keyd virtual keyboard  0fac:0ade  scale down
+139 ms	keyd virtual keyboard  0fac:0ade  brightnessdown down
+129 ms	keyd virtual keyboard  0fac:0ade  brightnessup down
+147 ms	keyd virtual keyboard  0fac:0ade  mute down
+147 ms	keyd virtual keyboard  0fac:0ade  volumedown down
+316 ms	keyd virtual keyboard  0fac:0ade  volumeup down
+263 ms	keyd virtual keyboard  0fac:0ade  coffee down

+221 ms	keyd virtual keyboard  0fac:0ade  leftmeta down

+773 ms	keyd virtual keyboard  0fac:0ade  volumedown down
+339 ms	keyd virtual keyboard  0fac:0ade  volumeup down

So the only thing that changed was hollow rectangle with chevrons in the top-left and bottom-right internal corners into F11, And the volume buttons on the side are seemingly indistinguishable from 🔉/🔊.

After a debugging session where I thought my keyd was broken (it had been, but unrelatedly), it turns out the generated mapping is just bonkers. I wasn't gonna include it here because it differs per-model, but the generated /etc/keyd/cros.conf is:

[ids]
0001:0001

[main]
f1 = back
f2 = forward
f3 = refresh
f4 = f11
f5 = scale
f6 = brightnessdown
f7 = brightnessup
f8 = mute
f9 = volumedown
f10 = volumeup

back = back
forward = forward
refresh = refresh
zoom = f11
scale = scale
brightnessdown = brightnessdown
brightnessup = brightnessup
mute = mute
volumedown = volumedown
volumeup = volumeup

f13=coffee
sleep=coffee

[meta]
f1 = f1
f2 = f2
f3 = f3
f4 = f4
f5 = f5
f6 = f6
f7 = f7
f8 = f8
f9 = f9
f10 = f10

back = f1
forward = f2
refresh = f3
zoom = f4
scale = f5
brightnessdown = f6
brightnessup = f7
mute = f8
volumedown = f9
volumeup = f10

[alt]
backspace = delete
brightnessdown = kbdillumdown
brightnessup = kbdillumup
f6 = kbdillumdown
f7 = kbdillumup

[control]
f5 = print
scale = print

[control+alt]
backspace = C-A-delete

(Rember that lines that start with "f123 =" are no-ops, since the keyboard by default generates the special keys.)

Yes: this has the ☕, but also identity-maps everything, and you unfuck it by holding 🔍 (the objectively-incorrect mode). Except hollow rectangle with chevrons in the top-left and bottom-right internal corners, which is in the would-be-F4 position, but it's mapped to F11. 🔒 is mapped to ☕ despite being where Delete usually is, and Delete is achieved with alt+.

I feel like I could do better with

[ids]
0001:0001

[main]
# ←
back		= f1
# →
forward		= f2
# ⟳
refresh		= f3
# tableau
zoom		= f4
# fast rectangle
scale		= f5
# small ☀️
brightnessdown	= f6
# ☀️
brightnessup	= f7
# 🔇
mute		= f8
# 🔉
volumedown	= f9
# 🔊
volumeup	= f10

# 🔒
sleep		= delete

# 🔍 remains as leftmeta

[meta]
# tableau
zoom		= print

back		= back
forward		= forward
refresh		= refresh
scale		= scale

brightnessdown	= brightnessdown
brightnessup	= brightnessup
mute		= mute
volumedown	= volumedown
volumeup	= volumeup

sleep		= sleep

hollow rectangle with chevrons in the top-left and bottom-right internal corners looks the most like a screen, hence it's mapped to PrtSc. Specifically hollow rectangle, to its right are two vertical stripes, but also , , and are prime real estate for mapping something useful to. ctrl+alt+hollow rectangle, to its right are two vertical stripes even works to switch to VT4, and ctrl+alt+🔒 to salute!

With this, the optimal /etc/systemd/logind.conf becomes just the usual

[Login]
HandlePowerKey=hibernate

It's also tempting to solve the Home/End/PgUp/PgDn situation here instead of with xmodmap, so appending this to the updated /etc/keyd/cros.conf works like one'd expect (but [meta] is better for i3 usage; also note that you can't make another file and have it patch the big one, because at most one file can match each device):

[alt]
left	= home
right	= end
up	= pageup
down	= pagedown

I had to find out the hard way that keyd, by default, mangles Shift_R and Control_R into Shift_L and Control_L. Appending this is necessary to make them work correctly:

# https://github.com/rvaiya/keyd/issues/618
[main]
rightcontrol = rightcontrol
rightshift   = rightshift

Overall, low value-add factor here. The quirks file is nice though. Let's hope it's upstreamed before it breaks, like upstream guarantees it will.

# CELES Post Install Workaround
If you experience issues in applications such as Parsec, or […]

Okay but that's so true though?

# Using Ectool

ectool is a utility that is used to interface with the ChromeOS Embedded Controller. It is used to communicate with the embedded controller from userspace and vice versa.

Boy I sure hope to use this program to communicate with the embedded controller! I would love to communicate with the ChromeOS Embedded Controller through this program.

Also: no link and it's not in by that name in Debian. Is it the same one as /sbin/ectool from coreboot-utils? Unknowable.

# Conclusions

# pog moments

# cringe-ass nae-nae baby moments

# family guy funny moments

Most of the issues out-lined above have been forwarded. That is also the reason for most of them having been discovered.

hw-probe of my result.

A good bug report never goes unpunished.


Nit-pick? Correction? Improvement? Annoying? Cute? Anything? Mail, post, or open!


Creative text licensed under CC-BY-SA 4.0, code licensed under The MIT License.
This page is open-source, you can find it at GitHub, and contribute and/or yell at me there.
Like what you see? Consider giving me a follow over at social medias listed here, or maybe even a sending a buck liberapay donate or two patreon my way if my software helped you in some significant way?
Compiled with Clang 19's C preprocessor on 10.09.2025 21:18:14 UTC from src/blogn_t/012a-installing-debian-chromebook-lenovo-300e-gen2-intel.html.pp.
See job on builds.sr.ht.
RSS feed