为了便于u-boot的调试,使用SD卡烧写u-boot程序。使用裸机程序的方法。
将SD卡插入虚拟机读到SD卡后,对SD卡进行分区。
sudo fdisk /dev/sdb #进入了分区模式
p #查看分区
d #删除分区
n #进行分区
建立两个分区
默认,主分区,1分区,default
默认,主分区,2分区,default
分区好以后,烧录u-boot.imx
sudo dd if=u-boot.imx of=/dev/sdb bs=512 seek=2 conv=fsync
694+0 records in
694+0 records out
355328 bytes (355 kB, 347 KiB) copied, 0.542137 s, 655 kB/s
启动开发版以后,就可以启动uboot。如果版本不对,也是没有任何打印信息的。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xRTZJgEk-1591541304033)(C:\Users\Administrator\Desktop\LinuxIMX开6ULL发\L27Uboot分析与根文件系统构建\图片\1_uboot启动.png)]
bdinfo :查看板子信息
printenv:打印环境变量
setsenv:修改环境变量 , 修改字符串要 ‘ ’ ,设置控制为删除环境变量
saveenv:保存修改环境变量
md:md [.b, .w, .l] address [# of objects] 其中显示0x20
=> md.b 80000000 14
80000000: ff cb 78 8e ff fb fe ff 77 b5 d4 5f fd ff 7f f7 ..x.....w.._....
80000010: af f3 6f df ..o.
=> md.w 80000000 20
80000000: cbff 8e78 fbff fffe b577 5fd4 fffd f77f ..x.....w.._....
80000010: f3af df6f ef3f ff6a ef5b bffb bf9f fdff ..o.?.j.[.......
80000020: d5d3 fffe fdff e8fb dff7 2f7e febe aa7f ..........~/....
80000030: fcfb 9ff3 fb6f 2eb7 7fbf 7fed afff e8ff ....o...........
=> md.l 80000000 20
80000000: 8e78cbff fffefbff 5fd4b577 f77ffffd ..x.....w.._....
80000010: df6ff3af ff6aef3f bffbef5b fdffbf9f ..o.?.j.[.......
80000020: fffed5d3 e8fbfdff 2f7edff7 aa7ffebe ..........~/....
80000030: 9ff3fcfb 2eb7fb6f 7fed7fbf e8ffafff ....o...........
80000040: f5f3ffff fa7bbafc d5fa5ff6 fb7efa5d ......{.._..].~.
80000050: fdfb6de3 fffdbfbc 5ffbf3ef ffffaffd .m........._....
80000060: 7fc357ff af5ffcfe 75ff3fe3 befbaeaf .W...._..?.u....
80000070: f7bbddf7 a6feef9d f7dbf58f abb7ebbe ................
nm:修改1个内存值 nm [.b, .w, .l] address , q是退出
=> nm.l 80000000
80000000: 8e78cbff ? 12345678
80000000: 12345678 ? q
=> md.l 80000000 1
80000000: 12345678
mm:修改一串内存
mw:修改制定内存快数mw [.b, .w, .l] address value [count]
cp:将dram中的数据从一段内存拷贝到另一端内存。cp [.b, .w, .l] source target count
cmp:比较指定数目内存块的c值 ,会告诉你从哪里地址不相等 。mp [.b, .w, .l] addr1 addr2 count
与主机ping通,要设置环境变量,这样网卡才能使用
setenv ipaddr 192.168.1.100 #开发版的地址
setenv ethaddr 00:04:9f:04:d2:88 #MAC地址
setenv serverip 192.168.1.200
setenv gatewayip 192.168.1.1
setenv netmask 255.255.255.0
saveenv
ping通虚拟机的
=> ping 192.168.1.200
Using FEC1 device
host 192.168.1.200 is alive
Note:开发版可以ping通虚拟机,现在有一个问题是虚拟机ping不同开发版,需要开发版ping虚拟机,虚拟机才能ping通开发版。
现在就可以挂载tftp,nfs服务了。
nfs是网络文件系统,使得开发版与虚拟机之间可以类似于共享文件夹的效果。下载到开发版的DRAM中。
虚拟机安装nfs环境
sudo apt-get install nfs-kernel-server
sudo vi /etc/exports
#在末尾追加
# /nfs/rootfs *(rw,sync,no_root_squash)
# 或 /source/ *(rw,sync,no_subtree_check)
sudo mkdir -p /nfs/rootfs
sudo chmod 777 /nfs
sudo chmod 777 /nfs/rootfs
sudo /etc/init.d/nfs-kernel-server restart#启动nfs服务
开发版上电以后输入命令,连接nfs服务,烧入准备好的内核
nfs 80800000 192.168.1.200:/nfs/rootfs/zImage
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-whEJ9COH-1591541304038)(C:\Users\Administrator\Desktop\LinuxIMX开6ULL发\L27Uboot分析与根文件系统构建\图片\2_nfsload.png)]
现在我们可以通过内存读取数据,与zImage用Winhex软件查看,发现内容一样,就代表下载成功了。
虚拟机安装tftp服务,并且开启tftp服务
$ sudo apt-get install tftpd-hpa //如果未安装,安装 tftp-server
$ sudo vi /etc/default/tftpd-hpa //修改tftp服务器配置文件为
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/tftpboot"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="-c -s -l"
$ mkdir /tftpboot //创建tftpboot目录,
$ sudo chmod a+w /tftpboot
$ sudo service tftpd-hpa restart //启动 tftp-server
在开发版中使用命令进行下载
tftp 80800000 zImage
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-crXeXAih-1591541304041)(C:\Users\Administrator\Desktop\LinuxIMX开6ULL发\L27Uboot分析与根文件系统构建\图片\3_tftp.png)]
mmc info:显示当前选中的内存设备
mmc rescan:扫描mmc设备
mmc list:打印出mmc设备的列表
mmc dev number
=> mmc dev 1 #切换mmc1设备作为当前设备
=> mmc info
Device: FSL_SDHC
Manufacturer ID: 15
OEM: 100
Name: 8GTF4
Tran Speed: 52000000
Rd Block Len: 512
MMC version 4.0
High Capacity: Yes
Capacity: 7.3 GiB
Bus Width: 4-bit
Erase Group Size: 512 KiB
mmc part:查看当前设备的扇区
mmc read
mmc write
SD/EMMC分为三个分区:1.存放uboot , 2.存放zImage ,dtb,fat ,3.rootfs
fatinfo:
fatls mmc 1:1 :查看mmc设备1的1分区的文件
fattype mmc 1:1 :查看mmc涉笔1的1分区的文件系统类型
fatload mmc 1:1 80800000 zImage
bootz:用来自动启动镜像文件 , 我们将kernel的镜像与dtb文件使用tftp下载在内存中 , 然后使用bootz来启动。其中zImage放到80800000的地址中,dtb放到83000000的地址中。
tftp 80800000 zImage
tftp 83000000 imx6ull-14x14-evk-emmc.dtb
bootz 80800000 - 83000000
启动完以后,开发版的LED灯亮了,就启动内核结束了
bootm:同bootz , 用于启动uImage
bootcmd:
setenv bootcmd 'tftp 80800000 zImage;tftp 83000000 imx6ull-14x14-evk-emmc.dtb;bootz 80800000 - 83000000'
saveenv
现在我们已经搭建好了tftp网络 , 只需要将Ubuntu下的bin文件放到tftpboot目录下,就可以通过tftp服务下载到开发版中。通过go命令跳转到裸机程序的地址当中开始执行裸机程序,这样调试程序就很方便。
tftpboot keyfilter.bin 87800000
=> tftp 87800000 keyfilter.bin
Using FEC1 device
TFTP from server 192.168.1.200; our IP address is 192.168.1.101
Filename 'keyfilter.bin'.
Load address: 0x87800000
Loading: #
222.7 KiB/s
done
Bytes transferred = 2512 (9d0 hex)
=> go 87800000
## Starting application at 0x87800000 ...