目录
开发板通过SD卡进行启动,SD卡中加载的有uboot
1.将uImage内核镜像文件、dtb设备树文件以及ramdisk.img根文件系统放在ubuntu服务器的tftpboot文件夹下
修改文件的权限:
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命令使用方式如下:?
??
fs4412芯片对应的RAM内存分布如下,芯片有3个G内存,但是开发板只外扩了1G内存条,只用0x40000000-0x8000000,为什么uImage不从0x40000000开始,是因为前面一段要放置uboot传递的参数?
?3.串口uboot终端设置bootargs自启动参数(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
4.检查网络设置是否正确,使用网线连接开发板和电脑,然后给开发板重新上电,上电之后观察uboot能否通过tftp加载和启动内核,启动时是否挂载根文件系统(ext2),启动完成后在终端上输入linux下的shell命令测试是否正常。
开发板实际应用时没有网络以及服务器,所以要提前把内核和根文件系统放在外存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块够根文件系统
?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
在实际开发调试中,需要经常修改根文件系统,所以需要电脑和开发板通过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?
重启开发板:
以上几种方式中我们即可以通过网络启动内核也可以将内核安装到EMMC中从本地启动,但是对于uboot我们一直使用的是从SD卡启动,所以我们也可以将uboot安装到EMMC中然后从EMMC启动uboot,这样就可以不适用SD卡了。
1.将资料中的”u-boot镜像“目录下的”u-boot-fs4412.bin“拷贝到ubuntu中tftp工作目录下
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
?