编译lichee官方的uboot和kernel时报yylloc重复定义解决方法:
编译荔枝派提供的uboot-2018的时候报错,提示multiple definition of `yylloc‘,提示yylloc这个变量重复定义了。
参考这篇帖子:https://blog.csdn.net/u011781073/article/details/123773085,
在uboot/kernel目录下,搜索所有的YYLTYPE yylloc文本,除了dtc-lexer.lex.c_shipped这个文件里的,其他地方出现的YYLTYPE yylloc前面均加上extern修饰。
编译uBoot:
暂时只能用lichee提供的uboot-2018修改版,用主线的uboot加载不了内核
1.拉取(这个版本已经修复了yylloc的问题):git clone https://github.com/jeason1997/u-boot.git
2.切换分支:git checkout nano-v2018.01
3.安装依赖:sudo apt install python2 python2-dev swig
4.配置(可直接去百度云把.config下载放到根目录):
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- licheepi_nano_defconfig 使用荔枝派的位置为默认配置
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- menuconfig
Enable boot arguments ->
Boot arguments -> 填入 console=ttyS0,115200 panic=5 rootwait root=/dev/mmcblk0p2 earlyprintk rw
Enable a default value for bootcmd ->
bootcmd value -> 修改为 mmc 0:1 0x80008000 zImage;load mmc 0:1 0x80c08000 suniv-f1c100s-licheepi-nano.dtb;bootz 0x80008000 - 0x80c08000;
5.编译:make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j5
6.完事后,在根目录下会生成 u-boot-sunxi-with-spl.bin
教程,uboot利用usb共享网络(RNDIS)实现tftp加载内核挂载到NFS根文件系统:https://www.jianshu.com/p/6ad16ebd4d60
编译内核:
去官网下载一个稳定版本内核:https://www.kernel.org/
1.解压内核:
tar -xvf linux-6.6.9.tar.xz
2.拷贝荔枝派的配置 linux-licheepi_nano_defconfig(百度网盘里有下载一份墨云提供的,也可以到墨云的网下载:https://files.cnblogs.com/files/twzy/linux-licheepi_nano_defconfig.zip,
或者到gitee仓库下载:https://gitee.com/LicheePiNano/Linux/blob/master/arch/arm/configs/f1c100s_nano_linux_defconfig# ,但是官方git仓库的那份对比墨云的不太一样,可能是修改过?) 到 linux-6.6.9/arch/arm/config 下面
3.安装依赖:
sudo apt install make gcc-arm-linux-gnueabi flex bison libncurses-dev libssl-dev bc
4.设置荔枝派配置为默认配置:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- linux-licheepi_nano_defconfig
5.配置内核(可直接去百度云把.config下载放到根目录):
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- menuconfig
6.开始编译:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j4
7.完事后,内核镜像在 linux-6.6.9/arch/arm/boot/zImage,设备树在 linux-6.6.9/arch/arm/boot/dts/allwinner/suniv-f1c100s-licheepi-nano.dtb
8.导出可卸载动态驱动模块:make INSTALL_MOD_PATH=/medial/jeason/rootfs modules_install,然后把该目录下的内容覆盖到根文件系统根目录即可
编译buildroot:
1.解压:
tar -xvf buildroot-2023.02.8.tar.gz
2.先clean下用于初始化一些设置:make clean
3.配置(可直接去百度云把.config下载放到根目录):
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- menuconfig
Target options ->(必选)
Arch -> ARM (little endian)
Arch Variant -> arm926t
Binary -> ELF
ABI -> EABI
Floating -> Soft folat
ARM -> ARM
Build options ->
libraries (both static and shared)
Toolchain ->(可选:选一些c++相关的库,就可以直接在开发板编译程序了)
C library (uClibc-ng) ---> (选择默认c库,uClibc是精简版的c,小巧)
Enable WCHAR support (uClibc要默认没开启wchar,要开启才能支持一些文本应用)
Thread library debugging
Enable C++ support
Enable Fortran support
Enable compiler OpenMP support
Enable graphite support
System configuration ->(可选:一些修饰,机器名字,欢迎语,root是否要密码等)
(GameBoyPi) System hostname
(Welcome to GameBoyPi) System banner
Root password (NEW)
Target packages -> (可选:要装什么软件在这里选,例如zsh,htop,lua等)
4.编译:make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j4 (注意:切记每次修改配置后要重新make clean下,不然很大概率编译失败)
5.完事后,在buildrot/output/images下面会生成一个rootfs.tar文件,那就是根文件系统
编译debian:
先安装debian文件系统制作工具:
sudo apt install debootstrap
制作镜像:
sudo debootstrap --foreign --verbose --arch=armel bookworm debian/rootfs http://mirrors.huaweicloud.com/debian/
--foreign: 这个选项告诉 debootstrap 只进行第一阶段,即在指定目录中设置基本系统但不完全安装它。这对于交叉编译和设置基本环境非常有用。
--verbose: 启用详细输出,让你能够看到 debootstrap 的操作过程。
--arch=armel: 指定了要安装的架构为 armel。
bookworm: 这是你要安装的 Debian 版本的代号。在这里,它指的是 Debian 12 "Bookworm" 版本。
debian/rootfs: 这是指定的目标目录,debootstrap 将在这里创建 Debian 系统。
http://mirrors.huaweicloud.com/debian/: 这是 Debian 软件包的源,debootstrap 将从这个源中获取软件包。
将宿主机的目录挂载到debian里(不确定是否非要这一步,貌似上面拉完的文件夹里面已经链接好了):
cd rootfs
sudo mount --bind /dev dev/
sudo mount --bind /sys sys/
sudo mount --bind /proc proc/
sudo mount --bind /dev/pts dev/pts/
chroot进入debian,然后用debootstrap完成剩下的安装:
cd ..
sudo cp /usr/bin/qemu-arm-static rootfs/usr/bin/
sudo chmod +x rootfs/usr/bin/qemu-arm-static
sudo LC_ALL=C LANGUAGE=C LANG=C chroot rootfs /debootstrap/debootstrap --second-stage --verbose
sudo LC_ALL=C LANGUAGE=C LANG=C chroot rootfs
修修改改(可选):
apt安装各种软件
增加用户
增加swap分区
连接WIFI
开启SSH
打包,完事后会生成一个rootfs.tar,剩下的跟上面一样的操作:
cd rootfs #进到文件系统目录,如果已经在该文件夹下,可以忽略
sudo tar cvf ../rootfs.tar .
编译armbian:
烧录到TF卡:
1.直接分区TF并手动拷贝进入:
分区:
sd卡分2个区,第一个分区16MB就够,当boot分区,剩下的给rootfs分区。boot分区开始要偏移1MB空间,留给uboot.bin,然后是fat16格式,rootfs分区是extf4格式
写入uboot.bin:
sudo dd if=u-boot-sunxi-with-spl.bin of=/dev/sdb bs=1024 seek=8 ,在sd卡开始偏移8K的地方写入,其中/dev/sdb是sd卡的设备,不同电脑可能不同,lsblk看下
拷贝内核:
将zImage以及suniv-f1c100s-licheepi-nano.dtb拷贝到boot分区
写入文件系统:
sudo tar -xvf rootfs.tar -C /media/user/rootfs
2.制作img镜像文件,并用树莓派工具或Win32DiskImage之类的工具一次性写入:参考网盘里的 make_image.sh
烧录SPI的方式:
参考:https://whycan.com/t_7558.html
uBoot:
跟上面一样,要用lichee的2018修改版,用主线暂时测试未通过:
git clone https://gitee.com/LicheePiNano/u-boot.git -b nano-v2018.01&&cd u-boot
make licheepi_nano_spiflash_defconfig (要用spi专用的配置,跟上面不一样)
make menuconfig
然后修改配置,因为是要在flash上运行,跟mmc tf卡有所区别:
# 对应 `CONFIG_BOOTCMD` 的宏定义
# 选中 然后 run distro_bootcmd 修改为以下参数
[*] Enable a default value for bootcmd
(sf probe 0 50000000; sf read 0x80C00000 0x100000 0x4000; sf read 0x80008000 0x110000 0x400000; bootz 0x80008000 - 0x80C00000) bootcmd value
# 对应 `CONFIG_BOOTARGS` 的宏定义
[*] Enable boot arguments
(console=ttyS0,115200 earlyprintk panic=5 rootwait; mtdparts=spi32766.0:1M(uboot)ro,64k(dtb)ro,4M(kernel)ro,-(rootfs) root=/dev/mtdblock3 rw rootfstype=jffs2) Boot arguments
内核:
主线最新版内核测试不通过,即使用荔枝派的config文件也不行,只用用lichee提供的4.15修改版
git clone https://gitee.com/LicheePiNano/Linux.git
make ARCH=arm f1c100s_nano_linux_defconfig (使用荔枝派提供的转为flash的配置)
因为是要在flash运行,不能用ext4之类的分区,要用JFFS2分区,所以要改下配置
File systems --->
[*] Miscellaneous filesystems --->
<*> Journalling Flash File System v2 (JFFS2) support # 打开jffs2的文件系统支持
(0) JFFS2 debugging verbosity (0 = quiet, 2 = noisy)
[*] JFFS2 write-buffering support
[ ] JFFS2 summary support
[ ] JFFS2 XATTR support
[ ] Advanced compression options for JFFS2
Device Drivers --->
<*> Memory Technology Device (MTD) support --->
<*> Command line partition table parsing # 勾选,用来解析uboot传递过来的flash分区信息。(如果 bootarg 是用的我的方法一就需要勾选)
<*> Caching block device access to MTD devices # 勾选,读写块设备用户模块
<*> SPI-NOR device support --->
[ ] Use small 4096 B erase sectors # 取消勾选,否则jffs2文件系统会报错
然后:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j8
这时候编译会报错yylloc重复定义,参考上面的解决方法
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j16 INSTALL_MOD_PATH=out modules
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j16 INSTALL_MOD_PATH=out modules_install
根文件系统:
直接用主线的即可,没啥特殊的,也不用加啥配置,除了改下架构
Target options ->(必选)
Arch -> ARM (little endian)
Arch Variant -> arm926t
如果是要自动将根文件系统打包成jffss2分区格式镜像,可以打开下面的配置:
Filesystem images --->
[*] jffs2 root filesystem
Flash Type (Parallel flash with 64 kB erase size) ---> # 具有64 kB擦除大小的并行闪存 -e 参数
[*] Do not use Cleanmarker # 用于标记一个块是_完整地_被擦除了。 -n 参数 Do not use cleanmarkers if using NAND flash or Dataflash where the pagesize is not a power of
[*] Pad output
(0xAF0000) Pad output size (0x0 = to end of EB) # 指定 jffs2 分区总空间 -p(--pad) 参数
Endianess (little-endian) --->
[ ] Produce a summarized JFFS2 image (NEW) # 生成镜像的
[*] Select custom virtual memory page size
(0x100) Virtual memory page size # 虚拟内存页大小 -s 参数
手动烧录:
sudo sunxi-fel -p spiflash-write 0 ./u-boot/u-boot-sunxi-with-spl.bin
sudo sunxi-fel -p spiflash-write 0x0100000 ./linux/arch/arm/boot/dts/suniv-f1c100s-licheepi-nano.dtb
sudo sunxi-fel -p spiflash-write 0x0110000 ./linux/arch/arm/boot/zImage
如果根文件系统已经打包好成jffs2格式,就可以直接烧录进入,否则要打包下
sudo sunxi-fel -p spiflash-write 0x0510000 ./buildroot-2017.08/output/images/rootfs.jffs2
脚本一键打包烧录,会自动将rootfs.tar解压,并将内核驱动模块安装进去,并且打包成jffs2格式:
荔枝派提供的:https://dl.sipeed.com/fileList/LICHEE/Nano/SDK/nano_flash_dd.sh
#!/bin/sh
UBOOT=u-boot-2018
KERNEL=linux-licheepi
BUILDROOT=buildroot-2023.11
UBOOT_FILE=./$UBOOT/u-boot-sunxi-with-spl.bin
DTB_FILE=./$KERNEL/arch/arm/boot/dts/suniv-f1c100s-licheepi-nano.dtb
KERNEL_FILE=./$KERNEL/arch/arm/boot/zImage
ROOTFS_FILE=./$BUILDROOT/output/images/rootfs.tar
MOD_FILE=./$KERNEL/out/lib/modules/
dd if=/dev/zero of=flashimg.bin bs=1M count=16 &&\
dd if=$UBOOT_FILE of=flashimg.bin bs=1K conv=notrunc &&\
dd if=$DTB_FILE of=flashimg.bin bs=1K seek=1024 conv=notrunc &&\
dd if=$KERNEL_FILE of=flashimg.bin bs=1K seek=1088 conv=notrunc &&\
#导出内核模块
cd ./$KERNEL/
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j16 INSTALL_MOD_PATH=out modules
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j16 INSTALL_MOD_PATH=out modules_install
cd ..
mkdir rootfs
tar -xvf $ROOTFS_FILE -C ./rootfs &&\
cp -r $MOD_FILE rootfs/lib/modules/ &&\
mkdir -p rootfs/lib/firmware/rtlwifi &&\
#拷贝内核驱动固件
cp rtl8723bs_nic.bin rootfs/lib/firmware/rtlwifi/ &&\
#为根文件系统制作jffs2镜像包
#--pad参数指定 jffs2大小
#由此计算得到 0x1000000(16M)-0x10000(64K)-0x100000(1M)-0x400000(4M)=0xAF0000
mkfs.jffs2 -s 0x100 -e 0x10000 --pad=0xAF0000 -d rootfs/ -o jffs2.img &&\
dd if=jffs2.img of=flashimg.bin bs=1K seek=5184 conv=notrunc &&\
rm -rf rootfs &&\
rm jffs2.img
#制作好后烧录:
sudo sunxi-fel -p spiflash-write 0 flashimg.bin
SUNXI-FEL:
参考:https://blog.csdn.net/p1279030826/article/details/112719638
//安装依赖包(不安装会报错)
sudo apt-get install pkg-config pkgconf zlib1g-dev libusb-1.0-0-dev
//获取源码
//v3s 分支
git clone -b v3s https://github.com/Icenowy/sunxi-tools.git
//v3s spiflash 分支
git clone -b v3s-spi https://github.com/Icenowy/sunxi-tools.git
//f1c100s 分支
git clone -b f1c100s https://github.com/Icenowy/sunxi-tools.git
//f1c100s-spiflash 分支
git clone -b f1c100s-spiflash https://github.com/Icenowy/sunxi-tools.git
//进入源码文件夹
cd sunxi-tools
//编译和安装
make && sudo make install