完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
重要说明:这份笔记不是4412开发配套的,是我在网上看视频的时候下载上课老师的笔记后修改的。所以我试了一下笔记上的uboot命令,有些无法使用,可能是uboot版本问题或者文件系统问题。具体原因我目前还不是很清楚,建议第五部分uboot命令可以先不用尝试。 一切以配套视频为准。 一、为什么是uboot 1.uboot从哪里来的? (1)uboot是SourceForge上的开源项目 (2)uboot项目的作者:一个德国人最早发起的项目 (3)uboot就是由一个人发起,然后由整个网络上所有感兴趣的人共同维护发展而来的一个bootloader。 2.、uboot的发展历程 自己使用的小开源项目->被更多人认可使用->被SoC厂商默认支持。 总结:uboot经过多年发展,已经成为事实上的业内bootloader标准。现在大部分的嵌入式设备都会默认使用uboot来做为bootloader。 3.uboot的版本号问题 (1)早期的uboot的版本号类似于这样:uboot1.3.4。后来版本号便成了类似于uboot-2010.06。 (2)uboot的核心部分几乎没怎么变化,越新的版本支持的开发板越多而已,对于一个老版本的芯片来说,新旧版本的uboot并没有差异。 4.uboot的可移植性的正确理解 (1)uboot就是universal bootloader(通用的启动代码),通用的意思就是在各种地方都可以用。所以说uboot具有可移植性。 (2)uboot具有可移植性并不是说uboot在哪个开发板都可以随便用,而是说uboot具有在源代码级别的移植能力,可以针对多个开发板进行移植,移植后就可以在这个开发板上使用了。 5.总结:uboot的出现是一种必然,如果没有uboot也会有另一个bootloader来代替。 二、为什么要有uboot1.计算机系统:计算机系统就是有CPU来做核心进行运行的系统。 计算机系统的组成部件非常多,不同的计算机系统组成部件也不同。但是所有的计算机系统运行时需要的主要核心部件都是3个东西:CPU + 外部存储器(Flash/硬盘) + 内部存储器(DDR SDRAM/SDRAM/SRAM) 2.PC机的启动过程 (1)典型的PC机的部署:BIOS程序部署在PC机主板上(随主板出厂时预制的),操作系统部署在硬盘上,内存在掉电时无作用,CPU在掉电时不工作。 (2)启动过程:PC上电后先执行BIOS程序(实际上PC的BIOS就是NorFlash),BIOS程序负责初始化DDR内存,负责初始化硬盘,然后从硬盘上将OS镜像读取到DDR中,然后跳转到DDR中去执行OS直到启动(OS启动后BIOS就无用了) 3.典型嵌入式linux系统启动过程 (1)嵌入式系统的部署和启动都是参考PC机的。只是设备上有一些差别。 (2)典型嵌入式系统的部署: uboot程序部署在Flash(能作为启动设备的Flash)上、OS部署在Flash(嵌入式系统中用Flash代替了硬盘)上、内存在掉电时无作用,CPU在掉电时不工作。 (3)启动过程:嵌入式系统上电后先执行uboot、然后uboot负责初始化DDR,初始化Flash,然后将OS从Flash中读取到DDR中,然后启动OS(OS启动后uboot就无用了) 总结:嵌入式系统和PC机的启动过程几乎相同,只是BIOS成了uboot,硬盘成了Flash。 4.android系统启动过程 (1)android系统的启动和linux系统(前面讲的典型的嵌入式系统启动)几乎相同,只是在内核启动后加载根文件系统后不同了。 (2)可以认为启动分为2个阶段:第一个阶段是uboot到OS启动;第二个阶段是OS启动后到rootfs加载到命令行执行;现在我们主要研究第一个阶段,android的启动和linux的差别在第二阶段。 5.总结:uboot到底是干嘛的 (1)uboot主要作用是用来启动操作系统内核。 (2)uboot还要负责部署整个计算机系统。 (3)uboot中还有操作Flash等板子上硬盘的驱动。 (4)uboot还得提供一个命令行界面供人来操作。 1.自身可开机直接启动 (1)一般的SoC都支持多种启动方式,譬如SD卡启动、NorFlash启动、NandFlash启动等等。uboot要能够开机启动,必须根据具体的SoC的启动设计来设计uboot (2)uboot必须进行和硬件相对应的代码级别的更改和移植,才能够保证可以从相应的启动介质启动。uboot中第一阶段的start.S文件中具体处理了这一块。 2.能够引导操作系统内核启动并给内核传参 (1)uboot的终极目标就是启动内核。 (2)linux内核在设计的时候,设计为可以被传参。也就是说我们可以在uboot中事先给linux内核准备一些启动参数放在内存中特定位置然后传给内核,内核启动后会到特定位置去取uboot传给他的参数,然后在内核中解析这些参数,这些参数将被用来指导linux内核的启动过程。 3.能提供系统部署功能 (1)uboot必须能够被人借助而完成整个系统(包括uboot、kernel、rootfs等的镜像)在Flash上的烧录下载工作。 (2)刷机就是利用uboot中的fastboot功能将各种镜像烧录到iNand中,然后从iNand启动。 4.能进行SoC级和板级硬件管理 (1)SoC级(譬如串口)就是SoC内部外设,板级就是SoC外面开发板上面的硬件(譬如网卡、iNand) (2)uboot中实现了一部分硬件的控制能力(uboot中初始化了一部分硬件),因为uboot为了完成一些任务必须让这些硬件工作。譬如uboot要实现刷机必须能驱动iNand,譬如uboot要在刷机时LCD上显示进度条就必须能驱动LCD,譬如uboot能够通过串口提供操作界面就必须驱动串口。譬如uboot要实现网络功能就必须驱动网卡芯片。 5.uboot的“生命周期” (1)uboot的生命周期就是指:uboot什么时候开始运行,什么时候结束运行。 (2)uboot本质上是一个裸机程序(不是操作系统),一旦uboot开始SoC就会单纯运行uboot(意思就是uboot运行的时候别的程序是不可能同时运行的),一旦uboot结束运行则无法再回到uboot(所以uboot启动了内核后uboot自己本身就死了,要想再次看到uboot界面只能重启系统。重启并不是复活了刚才的uboot,重启只是uboot的另一生) (3)uboot的入口和出口。uboot的入口就是开机自动启动,uboot的唯一出口就是启动内核。uboot还可以执行很多别的任务(譬如烧录系统),但是其他任务执行完后都可以回到uboot的命令行继续执行uboot命令,而启动内核命令一旦执行就回不来了。 四、uboot的工作方式 1.从裸机程序镜像uboot.bin说起 (1)uboot的本质就是一个裸机程序,和裸机程序xx.bin并没有本质区别。只是用户自己写的一般的裸机程序小于16KB,而uboot大于16KB(一般uboot在180k-400k之间) (2)uboot本身是一个开源项目,由若干个.c文件和.h文件组成,配置编译之后会生成一个uboot.bin,这就是uboot这个裸机程序的镜像文件。然后这个镜像文件被合理的烧录到启动介质中拿给SoC去启动。也就是说uboot在没有运行时表现为uboot.bin,一般躺在启动介质中。 (3)uboot运行时会被加载到内存中然后一条指令一条指令的拿给CPU去运行。 2.uboot的命令式shell界面 (1)普通的裸机程序运行起来就直接执行了,执行时效果和代码有关。 (2)有些程序需要和人进行交互,于是乎程序中就实现了一个shell(提供人机交互的界面),uboot就实现了一个shell。 注意:shell并不是操作系统,和操作系统一点关系都没有。linux中打开一个终端后就得到了一个shell,可以输入命令回车执行。uboot中的shell工作方式和linux中的终端shell非常像(只是命令集不一样。譬如linux中可以ls,uboot中ls就不识别) 3.掌握uboot使用的两个关键点:命令和环境变量 (1)uboot启动后大部分时间和工作都是在shell下完成的(譬如uboot要部署系统要在shell下输命令、要设置环境变量也得在命令行底下,要启动内核也要在命令行底下敲命令) (2)命令就是uboot的shell中可以识别的各种命令。uboot中有几十个命令,其中有一些常用另一些不常用(我们还可以自己给uboot添加命令) (3)uboot的环境变量和操作系统的环境变量工作原理和方式几乎完全相同。uboot在设计时借助了操作系统的设计理念(命令行工作方式借鉴了linux终端命令行,环境变量借鉴了操作系统的环境变量,uboot的驱动管理几乎完全照抄了linux的驱动框架)。 (4)环境变量可以被认为是系统的全局变量,环境变量名都是系统内置的,这部分是系统自带的默认的环境变量,譬如PATH;但是也有一部分环境变量是自己添加的。系统或者我们自己的程序在运行时可以通过读取环境变量来指导程序的运行。这样设计的好处就是灵活,譬如我们要让一个程序更改运行方法,不用去重新修改程序代码再重新编译运行,而只要修改相应的环境变量就可以了。可以这样理解:环境变量就是运行时的配置属性。 |
|
相关推荐
|
|
五、uboot的常用命令 注:这部分内容建议连接开发板启动uboot操作练习 1.linux终端设计有3种缓冲机制:无缓冲、行缓冲、全缓冲 (1)无缓冲:当我们向终端命令行输入命令的时候,这些命令立即被系统识别执行 (2)行缓冲:当我们向终端命令行输入命令的时候,这些命令没有立即被系统识别,而是被缓冲到一个缓存区(也就是系统认为我们还没有输入完),当我们按下回车键(换行)后系统就认为我们输入完了,然后将缓冲区中所有刚才输入的作为命令拿去分析处理。 (3).当我们向终端命令行输入命令的时候,这些命令没有立即被系统识别,而是被缓冲到一个缓存区,只有当缓存区满了之后才会执行命令 uboot是典型的行缓冲机制 2.有些命令有简化的别名 (1)譬如printenv命令可以简化为print,譬如setenv可以简化为set 3.有些命令会带参数(注意格式是固定的) (1)uboot的每个命令都有事先规定好的各种格式。有些命令就是不带参数的,譬如printenv/print命令;有些命令带可选的参数,譬如help命令(可以带也可以不带,当然带不带参数的执行结果是不同的);有些命令带必须的参数,譬如setenv/set命令。 4.命令中的特殊符号(譬如单引号) (1)uboot的有些命令带的参数非常长,为了告诉uboot这个非常长而且中间有好多个空格的东西是给他的一整个参数,所以用单引号将这个很长且中间有空格隔开的参数引起来。 (2)别的符号也许也有,而且有特定的意义。当碰到uboot的命令行有特殊符号时要注意不是弄错了,而是可能有特别的含义。 5.有些命令是一个命令族(譬如movi) (1)命令族意思就是好多个命令开头都是用同一个命令关键字的,但是后面的参数不一样,这些命令的功能和作用也不同。这就叫一个命令族。 (2)同一个命令族中所有的命令都有极大的关联,譬如movi开头的命令族都和moviNand(EMMC、iNand)操作有关。 6.printenv/print (1)print命令不用带参数,作用是打印出系统中所有的环境变量。 (2)环境变量就好像程序的全局变量一样。程序中任何地方都可以根据需要去调用或者更改环境变量(一般都是调用),环境变量和全局变量不同之处在于:全局变量的生命周期是在程序的一次运行当中,开始运行时诞生程序结束时死亡,下次运行程序时从头开始;但是环境变量被存储在Flash的另一块专门区域(Flash上有一个环境变量分区),一旦我们在程序中保存了该环境变量,那么下次开机时该环境变量的值将维持上一次更改保存后的值。 7.setenv/set(设置(添加/更改)环境变量) (1)用法:set name value 8.保存环境变量的更改:saveenv/save (1)saveenv/save命令不带参数,直接执行,作用是将内存中的环境变量的值同步保存到Flash中环境变量的分区。注意:环境变量的保存是整体的覆盖保存,也就是说内存中所有的环境变量都会整体的将Flash中环境变量分区中原来的内容整体覆盖。 总结:彻底更改一个环境变量的值,需要2步:第一步set命令来更改内存中的环境变量,第二步用save命令将其同步到Flash中环境变量的分区。 有时候我们只是想测试下这个环境变量,不希望影响到下一次开机,那就只set不save,这样set后当前本次运行的uboot已经起效果了,只不过没save下一次开机还是会恢复到原来的状况。 9.网络测试指令:ping (1)命令用法: ping ip地址 注意:ping是测试开发板和主机之间的网络链接,注意以下步骤: 1)首先要插上网线。 2)先试图ping通主机windows。注意Windows中有线网卡的地址设置(设置本地连接)。设置主机windows的本地连接IPv4,比如192.168.1.10 3)第三步确认开发板中uboot里几个网络相关的环境变量的值对不对。最重要的是ipaddr(这个环境变量表示当前开发板的IP地址),这个地址必须和主机windows的IP地址在同一个网段。 网段:一个IP地址分为2部分,一部分是网段地址,另一部分是网段内的主机地址(由子网掩码来区分哪一部分是网段地址,哪一部分是IP地址)。在子网掩码是255.255.255.0的情况下,192.168.1.10这个IP地址的前三部分(192.168.1.)属于网段地址,第4部分(10)属于主机地址。 补充: 1.开发板运行linux下和主机Windows的ping通 (1)先将开发板刷机成linux+QT镜像,然后启动进入linux命令行终端下。 (2)在linux下使用ifconfig命令将开发板中linux系统的IP地址设置为和主机windows同一网段(比如设置主机windows地址192.168.1.10,开发板uboot或linux的地址为192.168.1.20,虚拟机ubuntu地址为192.168.1.141) (3)此时开发板端ping windows通的。 (4)windows中ping开发板也是通的。 说明:首先开发板和主机的网络部分硬件都是好的,网络连接也是好的,主机windows中的网络软件设置是好的。 2.开发板运行linux下和虚拟机ubuntu的ping通 (1)虚拟机的网卡设置可以选择好几种方式,常用的就是NAT和桥接(bridged)。 (2)虚拟机要和开发板进行网络通信,只能通过桥接方式连接。 (3)虚拟机要想被开发板ping通,设置步骤如下: 第一步:虚拟机设置成桥接方式。 第二步:虚拟机的菜单中有个“虚拟网络编辑器”,这里面要设置为桥接到有线网卡。(默认是自动的,自动的一般会影响ping通。因为电脑现在一般都有2个网卡:一个有线的一个无线的。如果选了自动,那么虚拟机会自动桥接到无线网卡上,但是我们却是通过有线网卡来连接开发板的,自然ping不通) 第三步:在虚拟机ubuntu中设置IP地址为192.168.1.141(可以通过/etc/network/interfaces文件来设置静态的然后重启;也可以直接命令行ifconfig去设置) (4)此时开发板ping虚拟机ubuntu应该就通了。 (5)此时虚拟机ubuntu中ping开发板也是通的。 10.tftp下载指令:tftp (1)uboot本身主要目标是启动内核,为了完成启动内核必须要能够部署内核,uboot为了部署内核就需要将内核镜像从主机中下载过来然后烧录到本地flash中。uboot如何从主机(windows或者虚拟机ubuntu)下载镜像到开发板上?有很多种方式,主流方式是:fastboot和tftp。 fastboot的方式是通过USB线进行数据传输。 tftp的方式是通过有线网络的。典型的方式就是通过网络,fastboot是近些年才新发展的。 (2)tftp方式下载时实际上uboot扮演的是tftp客户端程序角色,主机windows或虚拟机ubuntu中必须有一个tftp服务器,然后将要下载的镜像文件放在服务器的下载目录中,然后开发板中使用uboot的tftp命令去下载即可。 (3)有些人习惯在windows中搭建tftp服务器,一般是用一些软件来搭建(譬如tftpd32,使用起来比较简单);有些人习惯在linux下搭建tftp服务器 (4)我的虚拟机搭建的时候设置的tftp下载目录是/tftpboot,将要被下载的镜像复制到这个目录下。 (5)检查开发板uboot的环境变量,注意serverip必须设置为虚拟机ubuntu的ip地址。(serverip这个环境变量的意义就是主机tftp服务器的ip地址) (6)然后在开发板的uboot下先ping通虚拟机ubuntu,然后再尝试下载:tftp 0x30000000 zImage-qt(意思是将服务器上名为zImage-qt的文件下载到开发板内存的0x30000000地址处。) (7)镜像下载到开发板的DDR中后,uboot就可以用movi指令进行镜像的烧写了。 注意: 1)如果你是用的windows下的tftp服务器,那uboot的serverip就要设置为和windwos下tftp服务器的ip地址一样(windows下的tftp服务器软件设置的时候就有个步骤是让你设置服务器的ip地址,这个ip地址和主机windows必须在一个网段)。 2)整个过程中间环节比较多,实际做的时候可能最后会下载不下来。(譬如:第一步应该先保证uboot和ubuntu可以ping通;第二步再保证ubuntu中tftp服务器搭建没错;第三步再实现tftp下载。如果第一步有问题参考网络设置部分,第二步有问题(tftp本地测试下载ok,但是开发板就是不行),有一个解决方案就是使用windows下的tftp服务器) 11.nfs启动内核命令:nfs 12.SD卡/iNand操作指令movi (1)开发板如果用SD卡/EMMC/iNand等作为Flash,则在uboot中操作flash的指令为movi(或mmc) (2)movi指令是一个命令集,有很多子命令,具体用法可以help movi查看。 (3)movi的指令都是movi read和movi write一组的,movi read用来读取iNand到DDR上,movi write用来将DDR中的内容写入iNand中。理解这些指令时一定要注意涉及到的2个硬件:iNand和DDR内存。 (4)movi read {u-boot | kernel} {addr} 这个命令使用了一种通用型的描述方法来描述:movi 和 read外面没有任何标记说明每一次使用这个指令都是必选的;一对大括号{}括起来的部分必选1个,大括号中的竖线表是多选一。中括号[]表示可选参数(可以有也可以没有) (5)指令有多种用法,譬如 movi read u-boot 0x30000000,意思就是把iNand中的u-boot分区读出到DDR的0x30000000起始的位置处。(uboot代码中将iNand分成了很多个分区,每个分区有地址范围和分区名,uboot程序操作中可以使用直接地址来操作iNand分区,也可以使用分区名来操作分区。);注意这里的0x30000000也可以直接写作30000000,意思是一样的(uboot的命令行中所有数字都被默认当作十六进制处理,不管你加不加0x都一样)。 13.NandFlash操作指令nand (1)理解方法和操作方法完全类似于movi指令 14.内存操作指令:mm、mw、md (1)DDR中是没有分区的(只听说过对硬盘、Flash进行分区,没听说过对内存进行分区····),但是内存使用时要注意,千万不能越界踩到别人了。因为uboot是一个裸机程序,不像操作系统会由系统整体管理所有内存,系统负责分配和管理,系统会保证内存不会随便越界。然后裸机程序中uboot并不管理所有内存,内存是散的随便用的,所以如果程序员(使用uboot的人)自己不注意就可能出现自己把自己的数据给覆盖了。 (2)md就是memory display,用来显示内存中的内容。 (3)mw就是memory write,将内容写到内存中 (4)mm就是memory modify,修改内存中的某一块,说白了还是写内存(如果需要批量的逐个单元的修改内存,用mm最合适) 15.启动内核指令:bootm、go (1)uboot的终极目标就是启动内核,启动内核在uboot中表现为一个指令,uboot命令行中调用这个指令就会启动内核(不管成功与否,所以这个指令是一条死路)。 (2)差别:bootm启动内核同时给内核传参,而go命令启动内核不传参。bootm其实才是正宗的启动内核的命令,一般情况下都用这个;go命令本来不是专为启动内核设计的,go命令内部其实就是一个函数指针指向一个内存地址然后直接调用那个函数,go命令的实质就是PC直接跳转到一个内存地址去运行而已。go命令可以用来在uboot中执行任何的裸机程序(有一种调试裸机程序的方法就是事先启动uboot,然后在uboot中去下载裸机程序,用go命令去执行裸机程序) |
|
|
|
|
|
FacenetPytorch人脸识别方案--基于米尔全志T527开发板
661 浏览 0 评论
飞凌嵌入式ElfBoard ELF 1板卡-CAN编程示例之开发板测试
1063 浏览 0 评论
该问题是用APP给芯海科技的CST92F25芯片发指令是出现的
3711 浏览 1 评论
880 浏览 0 评论
1746 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-30 12:11 , Processed in 0.764288 second(s), Total 42, Slave 34 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号