uboot201407如何查看从哪启动?SD卡还是EMMC

uboot201407如何查看从哪启动?SD卡还是EMMC,第1张

Arm板系统文件一般有三个——bootloader(uboot)、kernel(uImage)及根文件系统(rootfs)。在arm板上电后,按uboot->kernel->rootfs的顺序依次启动。由于开发板上有多种存储介质,三个文件可以放在任何可以存储的介质上,因此也就导致文件的多种启动方式。本文就来讨论,以上三个文件对应不通存放位置的不同启动配置。
一般开发板上会有flash(Nor or NAND),mmc,emmc,sd卡等。系统文件可以烧写在其中的任意一种上,因此也就对应不通的启动。在开发过程中,有时经常需要改动内核,或者修改应用程序,如果每次都修改后都重新烧写到板上的存储介质,会比较麻烦。因此,为方便调试,uImage和rootfs还可以从网络启动,即nfs启动。但uboot只能从板上介质启动。
启动过程其实是先将要启动的文件从存储位置拷贝到内存空间,再在内存中运行。因此所谓不同位置启动,也就是从不同位置拷贝而已。
下面我们以开发板启动为例,分别介绍三个文件从不同位置启动的过程方法。我使用的开发板上有emmc和两个sd卡。我们按照启动顺序,依次介绍。
首先是uboot启动。Uboot是三个系统文件中第一个启动的,对它的拷贝工作由cpu中的固件决定。固件中支持从几个位置拷贝uboot,它就能存放在几个位置上。至于每次启动具体从其中的哪里开始,硬件拨码开关决定,对应拨码在开发板手册上能查到。启动之前,先将uboot的二进制文件拷贝到对应介质。有两种不同方法烧写,如下:
1 uboot二进制文件拷贝到emmc,是通过芯片供应商的下载工具软件烧写完成;
2 拷贝到sd卡是在linux下,通过dd命令完成的。
烧写完成后,将启动拨码拨到对应位置即可启动uboot。
然后介绍kernel文件(uImange)和rootfs的启动。如上所述,uImage和rootfs可以从emmc、sd卡或nfs拷贝到内核启动。具体的启动位置由uboot中的参数传递的内容决定。这些参数的内容在uboot中有写死的值,也可以在uboot启动阶段进入到命令输入界面,修改这些参数的值,来改变启动位置。(作者:围补)
进入uboot命令界面后,输入如下一段命令,修改启动参数,并重启。
setenv loadaddr 0x10800000

setenv bootargs_base 'setenv bootargsconsole=ttymxc0,115200'

setenv bootargs_mmc 'setenv bootargs${bootargs} root=/dev/mmcblk0p1 rootwait rw video=mxcfb1:dev=ldb,LDB-XGA,if=RGB666video=mxcfb0:dev=hdmi,1920x1080M@60,if=RGB24 ip=dhcp'

setenv bootcmd_mmc 'run bootargs_basebootargs_mmc;mmc dev 1;mmc read ${loadaddr} 0x800 0x2000;bootm'

setenv bootcmd 'run bootcmd_mmc'

saveenv

run bootcmd
命令输入完后,重启开发板,即可按照上述命令中设置的参数来启动系统。
下面我们来分析一下uboot阶段输入的启动参数的意义,以便读者自己修改相关内容,让板子从自己需要的位置启动。
首先介绍几个命令。是在上面看到最多的setenv命令,该命令使用来设置或删除某个环境变量的。当setenv后面只带一个参数,该参数必须为已有的变量名,输入命令回车后该变量即被删除;当setenv后面有多个参数,将把其后第一个参数作为环境变量,后面其他参数作为该变量的值或内容。
第二个要解释的命令mmc。在uboot命令界面中敲入mmc,回车,能够看到其多个用法:
Usage:
mmc read addr blk# cnt
mmc write addr blk# cnt
mmc erase blk# cnt
mmc rescan
mmc part - lists available partition on currentmmc device
mmc dev [dev] [part] - show or set current mmcdevice [partition]
mmc bootpart [dev] [part] - show or set bootpartition
mmc list - lists available devices
解释一下其中几个用法:
mmc read addr blk# cnt 用来将硬盘(emmc/sd)中的内容读取到内存中。其中addr指内存中的目标位置起始地址,blk#指被拷贝内容起始存储块的块号,cnt指要被拷贝的块数。一般每个块的大小为512byte。
mmc dev [dev] [part] - show or set current mmc device [partition] 显示或设置当前设备。命令mmc dev即为显示当前是哪个device;mmc dev #意为设置“#”为当前设备。
第三个命令saveenv是保存环境变量的意思。环境变量设置后,使用该指令保存,下次重启时会按照上次保存的设置启动,就不用再次设置了。
最后,run命令比较明显,“运行”的意思。一般加在某内容为可执行命令的变量前。
再来说明一下变量。在上述参数设置命令中,参数bootargs和bootcmd是uboot的参数,其功能和名称不能被改变,其他都是用户自定义的变量,可以改变其名称。其中bootargs代表由uboot传给内核的参数;bootcmd是uboot启动时,系统自动加载的命令序列。如果设置了启动参数后,想让系统下次自动按照本次设置的方式启动,则一定要把拷贝和启动内核的语句设置为bootcmd的值,否则下次启动无法自动加载并启动内核。(作者围补)
介绍完重要的命令及uboot环境变量后,我们再来看上面的启动参数设置命令行:
setenv loadaddr 0x10800000

setenv bootargs_base 'setenv bootargsconsole=ttymxc0,115200'

setenv bootargs_mmc 'setenv bootargs${bootargs} root=/dev/mmcblk0p1 rootwait rwvideo=mxcfb1:dev=ldb,LDB-XGA,if=RGB666video=mxcfb0:dev=hdmi,1920x1080M@60,if=RGB24 ip=dhcp'

setenv bootcmd_mmc 'run bootargs_basebootargs_mmc;mmc dev 1;mmc read ${loadaddr} 0x800 0x2000;bootm'

setenv bootcmd 'run bootcmd_mmc'

saveenv

run bootcmd
按照上面对命令和参数的讲解,做一些变量的替换之后,可以看到,此处只做了两件事,一是设置环境变量bootargs的值,二是设置bootcmd的值,并保存。其中bootargs的值传递给内核,用来初始化一些设备和启动rootfs;bootcmd的值用来启动内核,即自动加载的命令序列。(最后一句run bootcmd是启动,不再是设置命令了。)
对上述命令中,采用如此多自定义变量的原因是,有些调试工具命令行输入不能过长,因此用中间自定义变量缩短一次性输入的命令行长度。我们将不必要的自定义变量做替换掉,然后来分析其内容。
setenv bootargs console=ttymxc0,115200root=/dev/mmcblk0p1 rootwait rw video=mxcfb1:dev=ldb,LDB-XGA,if=RGB666 video=mxcfb0:dev=hdmi,1920x1080M@60,if=RGB24ip=dhcp

setenv bootcmd 'mmc dev 1;mmc read0x10800000 0x800 0x2000;bootm'

saveenv

run bootcmd
将自定义变量替代掉后,能看到,参数设置其实就是做了对两个系统环境变量赋值的工作。下面具体分析各变量值得内容。
对bootargs的赋值,对要是跟rootfs启动相关。内容是一个很大的字符串,不同项之间由空格隔开,也可以把由空格隔开的多项看做是多个参数。
第一项是console=ttymxc0,115200是选择 *** 作台,并设置波特率。
中间几项root=/dev/mmcblk0p1 rootwait rw,是对rootfs启动位置设置root=/dev/mmcblk0p1是指从设备mmcblk0的p1分区挂载rootfs。那么mmcblk0到底是哪个设备呢?由于文件系统的挂载是在kernel启动后进行的,而内核启动后会安装linux的分配方式给现有设备分配名称,因此可对应区分设备。我使用的开发板上,emmc即为mmcblk0设备,sd安装挂载顺序依次后排。如果多个卡槽在系统启动前都插上了sd卡,系统会安装sd卡槽所在接口号依次分配设备名称号。比如,两个sd卡槽,slot2和slot3(对应总线号),只插一个sd开始,无论在哪个槽都是mmcblk1;但两个都插上sd时,在slot2中的是mmcblk1,slot3中的则是mmcblk2。Ok,至此,从哪个设备挂载rootfs已经很清楚了。后面两个参数,rw是声明启动权限,即以读写方式启动;rootwait是指等待设备/dev/mmcblk0p1设备就绪后才尝试挂载rootfs。如果没有此参数,linux内核启动时可能会在存储设备尚未就绪是就尝试挂载rootfs,此时肯定挂载失败,那么启动也就失败了。
最后的几个参数,video=mxcfb1:dev=ldb,LDB-XGA,if=RGB666video=mxcfb0:dev=hdmi,1920x1080M@60,if=RGB24 ip=dhcp,是做一些设备初始化的,主要是对视频设备和网络,对不需要视频设备的嵌入式系统可以不设置此项,ip也可以单独设置。
然后是第二个环境变量bootcmd的设置,主要跟kernel启动相关。
setenv bootcmd 'mmc dev 1;mmc read0x10800000 0x800 0x2000;bootm'
设置bootcmd内容为命令序列,用用单引号包围,命令间由分号分隔。
按照上面对mmc命令的讲解,第一个命令mmc dev 1,意思是将dev 1设置为当前设备。这里就是uImage启动(拷贝)的位置。在我使用的开发板上,dev 1指放在卡槽slot2中的sd卡。此处由于linux内核没有启动,设备名称不能按照linux分配方式确定。在我使用的开发板上,dev 2是放在卡槽slot3中的sd卡,dev3是emmc。对此句做相应修改,即可更改内核启动位置。
mmc read 0x10800000 0x800 0x2000这句大家也应该可以明白意思了,即将存储设备上从块号0x800开始的0x2000个存储块的东西拷贝到内存0x10800000开始的空间内。
bootm也是uboot命令,用于加载uboot能辨认的 *** 作系统映像。

-Boot环境变量的解释说明环 境 变 量
解 释 说 明
bootdelay
定义执行自动启动的等候秒数
baudrate
定义串口控制台的波特率
netmask
定义以太网接口的掩码
ethaddr
定义以太网接口的MAC地址
bootfile
定义缺省的下载文件
bootargs
定义传递给Linux内核的命令行参数
bootcmd
定义自动启动时执行的几条命令
serverip
定义tftp服务器端的IP地址
ipaddr
定义本地的IP地址
stdin
定义标准输入设备,一般是串口
stdout
定义标准输出设备,一般是串口
stderr
定义标准出错信息输出设备,一般是串口
参考U-boot,其环境变量设置如下:

由于项目需要,把玩了半年的DSP(c6748),扔到了一边,玩起了IMX6Q。本人使用的开发板是imx6q_sarbe_sd(MCIMX6Q-SDB),以下记录如何通过u-boot设置SD,NFS启动。由于IMX6Q的linux包建议在ubuntu904下,非root用户下使用,首先ubuntu904有bug,其次非root用户, *** 作起来很不方便。
一:SD卡启动
SD卡启动,需要先把uboot,kernel,filesystem烧写到SD卡上。SD卡烧写前,可以先在windows下把它格式化。板子启动时SW6设置为8‘b0100_0010
以下几步为SD卡烧写步骤:
1,SD卡烧写
11,烧写uboot
sudo dd if=u-bootbin of=/dev/sdb bs=512 seek=2 skip=2 conv=fsync
12,烧写uImage
sudo dd if=uImage of=/dev/sdb bs=512 seek=2048 conv=fsync
13,烧写filesystem
首先需要把SD卡分一个区来保存文件系统。 *** 作步骤如下:
(1)分区
$ fdisk /dev/sdb
u [switch the unit to sectors instead of cylinders]
d [repeat this until no partition is reported by the 'p' command ]
n [create a new partition]
p [create a primary partition]
1 [the first partition]
16384 [starting at offset sector #16384, ie 8MB, which leaves enough space for the kernel, the boot loader and its configuration data]
<enter> [using the default value will create a partition that spans to the last sector of the medium]
w [ this writes the partition table to the medium and fdisk exits]
(2)卸载分区
$ sudo umount /dev/sdb1
(3)格式化分区,可以是ext3格式,或ext4
$ sudo mkfsext3 /dev/sdb1 Or $ sudo mkfsext4 /dev/sdb1
(4)挂载sdb1
$ mkdir /home/user/Freescale/mountpoint
$ sudo mount /dev/sdb1 /home/user/Freescale/mountpoint
(5)复制文件系统
$ cd /home/user/Freescale/rootfs
$ sudo cp -a /home/user/Freescale/mountpoint
2,uboot变量设置
setenv loadaddr 0x10800000
setenv bootargs_base 'setenv bootargs console=ttymxc0,115200'
setenv bootargs_mmc 'setenv bootargs ${bootargs} ip=${ipaddr} root=/dev/mmcblk1p1 rootwait rw
setenv bootcmd_mmc 'run bootargs_base bootargs_mmc;mmc dev 2;mmc read ${loadaddr} 0x800 0x2000;bootm'
//注意这里的mmc dev 2,dev 2 对应板子上是slot3
setenv bootcmd 'run bootcmd_mmc'
saveenv
二:NFS启动
网络启动是在uboot起来后才能完成,因此必须先有SD卡进行uboot引导。uboot起来后,通过串口设置uboot变量,达到自己想要的启动方式。由于开发的过程kernel文件会不端更新,因此需要通过网络加载镜像文件,以下介绍使用tftpboot方式加载。
1,tftp下载uImage
11,设置ubuntu
(1) Setup tftp server files
# apt-get install tftpd tftp openbsd-inetd
(2) make a tftp directory Here we make /opt/tftpboot be a tftp directory
# mkdir /opt/tftpboot
# chmod 777 /opt/tftpboot
(3) Open /etc/inetdconf and edit it
# gedit /etc/inetdconf
Add this line:
tftp dgram udp wait nobody /usr/sbin/tcpd /usr/sbin/intftpd /opt/tftpboot
(4)Restarting tftp service
#sudo /etc/initd/openbsd-inetd restart
可以根据你的uImage文件放在路径,修改上述路径;也可以在/opt/tftpboot目录下生成一个目标连接文件。
12,tftp下载uImage
MX6Q SABRESD U-Boot >tftpboot uImage
2,文件系统以NFS方式加载
21 ,设置ubuntu
(1), Install NFS server package
# apt-get install nfs-kernel-server
(2), Configure portmap
# dpkg-reconfigure portmap
Select “NO”
(3) ,Configure mounted directory and authority
# gedit /etc/exports

Add the following line at the end of the file:
/home/usr/ltib/rootfs (rw,sync,no_root_squash)
(4) ,Restart the NFS service
#sudo /etc/initd/portmap restart
#sudo /etc/initd/nfs-kernel-server restart
22,通过串口设置uboot变量设置
setenv ipaddr 1921682xxx
setenv serverip 1921682xxx
setenv bootfile uImage
setenv nfsroot /home/carmili/ltib/rootfs
setenv bootargs_base 'setenv bootargs console=ttymxc0,115200'
setenv bootargs_nfs 'setenv bootargs ${bootargs} root=/dev/nfs rw ip=${ipaddr }:${serverip }:19216821:2552552550::eth0:off nfsroot=${serverip}:${nfsroot},v3,tcp
setenv bootcmd_net 'run bootargs_base bootargs_nfs;bootm'
setenv bootcmd 'tftpboot uImage; run bootcmd_net'


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/13319501.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-14
下一篇 2023-07-14

发表评论

登录后才能评论

评论列表(0条)

保存