一.linux开发之uboot移植(一)——初识uboot

一.linux开发之uboot移植(一)——初识uboot参考博文:http://blog.51cto.com/9291927/1791237一、uboot简介U-Boot,全称UniversalBootLoader,是遵循GPL条款的从FADSROM、8xxROM、PPCBOOT逐步发展演化而来的开放源码项目。-在操作系统方面,U-Boot不仅支持-嵌入式Linux系统的引导,它还支持NetBSD,VxWorks,

大家好,又见面了,我是你们的朋友全栈君。

参考博文: http://blog.51cto.com/9291927/1791237

一、uboot简介

U-Boot,全称 Universal Boot Loader,是遵循GPL条款的从FADSROM、8xxROM、PPCBOOT逐步发展演化而来的 开放源码项目。
在操作系统方面 ,U-Boot不仅支持
– 嵌入式Linux系统的引导,它还支持NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS, android嵌入式操作系统。目前支持的目标操作系统是OpenBSD, NetBSD, FreeBSD,4.4BSD, Linux, SVR4, Esix, Solaris, Irix, SCO, Dell, NCR, VxWorks, LynxOS, pSOS, QNX, RTEMS, ARTOS, android。
在CPU架构方面 ,U-Boot除了支持PowerPC系列的处理器外,还能支持MIPS、 x86、ARM、NIOS、XScale等诸多常用系列的处理器。
uboot主要作用 是用来启动操作系统内核

* *

uboot什么时候开始运行,什么时候结束运行?

  1.uboot本质上是一个裸机程序(不是操作系统),一旦uboot开始SoC就会单纯运行uboot(意思就是uboot运行的时候别的程序是不可能同时运行的),一旦uboot结束运行则无法再回到uboot(所以uboot启动了内核后uboot自己本身就死了,要想再次看到      uboot界面只能重启系统。重启并不是复活了刚才的uboot,重启只是uboot的另一生)

  2. **uboot的入口就是开机自动启动,uboot的唯一出口就是启动内核** 。uboot还可以执行很多别的任务(譬如烧录系统),但是其他任务执行完后都可以回到uboot的命令行继续执行uboot命令,而启动内核命令一旦执行就回不来了

二、uboot的工作模式

* U-Boot的工作模式有启动加载模式和下载模式。*

1、启动加载模式

启动加载模式是Bootloader的正常工作模式,嵌入式产品发布时,Bootloader必须工作在这种模式下,Bootloader将 [嵌入式操作系统](file:///h)从FLASH中加载到SDRAM中运行,整个过程是自动的。

2、下载模式

下载模式就是Bootloader通过某些通信手段将 内核映像或 根文件系统映像等从PC机中下载到 目标板的FLASH中。用户可以利用Bootloader提供的一些命令接口来完成自己想要的操作。开发人员可以使用各种命令,通过串口连接或网络连接等通信手段从主机(Host)下载文件(比如内核映像、文件系统映像),将它们直接放在内存运行或是烧入Flash类固态存储设备中。

板子与主机间传输文件时,可以使用串口的xmodem/ymodem/zmodem协议,还可以使用网络通过tftp、nfs协议来传输,以及USB下载等方法。

一般来说,嵌入式开发人员采用下载模式进行开发嵌入式系统。通常采用交叉网线将PC与目标开发板连接,通过TFTP服务器下载内核,用NFS服务器挂载文件系统。

三、uboot的常用命令

1** 、获取命令**

命令:help 或 ?

功能:查看当前U-boot版本中支持的所有命令。

2、环境变量命令

环境变量有2份,一份在Flash中,另一份在DDR中。uboot开机时一次性从Flash中读取全部环境变量到DDR中作为环境变量的初始化值,然后使用过程中都是用DDR中这一份

bootdelay 执行自动启动(bootcmd中的命令)的等候秒数
baudrate 串口控制台的波特率
netmask 以太网的网络掩码
ethaddr 以太网的MAC地址
bootfile 默认的下载文件名
bootargs 传递给Linux内核的启动参数
bootcmd 自动启动时执行命令
serverip TFTP服务器端的IP地址
ipaddr 本地的IP地址
stdin 标准输入设备,一般是串口
stdout 标准输出,一般是串口,也可是LCD(VGA)
stderr 标准出错,一般是串口,也可是LCD(VGA)

使用* print *命令可以打印出当前开发板的环境变量。
setenv envname value设置环境变量的值(设置后记得save保存

(1)新建一个环境变量,使用set var value

(2)更改一个环境变量,使用set var value

(3)删除一个环境变量,使用set var

     (4)save将修改的环境变量保存到固态存储器中。
  • bootcmd 自动启动执行命令

uboot开机后会自动倒计时,在倒计时结束前如果没有外部按键打断自动计时,uboot将自动执行bootcmd变量保存的命令。
这里写图片描述
意思是:将iNand的kernel分区读取到DDR内存的0x30008000地址处,然后使用bootm启动命令从内存0x30008000处去启动内核。

(1)可以将bootcmd设置为:set bootcmd print

然后save保存;重启则会看到启动倒数后自动执行print命令打印出环境变量

这里写图片描述
(2) 再还原为内核启动命令:

set bootcmd ‘movi read kernel 30008000; movi read rootfs 30B00000 300000; bootm 30008000 30B00000’

( 中间有分号记得必须得加” )

  • uboot给kernel传参:bootargs(内核移植中必定使用)

(1)linux内核启动时可以接收uboot给他传递的启动参数,这些启动参数是uboot和内核约定好的形式、内容,linux内核在这些启动参数的指导下完成启动过程。

(2)我们在uboot的环境变量中设置bootargs,然后bootm命令启动内核时会自动将bootargs传给内核。
这里写图片描述
意义解释:

console=ttySAC2,115200 控制台使用串口2,波特率115200.

root=/dev/mmcblk0p2 rw 根文件系统在SD卡端口0设备(iNand)第2分区,根文件系统是可读可写的

init=/linuxrc linux的进程1(init进程)的路径

rootfstype=ext3 根文件系统的类型是ext3

3、网络命令

. uboot可以通过网络来传输文件到开发板,直接用交叉网线连接开发板和电脑,也可以用普通直连网线连接路由器。

ping ip
  • 网络命令搭建开发板uboot和虚拟机ubuntu互相ping通记录在另一博课笔记中

    如果网络连通,就可以通过tftp、NFS挂载开发板

4.tftp下载指令:tftp

作用:使uboot为了部署内核就需要将内核镜像从主机中下载过来然后烧录到本地flash中去。

将要下载的镜像文件放在服务器的下载目录中,然后开发板中使用uboot的tftp命令去下载即可。

我的虚拟机搭建的时候设置的tftp下载目录是/tftpboot,将要被下载的镜像复制到这个目录下。

具体参考另一博客tftp服务器的安装搭建及使用(保证已经可以ping通)

5.nfs启动内核命令:nfs

作用: nfs服务,通过它”挂载”制作好的根文件系统。

主机开启nfs服务后,就可以像tftp一样传文件到开发板了,而且nfs还可以挂载根文件系统,这就是nfs的主要作用

具体参考另一博客* nfs服务器的安装及使用*

6.SD卡/iNand操作指令movi

  • movi的指令都是movi read和movi write一组的,

    movi read用来读取iNand到DDR上,movi write用来将DDR中的内容写入iNand中。理解这些指令时一定要注意涉及到的2个硬件:iNand和DDR内存

  • movi指令是一个命令集,有很多子命令,具体用法可以help ,这里说明怎么看

    例:movi read {u-boot | kernel} {addr}

这个命令使用了一种通用型的描述方法来描述:movi 和 read外面没有任何标记说明每一次使用这个指令都是必选的;一对大括号{}括起来的部分必选1个,大括号中的竖线表是多选一。中括号[]表示可选参数(可以有也可以没有)

譬如命令 movi read u-boot 0x30000000表示如下:

意思就是把iNand中的u-boot分区读出到DDR的0x30000000起始的位置处。

(uboot代码中将iNand分成了很多个分区,每个分区有地址范围和分区名,uboot程序操作中可以使用直接地址来操作iNand分区,也可以使用分区名来操作分区。);注意这里的0x30000000也可以直接写作30000000,意思是一样的( uboot的命令行中所有数字都被默认当作十六进制处理 ,不管你加不加0x都一样)。

7.NandFlash操作指令nand
这里写图片描述
8.内存操作指令:mm、mw、md

  • * nm * 修改内存值 * ( *指定地址* ) *

    格式: nm [.b, .w, .l] address

  • * mm 修改内存值(地址自动加一)*

    格式: mm [.b, .w, .l] address

  • * md 显示内存值*

    格式: md [.b, .w, .l] address [# of objects]

  • mw 用指定的数据填充内存

    格式: mw [.b, .w, .l] address value [count]

  • * cp 内存的拷贝(包括内存与Nor Flash间的数据拷贝)*

    格式:cp [.b, .w, .l] source target count

9.启动内核指令:bootm、go

uboot命令行中调用这个指令就会启动内核(不管成功与否,所以这个指令是一条死路)。

差别: bootm启动内核同时给内核传参,而go命令启动内核不传参。 bootm其实才是正宗的启动内核的命令,一般情况下都用这个 ;go命令本来不是专为启动内核设计的,go命令内部其实就是一个函数指针指向一个内存地址然后直接调用那个函数,go命令的实质就是PC直接跳转到一个内存地址去运行而已

四.uboot中对Flash和DDR的管理

uboot在Flash中的分区

Flash分区如下: 功能:
自由分区 待用空间(一般做根文件系统使用)
rootfs 根文件系统文件
kernel 内核文件
var 环境变量
uboot bootlater(必须在最前面)

(1)各分区彼此相连,前面一个分区的结尾就是后一个分区的开头。

(2)整个flash充分利用,从开头到结尾。

(3)uboot必须在Flash开头,其他分区相对位置是可变的。

(4)各分区的大小由系统移植工程师自己来定,一般定为合适大小(不能太小,太小了容易溢出;不能太大,太大了浪费空间)

(5)分区在系统移植前确定好,在uboot中和kernel中使用同一个分区表。将来在系统部署时和系统代码中的分区方法也必须一样。

因为Flash是掉电不丢失的,因此,在对Flash进行分区的时候要考虑到以后的使用条件。而DDR是掉电丢失的,因此,在系统的每个阶段都可以对它进行重新分区,例如在uboot阶段它有自己的分区管理,而在kernel启动起来之后,整个内存又将被kernel给接替过来,kernel将会对内存进行重新的分区和管理。

综上:DDR要根据具体使用情况对其进行分区管理,注意内存不要重叠。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/148804.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • seekg()/seekp()与tellg()/tellp()的用法详解

    seekg()/seekp()与tellg()/tellp()的用法详解对输入流操作:seekg()与tellg()对输出流操作:seekp()与tellp()下面以输入流函数为例介绍用法:seekg()是对输入文件定位,它有两个参数:第一个参数是偏移量,第二个参数是基地址。对于第一个参数,可以是正负数值,正的表示向后偏移,负的表示向前偏移。而第二个参数可以是:ios::beg:表示输入流的开始位置ios::cur:表示输入流的当前位置io

    2022年6月9日
    77
  • 服务熔断与服务降级详解

    服务熔断与服务降级详解为深入理解服务雪崩解决方案中服务熔断和服务降级两个方式,在这儿做一个详解服务熔断什么是服务熔断:当下游的服务因为某种原因突然变得不可用或响应过慢,上游服务为了保证自己整体服务的可用性,不再继续调用目标服务,直接返回,快速释放资源。如果目标服务情况好转则恢复调用服务熔断的原理:业内普遍采用断路器模式原理:当远程服务被调用时,断路器将监视这个调用,如调用时间太长,断路器将会介入并中断调用。此外,断路器将监视所有对远程资源的调用,如对某一个远程资源的调用失败次数足够多,那么断路器

    2022年10月20日
    0
  • Git创建分支和查看分支命令「建议收藏」

    Git创建分支和查看分支命令「建议收藏」branch:分支 是指在开发主线中分离出来的,做进一步开发而不影响到原来的主线Git存储的不是一系列的更改集,而是一系列快照,当你执行一次commit时,git存储一个commit对象,她包含它包含一个指针指向你当前需要提交的内容的快照。master分支是在gitinit命令运行时默认创建一个分支,并命名为master1.查看分支gitbranch:列出本地已经存在的分支,…

    2022年8月22日
    4
  • 浏览器安装为知笔记插件(chrome浏览器)

    浏览器安装为知笔记插件(chrome浏览器)1.下载并安装驱动 wiz.cn/zh-cn/downloads-webclipper.html2.我选择的谷歌浏览器,因为不好翻墙,这里选择手动安装3.下载会得到一个crx文件。注意这里按照官方文档去添加到扩展程序会失败。我们要把这个文件后缀名改为.zip形式并解压,得到文件夹。注意:是直接将.crx改成.zip!!不是自己压缩成的4.接着,打开谷歌的“更多工具”…

    2022年8月18日
    35
  • MobaXterm简单使用说明

    MobaXterm简单使用说明

    2021年5月13日
    286
  • 基于51单片机的毕业设计题目_单片机全自动洗衣机毕业设计

    基于51单片机的毕业设计题目_单片机全自动洗衣机毕业设计仿真链接:基于单片机的智能衣柜设计–仿真设计软件安装:Keil:点击下载 Proteus:点击下载 AD:点击下载 Visio:点击下载 烧录软件:点击下载设计简介:本设计是基于单片机的智能衣柜设计,主要实现以下功能:可实现通过DHT11测量衣柜的温湿度,并可自动进行除湿 可实现通过DS1302获取当前时间,并可通过按键调整 可实现通过按键设置紫外线消毒的开始时间和结束时间 可实现通过按键模拟打开衣柜或关闭衣柜 可实现通过LCD1602显示衣柜内的温湿度、衣柜的开关状态

    2022年10月3日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号