【开发阶段产品部署】:
启动流程:
-
启动uboot进入uboot的交互界面
u-boot的移植方式: 1. 通过ubuntu系统烧写ubootpak.bin到SD卡中。 使用工具:sdtool 1. 拷贝sdtool工具到ubuntu中,并切换到sdtool目录下 2. 将SD卡插到PC上,并让ubuntu识别SD卡。 要求: 1. 必须使用SD卡读卡器,不可以使用电脑自带的SD卡卡槽; 2. SD卡被ubuntu识别之前,先在windows下对SD卡进行格式化。 ubuntu识别SD卡步骤: 1. 虚拟机 --> 可移动设备 --> 读卡器的名字 --> 连接 2. 读卡器或者电脑是USB3.0的接口: 虚拟机 --> 设置 --> USB控制器 --> USB兼容性: --> USB3.0 3. 进入到sdtool目录下: xxxxxxx-sdmmc.sh:烧写ubootpak.bin到SD卡中的脚本文件 ubootpak.bin:u-boot的镜像 4. 烧写ubootpak.bin文件到SD卡中 : 在ubuntu的终端中执行以下命令 : sudo ./s5p6818-sdmmc.sh /dev/sdb ubootpak.bin /dev/sdb : SD卡在dev目录下的设备文件 执行以上命令出现以下内容,表示制作成功: 669+1 records in 670+0 records out 343040 bytes (343 kB) copied, 0.00605781 s, 56.6 MB/s ^_^ The image is fused successfully 5. 测试SD卡是否成功烧写uboot的镜像 2. 通过windows系统烧写xin_ubootpak.bin到SD卡中 使用windows下的工具: Win32DiskImager.exe 1. 首先得到windows版本的ubootpak.bin : 在ubuntu版本的ubootpak.bin文件前边添加512字节的占位,跳过SD的前边512字节的分区表。 dd if=/dev/zero of=512B bs=512 count=1 chmod 777 512B cat 512B ubootpak.bin > win_ubootpak.bin 拷贝win_ubootpak.bin到windows文件夹中 2. 将SD卡插到PC上,可以使用PC自带的SD卡卡槽 打开Win32DiskImager.exe,选择SD卡的盘符,选择要写到SD卡中的win_ubootpak.bin文件,单击write,就可以写入到SD卡中。 3. 测试SD卡是否制作成功。 3. 烧写ubootpak.bin到EMMC(flash)中 前提:SD卡启动盘必须制作好,前边已经完成。 思路:ubootpak.bin烧写到EMMC中的思路.png 1. 通过SD卡的方式启动uboot,并进入uboot的交互界面。 2. 使用tftp命令将ubootpak.bin文件烧写到内存中 1. 先将ubootpak.bin拷贝到tftpboot目录下: cp ubootpak.bin ~/tftpboot/ 2. 将ubootpak.bin烧写到内存的0x41000000地址中: tftp 0x41000000 ubootpak.bin 3. 将内存中的ubootpak.bin使用update_mmc命令烧写到EMMC中 4. 测试是否烧写成功
-sdmmc.sh 脚本文件解析
sudo ./s5p6818-sdmmc.sh /dev/sdb ubootpak.bin
s5p6818-sdmmc.sh脚本文件分析:
dd if="${xboot}" of="${dev}" bs=512 seek=1 conv=sync
dd:数据烧写命令
xboot=ubootpak.bin
dev=/dev/sdb
if:输入文件 (input file)
of:输出文件 (output file)
bs:大写是512字节
seek:偏移seek*bs大小空间
conv=sync:同步
update_mmc命令解析
update_mmc <dev no> <type> <mem> <addr> <length>
- type : 2ndboot | boot | raw | part
<dev no>:设备号 EMMC设备号为:2
<type>:类型 2ndboot
<mem>:从内存的哪个地址开始进行数据搬移
<addr>:搬移到EMMC的起始地址,以字节为单位
<length>:搬移数据的长度,以字节为单位 :具体长度要看ubootpak.bin大小
pri打印环境变量有以下信息:
flash=mmc,2:ubootpak:2nd:0x200,0x78000;
flash=mmc,2:2ndboot:2nd:0x200,0x4000;
update_mmc 2 2ndboot 0x41000000 0x200 0x78000
-
下载内核镜像 uImage 到内存中
1. 将 uImage 镜像文件拷贝到 tftpboot 目录下 2. tftp 0x48000000 uImage (下载内核镜像到开发板中)
-
设置自启动参数bootargs
u-boot环境变量中的bootargs变量是一个自启动参数,linux内核启动时,会uboot环境变量的分区读取bootargs变量的值。 32位ubuntu: setenv bootarges root=/dev/nfs nfsroot=1992.168.x.xxx:/home/xxxx/nfs/rootfs rw console=/ttySAC0 init=/linuxrc ip=192.168.x.xxx
-
启动linux内核 (bootm 0x4800000)
-
总结:根文件系统挂载不成功的原因
1. 检查nfs安装和配置是否正确 2. 重启nfs服务 sudo service nfs-kernel-server restart 3. 检查bootargs参数设置是否正确
-
设置开发板上电之后系统自动启动。
设置uboot中bootcmd自启动的命令。 # setenv bootcmd tftp 48000000 uImage\;bootm 48000000 # saveenv
.
产品阶段系统部署
相关命令:uboot中mmc命令的使用
1. mmc info - display info of the current MMC device
查看当前mmc设备的信息
2. mmc read addr blk# cnt
作用 : 从MMC中读数据到内存中
addr : 内存的起始地址
blk# : MMC块设备的编号,一块是512字节
cnt : 个数
从MMC的起始块号为blk的位置读数据到内存的addr为起始地址处,读cnt块数据的大小
3. mmc write addr blk# cnt
作用 : 从内存中写数据到MMC中
addr : 内存的起始地址
blk# : MMC块设备的编号,一块是512字节
cnt : 个数
从内存的addr为起始地址写数据到MMC的blk块号处,写数据的大小位cnt块。
4. mmc erase blk# cnt
作用 : 擦除MMC中的数据
blk# : MMC块设备的编号,一块是512字节
cnt : 个数
从MMC的blk处开始擦除数据,擦除数据的大小是cnt块。
流程:
-
将uboot镜像烧写到EMMC中(uboot烧写阶段已经完成)
参考u-boot移植第三种方法;update_mmc命令
-
将内核镜像uImage烧写到EMMC中
tftp 0x41000000 uImage 参考 mmc write 命令; mmc write 0x48000000 0x800 0x4000
-
将根文件系统镜像ramdisk.img烧写到EMMC中
tftp 0x41000000 ramdisk.img mmc write 0x49000000 0x20800 0x20800
-
设置uboot的启动参数
bootcmd bootargs
setenv bootcmd mmc read 0x48000000 0x800 0x4000\;mmc read 0x49000000 0x20800 0x20800\;bootm 0x48000000 0x49000000
setenv bootargs root=/dev/ram rw initrd=0x49000040,0x1000000 rootfstype=ext4 init=/linuxrc console=ttySAC0,115200
saveenv
解析:
root=/dev/ram :从内存中挂载根文件系统 rw :对根文件系统具有读写的权限
initrd=0x49000040,0x1000000 挂载根文件系统的起始地址和大小;跳过根文件系统的64字节的头部信息。
rootfstype=ext4 :根文件系统的类型
init=/linuxrc
console=ttySAC0,115200