基于荔枝派Nano学习Buildroot的构建过程

基于荔枝派Nano学习Buildroot的构建过程 热爱秃头的每一天 2023-07-04 09:30:02 803

文章目录

声明

本文参考了很多前辈的记录,在此表示感谢,已将所有参考项列于文末。

当前版本R1.0(预发布)。

作者联系方式:E-mail: WindForest@yeah.net

1. 前言

本文拟基于LicheePi Nano学习Buildroot的使用,以及该开发板基本环境的搭建。

关于LicheePi Nano的内容在网络上是如此之多,它已经成了不知多少人手中玩到腻歪的板子,所以商业介绍就算了,只需要知道它是一款基于全志F1C100s的开发板就好了。根据新旧版本的不同,板上使用的SPI Nor Flash有W25Q128或者XT25F128B两种型号;板上使用的触摸屏芯片是NS2009。此外引出了TF卡槽和支持到5寸800×480分辨率的40pin LCD排座。

相比于一些专用SoC,F1C100s支持的交叉编译工具链、内核、构建系统和第三方库的版本可以用“丰富多彩”形容,这让最开始从F1C100s上手的我非常茫然不知所措,好在Whycan论坛的前辈们的帖子以及网上众多的教程与经验,让我度过这一阶段,因此我有意将它们整理一下,一来作为我学习的总结,二来为后面的学习者提供一些便利。

关键字:荔枝派 F1C100s LicheePi Nano Buildroot 根文件系统 构建系统

2. 开发环境以及工具准备

2.1 主机系统

嵌入式开发中,Windows+Linux的开发方式非常广泛,Windows用于代码编辑和下载,Linux用于交叉编译和调试,两者相辅相成。本文基于的测试环境为Windows 10(Home 2004)+Kubuntu20.04。

Kubuntu下需要首先安装以下软件包:

sudo apt install vim make gcc libncurses-dev python swig python-dev libssl-dev g++ patch

2.2 编译工具链

嵌入式系统的构建通常分为几大部分:引导程序(Bootloader)、设备树(Device Tree)、内核(Kernel)、驱动(Driver)、根文件系统(Root File System)和应用程序(Application)。构建过程一般在性能更佳、交互更友好的开发主机进行,因此开发主机也需要安装GCC,如果没有特殊需求,安装最新版本的GCC即可。

开发伊始,首先确保要使用的交叉编译工具链已经安装, 本文使用Buildroot构建的交叉编译工具链 ,因此Buildroot的构建过程需先于u-boot和Kernel的编译。在一些资料中,使用下面示例中的Linaro工具链编译u-boot和Kernel,再使用Buildroot构建的工具链编译根文件系统和应用程序的方法也是可以的 。这是因为U-boot和Kernel的编译最终生成针对目标芯片的二进制可执行文件,所以只要交叉编译工具链对应的芯片架构符合要求,引导程序就能够正常运行、内核就能够正常启动。但应用程序在编译时通常使用动态链接方式以减小最终文件体积,动态库的提供依赖于交叉编译工具链,同时,Busybox(嵌入式中用于提供启动后的init程序)的启动也需要和Kernel配合,因此在整个系统编译期间最好使用同一个交叉编译工具链。

在系统构建过程中,交叉编译工具链有几点需要被关注,比如其使用的GCC版本、使用的C库类型和支持的内核版本等。GCC版本和C库决定了动态库大小以及C标准特性和实现,支持的内核版本则决定适配情况。

[工具链安装示例]

下面以gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabi工具链为例描述安装过程,Linaro工具链被广泛用于嵌入式系统编译过程,LicheePi Nano的大部分教程也使用该工具链编译u-boot和Kernel(注:本文未使用此工具链):

在文件所在目录运行:

sudo tar -Jxvf gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabi.tar.xz -C /opt/

即将工具链安装在/opt路径下。

编辑~/.bashrc文件:

sudo vim ~/.bashrc

在文件末尾增加:

export PATH=/opt/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabi/bin:$PATH

保存退出后,重启或执行:

source ~/.bashrc

此时在命令行输入arm-并按两次TAB键可见该工具链命令补全提示即为完成。

3. 构建系统Buildroot

Buildroot可用于构建一个完整的嵌入式系统,其集成了丰富的软件包,解决了众多应用的安装依赖问题,是嵌入式工程师必须掌握的一大利器。

在构建过程中,除了对架构和目标软件包的选择之外,用于目标板的交叉编译工具链的选取也是至关重要的。

本文使用的Buildroot版本为撰写时的最新版本:https://buildroot.org/downloads/buildroot-2020.11.1.tar.gz

解压Buildroot,在目录下执行:

make menuconfig

并依次进行下面的配置。

3.1 工程配置

  • Target options(目标选项)
  1. 修改Target Architecture(目标架构)为“ARM (little endian)”;
  2. 修改Target Architecture Variant(目标架构变体)为“arm926t”;

修改后的菜单如下图所示:

该菜单其余选项可保持默认。

  • Build options(构建选项)

这个菜单中用于设置Buildroot编译过程中的一些配置选项,比如Commands子菜单用于设置本机命令的别名(alias)、配置/下载/存储目录、镜像源以及编译是否包含调试符号等。

该菜单选项可保持默认。

注:若构建过程中镜像下载速度过慢,可修改Mirrors and Download locations(镜像和下载位置)中的项目,比如:

将Kernel.org mirror项修改为“https://mirror.bjtu.edu.cn/kernel

  • Toolchain(工具链)

工具链的选择分两大情况,一是使用Buildroot针对目标芯片架构构建一个工具链,二是使用已有的外部工具链。如果选择前者,则构建完成后,该工具链可作为外部工具链用于其它构建过程。

注:内核的交叉编译工具链和文件系统的交叉编译工具链可以不同,但是工具链必须适配目标芯片的架构和指令集。因此使用Buildroot构建工具链才成为可能。

(1)首次构建工具链的情况

  1. 修改Toolchain type(工具链类型)为“Buildroot toolchain(Buildroot工具链)”;
  2. 修改custom toolchain vendor name(定制工具链供应商名称)为你喜欢的工具链名称,或者保持默认也可;
  3. 修改C library(C库),本文中选择的是“musl”;

    注:本版本的Buildroot中,C库的选项一共有三个:uClibc-ng、glibc和musl。

    uClibc和Musl是针对嵌入式设计的小型C语言标准库,glibc则占用空间比较大,考虑到目标板上使用的Flash的容量,这里选择Musl为例。

  4. 修改Kernel Headers(内核头文件)为“Manually specified Linux version(手动指定Linux版本)”,设置的版本与使用的内核版本一致,这里设置linux version(Linux版本)为“4.15.0”,设置Custom kernel headers series(定制内核头文件系列)为“4.15.x”;
  5. 选择Enable C++ support(使能C++支持),以支持使用了C++标准的应用程序。

修改后的菜单如下图所示:

在这里插入图片描述

该菜单其余选项可保持默认。

注:若选择构建工具链,编译完成后可再执行:

make sdk

将在 ./output/images/ 下生成诸如 arm-buildroot-linux-musleabi_sdk-buildroot.tar.gz 名称的交叉编译工具链包,该工具链可作为外部工具链用于其它构建过程。

(2)使用外部工具链的情况

注:当使用已存在的交叉编译工具链单独构建文件系统时,需确保其适配内核。

  1. 修改Toolchain type(工具链类型)为“External toolchain(外部工具链)”;
  2. 修改Toolchain(工具链)为“Custom toolchain(用户工具链)”;
  3. 修改Toolchain origin(工具链来源)为“Pre-installed toolchain(预安装工具链)”;
  4. 填写Toolchain path(工具链路径),具体到安装目录即可,例如“/opt/arm-buildroot-linux-musleabi_sdk-buildroot”;
  5. 填写Toolchain prefix(工具链前缀),如“$(ARCH)-buildroot-linux-musleabi”,注意这里的前缀仅仅是前缀,不包含“-”;
  6. 修改External toolchain gcc version(外部工具链GCC版本)为工具链对应版本;

    查看GCC版本可用-v选项,如:

    arm-buildroot-linux-musleabi-gcc -v
    
    Using built-in specs.
    COLLECT_GCC=/opt/arm-buildroot-linux-musleabi_sdk-buildroot/bin/arm-buildroot-linux-musleabi-gcc.br_real
    COLLECT_LTO_WRAPPER=/opt/arm-buildroot-linux-musleabi_sdk-buildroot/bin/../libexec/gcc/arm-buildroot-linux-musleabi/9.3.0/lto-wrapper
    Target: arm-buildroot-linux-musleabi
    Configured with: ./configure --prefix=/home/wind/Documents/buildroot-2020.11.1/output/host --sysconfdir=/home/wind/Documents/buildroot-2020.11.1/output/host/etc --enable-static --target=arm-buildroot-linux-musleabi --with-sysroot=/home/wind/Documents/buildroot-2020.11.1/output/host/arm-buildroot-linux-musleabi/sysroot --enable-__cxa_atexit --with-gnu-ld --disable-libssp --disable-multilib --disable-decimal-float --with-gmp=/home/wind/Documents/buildroot-2020.11.1/output/host --with-mpc=/home/wind/Documents/buildroot-2020.11.1/output/host --with-mpfr=/home/wind/Documents/buildroot-2020.11.1/output/host --with-pkgversion='Buildroot 2020.11.1' --with-bugurl=http://bugs.buildroot.net/ --without-zstd --disable-libmpx --disable-libquadmath --disable-libquadmath-support --disable-libsanitizer --enable-tls --enable-threads --without-isl --without-cloog --with-float=soft --with-abi=aapcs-linux --with-cpu=arm926ej-s --with-float=soft --with-mode=arm --enable-languages=c,c++ --with-build-time-tools=/home/wind/Documents/buildroot-2020.11.1/output/host/arm-buildroot-linux-musleabi/bin --enable-shared --disable-libgomp
    Thread model: posix
    gcc version 9.3.0 (Buildroot 2020.11.1) 
    
  7. 修改External toolchain kernel headers series(外部工具链内核头文件版本)为工具链对应版本;

    查看工具链支持到的内核版本

    cat [工具链安装目录]/arm-linux-gnueabi/libc/usr/include/linux/version.h
    

    将LINUX_VERSION_CODE换算为十六进制,则从高到低每8位代表了内核版本号的各段,如:

    265984D=40F00H,则对应内核版本为4.15.0
    
  8. 修改External toolchain C library(外部工具链C库)为工具链对应库类型。

修改后的菜单如下图所示:

在这里插入图片描述

该菜单其余选项可保持默认。

[问题记录]本文撰写期间,曾使用外部工具链gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabi构建根文件系统,但编译出的根文件系统不能被Kernel识别和挂载,运行错误如下:

...
[    2.508480] VFS: Mounted root (jffs2 filesystem) on device 31:3.
[    2.517345] devtmpfs: mounted
[    2.526797] Freeing unused kernel memory: 1024K
[    2.814736] Kernel panic - not syncing: Attempted to kill init! exitcode=0x0000000b
[    2.814736] 
[    2.823886] CPU: 0 PID: 1 Comm: init Not tainted 4.15.0-rc8-licheepi-nano #6
[    2.830913] Hardware name: Allwinner suniv Family
[    2.835706] [<c010e584>] (unwind_backtrace) from [<c010b6cc>] (show_stack+0x10/0x14)
[    2.843462] [<c010b6cc>] (show_stack) from [<c0116880>] (panic+0xb8/0x230)
[    2.850343] [<c0116880>] (panic) from [<c011803c>] (do_exit+0x96c/0x9a4)
[    2.857043] [<c011803c>] (do_exit) from [<c0118bbc>] (do_group_exit+0x3c/0xb4)
[    2.864263] [<c0118bbc>] (do_group_exit) from [<c0121778>] (get_signal+0x144/0x558)
[    2.871921] [<c0121778>] (get_signal) from [<c010a954>] (do_signal+0xc4/0x404)
[    2.879150] [<c010a954>] (do_signal) from [<c010ae5c>] (do_work_pending+0xb8/0xcc)
[    2.886720] [<c010ae5c>] (do_work_pending) from [<c0107d68>] (slow_work_pending+0xc/0x20)
[    2.894888] ---[ end Kernel panic - not syncing: Attempted to kill init! exitcode=0x0000000b
[    2.894888] 

由于此工具链仅支持到4.10.3版本的内核,尝试将version.h中的内核支持版本改为4.15.0但问题依旧。该版本工具链已是当前最新,因此颇有些无计可施:

总之,尝试使用7.2-2017.11版本和7.5-2019.12版本的工具链编译内核和Buildroot出现问题,此处挖坑。

  • System configuration(系统配置)
  1. (可选)修改System hostname(系统主机名)和System banner(欢迎语)为自己喜欢的名字,或者保持默认也可;
  2. (可选)修改/dev management为“Dynamic using devtmpfs + mdev”;
  3. (可选)选择Use symlinks to /usr for /bin, /sbin and /lib(对/usr、/sbin和/lib使用符号链接到/usr);
  4. 保证Enable root login with password(使能带密码的root登录)在选择状态,并根据需要设置密码。若此项不选择则无法登录到终端。

该菜单其余选项可保持默认。

  • Kernel(内核)

该菜单选项保持默认。

注:保证Linux Kernel在未被选择的状态,因为目标板使用的内核是单独编译的。

  • Target packages(目标包)
  1. 选择Networking applications(网络应用)->ifupdown scripts;
  2. (可选)选择Networking applications(网络应用)->iperf3;
  3. 选择Networking applications(网络应用)->wireless tools;
  4. 选择Networking applications(网络应用)->wpa_supplicant,并选择“Install wpa_cli binary”和“Install wpa_passphrase binary”子项。

该菜单其余选项可根据需求选择。

  • Filesystem images(文件系统镜像)
  1. 选择jffs2 root filesystem(JFFS2根文件系统),并选择Flash Type子项为“Parallel flash with 64 kB erase size”;

    注:擦除块大小根据使用的Flash类型和型号选择,jffs2文件系统本身可支持Nor和Nand Flash。

  2. 选择tar the root filesystem(打包根文件系统),以便于后续对镜像手动扩展和打包。

该菜单其余选项可根据需求选择。

  • Bootloaders(启动引导程序)

该菜单选项保持默认。

注:保证各项在未被选择的状态,因为目标板使用的引导程序(u-boot)是单独编译的。

  • Host utilities(主机工具集)

该菜单选项可根据需求选择,如无特殊需求保持默认(全部未选)即可。

  • Legacy config options(旧版配置选项)

该菜单选项可根据需求选择,如无特殊需求保持默认即可。

3.2 构建

上述全部配置完成之后,退出并保存配置界面,在Buildroot目录下执行:

make

即可编译。编译完成后在 ./output/images/ 文件夹下生成的 rootfs.jffs2 文件即为最终的烧录镜像。

4. 编译Bootloader和Kernel

4.1 编译u-boot

u-boot来源:https://github.com/Lichee-Pi/u-boot/tree/nano-v2018.01。u-boot的代码要下载 nano-v2018.01 分支。如果分支选择错误,则配置目录下没有适配开发板的deconfig文件。

解压u-boot,首先看一下买到的LicheePi的板子上的Flash型号是什么,如果是诸如 w25q128bv 这样在 ./drivers/mtd/spi/spi_flash_ids.c 中已经列出的型号,那么本步骤可以略去。

在如下图所示的位置增加对 xt25f128b 的配置项,0x0b4018是该型号的标识。

在这里插入图片描述

而后在u-boot文件夹下执行:

make ARCH=arm CROSS_COMPILE=arm-buildroot-linux-musleabi- licheepi_nano_spiflash_defconfig

从默认配置生成本次编译使用的.config文件。

执行:

make ARCH=arm menuconfig

并进行以下配置:

  1. 选择ARM architecture->Enable graphical uboot console on HDMI, LCD or VGA(在HDMI,LCD或VGA上启用图形uboot控制台),以增加u-boot对LCD的支持;
  2. 修改ARM architecture->Enable graphical uboot console on HDMI, LCD or VGA(在HDMI,LCD或VGA上启用图形uboot控制台)->LCD panel timing details(LCD面板时序细节)为:

    x:800,y:480,depth:18,pclk_khz:33000,le:87,ri:40,up:31,lo:13,hs:1,vs:1,sync:3,vmode:0

  3. 修改ARM architecture->Enable graphical uboot console on HDMI, LCD or VGA(在HDMI,LCD或VGA上启用图形uboot控制台)-> LCD panel backlight pwm pin(LCD面板背光PWM引脚)为:

    PE6

  4. 修改Environment->Environment Offset(环境偏移)为0xf8000(992KiB);
  5. 修改Environment->Environment Size(环境大小)为0x8000(32KiB);

    经过上述设置后,u-boot所占分区大小即为1MiB。

    u-boot环境分区在u-boot镜像之后,其偏移之前即为u-boot镜像预留的空间,这个值可以根据生成的u-boot镜像大小手动调整为最 佳。

  6. 选择Console->Enable console multiplexing(启用控制台多路复用);
  7. 选择Console->Select console devices from environment(从环境中选择控制台设备)。

启动命令和参数可以在这里设置,但出于学习的目的,本文选择在后面手动修改,而且那些参数与Flash分区相关,这里我更想专注于u-boot的镜像。

接下来开始编译:

make ARCH=arm CROSS_COMPILE=arm-buildroot-linux-musleabi- -j2

-j的指令是进行编译加速用的(如果make认为可行),不加这个也可以编译。

这样编译完成之后可以在U-Boot根目录下得到 u-boot-sunxi-with-spl.bin 文件。

若编译过程提示:

...
OBJCOPY spl/u-boot-spl-nodtb.bin
COPY    spl/u-boot-spl.bin
MKSUNXI spl/sunxi-spl.bin
BINMAN  u-boot-sunxi-with-spl.bin
./tools/binman/binman: 1: binman.py: not found
make: *** [Makefile:1148: u-boot-sunxi-with-spl.bin] Error 127

则运行:

mv tools/binman/binman.py tools/binman/binman

并重新编译即可。相关来源已放在文末参考。

这时的U-Boot仅仅是完成了设备的启动,因为没有启动命令也没有传递参数,所以还不能引导内核,本文选择在烧录后再手动增加这两个命令。

4.2 编译Kernel

Kernel来源:https://github.com/Icenowy/linux/tree/f1c100s-480272lcd-test。内核的代码可以下载 f1c100s 或者 f1c100s-480272lcd-test 分支上的代码,前者不包括LCD驱动,后者包括。如果分支选择错误,则设备树目录下没有适配开发板的dts文件。

注:这里使用的是 f1c100s-480272lcd-test 分支的代码。

解压Kernel源码,复制官方.config文件到源码根目录。

首先还是检查并添加对Flash的支持,打开 ./drivers/mtd/spi-nor/spi-nor.c 并添加对应型号的SPI Flash信息:

在这里插入图片描述

在内核目录执行:

make ARCH=arm CROSS_COMPILE=arm-buildroot-linux-musleabi- menuconfig

并进行以下配置:

  1. 选择Networking support(网络支持)->RF switch subsystem support(射频开关子系统支持);

    注:该项用于避免wpa_supplicant出现“rfkill: Cannot open RFKILL control device”错误。

  2. 选择Device Drivers(设备驱动)->Memory Technology Device (MTD) support(内存技术设备(MTD)支持)->Command line partitioning table parsing(命令行分区表解析);
  3. 选择Device Drivers(设备驱动)->Memory Technology Device (MTD) support(内存技术设备(MTD)支持)->Caching block device access to MTD devices(缓存块设备对MTD设备的访问);
  4. 选择Device Drivers(设备驱动)->Block devices(块设备)->Loopback device support(回环设备支持);
  5. 选择File systems(文件系统)->Miscellaneous filesystems(杂项文件系统)->Journalling Flash File System v2 (JFFS2) support(日记Flash文件系统v2(JFFS2)支持)。

最后打开.config确认一下SPI控制选择为:

#CONFIG_SPI_SUN4I is not set
CONFIG_SPI_SUN6I=y

接下来开始编译:

make ARCH=arm CROSS_COMPILE=arm-buildroot-linux-musleabi-

若编译过程提示:

In file included from arch/arm/boot/dts/suniv-f1c100s.dtsi:6:0,
 from arch/arm/boot/dts/suniv-f1c100s-licheepi-nano.dts:7:
arch/arm/boot/dts/suniv.dtsi:71:10: fatal error: dt-bindings/reset/suniv-ccu.h: No such file or directory
#include <dt-bindings/reset/suniv-ccu.h>
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
make[1]: *** [scripts/Makefile.lib:310: arch/arm/boot/dts/suniv-f1c100s-licheepi-nano.dtb] Error 1
make: *** [arch/arm/Makefile:349: dtbs] Error 2

或类似错误,则将对应头文件内容覆盖在include语句位置即可。

编译完成之后可以在 ./arch/arm/boot/ 文件夹下得到 zImage 镜像文件和 suniv-f1c100s-licheepi-nano.dtb 二进制设备树文件。

5. 烧录

本文使用的分区表为:

分区名称镜像文件名起始地址跨越长度
u-bootu-boot-sunxi-with-spl.bin0x0000000xf8000(992KiB)
bootenv-0xf80000x8000(32KiB)
dtbsuniv-f1c100s-licheepi-nano.dtb0x1000000x10000(64KiB)
kernelzImage0x1100000x400000(4MiB)
rootfsrootfs.jffs20x5100000xAF0000(11200KiB=10.9375MiB)

短接开发板flash1、4引脚后通过usb连接开发板到电脑将使芯片进入FEL模式,并在电脑上识别为一个设备,上电后引脚1、4可不再保持短接。使用 zadig-2.3 工具安装驱动,设备选择开发板对应的设备,驱动库选择 libusb-win32 (v1.2.6.0) 项,但设备名称无所谓。在命令提示符下使用(Whycan网提供的)Windows版烧录工具对镜像进行烧录:

#注:使用下面命令时需先拷贝相应镜像到sunxi-fel.exe所在目录或指定文件位置

sunxi-fel.exe -p spiflash-write 0x000000 u-boot-sunxi-with-spl.bin
sunxi-fel.exe -p spiflash-write 0x100000 suniv-f1c100s-licheepi-nano.dtb
sunxi-fel.exe -p spiflash-write 0x110000 zImage
sunxi-fel.exe -p spiflash-write 0x510000 rootfs.jffs2

烧录完成后,上电启动,在u-boot命令行输入:

#加载dtb和zImage
setenv bootcmd 'sf probe 0 50000000;sf read 0x80C00000 0x100000 0x10000;sf read 0x80008000 0x110000 0x400000;bootz 0x80008000 - 0x80C00000'

#内核和屏幕均输出内核启动打印信息的bootargs
setenv bootargs 'console=tty0 console=ttyS0,115200 root=/dev/mtdblock3 rootfstype=jffs2 mtdparts=spi0.0:1M(uboot),64K(dtb),4M(kernel),-(rootfs)'

#保存启动环境
saveenv

以设置启动参数和启动命令。重新上电即可在屏幕和串口看到打印信息。

注:若不需打印Kernel信息到屏幕,使用如下bootargs:

setenv bootargs 'console=ttyS0,115200 root=/dev/mtdblock3 rootfstype=jffs2 mtdparts=spi0.0:1M(uboot),64K(dtb),4M(kernel),-(rootfs)'

6. 外设和应用程序

6.1 镜像打包

LicheePi Nano本身没有引出以太网接口,使用lrzsz速度又太慢。在使用基于Wi-Fi的NFS文件系统之前,若需添加自己的文件到根文件系统,可解压buildroot中 ./output/images/rootfs.tar 到文件夹,修改后,在文件夹上层目录执行下列语句手动打包根文件系统:

mkfs.jffs2 --root=./rootfs --little-endian --eraseblock=0x10000 --output=rootfs.jffs2

若需添加自己的程序到根文件系统,注意匹配程序使用的运行库。若需使用其它文件系统,注意开启Kernel对其的支持。

6.2 编译ESP8089驱动

驱动源码:https://github.com/al177/esp8089

下载后解压,在源码目录执行以下命令编译:

make ARCH=arm CROSS_COMPILE=[使用的交叉编译工具链前缀] -C [目标Linux内核源码目录]  M=$(pwd)  modules
#e.g.
#make ARCH=arm CROSS_COMPILE=arm-buildroot-linux-musleabi- -C ~/Documents/linux-lcd  M=$(pwd)  modules

编译后生成esp8089.ko即为目标驱动模块,在目标板上insmod挂载即可。

注:挂载无线网卡驱动需要内核开启Wireless和80211n的相关支持。

[问题记录]挂载后可能需要手动插拔ESP8089模块才能被识别;使用该模块只能搜索到一个热点,原因未知。

6.3 应用程序开发环境

构建根文件系统时使用的工具链为 arm-buildroot-linux-musleabi ,因此应用程序编译也应使用该工具链,其使用方式和其它工具链相同。

7. 后记

至此,最基本的根文件系统就制作完成了,也算是达成了我最初的目的——了解一下Buildroot。对于F1C100s和LicheePi Nano的学习不在计划之中,因为我的知识储备还不允许我随心所欲玩转这块板子,而且看过很多前辈们的尝试后,我好像知道所谓“极客”是什么了…

文中部分描述基于自己的理解,若有偏差错谬敬请指正。再次感谢所有铺路之前辈们的贡献,希望有朝一日我也可以成为那样的人。

本文资源共享

百度网盘链接https://pan.baidu.com/s/1ZA1-Lz5tydKBLfKVxHvA9w

提取码:6361

参考资料

本文编写过程中参考的所有资料均列在下方。本文若与任何列表之外的文章、博客、视频、教程等描述相同或相似则纯属巧合。

另在此处再次对以下资料的作者们表示感谢。

1. 相关信息

  1. 【Linux 系统】文件系统— Buildroot 从零开始制作文件系统 史上最详细_CSDN
  2. buildroot-2 构建系统探索_CSDN
  3. uclibc,eglibc,glibc,Musl-libc之间的区别和联系
  4. arm linux 支持 wifi (wpa_supplicant)
  5. wpa_supplicant启动出错rfkill: Cannot open RFKILL control device
  6. buildroot概述及使用_CSDN

2. 参考描述

  1. 尝试从零构建F1C100s开发环境_Whycan
  2. 荔枝派Nano 全流程指南
  3. 荔枝派nano的SPI-Flash系统编译创建全过程
  4. 关于荔枝派(LiChee Pi)Nano初体验中的114514个坑
声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
红包 点赞 收藏 评论 打赏
评论
0个
内容存在敏感词
手气红包
    易百纳技术社区暂无数据
相关专栏
置顶时间设置
结束时间
删除原因
  • 广告/SPAM
  • 恶意灌水
  • 违规内容
  • 文不对题
  • 重复发帖
打赏作者
易百纳技术社区
热爱秃头的每一天
您的支持将鼓励我继续创作!
打赏金额:
¥1易百纳技术社区
¥5易百纳技术社区
¥10易百纳技术社区
¥50易百纳技术社区
¥100易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区微信支付
易百纳技术社区
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-专栏模块

审核失败

失败原因
备注
拼手气红包 红包规则
祝福语
恭喜发财,大吉大利!
红包金额
红包最小金额不能低于5元
红包数量
红包数量范围10~50个
余额支付
当前余额:
可前往问答、专栏板块获取收益 去获取
取 消 确 定

小包子的红包

恭喜发财,大吉大利

已领取20/40,共1.6元 红包规则

    易百纳技术社区