首页 > 其他分享 >F1C100S 编译uBoot、Kernel、RootFs

F1C100S 编译uBoot、Kernel、RootFs

时间:2025-01-21 16:10:03浏览次数:1  
标签:F1C100S Kernel make sudo boot linux RootFs arm rootfs

编译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

标签:F1C100S,Kernel,make,sudo,boot,linux,RootFs,arm,rootfs
From: https://www.cnblogs.com/jeason1997/p/18683726

相关文章

  • NET8利用SemanticKernel对接DeepSeek
    1usingMarkdownSharp;2usingMicrosoft.Extensions.Hosting;3usingMicrosoft.SemanticKernel;4usingOpenAI;5usingOpenAI.Chat;6usingSystem.ClientModel;7usingSystem.Text;89varbuilder=Host.CreateApplicationBuilder(args);10//buil......
  • linux kernel tcp丢包分析
     现象使用netstat-s能看见如下丢包统计  1352910failedconnectionattempts1352910resetsreceivedforembryonicSYN_RECVsockets 查看netstat的代码https://sourceforge.net/p/net-tools/code/ci/master/tree/ 取的这两个文件:/proc/net/netstat, /pro......
  • Kernel Memory: 强大的AI驱动记忆系统
    KernelMemory简介KernelMemory(简称KM)是由微软开发的一个强大的多模态AI服务,专门用于高效索引和处理大规模数据集。它支持检索增强生成(RAG)、合成记忆、提示工程和自定义语义记忆处理等先进功能,为构建智能应用提供了强大的基础设施。 KM可以作为Web服务、Docker容器、......
  • 分析基于ASP.NET Core Kernel的gRPC服务在不同.NET版本的不同部署方式的不同线程池下
    分析基于ASP.NETCoreKernel的gRPC服务在不同.NET版本的不同部署方式的不同线程池下的性能表现使用默认的gRPC项目模板创建,垃圾回收器类型为ServerGC(Servergarbagecollection)。使用ghz工具在不同的请求总数、连接数、并发数的参数下,进行压力测试,接口为/greet.G......
  • 多个环境的anaconda中jupyter只有一个Python 3 (ipykernel)解决办法
    用anaconda打开jupyternotebook后发现,只有一个Python3(ipykernel),其他anaconda创造的虚拟环境都没法显示。解决方法:win+R调出cmd用condaenvlist调出总共有多少环境 再用activatename切换到想要的环境中,name为环境变量名然后在此环境中先输入pipinstallipykerne......
  • linux kernel 如何bind() VRF端口上的源IP
     前文  linuxkernelbind()时发生了什么 讲了bind()的实现机制。今天,我用bind()绑定一个VRF上的源IP,发生如下报错:bind(11.1.1.64)failed(99:Cannotassignrequestedaddress) 经过分析kernel代码,确认需要先设置setsockopt(SO_BINDTODEVICE)细节如下:bind()用dev_if......
  • emacs cscope linux kernel 找不到符号的一种原因
     当阅读linux内核代码时,我一般使用emacs+cscope,但是今天发生了找不到符合的问题。cscopecannotfindsymbolfunctionsock_setbindtodevice 找了半天原因,重建了很多次索引库,都不行。但是egrep就可以正常找到。最后发现,是因为子目录里也创建了cscope的索引库,emac在使......
  • 服务器上mysqld,java的进程Out of Memory,被kernel kill 掉了
    /var/log/messages里面日志如下Aug1019:47:16VM-0-7-centoskernel:8936totalpagecachepagesAug1019:47:16VM-0-7-centoskernel:0pagesinswapcacheAug1019:47:16VM-0-7-centoskernel:Swapcachestats:add0,delete0,find0/0Aug1019:47:16VM-0......
  • linux kernel bind()时发生了什么
    配置实验一下,我有两个口lo和enp0s3,两个地址,如下所示。 真实物理口测试访问同子网的10.0.2.2如果没有地址,返回:Cannotassignrequestedaddress,说明bind失败了。 lo口测试访问loopback地址127.0.0.1如果没有地址,返回:Cannotassignrequestedaddress,说明bind失败了......
  • 印象笔记启动错误:缺失kernel32.dll文件
    印象笔记启动时出现“缺失kernel32.dll文件”的错误,通常意味着系统的kernel32.dll文件丢失或损坏。kernel32.dll是MicrosoftWindows操作系统中的核心动态链接库(DLL),负责提供基本的操作系统功能,如内存管理、线程管理、文件和I/O操作等。如果该文件缺失或损坏,将严重影响系统的正......