uboot移植之前的工作

1.1计算机系统的主要部件:计算机系统是有cpu来做核心进行运行的系统。典型的计算机系统有:pc机,嵌入式设备(手机、平板电脑、游戏机),单片机(家用电器)。
1.2计算机系统组件部件非常多,不同的计算机系统组成部件也不同。但是所有的计算机系统运行时需要的主要核心部件都是3个东西:cpu+外部存储器(Flash/硬盘) + 内部存储器(DDR SDRAM/SDRAM/SRAM)。
1.3pc机的启动过程:(1)典型的pc部署:BIOS程序部署在pc机主板上(随主板出厂时已经预制了),操作系统部署在硬盘上,内存在掉电时无作用,cpu在掉电时不工作。(2)启动过程:pc上电后先执行BIOS程序(实际上pc的BIOS就是NorFlash),BIOS程序负责初始化DDR内存,负责初始化硬盘,然后从硬盘上将OS镜像读取到DDR中,然后跳转到DDR中去执行OS直到启动(OS启动后BIOS就无用了)。

1.4典型嵌入式linux系统启动过程:(1)嵌入式系统的部署和启动都是参考PC机的。只是设备上有一些差别。(2)典型嵌入式系统的部署:uboot程序部署在Flash(能作为启动设备的flash)上、OS部署在Flash(嵌入式系统中用Flash代替了硬盘)上、内存在掉电时无作用、CPU掉电不工作。(3)启动过程:嵌入式系统上电后先执行uboot、然后uboot复制初始化DDR,初始化Flash,然后将OS从Flash中读取到DDR中,然后启动OS(OS启动后uboot就成了Flash)。

总结:嵌入式系统和pc机的启动过程几乎没有两样,只是BIOS成了uboot,硬盘成了Flash。

1.4android系统启动过程:(1)android系统的启动和linux系统(前面讲的典型的嵌入式系统启动)几乎一样。只是在内核启动后加载根文件系统后就不同了。
(1)可以认为启动分为2个阶段:第一个阶段是uboot到OS启动;第二个阶段是OS启动后到rootfs加载到命令行执行;现在主要研究第一阶段,android的启动和linux的差别在第二阶段。

总结:uboot到底干嘛?
Uboot主要作用是用来启动操作系统内核
Uboot还要负责部署整个计算机系统
Uboot中还有操作Flash等板子上硬盘的驱动。
Uboot还痛一个命令行界面供人来操作。



为什么是uboot?

1. uboot从哪里来?
Uboot是sourceforge上的开源项目。
http://www.denx.de/wiki
uboot项目的作者,一个德国人最早发起的项目。
Uboot就是由一个人发起,然后由整个网络上所有感兴趣的人共同维护发展而来得一个bootloader。
2. uboot发展历程:
自己使用的小开源项目;被更多人认可使用;被soc厂商默认支持。Uboot经过多年发展,已经成为事实上的业内bootloader标准。现在大部分的嵌入式设备都会默认使用uboot来做为bootloader。
3. uboot版本号问题
早期的uboot的版本号类似于这样:uboot1.3.4。后来版本号便成了类似uboot-2010.6
Uboot的核心部分几乎没有什么变化,越新的版本支持的开发板越多而应,对于一个老版本的芯片来说,新旧版本的uboot并没有差异。
4.uboot移植:uboot就是universal bootloader(通用的启动代码),通用的意思就是在各种地方都可以用。所有说uboot具有可移植性。Uboot具有在源代码级别的移植能力,可以针对多个开发板进行移植,移植后就可以在这个开发板上使用了。
总结:uboot的出现时一种必然,如果没有uboot也会有另一个ubootloader。
ftp://ftp.denx.de/pub/u-boot/

uboot必须解决那些问题?
1. 自身可开机直接启动:一般的soc都支持多种启动方式,sd启动,norflash启动,nandflash启动等。。。uboot要开机启动,必须根据具体的soc的启动设计来设计uboot 。uboot必须进行和硬件相对应的代码级别的更改和移植,才能够保证可以从相应的启动介质启动。Uboot中第一阶段start.S文件中具体处理了这一块。
2. 能够引导操作系统内核启动并给内核传参:uboot终极目标就是启动目标。Linux在设计为可以被传参。我们可以在uboot中事先给linux内核准备一些启动参数放在内存中特定位置然后传给内核,内核启动后回到这个特定位置去取uboot传给他的参数,然后在内核中解析这些参数,这些参数将被用来指导linux内核的启动过程。
3. 能够提供系统部署功能:uboot必须能够被人借助而完成整个系统在Flash上烧录下载工作。裸机中刷机就是利用uboot中的fastboot功能将各种镜像烧录到inad中,然后从inad启动。
4. 能进行soc级和版级硬件管理:uboot中实现了一部分硬件的控制能力(uboot中初始化了一部分硬件),因为uboot为了完成一些任务必须让这些硬件工作。譬如uboot要实现刷机必须能驱动INand,譬如uboot要在刷机是LCD上显示进度条就必须能驱动LCD,譬如uboot能够通过串口提供操作界面就必须驱动串口。譬如uboot要实现网络功能必须驱动网卡芯片。 SOC级(串口)就是soc内部外设,板级就是soc外面开发板上面的硬件(譬如网卡,inand)。
5. uboot的生命周期:uboot的生命周期就是指:uboot什么时候开始运行,什么时候结束运行。Uboot本质上是一个裸机程序,一旦uboot开始soc就会淡村运行uboot.(就是uboot运行的时候别的程序是不可能同时运行的),一旦uboot结束运行则无法再回到uboot.(所以uboot启动了内核后uboot自身就死了,要想再次开到uboot界面只能重启系统。重启并不是复活了刚才的uboot,重启只是uboot的另一生 。)uboot的入口和出口。入口就是开机自动启动,uboot的唯一出口就是启动内核。Uboot还可以执行很多别的任务,但是其他任务执行完后都可以回到uboot的命令行继续执行uboot命令,而启动内核命令一旦执行就回不来了。
6. 总结:一切都是为了启动内核。

Uboot工作方式:
1. 从裸机长须镜像uboot.bin说起
a) Uboot的本质就是一个裸机程序,和我们裸机全集中写的那些裸机程序xx.bin并没有本质区别。如果非要说要有区别,那就是:我们写的大本分小于16kb,而uboot大于16kb(一般uboot在180kb-400kb之间)
b) Uboot本身是一个开源项目,由若干个.c文件和.h文件组成,配置编译之后会生产一个uboot.bin,这就是uboot这个裸机程序的镜像文件。然后这个镜像文件被合理的烧录到启动介质中拿给soc去启动。也就是说uboot在没有运行时表现为uboot.bin,一般趟在启动介质中。
c) Uboot运行时会被加载到内存中然后一条指令一条指令的拿给cpu去运行。
2. uboot命令式shell界面
a) 普通的裸机程序运行起来就直接执行了。执行时效果和代码有关。
b) 有些程序需要和人进行互动,于是程序中就实现了一个shell,uboot就实现了一个shell。
注意:shell不是操作系统,和操作系统一点关系都没有,linux中打开一个终端后就得到了一个shell,可以输入命令回车执行。Uboot中的shell工作方式和linux中终端shell非常像。

3. 掌握uboot使用的2个关键点:命令和环境变量
Uboot启动后大部分时间和工作都是在shell下完成的(譬如uboot要不是系统要在shell下输命令,要设置环境变量也得在命令行底下,要启动内核也要在命令行底下敲命令)。
命令就是uboot中shell中可以识别的各种命令。Uboot中由几十个命令,其中一些常用另一些不常用。Uboot环境变量和操作系统的环境变量工作原理和方式几乎完全相同。Uboot在设计时借助了操作系统的设计理念。(命令行工作方式借鉴了linux终端命令行哦,环境变量借鉴了操作系统的环境变量,uboot的驱动管理几乎完全照抄了linux的驱动框架)。
环境变量可以被认为是系统的全局变量,环境变量名都是系统内置的(认识就认识,不认识就不认识,这部分是系统自带的默认的环境变量,譬如PATH:但是也有一部分环境变量时自己添加了,自己添加的系统就不认识但我们自己认识)。系统和哦我们自己的程序在运行时可以通过读取环境变量来知道程序的运行。这样设计的好处就是灵活,譬如我们要让一个程序更改运行方法,不用去重新修改程序代码再重新编译运行,而只要修改想要的环境变量就可以了。
环境变量就是运行时的配置属性。

结合arm裸机部分进行理解和印证:
及时复习arm裸机中和现在降到的相关知识点,在复习中巩固arm裸机中学到的。这过程中原来记了笔记非常容易。以及对照原来arm裸机中讲到的相关部分,可以帮助理解当前讲到的知识点。结合arm裸机中和现在讲的,好好总结,思考。
Uboot常用命令1:类似linux终端的行缓冲命令行
行缓冲的意思:我们向终端命令行输入命令的时候,这些命令没有立即被系统识别,而是被缓冲到一个缓存区,当我们按下回车键后系统就认为我们输入完了,然后将缓冲区中所有刚才输入的作为命令拿去分析处理。
Linux终端设计有3种缓冲机制:无缓冲,行缓冲,全缓冲。

譬如:printenv 命令可以简化print setenv 简化为set

Uboot的每个命令都有事先规定好的各种格式。有些命令不带参数,譬如:printenv/print命令:有些命令带可选的参数(可以带,也可以不带,)有些就必须带参数。(setenv命令)。

命令中的特殊符号:(单引号)uboot的有些命令带的参数非常长,为了告诉uboot这个非常长而且中间有好多个空格的东西是给他的一整个参数,所以用单引号将这个很长且中间有空格隔开的参数引起来。别的符号也许也有,而且有特殊依稀,当碰到uboot的命令行有特殊符号是要注意不是弄错了,而可能又特别的含义。
命令族:好多个命令开头都是用同一个命令关键字的,但是后面的参数不一样,这些命令的功能和作用也不同。这就叫一个命令族。
同一个命令族中所有的命令都有极大的管理,譬如movi 开头的命令族都和moviNand(emmc,inand)操作有关。

movi init - Initialize moviNAND and show card info
movi read {u-boot | kernel} {addr} - Read data from sd/mmc
movi write {fwbl1 | u-boot | kernel} {addr} - Write data to sd/mmc
movi read rootfs {addr} [bytes(hex)] - Read rootfs data from sd/mmc by size
movi write rootfs {addr} [bytes(hex)] - Write rootfs data to sd/mmc by size
movi read {sector#} {bytes(hex)} {addr} - instead of this, you can use "mmc read"
movi write {sector#} {bytes(hex)} {addr} - instead of this, you can use "mmc write"
第一个命令:printenv print
作用是打印出系统中所有的环境变量。
环境变量就好像程序的全局变量一样。程序中任何地方都可以根据需要去调用或者更改环境变量(一般都是调用),环境变量和全局变量不同之处在于:全局变量的生命周期是在程序的一次运行当中,开始运行时诞生程序结束时死亡,下次运行程序时从头开始;但是环境变量被存储在Flash的另一块专门区域,一旦我们在程序中保存了该环境变量,那么下次开机时该环境变量的值将维持上一次更改保存后的值。

printenv
- print values of all environment variables
printenv name ...
print value of environment variable 'name'
setenv name value ...
- set environment variable 'name' to 'value ...'
setenv name
- delete environment variable 'name'

网络测试指令:ping
命令用法:ping ip地址
注意:ping是测试开发板和主机之间的网络连接,注意以下步骤:
1. 首先要插上网线。
2. 先试图ping通主机windows。注意windows中有线网卡的地址设置(设置本地连接)。设置主机windows的本地连接IPv4地址为192.168.1.10
3. 第三步确认开发板中uboot里几个网络相关的环境变量的值对不对。最重要的是ipaddr(这个环境变量是开发板的ip地址)。这个地址必须和主机window在同一个网段。

主机地址(由子网掩码来区分那一部分是网段地址,那一部分是ip地址)。在子网掩码是255.255.255.0的情况下,192.168.1.10这个ip地址的前三部分(192.168.1)属于网段地址,第4部分(10)属于主机地址。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章