Lenovo IdeaPad Flex 5 13IML05 Chromebook

From ArchWiki

This article or section does not follow the Laptop page guidelines.

Reason: Missing hardware information, Accessibility, Firmware and Function Key sections (Discuss in Talk:Lenovo IdeaPad Flex 5 13IML05 Chromebook)
Hardware PCI/USB ID Working?
GPU 8086:9b41 Yes
SSD 144d:a809 Yes
MicroSD card reader Yes
Keyboard Yes
Keyboard backlight Yes
WiFi 8086:02f0 Yes
Bluetooth 8087:0026 Yes
Speakers 8086:02c8 Yes
Microphone Yes
3.5mm jack Partial
Touchpad 06cb:cde1 Yes
Touchscreen 27c6:0e32 Yes
Stylus 27c6:0e32 Untested
Webcam 174f:244f Yes

Installation

This Chromebook does not support Legacy Boot Mode. Even if you try to invoke it by pressing CTRL+L on the Developer Mode boot screen, it will show two options without a choice. Therefore it is necessary to flash a custom firmware.

UEFI firmware flashing

Warning:
  • This step relies on third-party scripts and firmware and may damage your hardware or data.
  • After performing this step, it will not be possible to use ChromeOS (unless you flash the original firmware back).
Note:
  • If you decide to boot without the battery to disable Firmware Write Protection, remove the battery according to the official manual and do not connect it back until the new firmware is flashed.
  • If your Chromebook has turned into a brick, you can try to unbrick it by flashing the original firmware with a special cable called SuzyQable.
  1. Disable Firmware Write Protection by booting without battery or using SuzyQable.
  2. Enable Developer Mode.
  3. Use MrChromebox's Firmware Utility Script.

Arch Linux installation

Warning:

If you plan to use F2FS, read about the power management issue first.

Note:
  • Use UEFI-compatible bootloaders (e.g. systemd-boot).
  • The SSD disk is /dev/nvme0n1.

Use auditctl(8) to suppress audit messages that appear every second:

# auditctl -e0

Follow the Installation guide.

Power management

As of January 20, 2022, the power management is broken in the Linux kernel (5.16.1). It is also broken in the official linux-lts (5.15.15) package.

The Chromebook hangs when closing the lid, restarting, and shutting down.

An older kernel linux-lts510AUR can be used as a workaround.

The issue appears to be resolved as of kernel version 5.19.16 or earlier.

Lid sensor

As of kernel version 5.19.16 or perhaps earlier, the lid sensor causes the system to wakeup shortly after suspending, regardless of whether the lid is closed.

A workaround is to disable wakeup events from the lid sensor. An example udev rule:

/etc/udev/rules.d/lid.rules
# Disable wakeups from lid sensor
ACTION=="add", SUBSYSTEM=="acpi", KERNEL=="PNP0C0D:00", ATTR{power/wakeup}="disabled"

Sound

Note:
  • The 3.5mm jack will only work with headphones. In all cases will be used Chromebook's microphone.
  • Headphones connected to the 3.5mm jack will have minor noise, so it is recommended to use Bluetooth instead.

Install the following packages:

Describe the sound card using the ALSA configuration file:

/etc/asound.conf
# Devices for PulseAudio
pcm.speakers "hw:0,5"
pcm.microphone "plughw:0,1"
pcm.headphones "hw:0,0"

# Force ALSA based applications (e.g. speaker-test(1)) to use PulseAudio
pcm.!default pulse
ctl.!default pulse

Force PulseAudio to use the devices defined above:

/etc/pulse/default.pa.d/devices.pa
# This line is required for Bluetooth
load-module module-switch-on-connect

load-module module-alsa-sink device=speakers sink_name=speakers
load-module module-alsa-source device=microphone
load-module module-alsa-sink device=headphones sink_name=headphones

Find and delete or comment out the following block of code to prevent conflicts:

/etc/pulse/default.pa
### Automatically load driver modules depending on the hardware available
.ifexists module-udev-detect.so
load-module module-udev-detect
.else
### Use the static hardware detection module (for systems that lack udev support)
load-module module-detect
.endif

Create the following script to automatically switch sinks with acpid because of the 3.5mm jack:

/etc/acpi/headphones_jack.sh
# License: 0BSD

#!/bin/bash

function get_active_pulseaudio_users_ids {
    active_pulseaudio_users_ids=`ps -C pulseaudio -o ruid=`
}

function set_up_environment {
    local user_id="$1"
    export HOME=`getent passwd $user_id | cut -d: -f6`
    export PULSE_RUNTIME_PATH="/var/run/user/$user_id/pulse"
}

function set_sink {
    local user_id="$1"
    local sink_name="$2"
    sudo -u "#$user_id" -E pacmd set-default-sink $sink_name
}

if [ "$2" == "HEADPHONE" ]; then
    get_active_pulseaudio_users_ids

    for user_id in $active_pulseaudio_users_ids; do
        set_up_environment $user_id
        if [ "$3" == "plug" ]; then
            set_sink $user_id "headphones"
        else
            set_sink $user_id "speakers"
        fi
    done
fi

Make the script executable.

Register the script as a listener:

/etc/acpi/events/headphones_jack
event=jack/headphone
action=/etc/acpi/headphones_jack.sh %e

Enable acpid.service

The sound should work after reboot.

Touchscreen

As of January 12, 2022, the Linux kernel (5.15.13) uses the wrong module for the touchscreen due to a bug.

Therefore, it is necessary to block it:

/etc/modprobe.d/blacklist.conf
blacklist elants_i2c

The kernel will load the correct module after reboot.

See also