【F1C100S】编译启动所需的uboot,kernel,rootfs

article/2025/9/22 4:01:24

         个人画了块没有连接任何其他模块的F1C100S开发板,没有链接任何外设,本文是编译所有启动所需的三大件。(只要编译出三个东西复制到sd卡就可启动,不需要制作成镜像img文件)

环境:使用安装了ubuntu18的电脑进行编译。以及准备了一张128M的内存卡,提前分好两个区,分区1大小20M,为fat32格式,分区2为剩余的所有空间,是ext4格式。

镜像三大件

        一个可供启动运行使用的linux镜像,包含3大部分,bootloader,linux kernel,root file system。需要使用3个开源项目进行编译,uboot(bootloader),最伟大的linux,buildroot(root file system)。

        bootlader是上电后第一个被调出来运行的程序,他负责初始化芯片的各种外设并引导linux内核运行,还能实现一些如联网下载linux内核更新等骚操作。

         kernel,linux内核,由那个史上最伟大的开源项目编译而成,linux操作系统的本体。

         root file system简称rootfs,虽然名字叫文件系统,但跟NTFS FAT32那种文件系统不是一个东西。在linux中的作用相当于windows下的c盘。是一堆文件夹与文件的集合体,xxx路径下存放着可供执行的指令,xx路径是用于存放linux运行时产生的数据等,这一坨文件夹以及内部的各种文件统称为rootfs,如果要在板子上使用python vim git等软件,都是要将那些软件编译后存放到rootfs里。

下载所需工具/项目

1.安装后续会使用到的软件

       如果编译时遇到报错xxx命令not found,那就是对应的程序没安装,用apt指令安装即可。

sudo apt-get install gcc g++ make  python-dev python3-dev git swig net-tools ssh sed  binutils build-essential apt-utils ncurses-base  bison flex nfs-kernel-server  chrpath gawk texinfo cvs file cpio w3m asciidoc dblatex asciidoc-dblatex graphviz  -y

2.安装易缺少的库。

        如果编译时遇到报错xxx.h文件不能打开,那就是缺少lib库文件,用apt指令安装即可。

sudo apt-get install diffstat libsdl1.2-dev libc6-i386 lib32stdc++6 lib32z1 libssl-dev   libncurses5-dev  -y

3.安装交叉编译器

        在x86架构的电脑上,编译要在arm架构中运行的程序,需要使用交叉编译器编译        

sudo apt-get install gcc-arm-linux-gnueabi gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf -y

4.uboot项目(官方)

git clone https://github.com/u-boot/u-boot.git

5.linux项目(官方)

        那个史上最伟大的开源项目linux(这链接是国内的镜像下载站)

wget http://ftp.sjtu.edu.cn/sites/ftp.kernel.org/pub/linux/kernel/v5.x/linux-5.2.tar.gz

        解压刚刚下载的linux项目

tar -zxvf linux-5.2.tar.gz

6.buildroot项目(官方)

        用于编译rootfs的

git clone https://github.com/buildroot/buildroot.git

编译uboot

        首先进入uboot项目的文件夹。

1.声明交叉编译器

export CROSS_COMPILE=arm-linux-gnueabi-

2.载入配置

        所有配置文件都存储于configs文件夹下,大部分芯片厂商都会把自己芯片的配置文件贡献进来,但全志没有。我们使用其中名为licheepi_nano_defconfig的,由荔枝派贡献的配置文件。

make ARCH=arm licheepi_nano_defconfig

-前几步的操作如下图-

3.进menuconfig改点配置

    按照荔枝派设计的流程,接下来需要创建一个文件,填入一些参数,调用脚本单独编译那个文件。太麻烦,这里我选择直接将那些参数通过menuconfig写入编译配置。

        用命令进入menuconfig

make ARCH=arm menuconfig

menuconfig的操作方法:上下键在竖向选项间移动,左右键控制下面横向选项移动,回车执行横向的选项,按两下esc键返回,按空格选择启用选项。

1)启用boot arguments

        将光标移动到Enable boot arguments,按空格启用(左边[]变成[*]就是启用)。下面就会冒出个Boot arguments的选项

-操作如下图-

2)修改Boot arguments

        光标移动到Boot arguments,按回车进入修改。 将下面这一串复制进去,然后按回车ok。

console=ttyS0,115200 panic=5 rootwait root=/dev/mmcblk0p2 earlyprintk rw

console:指定控制台为串口0,波特率115200

root:指定rootfs位置

rw:设置rootfs可读写

-操作如下图-

3)修改bootcmd value

        光标移动到bootcmd value,按回车进入修改

-位置如下图-

将其内容修改为下面这一串

load mmc 0:1 0x80008000 zImage; load mmc 0:1 0x80c08000 suniv-f1c100s-licheepi-nano.dtb; bootz 0x80008000 - 0x80c08000;

这段东西的含义是:

load mmc 0:1 0x80008000 zImage; 将mmc0的分区1中名为“zImage”的文件加载到内存的0x80008000位置

load mmc 0:1 0x80c08000 suniv-f1c100s-licheepi-nano.dtb; 将mmc0的分区1中名为“xxx.dtb”的文件加载到内存的0x80c08000位置

bootz 0x80008000 - 0x80c08000; 从内存的这个区域启动linux

-操作如下图-

4)修改完成,退出

        修改完成后,按两下esc键,会弹出是否保存的询问,选择yes按回车。

-完成修改后如下图-

4.编译

        使用make编译。uboot是三大件里编译最快的(

make ARCH=arm

        make默认使用单线程,如果想用多线程加快速度,如8线程编译,可以在后面加上-j8,如

make ARCH=arm -j8

5.目标文件烧录

        编译完成后,会在当前目录下生成一个u-boot-sunxi-with-spl.bin文件。我们需要将此文件烧录进sd卡的8k偏移处,这个位置写死在芯片内部,上电时会从这个位置调出uboot来运行。

        使用dd指令来烧录,示例如下:

sudo dd if=u-boot-sunxi-with-spl.bin of=/dev/sdb bs=1k seek=8

编译linux kernel

         首先进入刚刚下载的linux5.2项目的文件夹。

        我们需要编译出一个内核zImage文件,与一个设备树文件(驱动会根据设备树的内容去配置芯片外设,如设置mmc,串口初始化等)。

        正常情况下应该由厂商提供一个配置文件,但全志没有。这里我们调用荔枝派大佬所编写的配置文件。

1.下载文件

        为了方便本文读者,我去荔枝派的开源资料里把那几个所需文件找了出来,并放在我自己的github里,用下面的链接就可以下载(linux主线里有荔枝派贡献的设备树,但版本太老,一些东西没开启)

         下载荔枝派的配置文件.config及两个设备树文件

​wget https://raw.githubusercontent.com/orange2c/public/main/f1c100s/licheepi-kernel/.config
wget https://raw.githubusercontent.com/orange2c/public/main/f1c100s/licheepi-kernel/suniv-f1c100s.dtsi
wget https://raw.githubusercontent.com/orange2c/public/main/f1c100s/licheepi-kernel/suniv-f1c100s-licheepi-nano.dts

2.处置下载的文件

      .config文件存放到linux5.2项目的文件夹下,两个设备树文件就移动到arch/arm/boot/dts路径   

mv suniv-f1c100s.dtsi arch/arm/boot/dts/
mv suniv-f1c100s-licheepi-nano.dts arch/arm/boot/dts/

3.进一次menuconfig

        我们需要先进一次menuconfig,不需要修改东西,只是要触发一下设置流程,让他将我们刚刚下载进来的.config文件更新一下。

make ARCH=arm menuconfig

        这个menuconfig界面可以用来启用或关闭一些内核功能。但我们现在不做任何操作。按两次esc键退出menuconfig,记得在弹出询问是否保存的界面时选择yes后按回车

4.声明交叉编译器

           makefile脚本通过环境变量CROSS_COMPILE来控制要使用的交叉编译器,这个变量不填就是用gcc编译。我们要使用arm-linux-gnueabi-gcc来编译,只要把除了gcc三个字母的那部分前缀赋给这个变量就行。

export CROSS_COMPILE=arm-linux-gnueabi-

5.开始编译

        我使用4线程来编译内核镜像,耗时约几分钟

make ARCH=arm -j4

         还有设备树需要编译,这个的编译就比较快了。不需要多线程,才几个文件

make ARCH=arm dtbs

6.处置编译出的目标文件

        我们需要的是arch/arm/boot路径下的zImage,和arch/arm/boot/dts路径下的suniv-f1c100s-licheepi-nano.dtb。

        我们刚刚在uboot内已经指定了文件名和存储位置,这两个文件只要复制到sd卡的分区1内即可。例如我的操作是:

sudo mount /dev/sdb1 /mnt/  #挂载sd卡分区1到电脑/mnt路径
sudo cp arch/arm/boot/zImage /mnt/  
sudo cp arch/arm/boot/dts/suniv-f1c100s-licheepi-nano.dtb /mnt/
sudo umount /mnt/

编译rootfs

         我们使用buildroot来编译rootfs。你想在开发板使用的所有软件如vim gcc python等,都是在这个项目的配置菜单里启用,并编译进去。

        rootfs只要芯片架构的设置一样就可使用,所以这里我们使用默认配置,然后手动修改涉及芯片架构的部分。不添加任何软件,不新增对xx功能的支持。

1进入menuconfig

make menuconfig

menuconfig的操作方法:上下键在竖向选项间移动,左右键控制下面横向选项移动,回车执行横向的选项,按两下esc键返回,按空格选择启用选项。

2.修改选项

        首先按回车进入第一个Target options的选项,这里是设置编译的目标芯片架构的。我们只需要修改三项。

         Target Architecture 目标架构,选择ARM (little endian)

         Target Architecture Variant ,选择arm926t,即F1c100的内核。

         确保Enable VFP extension support项不被勾选。VFP是指硬件浮点计算单元,F1C100并没有。

-完成修改后如下图-

3.退出menuconfig

        按两次esc键退出menuconfig,记得它询问是否保存时要选yes,然后按回车

4.编译

        开始编译,这个耗时较长,中途还会自己下载所需软件,网速更拖长了时间。我电脑第一次编译花了一小时。

make

5.目标文件

        编译结果,是位于output/images/下的rootfs.tar。我们只要将这个压缩包内的东西解压到sd卡的分区2即可。例如我的操作是:   

sudo mount /dev/sdb2 /mnt/ #挂载sd卡分区2到电脑/mnt路径
sudo tar -xvf rootfs.tar -C /mnt/
sudo umount /mnt

sd卡内容总结

在sd卡8k偏移的地方存放着uboot

分区1里存放的是.dtb后缀的设备树文件与zImage。

分区2内存放着rootfs.tar解压后的内容

 只要全部编译正确,即可启动。


http://chatgpt.dhexx.cn/article/sLqbkiCB.shtml

相关文章

荔枝派nano(f1c100s)从零开始TF卡启动(附源码下载)

本文所使用的所有文件都已打包到SDK中,可以直接使用,有些细节我已省略,直接使用我包里的文件即可。 (无需积分,免费下载,里面的东西都来源于官方) 觉得可以的,可以点个赞、点个关注&#xff0…

全志F1C100s使用记录:u-boot linux rootfs 编译与烧录测试(基于SD卡)

文章目录 目的基础准备硬件准备开发环境 制作toolchain和rootfs设置编译工具链 u-boot & linux编译u-bootboot.scrlinux 测试程序文件烧录分区设置分块烧录 上电测试系统镜像制作镜像文件使用镜像文件 可能会遇到的问题SDK数据包总结 目的 这篇文章中将测试在 F1C100s 中运…

【f1c200s/f1c100s】RGB接口 LCD驱动适配

【f1c200s/f1c100s】RGB接口 LCD驱动适配 RGB模式介绍F1C200s/F1C100s RGB LCD驱动适配设备树修改源码修改结果 RGB模式介绍 RGB 模式就是我们通过说的 RGB 屏,以 RGB(TTL 信号)并行数据线传输,广泛的应用于 5 寸及以上的 TFT-LC…

全志F1C100s入坑与填坑 uboot Linux Kernel 与buildroot

全志F1C100s 入手了几块全志的板子准备玩一玩随便记录一下!! 如图 是一块荔枝派 Nano 从sipeed官网可得如下介绍 官网传送门-----》 sipeed Nano 硬件参数# 硬件参数 CPU: 全志 F1C100s, ARM 926EJS , 最高 900MHz 内存&#xf…

全志F1C100S声卡驱动探究

如果有问题,请加QQ群 891339868 进行交流 最近刚上手全志的F1C100S这个片子,听一下音乐,本来想着挺简单,内核配置一下驱动就OK,谁知道上来就一闷棍,主线内核不支持内置声卡,经过多方面的研究&am…

【f1c200s/f1c100s】全志f1c200s开发板设计(含原理图和PCB)

f1c200s开发板设计 芯片特征开发板包含资源 开发板如图所示,模仿树莓派取了一个mango-pi的名字,haha~。 硬件主要参考了荔枝派nano和正点原子开发板。经过测试,全部功能正常。 芯片特征 全志F1C200s与F1C100s的区别为F1C200s含有64M SIP RA…

全志F1C100s使用记录:资料索引与基础说明

文章目录 前言资料来源u-boot & linux基础特性启动过程FEL模式电路设计 前言 最早接触到F1C100s是前两年的一个文章,里面使用F1C100s制作了一张可以运行Linux的名片,就是下图这个。下图上实际电路部分就占用角落一点点面积,当时觉得蛮有…

MySql 内连接与外连接 作用和 区别

内连接:指连接结果仅包含符合连接条件的行,参与连接的两个表都应该符合连接条件。 外连接:连接结果不仅包含符合连接条件的行同时也包含自身不符合条件的行。包括左外连接、右外连接和全外连接。 左外连接:左边表数据行全部保留…

php左内连接,内连接和外连接的区别是什么

内连接和外连接的区别:1、连接结果不同,内连接的连接结果仅包含符合连接条件的行,而外连接的连接结果包含了符合连接条件的行;2、注意事项不同,内连接需要注意区分在嵌套查询时使用的any以及all的区别,外连…

Mysql内连接和外连接的区别

内连接 简单来说:就是根据交集的部分来链接到一条完整的数据,以此来完成查询 以两张表相同的部分来链接上两张表的数据,而不是说,内连接查询的就是交集的部分,那样查询出来的不就是表的id信息了或者仅仅是关联的信息 …

mysql内连接和左连接的区别_MySQL连接查询 内连接和外连接的区别

展开全部 内连接:指连接结果仅包含符合连接条件的行,参与连接的两个表都应该符合连接条件。 外连62616964757a686964616fe78988e69d8331333363393638接:连接结果不仅包含符合连接条件的行同时也包含自身不符合条件的行。包括左外连接、右外连…

mysql内外三种连接,mysql内连接和外连接的区别

以下面两张表为例来看一下内连接与外连接的区别: 一、内连接( 最常用 ) 定义:仅将两个表中满足连接条件的行组合起来作为结果集。 关键词:INNER JOINselect * from employees e inner join department d on e.employee_id d.department_id …

Sql 中内连接、外连接、全连接、交叉连接的区别

外连接(out join) 外连接分为外左连接(left outer join)和外右连接(right outer join) 注释:left outer join 与 left join 等价, 一般写成left join right outer join 与 right join等价,一般写成right join 左连接&#xf…

谈谈你对计算机的发展,结合您目前对计算机的认识,请您谈谈对计算机发展趋势的看法。...

计算机从出现至今,经历了机器语言、程序语言、简单操作系统和Linux、Macos、BSD、Windows等现代操作系统四代,运行速度也得到了极大的提升,第四代计算机的运算速度已经达到几十亿次每秒。 计算机也由原来的仅供军事科研使用发展到人人拥有&am…

对计算机科学与技术专业课程的认识,计算机科学与技术专业课程

计算机科学与技术专业课程计算机科学与技术专业课程 二、课程简介 TOP 1.数字逻辑电路: “数字逻辑”是计算机专业本科生的一门主要课程,具有自身的理论体系和很强的实践性。它是计算机组成原理的主要先导课程之一,是计算机应用专业关于计算机系统结构方面的主干课程之一。…

计算机网络技术的专业认识,计算机网络技术课程学习后的自我认识

计算机网络技术课程学习后的自我认识 随着计算机、多媒体、现代通讯网络为代表的信息技术的迅猛发展,信息技术已经渗透到了教育领域,在教育领域中引起了一场深刻的变化。小编是YJBYS小编整理的计算机网络技术课程学习后的自我认识,欢迎阅读 信…

计算机专业认识和规划,计算机科学与技术专业认识与规划

计算机科学与技术专业认识与规划 专业认识与规划专业认识与规划对于这个专业的学生,它要求学生的英语水平,数学水平很高。最主要的是,它的专业课程很多,很复杂,很累人,它需要你付出很多的努力,…

对计算机网络的认识论文800,对计算机的认识论文

为毕业生写对计算机的认识论文提供对计算机的认识论文范文参考,涵盖硕士、大学本科毕业论文范文和职称论文范文,包括论文选题、开题报告、文献综述、任务书、参考文献等,是优秀免费对计算机的认识论文网站。 对计算机软件属性和保护方式的认识 摘要&…

JS取整,取余

1、取整 // 丢弃小数部分,保留整数部分 parseInt(5/2)  // 2 2.向上取整 // 向上取整,有小数就整数部分加1 Math.ceil(5/2)  // 3 3.向下取整 // 向下取整,丢弃小数部分 Math.floor(5/2)  // 2 4四舍五入 // 四舍五入 Math.round(5/2)  // 3 5 取余 // 取余 6…

JS中的求余和求模

在JS中有两个操作符,求余和求模,它们本质上并没有区别,但仍有一些差异,今天就给大家区分一下它们 求余 符号:% 写法:a % b 求余:a % b ,表示为a rem b,相当于 a - n * …