荔枝派 Nano 全志 F1C100s 编译运行 Linux ubuntu并升级gcc
首先是荔枝派的官方文檔,寫的不是很細,應當說我們必須明確幾點:
- 出廠時 SPI Flash 自帶了一個 U-Boot+Linux Kernel(出廠的時候可能燒過了),可直接拿來用。如果希望自己燒固件,才需要后續步驟
- 必須使用移植版的 sunxi-tools 工具,而非官方版
- 必須使用移植版的 U-Boot 工具,而非官方版
- 可以使用最新的主線 Linux 內核
- 荔枝派 Nano 沒有 reset 按鈕,且使用的是片內 DDR1 DRAM,大小為 32MB,外部 SPI Flash 為 16MB。芯片架構 ARM926EJ-S
編譯 U-Boot
下載并安裝交叉編譯器 wget http://releases.linaro.org/components/toolchain/binaries/7.2-2017.11/arm-linux-gnueabi/gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi.tar.xz 上邊的下載相當慢,不知是不是我這邊網絡的原因, 我直接windows下迅雷下載了復制到之前建立的共享目錄中 sudo tar -vxJf gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi.tar.xz --directory=/opt/ 解壓到 /opt/目錄下 sudo vim /etc/bash.bashrc # 在文件末尾 添加以下內容 PATH="$PATH:/opt/gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi/bin" # 添加完畢# 使路徑生效 sudo source /etc/bash.bashrc 注意這里要加sudo ,否則用sudo編譯會提示你找不到arm-linux-gnueabi-gcc 此時可用arm-linux-gnueabi-gcc -v 進行測試;若普通用戶狀態下沒有成功,通過 sudo su 切換到root用戶再嘗試;下載并編譯u-boot 由于用的是荔枝派的小板子, 所以從荔枝派的代碼倉庫中獲取 sudo git clone https://github.com/Lichee-Pi/u-boot.git -b nano-v2018.01 #把代碼從倉庫克隆到本地 cd u-boot #進入u-boot目錄 git branch -a #查看分支 git checkout nano-v2018.01 #切換到需要的分支 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- licheepi_nano_spiflash_defconfig # 此處告知make采用arm-linux-gnueabi下的所有交叉編譯工具,目標架構為Arm,設定各默認配置為 nano 的spiflash支持版 # 若不帶spi-flash的板子,請換成 licheepi_nano_defconfig make ARCH=arm menuconfig # 進行可視化配置 若提示沒有curses.h,則需安裝libncurses5-dev庫 sudo apt-get install libncurses5-dev 執行編譯 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j8 # -j8 指8線程編譯 若提示recipe for target 'scripts/dtc/pylibfdt/_libfdt.so' failed, 缺少python庫 apt-get install swig python-dev python3-dev4. 升級gcc版本 在執行make 時出現報錯:Your GCC is older than 6.0 and is not supported ubuntu update gcc-6.1 解決方法:更新GCC 方法一 下載并自己編譯 (1)wget http://ftp.gnu.org/gnu/gcc/gcc-6.1.0/gcc-6.1.0.tar.gz #下載壓縮包,可到windows下下載 (2)tar -zvxf gcc-6.1.0.tar.gz --directory=/usr/local/ #解壓到 /usr/local目錄下 (3)cd /usr/local/gcc-6.1.0 #進入目錄 (4)sudo ./contrib/download_prerequisites #下載所需要的文件 (5)sudo mkdir build #創建build目錄 (6)cd build #進入build迷了路 (7)sudo ../configure -enable-checking=release -enable-languages=c,c++ -disable-multilib #生成Makefile (8)sudo make -j4 #執行make 過程很慢,耐心等待 (9)sudo make install #執行make install 方法二 下載ubuntu打包好的gcc (1)添加ppa到庫sudo add-apt-repository ppa:ubuntu-toolchain-r/testsudo apt-get update (2)安裝最新版本的gcc9sudo apt-get install gcc-9 g++-9sudo apt-get install gcc-9 g++-9 (3)更新系統(可選)sudo apt-get upgrade (4)強制更新軟件包到最新版本,并解決缺少的依賴包sudo apt-get dist-upgrade (5)刷新db并locatesudo updatedbsudo ldconfiglocate gcc | grep -E "/usr/bin/gcc-[0-9]" #此指令可查看所有安裝的gcc版本locate g++ | grep -E "/usr/bin/g\+\+-[0-9]" #此指令可查看所有安裝的g++版本 (6)切換gcc/g++版本我們正常使用的gcc/g++其實都是/usr/bin/gcc和/usr/bin/g++, 他們指向了/usr/bin下真正版本的gcc/g++程序cd /usr/binsudo rm gccsudo ln -s gcc-9 gccsudo rm g++sudo ln -s g++-9 g++ (7)查看當前gcc/g++版本gcc -vg++ -v據說是因為 Winbond 漲價了,所以板子上的 SPI Flash 換成了大陸產 xt25f128,需要修改 U-Boot 的 arch/arm/dts/suniv-f1c100s-licheepi-nano.dts:
&spi0 {pinctrl-names = "default";pinctrl-0 = <&spi0_pins_a>;status = "okay";flash@0 {#address-cells = <1>;#size-cells = <1>;compatible = "winbond,xt25f128", "jedec,spi-nor";reg = <0>;spi-max-frequency = <40000000>;}; };然后修改 drivers/mtd/spi/spi_flash_ids.c,在 Winbond 節加入:
{"xt25f128", INFO(0x0b4018, 0x0, 64*1024, 256, RD_FULL | WR_QPP | SECT_4K) },移植版的 U-Boot 沒有做這個步驟,也沒有任何說明,這不是故意坑么?
燒錄
燒錄 U-Boot 到 SPI Flash 是必須的,至于引導 Linux,可以把 Linux 映像放到 SD、TF 卡中,也可以直接燒到 SPI Flash 中。這里我采用后者。為此,我們準備一個打包腳本(因為我這里使用 initramfs,所以就不需要額外 rootfs 了):
dd if=/dev/zero of=firmware.bin bs=1M count=16 2>/dev/null printf "create firmware.bin, size 0x%04x\n" $[1024*1024*16]echo "+======================+" echo "| Bootloader: 1MB" echo "+----------------------+" echo "| dtb: 32KB" echo "+----------------------+" echo "| zImage: 8MB" echo "+----------------------+" echo "| rootfs: .MB" echo "+======================+"dd if=u-boot/u-boot-sunxi-with-spl.bin of=firmware.bin bs=1k conv=notrunc 2>/dev/null printf "uboot: 0x0000, size 0x%04x\n" $[1024*1024]dd if=linux/arch/arm/boot/dts/suniv-f1c100s-licheepi-nano.dtb of=firmware.bin bs=1k seek=1024 conv=notrunc 2>/dev/null printf "dtb: 0x%04x, size 0x%04x\n" $[1024*1024] $[32*1024]dd if=linux/arch/arm/boot/zImage of=firmware.bin bs=1k seek=$[1024+32] conv=notrunc 2>/dev/null printf "zImage: 0x%04x, size 0x%04x\n" $[1024*(1024+32)] $[1024*1024*8]#dd if=jffs2.img of=firmware.bin bs=1K seek=$((1024+32+8192)) conv=notrunc 2>/dev/null printf "rootfs: 0x%04x, size 0x%04x\n" $[1024*(1024+32+1024*8)] $[1024*(1024*16 - 1024*9 - 32)]echo "sf probe 0 50000000 0; sf erase 0 0x1000000; reset" echo "sudo sunxi-fel -p spiflash-write 0 firmware.bin"注意這個 dtb 文件應該使用 linux 編譯目標 dtbs 生成,而不應該使用 U-Boot 所生成的 dtb 文件。
然后燒錄。根據官方的文檔,先把 SPI Flash 的 CS 腳拉低,然后芯片進入 FEL 模式后進行操作。測試發現,sunxi-tools 的燒錄命令似乎沒有進行 erase,導致我后面燒錄的時候,里面的數據根本沒有變化。
因此我們在燒新的 U-Boot 前,應該先進入出廠時的 U-Boot ,用以下命令清空 SPI Flash 的 16MB 空間(注意 0 和 50000000之間沒有冒號,別被官方文檔騙了):
sf probe 0 50000000 0 sf erase 0 0x1000000 reset重新上電,由于沒有 SPL 頭部,芯片會自動進入 FEL 模式。然后就可以使用 sunxi-tools 來燒寫了。
這么隱蔽的坑,那感覺,誰試誰知道
引導 Kernel
重新上電,在 U-Boot 中執行:
setenv bootargs 'console=tty0 console=ttyS0,115200n8' sf probe 0 50000000 0 sf read 0x80C00000 0x100000 0x8000 sf read 0x80008000 0x108000 0x800000 bootz 0x80008000 - 0x80C00000如果你的內核映像在 SD 卡中:
setenv bootargs 'console=tty0 console=ttyS0,115200n8' load mmc 0:1 0x80C00000 suniv-f1c100s-licheepi-nano.dtb load mmc 0:1 0x80008000 zImage bootz 0x80008000 - 0x80C00000最終效果
就是在用戶登錄那里總是有問題,明明已經關閉密碼了卻還提示密碼錯誤,設置一個有效密碼仍然是密碼錯誤,見鬼。最后索性不需要登錄了。
自己畫板子
https://www.thirtythreeforty.net/posts/2019/12/my-business-card-runs-linux/#source-code
源代碼:
https://github.com/thirtythreeforty/businesscard-linux
電路原理圖:
https://www.thirtythreeforty.net/posts/2019/12/my-business-card-runs-linux/businesscard.pdf
FC100s 技術文檔:
https://www.thirtythreeforty.net/media/F1C100s_Datasheet_V1.0.pdf
https://www.thirtythreeforty.net/media/Allwinner_F1C600_User_Manual_V1.0.pdf
總結
以上是生活随笔為你收集整理的荔枝派 Nano 全志 F1C100s 编译运行 Linux ubuntu并升级gcc的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 华为交换机telnet和ftp服务开启/
- 下一篇: 小程序如何跳转到各大电商小程序进行CPS