针对正点原子的i.mx6ull (a7处理器)
官方的uboot编译、烧写和启动
启动后====先看看与自己的有哪些不一样,
根据的自己的板子进行修改
这个阶段基本上,就是在这官方的bsp包,,肯定支持最多开发板,我们只需建立相同的文件,修改等等,
最多就是基本的外设驱动: 串口 lcd 网络 外置的mmc或者sd
uboot与内核联系的重要的参数bootcmd和bootargs
## bootcmd环境变量,
#define CONFIG_BOOTCOMMAND \
"run findfdt;" \ =============设备树文件
"mmc dev ${mmcdev};" \
"mmc dev ${mmcdev};
if mmc rescan; then " \ //看看有没有sd卡和emmc存在
"if run loadbootscript; then " \ //如果加载文件成功就运行bootscript
"run bootscript; " \
"else " \
"if run loadimage; then " \ //加载不成功就把mmc中zImage到内存中
"run mmcboot; " \
"else run netboot; " \
"fi; " \
"fi; " \
"else run netboot; fi"
mmcboot
"mmcboot=echo Booting from mmc ...; " \
"run mmcargs; " \ //用来设置bootargs
"if test ${boot_fdt} = yes || test ${boot_fdt} = try; then " \
"if run loadfdt; then " \ //加载evk.dtb到83000000处linux文件
"bootz ${loadaddr} - ${fdt_addr}; " \ //bootz 80800000-83000000
"else " \
"if test ${boot_fdt} = try; then " \
"bootz; " \
"else " \
"echo WARN: Cannot load the DT; " \
"fi; " \
"fi; " \
"else " \
"bootz; " \
"fi;\0" \
//整个bootcmd的功能就是
emmc Dev 1
fatload mmc 1:1 0x80800000 zImage //加载文件zImage 到0x80800000处
fatload mmc 1:1 0x83000000 imx6ull-14x14-evk.dtb //读取设备树到0x83000000处
bootz 0x80800000 - 0x83000000
bootargs(mmcargs设置的)环境变量
作用就是保存着uboot传递给Linux内核的的参数
mmcargs=setenv bootargs console={baudrate} root=${mmcroot}
也就是
mmcargs=setenv bootargs console= ttymxc0, 115200 root= /dev/mmcblk1p2 rootwait rw
- //console
原来设置linux终端,通过什么设备(串口ttymxc 还是lcd)和linux就行交互 - //root
root用来设置根文件系统的位置,root=dev/mmcblk1p2用于指明根文件系统存放在mmcblk1设备分区2中
这里的/dev/mmcblk1表示EMMC,而/dev/mmcblk1p2表示EMMC的分区2 - //rootfstype
一般配置root一起使用,rootfdtype用于指定根文件系统类型
如果根文件系统为ext 格式的话此选项无所谓。如果根文件系统是 yaffs、jffs 或 ubifs 的话就需要设置此选项
uboot启动linux系统
从emmc启动也就是:
将编译出来的 ”linux镜像文件zImage“ 和 ”设备树文件“保存在EMMC中===》uboot从EMMC中读取这两个文件并启动
》》》先要保证emmmc里面有这两个必要的文件。:
ls mmc 1:1 看看有没有文件
》》再设置uboot的环境变量 bootcmd 和 bootargs:
setenv bootargs ‘console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw’
setenv bootcmd ‘mmc dev 1;fatload mmc 1:1 80800000 zImage; fatload mmc 1:1 83000000 imx6ull-alientek-emmc.dtb; bootz 80800000 - 83000000;’
saveenv
》》》再直接boot就可以启动
从网络启动(目的为了调试)可以用nfs或者tftp
每次修改linux系统文件或者linux下的某个驱动以后都要将其烧写到EMMC中去测试,这样实在太麻烦了
》》》在ubuntu建立一个文件夹叫做tftp ,把zImage镜像文件(linux内核)和设备树文件 放进去
》》》设置环境变量bootcmd 和 bootargs
setenv bootargs ‘console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw’
setenv bootcmd ‘tftp 80800000 zImage; tftp 83000000 imx6ull-alientek-emmc.dtb; bootz 80800000 - 83000000’
saveenv
》》》boot
这样有个缺点下次启动的时候还是要远端传驱动文件,而不是像本地直接使用
uboot DDR初始化
裸机
imxdownload软件下载,会在bin文件头部添加IVT DCD数据
uboot
uboot编译生成的u-boot.imx
u-boot.imx已经包含了IVT DCD数据
需要用官方的工具找出需要校准的寄存器的值,比对board/freescale/mx6ull_alientek_emmc/imximage.cfg进行修改
//Read DQS Gating calibration
setmem /32 0x021b083c = 0x0140013C // MPDGCTRL0 PHY0
//Read calibration
setmem /32 0x021b0848 = 0x40403036 // MPRDDLCTL PHY0
//Write calibration
setmem /32 0x021b0850 = 0x4040322E // MPWRDLCTL PHY0
总结
- 不管是自己购买的开发板还是自己做的开发板,基本都需要参考半导体厂商的dmeo板(贵),
半导体厂商会在他们的开发板上移植好uboot、linux kernel和sysytemfs等最终做好BSP包给用户。
这个时候我们可以在官方提供的BSP包的基础上添加我们自己的板子,====俗称移植
- 我们不会原封不动的照抄半导体的demo板,有修改就必然会涉及到uboot下驱动的移植
- 一般uboot中需要解决 串口 (交互)、 NAND、EMMC或SD卡 (用来保存启动文件)、 网络驱动(用来调试) 、屏幕驱动(交互),uboot的主要目的就是启动内核,所以不要考虑太多的外设驱动
- 在uboot中添加自己的板子信息,根据实际的情况来修改uboot中的驱动