Latest Linux Distributions on LattePanda and Kernel Customization


前言 Preface

原創文章,轉載引用請務必注明鏈接,水平有限,如有疏漏,歡迎指正。從此以后,盡量使用雙語,英語水平有限,貽笑大方,萬事開頭難。

有時候買到心儀的東西,特別盼着早點到貨,然后隔一會就去打開手機客戶端刷新一下查看快遞信息,時間久了浪費生命,所以想着用電腦幫我查,有變動告訴我。

軟硬件環境:

LattePanda、Python3.8、Arduino 18.12、Lubuntu 20.04。

本項目將分為三個部分:

  1. Latest Linux Distributions on LattePanda and Kernel Customization | 為LattePanda安裝Ubuntu 20.04並重新編譯優化內核
  2. Core Code to Track the Packages | 包裹監視追蹤項目的核心代碼
  3. Additional Features like Tracking People with Wifi Using Kismet | 額外功能例如識別人在旁邊時的智能化動作

本項目預計實現以下功能Features:

  1. 網頁前端添加待監視信息
  2. 查詢的所有快遞歷史記錄
  3. 自定義查詢頻率
  4. 快遞信息變動時微信通知
  5. 人在家中時額外LED、Speaker、Dashboard等提醒

本項目后期准備添加以下功能TODO:

  1. 使用微信等添加待監視快遞信息,或者小程序

  2. 添加中文語音播報

  3. 整合進Home Assisant Dashboard

最后可以了解到的知識包括:

  1. Install and setup latest Ubuntu for LattePanda | 在LattePanda上安裝配置最新版Ubuntu
  2. Interaction between MPU and MCU on LattePanda with Firmata protocol | LattePanda上Linux和Arduino使用Firmata協議進行交互
  3. Python GUI Programming with remi | Python圖形化編程(使用remi)
  4. Usage of TinyDB——a lightweight database 破折號還是逗號?| 介紹輕量級數據庫TinyDB的使用
  5. Wechat notification via ServerChan | 使用Server醬實現微信通知功能
  6. Tracking people with wifi using kismet | 使用Kismet識別人是否在旁邊
  7. Using Kismet REST-like API | 使用Kismet的API
  8. Text To Speech with Python | 語音合成播報
  9. Home Assistant | HA的一些整合與應用

本文為第一部分。看到社區的活動,覺得很有趣,加上有個Intel 和 DFRobot合辦的活動,需要Intel CPU,我的是AMD CPU,也沒有神經開發棒,然后拿出LattePanda(以下稱胖噠) 作為可行性驗證。基板准備用LattePanda v1,系統准備轉成Linux,方便開發。安裝Linux的過程中發現一些問題,本文分享相關經驗。另外LattePanda Alpha / Delta 相關架構類似,一些內容也有參考價值。

1. 准備

為什么要使用Linux | Why do we prefer to use Linux

Linux可定制化更高,用來開發更熟悉。

選擇Ubuntu還是Mint | Ubuntu or Mint: which one to choose?

Mint 最新版基於Ubuntu 18.04,pass。但不喜歡Ubuntu的Unity桌面,加上LattePanda性能捉襟見肘,所以我們選擇使用比較輕量級的LXQt桌面(之前是LXDE,使用Qt重寫)的Lubuntu,基於openbox,能看到遺留。感興趣的也可以看看來自TW的LXQt開發者洪任諭醫師的一些介紹:

1.1 現狀

通過網上沖浪可知,目前關於在LattePanda上運行Linux有以下信息:

Caution:

  • 官方文檔寫着Official Supported Version: S70CR200 Version,但實際我的S70CR110也是可用。

  • mop講的設置bios里的南橋相關,新版ubuntu里無需設置。

以上三個都有一個共同的特點:OUTDATED。我們需要更好的軟硬件兼容性以及主流的Linux版本和內核支持。當然,從以上還是能獲得一些有價值的信息,也就是我們需要解決的問題。

1.2 面臨的問題

  • rtl8723bs wifi & bluetooth driver
  • HDMI audio output issue
  • Goodix touch panel dirver
  • PWM? 這個我暫時不知道啥問題

1.3 探索

為啥LattePanda有上述問題要解決呢,主要和胖噠采用的Intel Atom x5 z8350 CPU有關,其規格如下:

Intel Atom x5 z8350, (Code Name: Cherry Tail, Original Target: Lightweight tablets / High-end Smartphones. Microarchitectures: Airmont——the 14 nm die shrink of Silvermont, more info, Via), remember that there is no avx instruction set supported, therefore, recompile is need to run newer version of Tensorflow.

原來z8350設計用於Windows平板以及手機,並沒有考慮Linux兼容性,所以有很多問題,特別是驅動上,總結起來有以下:

  • 無線和藍牙功能:使用RTL8723BS模塊,SDIO接口,2.4GHz 802.11bgn,bt4.0,RealTek官網僅提供了Windows驅動
  • 觸摸屏:使用Goodix gt911 方案

甚至默認最大僅支持2GB內存,不過國內魔改支持4GB,但是據說內存帶寬也減半。

在Linux Kernel 4.12之前,需要手動安裝RTL8723BS模塊的驅動,但是Since Linux 4.12, rtl8723bs has been merged,這就很像早幾年在樹莓派上使用小米隨身wifi(mt7601u芯片),最初需要自己編譯安裝驅動,后來也合並到內核里開箱即用了,可以看到mop的內核還是4.11。

Caution:

  • LattePanda Delta 采用的Intel Celeron N4100同樣不支持avx指令集,所以想要運行新版的Tensorflow,需要自行編譯。參考《Tensorflow-Intel-Atom-CPU》

采用z8350的設備有很多,比如Lenovo Miix 310 和Chuwi Hi10 Pro,其中聯想的miix310屬於筆記本,更接近胖噠的使用情景。

參考鏈接:

1.4 發現

字里行間我們發現兩個東西:Ian Morrison's isorespin.shkernel_gcc_patch

1.4.1 isorespin.sh

項目主頁工具介紹

簡而言之,就是使用Intel Bay Trail 和 Cherry Trail處理器的設備安裝Linux會遇到一些兼容性問題,特別是HDMI輸出、系統假死以及無線驅動,Linux 4.11 解決了HDMI音頻輸出和系統假死的問題,4.12解決了無線驅動的問題。而Ian Morrison(Linuxium)則更進一步,開發了isorespin.sh這個工具,可以制作適合上述CPU的帶有Linux Mainline內核的新版Ubuntu ISO安裝鏡像。另外Ian也是 cnx-software網站的作者之一。——Via

我們使用該腳本來定制化Linux系統,而且作者有做好的最新系統鏡像可供下載。目前支持自定義64bit Ubuntu、Ubuntu Flavoured、LinuxMint等等。

該腳本針對Intel Atom處理器做了如下改進:

  1. Add a GRUB 32-bit bootloader to allow ISOs to boot on the many Intel Atom devices limited by their BIOS.
  2. Add functionality to boot ISOs on any Intel Apollo device regardless of the BIOS settings.
  3. Upgrade the kernel to the latest mainline version or to a specific version to benefit from recent patch functionality e.g. for audio and wifi/bluetooth or to use a rolling (HWE) kernel.
  4. Add (or remove) repositories, software packages, scripts and files to allow the installation of firmware and favourite programs.
  5. Preseed or perform set-up commands and scripts and also change system defaults and kernel boot parameters.
  6. Add persistence so that the ISO can retain data, installed software packages and settings across reboots.
  7. Create a server ISO that works on both 32-bit and 64-bit bootloaders found on various low cost Intel Atom mini PCs or one that works on the more recent Apollo and Gemini Lake mini PCs..

--atom include the flags, packages, scripts and commands that I recommend when respinning an ISO for a device with an Intel Atom (Bay Trail or Cherry Trail) processor and mirrors the manual invocations of '-l rtl8723bX_4.12.0_amd64.deb -f linuxium-install-UCM-files.sh -f wrapper-linuxium-install-UCM-files.sh -f linuxium-install-broadcom-drivers.sh -f wrapper-linuxium-install-broadcom-drivers.sh -c wrapper-linuxium-install-UCM-files.sh -c wrapper-linuxium-install-broadcom-drivers.sh'.

關於HWE內核可以參考《為 Ubuntu LTS 安裝 HWE 以獲取更新的內核與圖形支持》

遇着寶了,似乎我們的問題都可以一攬子解決,是否真的可以高枕無憂呢?這里下載Lunbutu 20.04 LTS Atom。

1.4.2 kernel_gcc_patch

項目主頁 | Kernel patch enables gcc optimizations for additional CPUs.

由於Atom x5-8350和Celeron N4100相對性能比較低,操作系統默認會使用generic內核,着眼於兼容性普適性,就是安裝好之后大多數的硬件都可以運行起來。所以我們可以針對性地重新編譯內核,以期獲得更高的性能。另外本項目也支持Celeron N4100 (Intel Goldmont Plus family of low-power Atom processors——Gemini Lake)。

注意這里是我理解錯了,generic是實時性方面的東西,具體見參考鏈接所述

2. 整活

2.1 Install Lubuntu Customized for Cherry Trail CPU

制作安裝U盤

  1. 我用balenaEtcher將作者ISO安裝鏡像燒錄到U盤上,插上制作好的U盤(不支持從mSD卡啟動),開機按ESC或者Del進入到bios,更改boot設置即可,忘記看是不是 默認U盤啟動順序最高了,大家可以試試。
  2. 可以從清華鏡像站下載原版鏡像以供定制。

硬盤分區

  1. esp分區 | 必須要有,100MB就行,flag: boot
  2. root分區,xfs文件系統,反正ext4不是emmc的最優解,后續還要改改默認調度模式
  3. swap,根據內存大小,2-4G選擇1:1即可。我這里4G。

插電!啟動!

我是插HDMI連接顯示器,不是用的MIPI接口的顯示屏(以下稱IGD, 內置圖形顯示),然后顯示器上只有壁紙沒有圖標和任務欄,原來主輸出跑到沒連接的IGD上了。這整的真的是。。。盲開終端,然后輸入sudo poweroff先關上機,然后插上顯示屏和觸控面板,發現觸控面板沒反應。

2.2 Post-Installation Setup

好的,目前需要測試上面提到的問題以及解決HDMI輸出和觸控面板的問題。先插上專用IPS屏,設置HDMI為主輸出,然后安裝OpenSSH,我們通過MobaXterm連接到LP,具體可以參考我的文章《忘掉VNC/RDP,拿起手中的MobaXterm輕松上手遠程桌面》

  • 選擇Openbox desktop 是圖形界面,默認的LXQt目前MobaXterm不支持,僅支持LXDE。

  • 選擇Interactive shell 是傳統終端界面

安裝必要的軟件:

sudo apt install openssh-server tmux

2.2.1 測試無線、藍牙、音頻輸出功能

我們下載的是作者為atom處理器制作的鏡像,根據isorespin.sh使用介紹

--atom include the flags, packages, scripts and commands that I recommend when respinning an ISO for a device with an Intel Atom (Bay Trail or Cherry Trail) processor and mirrors the manual invocations of '-l rtl8723bX_4.12.0_amd64.deb -f linuxium-install-UCM-files.sh -f wrapper-linuxium-install-UCM-files.sh -f linuxium-install-broadcom-drivers.sh -f wrapper-linuxium-install-broadcom-drivers.sh -c wrapper-linuxium-install-UCM-files.sh -c wrapper-linuxium-install-broadcom-drivers.sh'.

也就是安裝了rtl8723bs的無線藍牙固件,注意有些是系統帶驅動driver但是不帶正確的固件firmware,也不能正確使用。增加了音頻輸出的UCM文件。

我們來測試一下:

藍牙部分使用bluetoothctl,參考https://wiki.archlinux.org/index.php/Bluetooth#Console,成功連上了我的手機

無線部分可以用iwconfigiw list等命令,可以看到該無線網卡支持``monitor模式,為我們下面使用kismet進行無線嗅探提供了硬件基礎,關於無線網卡的介紹可以參考我的文章:UP Board USB無線網卡選購指南

連接無線網絡 CLI

了解一番發現使用的是networkmanager,圖形化很好弄,CLI的話就是nmcli:

$ nmcli device status
DEVICE           TYPE      STATE         CONNECTION
wlx001f1fa92b87  wifi      connected     nww
wlan0            wifi      disconnected  --
$ nmcli device wifi list ifname wlan0
$ sudo nmcli device wifi connect nww password PASSWORD ifname wlan0

以上命令即可,注意改成你的無線網絡名稱SSID和密碼。具體可以參考nm操作指南

聲音輸出的話,LXQt桌面自帶的任務欄右下角調節widget支持不好,使用的是pavucontrol進行控制,圖形菜單欄里也有,實測HDMI音頻輸出和3.5mm都正常。

其他相關命令:

dmesg | grep XXX
lsmod | grep XXX
lshw
lsusb
lspci

2.2.2 默認輸出設置為HDMI

這個很頭疼,我是先用專用屏上去連無線網安裝ssh server后從SSH里面暫時用。雖然進入桌面后手動更改主/副輸出后,可以正常使用,但是重啟還是一個樣,所以干脆關閉IGD輸出。

查看How to Disable Internal Display from BIOS?,官方說的BIOS->"Chipset"->"North Bridge"->"IGD - LCD Control"->"Force Lid Status"->"Off"沒用,最后參考k3dAR的回帖解決: add kernel parameter: video=DSI-1:d

怎么做到的呢?查看archwiki的Kernel parameters頁面:

sudo nano /etc/default/grub
# 在GRUB_CMDLINE_LINUX_DEFAULT這行處”前添加video=DSI-1:d
# 例如GRUB_CMDLINE_LINUX_DEFAULT="quiet splash resume=UUID=cb38daad-4618-4b36-98de-1915abb168cf video=DSI-1:d"
# 重新生成grub.cfg文件
sudo grub-mkconfig -o /boot/grub/grub.cfg
# TODO:使用sed進行更改

重啟生效,想要啟用IGD,步驟同上,刪除添加的那句話。如果我們想要生成默認關閉IGD的鏡像,參考isorespin.sh的介紹,添加grub內容,生成iso鏡像參數為isorespin.sh -i xxx.iso --atom -g "video=DSI-1:d"

2.2.3 解決觸控面板驅動問題

安裝之后主要功能正常,但是觸摸屏不行,以為是我沒插好,試了好幾次都一樣,使用xinput list命令沒看到,使用dmesg | grep Goodix可以看到識別了一個設備,但是沒有正確驅動;進系統使用lsmod goodix也有加載,懷疑是驅動不正確問題。

可以看到觸控面板主控芯片為Goodix GT911

dmesg | grep goodix # 能識別到設備,但是有報錯
lsmod # 我不記得輸出什么樣的,大家可以自己瞅瞅
xinput list # 識別不到Goodix Capacitive TouchScreen

參考以下內容,可以發現Goodix驅動確實存在問題。而且在Linux內核里能看到GT911相關內容,很困惑。

放狗一搜,找到了這個:Goodix Touchscreen Linux Driver,實測可用。

# 編譯驅動
git clone https://gitlab.com/AdyaAdya/goodix-touchscreen-linux-driver
cd goodix-touchscreen-linux-driver
make
# 測試驅動(刪除原驅動並加載剛編譯的驅動),我這里成功
sudo su
rmmod goodix
insmod goodix.ko
# 安裝驅動
xz goodix.ko
mv goodix.ko.xz /lib/modules/$(uname -r)/kernel/drivers/input/touchscreen/goodix.ko.xz

重啟之后可用。

完整的debug命令:

  $ dmesg | grep -i goodix
  $ cat /proc/bus/input/devices | grep -B 1 -A 8 -i goodix
  # libinput list-devices | grep -A 17 -i goodix
  # libinput debug-events
  $ xinput list

2.3 Recompile kernel to increase performance | 重新編譯內核(待優化)

前文說過針對Atom X5 z8350重新編譯內核,可以些許提高性能,現在就來實際操作一番。

sjqlwy@LattePanda:~$ uname -a
Linux LattePanda 5.6.8 #1 SMP Sat May 2 23:36:54 CST 2020 x86_64 x86_64 x86_64 GNU/Linux
sjqlwy@LattePanda:~$ cat /proc/version 
Linux version 5.6.8 (sjqlwy@LattePanda) (gcc version 9.3.0 (Ubuntu 9.3.0-10ubuntu2)) #1 SMP Sat May 2 23:36:54 CST 2020

這是我在LattePanda上為它自己編譯的內核,不帶genetic字樣。編譯花了一個多小時?建議在其他性能更強的電腦上進行編譯。

2.3.1 下載源碼並打上補丁

打開Linux Kernel網站可以看到最新的Stable版是5.6.x,下載下來備用。建議閱讀Linux內核版本介紹與查詢。Ubuntu自帶的內核講究一個通用性,所以我們使用patch來針對z8350重新編譯內核,以期獲得更好的性能。好在已經有人做了,並且進行了日常維護,移步:kernel_gcc_patch

CPU Family GCC Optimization
Intel Silvermont family of low-power Atom processors -march=silvermont
Intel Goldmont family of low-power Atom processors (Apollo Lake and Denverton) -march=goldmont
Intel Goldmont Plus family of low-power Atom processors (Gemini Lake) -march=goldmont-plus

教程使用silvermont,怎么沒看到我們需要的Cherry Trail ,這些代碼都是啥意思?查找Intel Atom的相關Wiki,了解到如下內容。

  • Cherry Trail、Apollo Lake、Gemini Lake等是Code Name開發代號
  • Silvermont、Goldmont、Airmont等是CPU微架構
  • 微架構下又有子集,例如AirmontSilvermont的子集,Goldmont Plus是的子集
  • Goldmont Plus——Gemini Lake——Celeron N4100(Mobile processors)
  • Airmont——Cherry Trail ——Atom X5 z8350(consumer SoCs aimed at tablets)
  • Airmont is the 14 nm die shrink of Silvermont(22 nm)

2.3.2 編譯內核

  • 這里我們下載enable_additional_cpu_optimizations_for_gcc_v9.1+_kernel_v5.5+.patch(5.6)放到Linux源碼所在文件夾里。

  • This patch works with gcc versions 9.1+ and with kernel version 5.5+ and should
    NOT be applied when compiling on older versions of gcc due to key name changes
    of the march flags introduced with the version 4.9 release of gcc

  • 如果使用Ubuntu 20.04則編譯環境gcc版本、kernel版本都滿足,否則需要進行設置

  • patch -p1 < PATCH_NAME.patch 會報錯

sudo apt-get install gcc make libncurses5-dev libssl-dev bison flex libelf-dev
patch -Np1 -i /path/to/patch
make menuconfig

此時在 "Processor type and features -> Processor family"中可以選擇 "Intel Silvermont family of low-power Atom processors (Silvermont)"了。

make -j4 bindeb-pkg # 編譯內核,根據機器性能大約需要20m-2h不等
sudo dpkg -i linux*.deb # 安裝編譯好的內核,會自動設置grub

重啟即可看到已經啟用了新的內核。

參考:

2.3.3 番外1 升級gcc

上面講到使用該補丁需要gcc 9.1以上,但是我在我的其他機器上(Ubuntu 18.04 LTS)可以看到默認安裝的是gcc 7.5,這將導致安裝失敗。

ubuntu@VM-126-41-ubuntu:~$ gcc --version
gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0

嘗試過ubuntu-make,backports源等方法后,參考如何在 Ubuntu 18.04 LTS 系統中安裝多版本 GCC 編譯器的PPA源方法,完美。

你正在運行 Debian穩定版 因為你更偏好選擇 Debian 穩定版分支。它運行得很好,但是只有一個問題:與其他發行版相比,它的軟件有一點過時了。這便是 backports 出現的原因。

root@build-server:~# gcc --version
gcc (Ubuntu 9.3.0-11ubuntu0~18.04.1) 9.3.0
# Ubuntu 20.04 不存在該問題
sjqlwy@LattePanda:~$ gcc --version
gcc (Ubuntu 9.3.0-10ubuntu2) 9.3.0

2.3.4 番外2 阻止apt更改內核

我們運行apt upgrade時會提醒你安裝generic內核,我們使用apt-mark命令來阻止這一行為。

apt list --installed
dpkg-query -l # 輸出更清晰
apt-mark hold <pkg> # 將<pkg>改為apt upgrade里提示的所有內核相關的包
apt-mark unhold <pkg>
apt-mark showhold

參考:

2.3.5 docker 支持

參考DIY NAS Project (2) Docker and ownCloud以及上文Miix 310的設置來配置內核編譯參數

2.3.6 TODO

3. 總結

最終我們比較完美地在LattePanda上安裝了Lunbutu 20.04,解決了BT/Wifi/Audio Output/Touch Panel以及IGD的問題,並使用優化內核提高了LP的性能,后續有時間的話可以自己定制適合LP的ISO鏡像,包括:

  • 默認關閉內置輸出,采用HDMI輸出信號
  • 優化過的內核,支持Docker,更好的性能
  • 預裝觸摸屏驅動
  • 更改io調度和添加更多文件系統支持
  • 預裝SSH Server

4、Reference | 參考


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM