目录

一、通过tftp加载内核和根文件系统

二、通过emmc加载内核和根文件系统

三、tftp加载linux内核,nfs挂载rootfs

四、将uboot安装到EMMC


开发板通过SD卡进行启动,SD卡中加载的有uboot

一、通过tftp加载内核和根文件系统

1.将uImage内核镜像文件、dtb设备树文件以及ramdisk.img根文件系统放在ubuntu服务器的tftpboot文件夹下

uboot 设置的EMMC总线速度_linux

修改文件的权限:

sudo chmod 777 /tftpboot/*

 2.在串口uboot终端设置启动命令:

setenv bootcmd tftp 0x41000000 uImage\;tftp 0x42000000 exynos4412-fs4412.dtb\;tftp 0x43000000 ramdisk.img\;bootm 0x41000000 0x43000000 0x42000000
saveenv

其中bootm命令使用方式如下: 

  

uboot 设置的EMMC总线速度_uboot 设置的EMMC总线速度_02

fs4412芯片对应的RAM内存分布如下,芯片有3个G内存,但是开发板只外扩了1G内存条,只用0x40000000-0x8000000为什么uImage不从0x40000000开始,是因为前面一段要放置uboot传递的参数

uboot 设置的EMMC总线速度_运维_03

uboot 设置的EMMC总线速度_服务器_04

uboot传递给内核的参数,对uboot没有意义,没有这些参数,linux不能正常启动

setenv bootargs root=/dev/nfs nfsroot=192.168.1.200:/opt/4412/rootfs rw console=ttySAC2,115200 init=/linuxrc ip=192.168.1.100
saveenv

uboot 设置的EMMC总线速度_运维_05

4.检查网络设置是否正确,使用网线连接开发板和电脑,然后给开发板重新上电,上电之后观察uboot能否通过tftp加载和启动内核,启动时是否挂载根文件系统(ext2),启动完成后在终端上输入linux下的shell命令测试是否正常。

二、通过emmc加载内核和根文件系统

开发板实际应用时没有网络以及服务器,所以要提前把内核和根文件系统放在外存emmc中,因为内存ram掉电丢失文件,而外存emmc掉电数据不丢失

 1.在uboot交互模式下,去下载并安装这些镜像

下载内核镜像到内存中

tftp 0x41000000 uImage

将内核镜像写入到EMMC中指定的扇区

mmc write 0 0x41000000 0x800 0x2000

其中0表示emmc,0x41000000表示内存中的地址,0x800表示emmc的扇区

uImage大小为2.9M,2.9*1024*1024字节,emmc时块设备,一个块512字节,所以需要2.9*1024*1024/512=5939.2块,大概5940块,将5940换算为16进制为1734,所以使用2000块完全够用。

下载设备树到内存中

tftp 0x41000000 exynos4412-fs4412.dtb

下载到内存中的41000000地址会覆盖前面的,但是不影响,因为内存只是文件传输的一个载体 

将设备树写入到EMMC中指定的扇区

mmc write 0 0x41000000 0x2800 0x800

 设备树大小为36k,36*1024字节,需要36*1024/512=72块,换算成16进制为0x48,所以0x800块完全够用。

下载根文件系统镜像到内存中

tftp 0x41000000 ramdisk.img

将根文件系统镜像写入到EMMC中指定的扇区

mmc write 0 0x41000000 0x3000 0x2000

 其中0x3000表示0x2800+0x800,根文件系统大小为2.5M,而uImage为2.9M,所以0x2000块够根文件系统

uboot 设置的EMMC总线速度_uboot 设置的EMMC总线速度_06

 2.因为要从EMMC启动,所以要修改uboot的启动参数

setenv bootcmd mmc read 0 0x41000000 0x800 0x2000\;mmc read 0 0x42000000 0x2800 0x800\;mmc read 0 0x43000000 0x3000 0x2000\;bootm 0x41000000 0x43000000 0x42000000

若无法设置可尝试如下格式:

setenv bootcmd ‘mmc read 0 0x41000000 0x800 0x2000;mmc read 0 0x42000000 0x2800 0x800;mmc read 0 0x43000000 0x3000 0x2000;bootm 0x41000000 0x43000000 0x42000000’

mmc read 0 0x41000000 0x800 0x2000表示从 EMMC中的0x800地址读取0x2000块到RAM内存中的0x41000000地址。

saveenv

 重启开发板是如下界面,根文件系统挂载到ext2

uboot 设置的EMMC总线速度_uboot 设置的EMMC总线速度_07

 三、tftp加载linux内核,nfs挂载rootfs

在实际开发调试中,需要经常修改根文件系统,所以需要电脑和开发板通过nfs共享文件,方便开发和调试。

tftp加载linux内核,linux启动后就可以挂载根文件系统,linux运行起来,里边安装了nfs客户端,就可以直接使用nfs。

1.将”根系统镜像“目录下的”rootfs.tar“拷贝到ubuntu中nfs工作目录下,解压根文件系统到nfs工作目录。

sudo tar xvf rootfs.tar.xz

 解压后删除原有压缩包

sudo rm rootfs.tar.xz

2.修改uboot的启动参数

setenv bootcmd tftp 0x41000000 uImage\;tftp 0x42000000 exynos4412-fs4412.dtb\;bootm 0x41000000 - 0x42000000
saveenv

重启开发板:

uboot 设置的EMMC总线速度_linux_08

 四、将uboot安装到EMMC

以上几种方式中我们即可以通过网络启动内核也可以将内核安装到EMMC中从本地启动,但是对于uboot我们一直使用的是从SD卡启动,所以我们也可以将uboot安装到EMMC中然后从EMMC启动uboot,这样就可以不适用SD卡了。

1.将资料中的”u-boot镜像“目录下的”u-boot-fs4412.bin“拷贝到ubuntu中tftp工作目录下

uboot 设置的EMMC总线速度_运维_09

2.给开发板重新上电,在uboot交互模式下,去下载并安装uboot

tftp 0x41000000 u-boot-fs4412.bin

将u-boot镜像安装到EMMC中指定的扇区

emmc open 0
mmc write 0 0x41000000 0x0 0x800
emmc close 0

 

使用open先打开emmc的引导分区 ,将内存中的0x41000000地址对应的数据写入到emmc的0x0扇区,块大小为0x800(4412芯片如果使用SD卡启动,BL0则从SD卡的第一块开始搬uboot,一个块是512字节,如果使用emmc,BL0则从emmc的第0块搬uboot)

uboot大小为516k,516*1024字节,需要516*1024/512=1032块,转换为十六进制为0x408,0x800大于0x408.

3.关闭开发板电源,调整拨码开关位置为EMMC启动

4.给开发板重新上电,观察uboot是否能正常启动

因为启动的是emmc中的uboot,所以环境变量还需要重新设置

setenv ipaddr 192.168.1.100
setenv serverip 192.168.1.200
setenv bootcmd tftp 0x41000000 uImage\;tftp 0x42000000 exynos4412-fs4412.dtb\;bootm 0x41000000 - 0x42000000
setenv bootargs root=/dev/nfs nfsroot=192.168.1.200:/opt/4412/rootfs rw console=ttySAC2,115200 init=/linuxrc ip=192.168.1.100
saveenv