27
Device Specific Setup
Derrick edited this page 2022-08-21 22:25:36 -05:00
This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

Samsung Chromebook 3 (CELES, Braswell)

Uploaded specs at linux-hardware.org ... for the Celeron variant

What works:

  • UEFI Boot from eMMC, mSD card, and USB (MrChromebox-4.16 04/09/2022)
  • Audio (Speaker+Headphone-Jack) -- Mainstream kernel (5.18.x) has support
  • Wifi (iwd) -- Mainstream kernel (5.18.x) has support
  • Bluetooth -- Mainstream kernel (5.18.x) has support
  • Tochpad & keyboard -- Mainstream kernel (5.18.x) has support
  • Wayland - Tested with Wayfire + wlroots
  • Webcam - not tested yet.

Kernel

Boot Parameters: tpm_tis.interrupts=0 acpi_osi=Linux

Kernel Drivers

SD Card Slot & eMMc [ mmcblk ]

Device Drivers -->  
[*] MMC/SD/SDIO card support  --->
   <*> MMC block device driver
   <*> Secure Digital Host Controller Interface support
   <*> SDHCI support for ACPI enumerated SDHCI controllers

Touchpad [ Atmel maXTouch Touchpad ]

Device Drivers --> 
 Input device support  --->
   <*> Mouse interface
   [*] Mice  --->
       <M> PS/2 mouse
   [*] Touchscreens  --->
       <M> Atmel mXT I2C Touchscreen
 I2C support  --->
   <*> I2C device interface
   I2C Hardware Bus support  --->
      <M> Synopsys DesignWare Platform      

Bluetooth [Intel Bluetooth] Firmware: intel/ibt-hw-37.8.10-fw-1.10.3.11.e.bseq

Networking Support -->
 <M/*>  Bluetooth subsystem support  --->
   [*]  Bluetooth Classic (BR/EDR) features 
   <M>     RFCOMM protocol support 
   <M>     BNEP protocol support
   <M>     CMTP protocol support
   <M>     HIDP protocol support 
        Bluetooth device drivers  --->
           <M> HCI USB driver 
           [*]   Broadcom protocol support
           [*]   MediaTek protocol support 
           [*]   Realtek protocol support 
           <M> HCI VHCI (Virtual HCI device) driver
HID support  ---> 
  [*]   Battery level reporting for HID devices 
  [*]   /dev/hidraw raw HID device support  
  <M>   User-space I/O driver support for HID subsystem
  <M>   Generic HID driver
       Special HID drivers  --->
          <M> Logitech devices 
          <M>   Logitech receivers full support 
          -M-   Logitech HID++ devices support 

Kernel Source:

Mainstream kernel works. It's just a matter of selecting the correct drivers and features. No patches needed.

To compile:

cd linux
# Clean
make mrproper

# Apply this patch as to enable module signing with SHA512 & LibreSSL
#diff --git a/scripts/sign-file.c b/scripts/sign-file.c
#index fbd34b8e8f57..fd4d7c31d1bf 100644
#--- a/scripts/sign-file.c
#+++ b/scripts/sign-file.c
#@@ -41,9 +41,10 @@ 
#  * signing with anything other than SHA1 - so we're stuck with that if such is
#  * the case.
#  */
#-#if defined(LIBRESSL_VERSION_NUMBER) || \
#-    OPENSSL_VERSION_NUMBER < 0x10000000L || \
#-    defined(OPENSSL_NO_CMS)
#+#if defined(OPENSSL_NO_CMS) || \
#+    ( defined(LIBRESSL_VERSION_NUMBER) \
#+    && (LIBRESSL_VERSION_NUMBER < 0x3010000fL) ) || \
#+    OPENSSL_VERSION_NUMBER < 0x10000000L
# #define USE_PKCS7
# #endif
# #ifndef USE_PKCS7

# Validate config and update with new kernel [config] symbols
make oldconfig

# Modify config if desired:
make menuconfig

# Build kernel & modules
make bzImage modules

# Install modules
make INSTALL_MOD_PATH=${BUILD} modules_install

# Install kernel, config and symbol map:
cp -iv arch/x86/boot/bzImage   ${BUILD}/boot/vmlinuz 
cp -iv .config ${BUILD}/boot/config
cp -iv .config ${BUILD}/boot/config

source ArchLinux Build

source for module-siging with LibreSSL

Initrd.img

in progress

initrd.img [from GalliumOS] has two archives inside: first is the intel CPU microcode and then secondly, the actual initrd. The actual initrd is gzip'ed with kernel modules.

To extract the microcode:

$ file initrd.img-4.16.18-GaOS
initrd.img-4.16.18-GaOS:  ASCII cpio archive (SVR4 with no CRC)

$ mkdir mcode && cd mcode
$ cpio -mvid < ../initrd.img-4.16.18-GaOS
kernel
kernel/x86
kernel/x86/microcode
kernel/x86/microcode/.enuineIntel.align.0123456789abc
kernel/x86/microcode/GenuineIntel.bin
5784 blocks

The first 5784 blocks of initrd.img-4.16.18-GaOS is the microcode. Skip these blocks to unpack the actual initrd archive:

$ cd ..
$ dd if=initrd.img-4.16.18-GaOS bs=512 skip=5784 of=initramfs.img

# Now it can be unpacked:
$ mkdir initrd-build && cd initrd-build
$ zcat ../initramfs.img | cpio -idmv

To re-pack:

# Pack-up the modified initramfs as `initramfs.gz`
$ cd initrd-build && mkdir ../inner-initrd
$ find . | cpio -o | gzip -9 > ../inner-initrd initramfs.gz

# Create the new [final] initrd.img:
$ cd ../mcode
$ find kernel/ | cpio -o -H newc > ../initrd.img

# Add initramfs.gz to new initrd.img:
$ find ../inner-initrd/ | cpio -o >> ../initrd.img

Source: Unpack stock GalliumOS initrd.img Source: Unpacking and packing initrd.img's

Currently, modified initrd.img causes kernel panic (unable to find & mount rootfs from the root= kernel parameter). For now, ditch the initrd.img and make sure the mmcblk driver is built into kernel (and not as a module), so that kernel can mount rootfs with the kernel modules. I assume GalliumOS created a initrd.img to load the microcode as early in boot AND to build as many drivers as modules to reduce the kernel image size.

Audio Setup (chtrt5650)

  1. Install alsa-lib & alsa-ucm-conf
  2. Create /etc/asoundrc with card 2 as default:
pcm.!default {
  type hw
  card 2
} 
ctl.!default {
  type hw
  card 2
} 
  1. Configure soundcard: alsaucm -c chtrt5650 set _verb HiFi set _enadev Speaker ... not persistent between boots. May need to add to boot scripts.
  2. Restart ALSA: alsactl init

Test with a WAV or MP3 file to test build-in speakers:

aplay -D sysdefault:CARD=chtrt5650 sample.wav
mpg123 -a sysdefault:CARD=chtrt5650 sample.mp3

UPDATE: When using the 5.10.1 kernel from Hurrico's Fork, step 3 is still needed (at the VT/commnadline) UNLESS a Wayland DE is launched. Afterwards, audio is still fixed even while on the VT after exiting a Wayland DE. Step 4 may only be needed if using the GallimOS built kernel. No need to specify audio device , sysdefault:CARD=chtrt5650 when using Hurrico's kernel fork

Wifi - Intel Wireless 7265

Requires firmware:

/lib/firmware/iwlwifi-7265D-22.ucode
/lib/firmware/iwlwifi-7265D-27.ucode
/lib/firmware/iwlwifi-7265D-29.ucode

Small eMMC

The eMMC is ~ 16GB. Probably will use micro-SD card slot to expand storage.

To avoid creating a swap partition on the eMMC, use ZRAM

Perhaps, create a squashFS filesystem for /opt. Currently, /opt has:

  • X11/Xorg libraries, headers, and apps
  • Qt5 libraries, headers, apps
  • OpenSSL libraries for apps that will not build against LibreSSL
  • Openjdk libraries, headers and apps.
  • /opt/build - Packages used for building packages and not required at boot, like CMake or nasm.

ZRAM

Make sure to enable zram as a kernel module (for flexibility).

Disable zswap (similar name, different beast) to avoid it acting as a swap cache in front of zram:

sudo bash -c "echo 0 > /sys/module/zswap/parameters/enabled"

Disable any active swaps:

sudo swapoff --all
# May need to comment/remove any swap entries in /etc/fstab

Setup the zram device:

# Load the kernel module
$ sudo modprobe zram num_devices=1

# Show supported compression algorithms
$ cat /sys/block/zram0/comp_algorithm

# Set compression algorithm (example: zstd)
$ sudo bash -c "echo zstd > /sys/block/zram0/comp_algorithm"

# Set disk size (example: 4G)
$ sudo bash -c "echo 4G > /sys/block/zram0/disksize"

# Activate zram0 device with the highest priority setting of 32767
$ sudo mkswap --label zram0 /dev/zram0
$ sudo swapon --priority 32767 /dev/zram0

# Examine device using zramctl command (from package util-linux)
$ sudo zramctl
NAME       ALGORITHM DISKSIZE DATA COMPR TOTAL STREAMS MOUNTPOINT
/dev/zram0 zstd            4G   4K   64B    4K       2 [SWAP]

How to stop ZRAM

# Deactivate zram0
$ sudo swapoff /dev/zram0

# Free all memory formerly allocated to device and reset disksize to zero
$ sudo bash -c "echo 1 > /sys/block/zram0/reset"

# Unload kernel module 
$ sudo modprobe -r zram

source

Squashfs

Squashfs does not decompress entirely in RAM:

Mounting a squashfs file system doesnt involve decompressing it into memory; decompression is done on the fly, as necessary. There is a small internal cache to avoid repeatedly decompressing the same data, but thats all.

source

compress /opt/build /opt/X11 and /opt/openssl directories and empty them:

for d in build X11 openssl
do
   sudo -S mksquashfs /opt/$d /opt/$d.sqsh
   sudo -S rm -rf /opt/$d/*
done

source

Then create a bootscript to mount those directories:

for d in build X11 openssl
do
   mount /opt/$d.sqsh /opt/$d -t squashfs -o loop
done

or add to /etc/fstab:

/opt/build.sqsh	  /opt/build	squashfs	ro,defaults	0 0
/opt/openssl.sqsh /opt/openssl  squashfs        ro,defaults     0 0
/opt/X11.sqsh     /opt/X11      squashfs        ro,defaults     0 0

Squashfs + OverlayFS

Squashing a home directory but without losing the possibility to apply changes or writing new files. This requires kernel to have overlayfs support.

Create the user1-ro.sqfs squashed file system and the user1-rw.dir dir:

$ mksquashfs /home/user1 user1-ro.sqfs
$ mkdir /home/user1-rw.dir

Mount the squashed ro.fs file system using the loopback device

$ mount -t squashfs user1-ro.sqfs /mnt/user1-rofs -o loop

mount the overlay file system, that makes /mnt/user1-rofs.dir and /home/user1-rw.sqfs apparently merged under /home/user1 location.

$ cd /home
$ mount -t overlay overlay user1 -o lowerdir=/mnt/user1-rofs,upperdir=/home/user1-rw.dir

When its time to add the new created files to the stable and compressed squashed file system, add them to the existing one.

# First unmount squashfs then append it:
$ mksquashfs /home/user1-rw.dir /home/user-ro.sqfs

To mount at boot, add to /etc/fstab:

/home/user-1ro.fs  /mnt/rofs squashfs loop 0 0
overlay /home/user1 overlay lowerdir=/mnt/user1-rofs,upperdir=/home/user1-rw.dir 0 0

Source