(二)uboot移植--从零开始自制linux掌上电脑(F1C200S)<嵌入式项目>

news2024/9/22 13:26:32

目录

一、前言

二、F1C200s上电启动顺序

三、前期准备

四、新建用户

五、交叉编译环境配置

六、uboot简介

七、uboot移植

🍏 uboot下载

🍏  uboot默认配置

🍏  uboot图形界面配置

🍏 uboot编译

🍏 烧录bin文件

八、uboot启动测试

九、参考内容


一、前言

在移植Linux之前我们需要先移植一个bootloader代码,这个bootloader代码用于启动Linux内核,bootloader有很多,常用的就是 uboot。移植好uboot以后再移植Linux内核,移植完Linux内核以后Linux还不能正常启动,还需要再移植一个根文件系统(rootfs),根文件系统里面包含了一些最常用的命令和文件。所以uboot、Linux kernel 和 rootfs 这三者一起构成了一个完整的Linux系统,一个可以正常使用、功能完善的 Linux 系统。

-- 来自正点原子嵌入式Linux驱动开发指南。

Linux系统要启动就必须需要一个bootloader程序,也就说芯片上电以后先运行一段bootloader程序。这段 bootloader 程序会先初始化DDR等外设,然后将 Linux 内核从 flash(NAND,NOR FLASH,SD,MMC等)拷贝到DDR中,最后启动Linux内核。下面我们首先进行uboot的移植,或者说适配。


二、F1C200s上电启动顺序

在进行uboot移植之前,需要了解F1C200s芯片上电后启动的顺序,避免重复造轮子,我们直接根据F1C100s启动时搜索SPI Flash的顺序?了解到启动顺序如下,F1C200s同F1C100s。

1. 上电后, f1c100s内部 BROM (芯片内置,无法擦除) 启动,
2. 首先检查 SD0 有没有插卡, 如果有插卡就读卡 8k偏移数据,是否是合法的启动数据, 如果是BROM 引导结束, 否则进入下一步
3. 检测SPI0 NOR FLASH(W25QXXX, MX25LXXX) 是否存在, 是否有合法的启动数据, 如果是BROM 引导结束, 否则进入下一步
4. 检测SPI0 NAND FLASH 是否存在, 是否有合法的启动数据, 如果是BROM 引导结束, 否则进入下一步
5. 因为找不到任何可以引导的介质, 系统进入usb fel 模式, 可以用USB烧录了。

上电之后,F1C200s芯片内部的BROM启动检查到SD卡,读取8k偏移数据。

注意:这里的bs=1024 seek=8是添加了8192字节的偏移,之所以要加8K偏移是因为FSBL也就是bootROM里面硬写死了会从设备的8K地址处加载SPL,然后进入uboot。因此上面烧写的时候,指定的偏移地址一定是相对于储存设备硬件的偏移,而不是相对于分区的偏移!

来自:peng-zhihui/Planck-Pi: Super TINY & Low-cost Linux Develop-Kit Based On F1C200s.


三、前期准备

虚拟机VmwareWorkstation安装;

ubuntu16.04系统安装。


四、新建用户

如果你已经再当前用户安装了一些其他的编译器,那么最好创建一个新的账户,避免一些命令可能出现干扰,或者说与其他项目隔离开,具体操作如下,比较简单,看图操作即可。


五、交叉编译环境配置

在路径 “ linaro release->compoments->toolchain->binaries->7.2-2017.11->arm-linux-gnueabi->gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi.tar.xz ” 中下载对应的交叉编译器,记住是release版本,不是snapshots版本。(Snapshot版本代表不稳定、尚处于开发中的版本,快照版本。Release版本则代表稳定的版本,发行版本。)具体链接如下:

Linaro Releaseshttps://releases.linaro.org/components/toolchain/binaries/7.2-2017.11/arm-linux-gnueabi/下载完成,使用如下面命令解压缩:

tar -vxf gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi.tar.xz 

将解压的文件复制到/usr/local/arm/中,操作命令如下:

sudo cp -rf /home/project01/pro01/gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi ./

然后添加该交叉编译器的环境变量,只有这样编译器才能在任何目录或者任何位置打开的终端中执行,打开~/.bashrc文件 (修改.bashrc文件,只是针对某一个特定的用户;修改/etc/profile文件,它是针对于所有的用户),写入以下内容:

export PATH=$PATH:/usr/local/arm/gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi/bin

使环境变量生效:

source ~/.bashrc 

验证是否成功:

arm-linux-gnueabi-gcc -v


六、uboot简介

bootloader主要的工作就是启动 Linux 内核,bootloader和 Linux内核的关系就跟PC上的BIOS和 Windows的关系一样bootloader就相当于BIOS。常见的bootloader有 U-Boot、vivi、RedBoot 等等。

本文使用uboot作为系统的bootloader,它的全称是"Universal Boot Loader",意为"通用引导加载程序"。uboot是一种裸机程序,可以视为是一个汇集了多种裸机功能的综合示例。目前的uboot已经支持液晶显示屏、网络连接、USB等高级功能。

uboot官方会维护uboot源码,也是最原汁原味的源码,但是官方提供的代码是供半导体厂商,也就是生产F1C200s的厂商使用的,他们会维护一个定制版本的uboot,但是,很遗憾,全志并没有将资料公开。由于网上关于F1C200s的uboot从零开始的开发资料几乎没有,此处我们使用荔枝派的uboot启动Linux。(后面有时间再完善,欢迎大佬加群或评论区指导)


七、uboot移植

🍏 uboot下载

首先在github上下载Lichee-Pi提供的uboot,当然,前提是你的虚拟机能访问网络,如果不会配置,参看我左侧专栏虚拟机中的文章即可。或者直接在Windows中github上下载,然后传到ubuntu中解压。 

uboot下载完成后,打开文件夹,uboot文件内容如下图所示:

🍏  uboot默认配置

对于同一款芯片,比如F1C200s,可能有不同的外设,uboot需要初始化的内容也不相同,因此需要选用uboot中的某些配置,去初始化各个外设,在uboot中的configs文件夹中存储着一些配置“套餐”,就是已经固定配置某些外设的默认配置文件一旦进行编译,uboot会根据这个配置文件进行配置。

如上图所示,为uboot的configs目录下的两个荔枝派的配置文件,第一个licheepi_nono_defconfig    是针对TF卡的配置文件,第二个licheepi_nano_spiflash_defconfig是针对flash的启动文件,显然我们需要选择第一个配置文件编译uboot,因为我们只有TF卡一种存储介质,没有flash。下面是编译指令:

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- licheepi_nano_defconfig

为了避免使用类似于上方的繁琐编译指令,在uboot根目录Makfile中加入如下内容:

这样我们可以通过以下简洁的代码进行uboot配置: 

# 进入u-boot目录
cd u-boot/

# 加载配置文件
make licheepi_nano_defconfig

 经过以上操作,默认配置文件licheepi_nano_deconfig已经写入到,/uboot/.config文件中,这是根据默认配置文件,生成的uboot的最终配置文件这个配置文件记录了所有配置选项的宏开关,我们可以通过宏开关对其进行修改。

注意:硬件中USB T口连接uart0,而荔枝派默认初始化uart0,因此无需修改。

🍏  uboot图形界面配置

使用make menuconfig命令进行图形界面配置uboot。

  1. bootcmd,主要用于描述控制Linux内核文件以及其他描述文件加载到内存中位置以及启动Linux内核系统等
  2. bootargs,用于配制文件系统、串口信息等。

Enable boot arguments 选项上点击空格,弹出Boot arguments选项,选中回车输入以下内容后回车保存。

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

同样的操作输入bootcmd的值,输入完成后如下图所示,有关bootargs和bootcmd值的含义,后序文章进行分析,这里不做解释。

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

 🍏 uboot编译

在进行编译之前需要在Ubuntu 中安装 ncurses 库,否则可能编译会报错,安装命令如下: 

sudo apt-get install libncurses5-dev

使用make -j2进行编译,其中-j2代表处理器核心数。编译完成,在根目录下找到u-boot-sunxi-with-spl.bin文件,该文件为最终烧录文件。

 🍏 烧录bin文件

只要将u-boot-sunxi-with-spl.bin烧录到tf卡的8k偏移地址处就可以了,至于为什么,上面的引用已经解释清楚了。将准备号的TF卡插入读卡器,使用如下块搬移命令进行烧写:

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

if    文件名:输入文件名,缺省为标准输入。即指定源文件。< if=input file >

of   文件名:输出文件名,缺省为标准输出。即指定目的文件。< of=output file >

bs  bytes:同时设置读入/输出的块大小为bytes个字节。

seek  blocks:从输出文件开头跳过blocks个块后再开始复制。

这里的输出文件(of)为主机电脑的/dev/sdb文件,也就是插入的读卡器代表的TF卡。

 烧录完成,如下图所示,然后弹出读卡器之后再拔出,否则可能损坏读卡器。


八、uboot启动测试

将开发板使用数据线与电脑相连,打开串口调试工具,根据bootargs参数设置串口通信参数:

 正常启动,窗串口调试工具为SecureCRT,选中端口后,波特率设置为115200:

墨云:

因为在你插入USB通电的时候开发板就已经启动了,所以当你打开串口连接的时候可能未必会看到信息,所以按一下重启键,就可以看到如下的输出信息了,这就是我们的u-boot,执行到u-boot计数完成后会产生错误,那是因为我们还没有进行系统内核的移植,所以默认就会进入u-boot命令模式。

点击复位按钮之后,在3秒之内(我设置的5秒)点击回车即可进入uboot命令模式,在 uboot命令模式输入“print”来查看环境变量 bootargs和bootcmd的值如下,和我们设置的相同,表示uboot启动成功!

 至此,完成uboot移植全部内容,然而并没有像我想的那样,从零开始,按照官方的uboot一步一步自己移植,谁让我是个小白呢。


九、参考内容

1. 墨云uboot移植;

2. 稚辉君github项目;

3. 正点原子《嵌入式Linux驱动开发指南》        


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/138391.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python-变量和简单数据类型

目录 1. 字符串 1.1. 修改字符串大小写 1.2. 合并字符串 1.3. 制表符与换行符 1.4. 删除空白 2. 数字 2.1. 使用 2.2. 使用str函数避免类型错误 2.3. 注释 2.4. Python之禅 1. 字符串 1.1. 修改字符串大小写 首字母大写&#xff1a;name.title()全部大写&#xf…

基于DDAUNet的CT食管肿瘤分割

摘要 在CT图像中手动或自动描绘食道肿瘤是非常具有挑战性的。这是由于肿瘤与邻近组织的对比度低,食道的解剖结构变化,以及偶尔存在异物(如喂食管)。 本文提出了一种基于卷积神经网络的全自动端到端食管肿瘤,本文所提出的网络称为扩张密集注意力网络,利用每个密集块中的空…

VScode代码片段尝试

最近开始尝试强迫自己使用 VSCode&#xff0c;毕竟 Webstorm 用了很多年了&#xff0c;依赖性比较严重。但是&#xff0c;最近 Webstorm 越来越难搞到免费永久合法使用方式了。 遂转向 VSCode 。 不过 VSCode 需要调教&#xff0c;不像 Webstorm 那么集成度比较高&#xff0c…

CalDAV网络服务器Baikal

什么是 Baikal &#xff1f; Baikal 是一个免费的开源自托管 CalDav 和 CardDav 服务器&#xff0c;适用于想要管理其数据并确保其数据是私有的用户。 Baikal和群晖套件中的 Synology Calendar 是类似的应用&#xff1b; 什么是 CalDav ? CalDav 是一种互联网标准和协议&…

Qt扫盲-QVector理论总结

QVector理论总结一、概述二、使用1. 声明初始化2. 获取元素和链表信息3. 常用操作4. 迭代Vector三、注意一、概述 QVector是Qt的泛型容器类之一。它将每一个元素存储在相邻的内存位置&#xff0c;并提供快速的基于索引的访问。 QList&#xff0c; QLinkedList&#xff0c; QVe…

eurake原理分析以及搭建

消费者随时能够监控到服务的状态 消费者如何获取服务提供者具体的信息&#xff1f; 1&#xff09;服务提供者启动时间eureka注册自己的信息 2&#xff09;eureka保存这些信息 3&#xff09;消费者根据服务名称向eureka拉取提供者的信息 如果有多个服务提供者&#xff0c;消费者…

VS代码生成工具ReSharper v2022.3官宣首发——支持C# 11

实质上&#xff0c;ReSharper特征可用于C#&#xff0c;VB.net&#xff0c;XML&#xff0c;Asp.net&#xff0c;XAML&#xff0c;和构建脚本。 使用ReSharper&#xff0c;你可以进行深度代码分析&#xff0c;智能代码协助&#xff0c;实时错误代码高亮显示&#xff0c;解决方案范…

网络OSI(七层模型)

OSIOSI是一个理论上的网络通信模型&#xff0c;而TCP/IP则是实际运行的网络协议。TCP/IPTCP/IP (传输控制协议/网际协议) 网络通信模型 以及一整个网络传输协议家族应用层应用层协议: FTP TFTP HTTP SNMP SMTP DNS Telnet表示层 数据格式化 代码转换 数据解密/加密会话层 解除或…

低代码如何构建响应式布局前端页面

“你开发的界面为啥在我的屏幕里这么小啊&#xff1f;” “这个界面为啥在我这里会出现横向滚动条啊&#xff1f;” 大家在进行前端界面开发时&#xff0c;有没有遇到这些类似的问题呢&#xff1f;又是如何解决的呢&#xff1f; 页面响应式 在进行项目交付的场景中&#xf…

JavaEE【Spring】:Spring AOP

文章目录一、概念1、定义2、作用二、Spring AOP1、AOP 组成① 切面&#xff08;Aspect&#xff09;② 连接点&#xff08;Join Point&#xff09;③ 切点&#xff08;Pointcut&#xff09;④ 通知&#xff08;Advice&#xff09;2、实现① 添加 AOP 框架支持② 定义切面和切点Ⅰ…

都有哪些好用的设备维护管理软件?这5款值得一试

都有哪些好用的设备维护管理软件&#xff1f; 速速点进来&#xff0c;这些超高性价比的设备维护管理App/软件不容错过&#xff01; 设备是工厂及企业生存的基础&#xff0c;设备的正常运作是保证工厂及企业存活的前提&#xff0c;而要保证设备的正常运作&#xff0c;就必须要…

NLP预训练小结-从词向量到BERT

图像预训练预训练首先是在图像领域广泛应用的。设计网络结构后&#xff0c;处理图像一般是CNN的多层叠加网络结构&#xff0c;先用训练集对网络预先训练&#xff0c;处理新任务时采取相同的网络结构&#xff0c;在比较浅的几层CNN结构&#xff0c;网络参数初始化的时候可以加载…

思科路由器DHCPv6中继服务配置

配置如下&#xff1a; Router>ena Router#conf t Router(config)#host R1 R1(config)#ipv6 unicast-routing R1(config)#service dhcp R1(config)#int g0/1 R1(config-if)#ipv6 add 2001:1::1/64 R1(config-if)#no sh R1(config-if)#exit R1(config)#ipv6 local …

【自学Java】Java三目运算符

Java三目运算符 Java三目运算符教程 在 Java 语言 中&#xff0c;有一种语言可以等价于使用 if…else 进行变量的赋值操作。它就是三目运算符。 Java语言三目运算符详解 语法 Object result condition?value:value2;参数 参数描述condition条件判断符&#xff0c;一般运…

PointNet++详解(二):网络结构解析

如有错误&#xff0c;恳请指出。 在之前对PointNet与PointNet网络进行了介绍&#xff0c;接下来是对其代码的解析。 1. 论文阅读笔记 | 三维目标检测——PointNet 2. 论文阅读笔记 | 三维目标检测——PointNet 参考的github项目为&#xff1a;https://github.com/yanx27/Poi…

window10安装minio

1、首先第一步我们先下载minio 可以从官网上下不同的版本 下载地址&#xff1a;MinIO | Code and downloads to create high performance object storage 2、启动minio 切记不要双击minio&#xff0c; 1、把下载好的minio.exe放到F(我这里放到F里了)&#xff0c;在地址栏里输…

【NI Multisim 14.0编辑环境——项目管理器】

目录 序言 一、项目管理器 ⛄1.“设计工具箱”面板 ⛄2.“SPICE 网表查看器”面板 ⛄3.“LabVIEW 协同仿真终端”面板 序言 NI Multisim最突出的特点之一就是用户界面友好。它可以使电路设计者方便、快捷地使用虚拟元器件和仪器、仪表进行电路设计和仿真。 首先启动NI Mu…

前端调试(常用)

定义调试&#xff1a;代码在某个平台运行&#xff0c;把运行时的状态通过某种方式暴露出来&#xff0c;传递给开发工具做 UI 的展示和交互&#xff0c;辅助开发者排查问题、梳理流程、了解代码运行状态等&#xff0c;这个就是调试。调试就是通过某种信道&#xff08;比如 WebSo…

clip_as_service学习过程(二)——clip主要的功能

参考链接:https://clip-as-service.jina.ai/user-guides/client/#async-encoding 一、encoding()_编码 clip_client提供 encode&#xff08;&#xff09; 函数&#xff0c;允许您以流和同步/异步方式将句子、图像发送到服务器。这里的编码意味着获取文本或图像的固定长度矢量…

【Vue中使用Echarts】在Vue中优雅的使用Echarts——图表轮播图、Echarts图表组件封装、节流函数优化图表性能

文章目录一、为什么要优雅的使用echarts二、最初的表格组件三、初步的封装四、性能优化一、为什么要优雅的使用echarts 为了提高代码的规范性、复用性&#xff0c;vue中最常用的就是将具有某些功能的代码封装到一个插件。如果没有对插件进行封装&#xff0c;在后期使用插件的时…