Sipeed R329 主線 armbian 內核、系統、驅動的開發方法

我的開發環境是 ubuntu20.04 ,請在具備以下文章的開發基礎上,再繼續往下會比較好。

Allwinner & Arm 中國 & Sipeed 開源硬件 R329 SDK 上手編譯與燒錄!

選用官方版型:MaixSense 簡介

首先拿到原始鏡像 r329-armbian-maixpy3-0.4.0.img ,用 dd 燒錄到大於 4G 的卡里就行。

sipeed 用戶鏡像 root 賬號沒有 root 密碼,輸入 root 直接進入系統,自帶 maixpy3 0.4.0 所需的基礎環境,僅用於用戶參考。

原始鏡像爲 Armbian_21.08.0-trunk_Maixsense_bullseye_edge_5.14.1.img.xz (700M) 自行下載站的 sipeed 企業盤中獲取。

鏡像編輯和導出的方法

在 ubuntu 上可以直接使用 disk 裝載鏡像編輯文件(disk)。

  • 掛載到 loop 設備和加載到文件系統

sudo losetup -P /dev/loop404 ./r329-armbian-maixpy3-0.4.0-20220223.img && sudo mkdir -p ./r329 && sudo mount /dev/loop404p1 ./r329 && ls ./r329

  • 卸載的文件系統,並刪除目錄。

sudo umount /dev/loop404p1 && sudo losetup -d /dev/loop404 && rm -rf ./r329

卸載後會自動同步,此時燒錄即可使用。

擴容文件系統的方法

注意分區的損壞了就不能掛載,分區的大小改變不代表文件系統大小改變,所以需要以下代碼檢查和擴容文件系統。


e2fsck -f /dev/loop404p1 && sudo resize2fs -p /dev/loop404p1

在 armbian 裏可以用這個進行擴容 /usr/lib/armbian/armbian-resize-filesystem start ,注意該操作會改變分區表,也會影響尾部的分區大小,慎用。

參考文章:修改R329的Armbian鏡像包

Linux 內核、驅動、設備樹的相關用法方法

可以參考 Sipeed Lichee 進行學習,這部分爲通用基礎,而 armbian 不需要自己去手工編譯。

準備環境 sudo apt install git wget make gcc flex bison libssl-dev bc kmod

前置知識:

  1. 主線Kernel基礎編譯
  2. 主線Linux編譯

修改設備樹配置的方法

獲取 git clone https://github.com/sipeed/linux.git 切到 r329-wip 分支

編譯鏈工具可以用系統自帶的 通用編譯鏈 或 gcc-linaro,看自己喜好,我們用的是這個 gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu.tar.xz 版本

前置知識:設備樹簡介

簡單來說,設備樹就是用戶定義的需要選配的驅動功能,用戶在設備樹裏定義並啓用的樹結點,就是要匹配使用的驅動。

R329 的設備樹在 linux/arch/arm64/boot/dts/allwinner/ 路徑下,和 r329 相關的設備樹有

  • sun50i-r329-maix-iia.dtsi
  • sun50i-r329-maixsense.dts
  • sun50i-r329.dtsi

目前的主線配置 linux/arch/arm64/configs/defconfig 導入它。

make ARCH=arm64 defconfig

開始完整編譯。

make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j8
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j8 INSTALL_MOD_PATH=out modules
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j8 INSTALL_MOD_PATH=out modules_install

啥都不清楚的情況下,一路確認鍵按下去,直到開始編譯,導出 modules 是非必要操作,但對應一些外置 ko 模塊需要導出拷入 /lib/modules/ 中,在 menuconfig 中設置爲 M 就可以編譯出 ko 模塊從外部插入系統。

編譯成功後,生成文件所在位置:

內核 Image 文件: ./arch/arm64/boot/Image 對應 armbian 目錄下的 boot/Image
設備樹 dtb 文件: ./arch/arm64/boot/dts/allwinner/sun50i-r329-maixsense.dtb 到 boot/dtb/allwinner/
modules 文件夾: ./out/lib/modules

將 Image 與 dtb 文件放入 boot 目錄下重啓即可完成內核的更新(armbian 特有)。

上述內容測試過後,你就可以開始自定義自己的主線內核了,但這個並不是主要目的,只是說一些基礎用法。

單獨編譯 dtb 文件加入設備。

通常來說,在不瞭解如何編譯整體的情況下,只需要通過簡單的設備樹替換就可以完成驅動適配。

make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- dtbs -j8

參考文章:爲R329添加i2c設備

參考文章:總結一次爲R329開啓uart的經歷

將編譯得到的 dtb 文件 cp linux/arch/arm64/boot/dts/allwinner/sun50i-r329-maixsense.dtb /boot/dtb

最終提交 62b5919cfbff3a74bc100a05347800bd55ae7a9b 於此,感謝開源社區的 冰淇淋 和 燈鼠。

爲主線加入外部模塊並編譯使用。

這裏僅供學習參考,Sipeed 內部已經包含了 /usr/lib/modules/5.14.0-rc4-sun50iw11/kernel/drivers/net/wireless/rtl8723ds/8723ds.ko 模塊。

上述方法出來的內核不是我們提供的,因爲配置項的不同所以會缺少一些驅動,需要你自行加入,如 8723ds 非主線所使用的 wifi 模塊。

獲取 git clone https://github.com/Icenowy/rtl8723ds 切到 newest-kernel

放到 linux/drivers/net/wireless/realtek/ 下

編輯 drivers/net/wireless/Kconfig 添加 source "drivers/net/wireless/realtek/rtl8723ds/Kconfig",清理錯誤的語法,只留最簡單的部分即可。

config RTL8723DS
	tristate "Realtek 8723D SDIO or SPI WiFi"

編輯 linux/drivers/net/wireless/realtek/Makefile 添加 obj-$(CONFIG_RTL8723DS) += rtl8723ds/ 使得模塊參與編譯。

通過 make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j8 menuconfig 按 / 搜索 8723ds 把它配上編譯即可。

配好直接 make 編譯就行,在 sipeed 的 armbian 這裏不需要,僅告知如何加入非主線模塊,如特殊的 TP 觸摸屏、ADC 按鍵驅動、I2C 傳感器驅動等。

編譯 armbian 系統*

自行準備良好的網絡環境,相關問題不做解答,默認懂得都懂,編不出來也很正常,不用太在意。

上述開發的內核模塊在 sipeed 提供的 armbian 鏡像中都是無用的,僅用於測試和確認開發環境,所以要進一步把 armbian 編譯出來纔是最終用戶所用的環境。

可以看文檔 https://docs.armbian.com/Developer-Guide_Build-Preparation/ 說明,雖然也沒什麼好看的。

安裝 apt install dialog psmisc acl uuid-runtime curl gnupg gawk 準備環境

獲取 https://github.com/sipeed/armbian-build.git 切到 r329-wip 分支,可以在 6ba70ed1f0acabb48c7072e044b62d3439374996 提交獲取到配置,最後通過 compile.sh 完成編譯。

將根據以下配置在 armbian-build 中進行編譯。

  • config/boards/maixsense.wip
  • config/bootscripts/boot-sun50iw11.cmd
  • config/kernel/linux-sun50iw11-edge.config
  • config/sources/families/sun50iw11.conf

運行 ./compile.sh 選擇 會自動拉取所有相關的東西,即可編譯出來,接下來就是漫長的等待。

注意 maixsense 並非爲最終 conf 版本,你需要在 底下的 show WIP 中選擇 agree 後就可以看到 maixsense 了,配置可以是 bullseye 和 minimal 就好。。

編譯期間會在 armbian-build/cache/sources 下 git clone 在 config/sources/families/sun50iw11.conf 指定的倉庫和分支。

完成後輸出如下:

[ o.k. ] Building kernel splash logo [ bullseye ]
[ .... ] Installing extras-buildpkgs [  hostapd htop mmc-utils sunxi-tools ]
[ o.k. ] Calling image customization script [ customize-image.sh ]
[ o.k. ] No longer needed packages [ purge ]
[ o.k. ] Unmounting [ /home/juwan/R329/armbian-build/.tmp/rootfs-c735dfca-9977-402a-a68b-b4529b5aac8f ]
[ o.k. ] Preparing image file for rootfs [ maixsense bullseye ]
[ o.k. ] Current rootfs size [ 780 MiB ]
[ o.k. ] Creating blank image for rootfs [ 984 MiB ]
[ .... ] dd:  984MiB [ 136MiB/s] [================================================================>] 100%
[ o.k. ] Creating partitions [ root: ext4 ]
[ .... ] Creating rootfs [ ext4 on /dev/loop40p1 ]
[ .... ] Copying files to [ / ]
[ .... ] Copying files to [ /boot ]
[ .... ] Updating initramfs... [ update-initramfs -uv -k 5.14.0-rc7-sun50iw11 ]
[ o.k. ] Updated initramfs. [ for details see: /home/juwan/R329/armbian-build/output/debug/install.log ]
[ .... ] Re-enabling [ initramfs-tools hook for kernel ]
[ o.k. ] Unmounting [ /home/juwan/R329/armbian-build/.tmp/mount-c735dfca-9977-402a-a68b-b4529b5aac8f/ ]
[ o.k. ] Free SD cache [ 8% ]
[ o.k. ] Mount point [ 91% ]
[ o.k. ] Writing U-boot bootloader [ /dev/loop40 ]
[ o.k. ] SHA256 calculating [ Armbian_21.08.0-trunk_Maixsense_bullseye_edge_5.14.0_minimal.img ]
[ warn ] GPG signing skipped - no GPG_PASS [ Armbian_21.08.0-trunk_Maixsense_bullseye_edge_5.14.0_minimal.img ]
[ o.k. ] Done building [ /home/juwan/R329/armbian-build/output/images/Armbian_21.08.0-trunk_Maixsense_bullseye_edge_5.14.0_minimal.img ]
[ o.k. ] Runtime [ 350 min ]
[ o.k. ] Repeat Build Options [ ./compile.sh  BOARD=maixsense BRANCH=edge RELEASE=bullseye BUILD_MINIMAL=yes BUILD_DESKTOP=no KERNEL_ONLY=no KERNEL_CONFIGURE=no COMPRESS_OUTPUTIMAGE=sha,gpg,img  ]

把 Armbian_21.08.0-trunk_Maixsense_bullseye_edge_5.14.0_minimal.img 拿來燒錄就行。

以下是我的配置:(如果你連這個都沒編譯出來就不要操作了)

# Allwinner R329 dual core 256M RAM WiFi USB-C
BOARD_NAME="MaixSense"
BOARDFAMILY="sun50iw11"
BOOTCONFIG="sipeed_maixsense_defconfig"
MODULES_BLACKLIST="lima"
DEFAULT_CONSOLE="serial"
BUILD_DESKTOP="no"
BOOT_LOGO="yes"
SERIALCON="ttyS0"
KERNEL_TARGET="edge"
OFFLINE_WORK="yes"
CLEAN_LEVEL=""

必須經過第一次完整編譯才能用 OFFLINE_WORK 加快倉庫的拉取檢查。

常見問題後記

boot 就不提了,看 https://github.com/sipeed/u-boot 就行,實際上全部交給 armbian-build 倉庫就行,這樣就具備了基礎環境,要編輯的部分自然就很少了。

如果你發現模塊加載不成功,可能是 version magic '5.14.0-rc4-sun50iw11 SMP mod_unload aarch64' should be '5.14.0-rc7-01557-gd78f1b75fd69-dirty SMP preempt mod_unload aarch64' 錯誤。

這是模塊加載不成功的常見 version magic 錯誤,簡單的處理方法是修改 linux/include/linux/vermagic.h 直接懟到 #define VERMAGIC_STRING "5.14.0-rc7-01557-gd78f1b75fd69-dirty"

想要徹底解決上述這個問題,只能重新編譯 armbian-build 導出鏡像改變 kernel version 。

如果還有遺漏可以 @ 我補充。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章