源码选择
出厂可以直接使用 原子出厂源码, 出厂源码会随时修复bug或者添加新的驱动以兼容正点原子的其他模块
学习的时候
U-Boot 烧写与启动
uboot 启动位置根据拨码开关
烧写 通过.imxdownload 工具把 编译后的u-boot.bin 烧进sd 卡
/imxdownload u-boot.bin /dev/sdd
U-Boot 输出信息详解
U-Boot 2016.03 (Apr 12 2019 - 02:33:00 +0800)
/*版本 和当前时间*/
CPU: Freescale i.MX6ULL rev1.1 69 MHz (running at 528MHz)
/*飞思卡尔单片机 imx属于飞思卡尔 被NXP收购 */
CPU: Industrial temperature grade (-40C to 105C) at 46C
/*CPU温度 */
Reset cause: POR
/*复位原因 POR*/
Board: MX6ULL 14x14 EVK
/*板卡名称*/
I2C: ready
DRAM: 512 MiB
MMC: FSL_SDHC: 0, FSL_SDHC: 1
/*IMX6ull 支持2个MMC/SD卡控制器 FSL_SDHC(0) 接SD卡 FSL_SDHC(1) 接EMMC*/
Display: ATK-LCD-7-1024x600 (1024x600)
Video: 1024x600x24
/*上2行 表示LCD型号*/
In: serial
/*标准输入终端 此处串口*/
Out: serial
/*标准输入终端 此处串口*/
Err: serial
/*标准输入终端 此处串口*/
switch to partitions #0, OK
mmc0 is current device
/*切换到emmc的第0分区。因为当前的uboot 是emmc版本的 也就是从emmc启动*/
Net: FEC1
/*网口信息 用的网口1*/
Normal Boot
/*正常启动 也就是说uboot 要从 emmc 读取环境变量 和参数信息启动linux内核了*/
Hit any key to stop autoboot: 0
/*倒计时*/
U-Boot 常用命令
-
help or ? 查看支持的所有命令
- help or ? + 命令名称 查看该命令用法
信息查询命令
- bdinfo 打印boot 参数地址位置 DRAM起始地址 网卡信息 波特率信息 堆栈指针等信息
- printenv 打印环境变量
- version 查看 boot版本号
环境变量操作命令
- setenv bootdelay 5 设置
- saveenv 保存
- setenv bootargs 'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw'
设置多个值的环境变量 用 ' ' 包含 各组值 用 空格隔开
- setenv author kongbin 当没有此变量 该命令会 创建环境变量
- setenv author 无参, 删除环境变量
网络操作命令
setenv ipaddr 192.168.1.50 板卡IP地址
setenv ethaddr b8:ae:1d:01:00:00
setenv gatewayip 192.168.1.1
setenv netmask 255.255.255.0
setenv serverip 192.168.1.253 服务器IP地址 也就是ubutun 主机IP地址
saveenv
- ping 命令 例 ping 192.168.1.105
- dhcp 命令 从路由器获取IP地址 该命令还会通过TFTP来启动linux 内核
- nfs [loadAddress] [[hostIPaddr:]bootfilename] 网络文件系统命令 通过nfs 协议获取网络文件文件到 指定地址
例如:nfs 80800000 192.168.1.253:/home/zuozhongkai/linux/nfs/zImage
把主机中的 zImage 加载到DRAM的0x8080000 地址处
- tftp [loadAddress] [[hostIPaddr:]bootfilename] 通过tftp协议 获取网络文件文件到 指定地址
ubutun 主机端设置
sudo apt-get install tftp-hpa tftpd-hpa
sudo apt-get install xinetd
在目录/etc/xinetd.d/ 中创建 tftp文件
并输入以下内容
server tftp
{
socket_type = dgram
protocol = udp
wait = yes
user = root
server = /usr/sbin/in.tftpd
server_args = -s /home/kongbin/linux_aph/tftpboot/
disable = no
per_source = 11
cps = 100 2 flags = IPv4
}
并修改 /etc/default/tftpd-hpa 中 TFTP_DIRECTORY的值为 tftp 目录
EMMC 和SD卡操作命令
- mmc 一系列命令 操作emmc 和sd 卡
- mmc info
- mmc read addr blk# cnt 从mmc 读取内容到 dram中
- mmc write addr blk# cnt 把dram中的数据写入到 mmc中
- mmc rescan 扫描mmc社保
- mmc part 列出mmc设备分区
- mmc dev 切换mmc设备 例如 mmc dev 0 //切换到sd卡 0:sd卡 1:eMMC
- mmc list
- mmc hwpartition
- mmc rst
- mmc setdsr
- mmc part 可以查看emmc 分区情况 完整的应该是
part 0 : uboot
part1:linux内核 image 和 设备树 dts
part2:根文件系统
- mmc dev 1 2 把emmc 的分区2 设置为当前mmc设备 然后就可以完成一些读写操作
- mmc read addr blk# cnt emmc >> dram addr DRAM地址 blkMMC:块地址 cnt:块数量
例如 mmc read 80800000 600 10 0x10 = 16 一个扇区512 16 * 512 = 0x2000
读完可以通过 md.b 80800000 2000 查看DRAM中的内容
- mmc write addr blk# cnt dram>> write
综合应用 更新sd 卡中uboot程序
tftp 80800000 u-boot.imx
mmc dev 0 0
mmc write 80800000 2 32E
综合应用 更新emmc 卡中uboot程序
tftp 80800000 u-boot.imx //下载u-boot.imx 到dram中
mmc dev 1 0 //切换到emmc的分区0
mmc write 80800000 2 32E //烧写u-boot.imx到emmc中
mmc partconf 1 1 0 0 //分区配置, EMMC需要这一步!
FAT 一系列操作命令
对SD、EMMC 存储的文件进行操作
-
fatinfo <interface> [<dev[:part]>] 查询文件系统信息 例如 fatinfo mmc 1:1
-
fatls <interface> [<dev[:part]>] [directory] 列出该目录下 有哪些文件 和linux中的ls 命令类似
- fstype <interface> <dev>:<part> 查询分区文件系统类型
- fatload <interface> [<dev[:part]> [<addr> [<filename> [bytes [pos]]]]] 加载文件到DRAM
例如 fatload mmc 1:1 80800000 zImage 加载zImage 到dram中
boot 操作命令 重中之中
uboot 本质工作就是引导linux
- bootz [addr [initrd[:size]] [fdt]]
addr: linux 内核 imge dram地址
initrd是initrd文件在dram中的地址 可用-代替
fdt:设备树地址
例:
tftp 80800000 zImage
tftp 83000000 imx6ull-14x14-emmc-7-1024x600-c.dtb
bootz 80800000 - 83000000
8080000 加载linux镜像文件
83000000 加载设备树文件
- bootm 参数、功能和 bootz类似
boot 命令
最重要的2个环境变量
bootcmd
uboot启动后会运行环境变量 bootcmd 中的命令 去加载 内核 和设备树
调试阶段 可通过tfp 从服务器获取 文件 加载 内核 zImage 文件 和设备树文件
setenv bootcmd 'tftp 80800000 zImage; tftp 83000000 imx6ull-14x14-emmc-7-1024x600-c.dtb; bootz 80800000 - 83000000'
生产阶段 从emmc中 加载文件
把linux keneral 和 设备树 (dts)文件
setenv bootcmd fatload mmc 1:1 80800000 zImage; fatload mmc 1:1 83000000 imx6ull-14x14-emmc-4.3-800*480-c.dtb; bootz 80800000 - 83000000'
bootargs
调试阶段 通过 nfs 加载根文enü
setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs nfsroot=192.168.1.14:/home/kongbin/linux_aph/nfs/rootfs,v3 ip=192.168.1.50:192.168.1.14:192.168.1.1:255.255.255.0::eth0:off'
注意:nfs 服务 系统是ubutun18.04 加个v3
生产阶段 从emmc的分区2 中加载根文件系统
setenv bootcmd ‘console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw’
bootz 命令启动流程如下图: