本博客主要对学习嵌入式Linux进行总结,学习视频参考正点原子。开发板使用Imx6ull芯片。
1. 什么是Uboot
1 Uboot是一个裸机程序,比较复杂。
2 Uboot就是一个bootloader,最终目的是启动系统(linux)。
主要工作是初始化DDR,将Linux系统镜像(zImage.uImage)、设备树(dtb)文件从SD、EMMC、Nand、Spi Flash等搬移到DDR中运行。
3 Uboot是一个通用Bootloader,支持多种系统。
2. Uboot获取
1.从uboot官网获取,缺点支持少,某一款具体芯片驱动不完善
2.从SOC厂商获取,该厂商从Uboot官网下载某版本并修改该版本加入响应的SOC以及驱动,这就是SOC厂商定制的Uboot,SOC厂商会提供评估板。
3.从开发板厂商获取,驱动有所不同,开发板厂商也是依赖SOC厂商做的评估板。
3. Uboot编译
编译uboot后生成u-boot.bin文件,但还需要用相应软件添加头部信息,最终生成u-boot.imx
1.清理工程
make distclean
2.配置文件
make mx6ull_mynand_defconfig
3.向顶层makefile中添加(大约252行)
ARCH ?= arm #arm架构
CROSS_COMPILE ?= arm-linux-gnueabihf- #配置编译器
4.编译
make -j4
4. Uboot输出信息
5.Uboot相关命令
5.1 Uboot调试命令
1. help ? 命令名 :查看某一个命令帮助信息,
2. bdinfo :查看板子信息
3. printenv :查看当前板子的环境变量
4. setenv :设置环境变量以及删除环境变量
5. saveenv : 保存环境变量
5.2 内存命令(Uboot中的数字都是十六进制)
.b为byte(1字节).w为word(2字节).l为long(4字节)
1.md命令:md[.b,.w,.l] address (md.b 80000000 14) #显示内存值
2.nm命令:nm[.b,.w,.l] address (nm.l 80000000) #修改指定地址的内存值,不会自增
3.mm命令:mm[.b,.w,.l] address (mm.l 80000000) #修改指定地址的内存值,会自增
4.cp命令:cp[.b,.w,.l] source target count (cp.l 80000000 80000100 10) #将DDR中一段内存拷贝到另一段中
5.cmp命令:cmp[.b,.w,.l] addr1 addr2 count (cmp.l 80000000 80000100 10) #比较DDR中的一段内存与另一段内存进行比较
5.3 网络命令
1.设置MAC地址:setenv ethaddr 00:04:9f:04:d2:35
2.设置IP地址:setenv ipaddr 192.168.1.50
3.设置网关地址:setenv gatewayip 192.168.1.1
4.设置子网掩码:setenv netmask 255.255.255.0
5.设置服务器IP:setenv serverip 192.168.1.66
5.4 EMMC操作
1.查看设备信息:mmc info
2.列出含有的EMMC设备:mmc rescan / mmc list
3.切换设备:mmc dev 0
4.查看当前设备分区: mmc part
5.切换入设备中的分区:mmc dev 1 0
6.读取设备分区中的内存:mmc read 80800000 600 10
7.写入设备升级:mmc write 80800000 2 32e
5.5 根文件系统操作(SD卡文件系统)
FAT格式文件系统:对于I.MX6U芯片,SD/EMMC分为三个分区
第一分区:存放Uboot文件
第二分区:存放linux的zImage(镜像)和dtb(设备树)文件
第三分区:存放根文件系统(EXT4)
1.fatinfo(fatinfo mmc 1:1) #查询设备下对应分区信息
2.fatls(fatls mmc 1:1) #查询fat格式设备的目录和文件信息
3.fstype(fstype mmc 1:0) #查询设备分区的文件系统格式
4.fatload (fatload mmc 1:1 80800000 zImage) #将指定的文件读取到DDR中
5.6 NAND操作
1.nand info:打印Nand Flash信息
2.nand device:切换设备
3.nand erase:擦除Nand flash
4.nand write:往Nand的指定地址写入指定的数据
5.nand read:从Nand的指定地址读出指定大小数据到DDR中
6. Boot指令
6.1 从网络启动linux
1.使用tftp命令将zImage下载到DDR的0x800000地址处
tftp 80800000 zImage
2.将设备树imx6ull_mynand.dtb下载到DDR的0x83000000
tftp 83000000 imx6ull_mynand.dtb
3.bootz启动linux内核
bootz 80800000 - 83000000
6.2 EMMC中启动linux
1.使用fatload命令将zImage下载到DDR的80800000
fatload mmc 1:1 80800000 zImage
2.使用fatload命令将设备树下载到DDR的83000000
fatload mmc 1:1 83000000 imx6ull_mynand.dtb
3.bootz启动linux内核
bootz 80800000 - 83000000
6.3 设置bootcmd环境变量进行启动linux
1.设置环境变量
setenv bootcmd 'tftp 80800000 zImage; tftp 83000000 imx6ull_mynand.dtb; bootz 80800000 - 83000000'
2.保存环境变量
saveenv
3.启动linux
boot