Uboot移植
以正点原子的ALPHA开发板为例
NXP官方Uboot编译与测试
一个开发板运行Uboot,应该先初始化好DDR(DRAM)、串口、SD卡、EMMC、NADA的驱动,板子能运行
NXP官方Uboot编译结果:Uboot正常驱动,LCD要更具所使用的屏幕修改,网络初始化失败,SD卡、EMMC驱动正常
移植NXP官方Uboot到ALPHA开发板
添加板子默认文件
借鉴NXP官方6ULL EVK开发板,将configs下的mx6ull_14x14_evk_emmc_defconfig,复制为mx6ull_volcanism_emmc_defconfig
将CONFIG_SYS_EXTRA_OPTIONS改为"IMX_CONFIG=board/freescale/mx6ull_volcanism_emmc/imximage.cfg,MX6ULL_EVK_EMMC_REWORK"
将CONFIG_TARGET_MX6ULL_14X14_EVK改为CONFIG_TARGET_MX6ULL_VOLCANISM_EMMC
修改LCD驱动
一般Uboot中修改驱动都很实在xxx.h和xxx.c中,其中xxx为板子名称
比如board/freescale目录下的mx6ull_volcanism_emmc.h和mx6ull_volcanism_emmc.c
检查LCD使用的GPIO是否和LCD的IO配置正确,确保LCD背光引脚GPIO配置正确
最后修改LCD配置参数,在mx6ull_volcanism_emmc.c中修改LCD参数修改如下(以正点原子4.3寸RBGLCD屏为例)
{
.bus = MX6UL_LCDIF1_BASE_ADDR,
.addr = 0,
.pixfmt = 24,
.detect = NULL,
.enable = do_enable_parallel_lcd,
.mode = {
.name = "ATK-LCD-7-1024x600",
.xres = 1024,
.yres = 600,
.pixclock = 19531,
.left_margin = 140,
.right_margin = 160,
.upper_margin = 20,
.lower_margin = 12,
.hsync_len = 20,
.vsync_len = 3,
.sync = 0,
.vmode = FB_VMODE_NONINTERLACED
}
}
将mx6ull_volcanism_emmc.h中所有的panel=TFT43AB改为panel=ATK-LCD-7-1024x600
最后进入Uboot命令中修改panel变量为ATK-LCD-7-1024x600
修改网络驱动
Uboot启动Linux
从EMMC启动Linux
1、查看EMMC是否已经烧写了系统,通过mmc dev 1切换到EMMC,fatls mmc 1:1 查看EMMC分区中的文件
2、通过 fatload命令将zImage、dtb分别下载到80800000、83000000处,最后通过bootz命令启动Linux内核
fatload mmc 1:1 80800000 zImage
fatload mmc 1:1 83000000 imx6ull-14x14-emmc-4.3-800x480-c.dtb
bootz 80800000 - 83000000
从网络启动
设置好IMX6ULL的IP地址和TFTP主机地址,确保板子能和主机ping通
tftp 80800000 zImage
tftp 83000000 imx6ull-alientek-emmc.dtb
bootz 80800000 - 83000000
bootcmd分析
在mx6ull_volcanism_emmc .h中有一个CONFIG_BOOTCOMMAND定义
#define CONFIG_BOOTCOMMAND \
"run findfdt;" \
"mmc dev ${mmcdev};" \
"mmc dev ${mmcdev}; if mmc rescan; then " \
"if run loadbootscript; then " \
"run bootscript; " \
"else " \
"if run loadimage; then " \
"run mmcboot; " \
"else run netboot; " \
"fi; " \
"fi; " \
"else run netboot; fi"
#endif
其最后分析完的结果为
mmc dev 1
fatload mmc 1:1 80800000 zImage
fatload mmc 1:1 83000000 imx6ull-14x14-evk.dtb
bootz 80800000 - 83000000
即从emmc中下载zImage和dtb设备树,并启动Linux内核
bootargs环境变量
在mmcboot中会运行mmcargs
"mmcargs=setenv bootargs console=${console},${baudrate} " \
CONFIG_BOOTARGS_CMA_SIZE \
"root=${mmcroot}\0" \
展开后后可以得到
mmcargs=setenv bootargs console= ttymxc0, 115200 root= /dev/mmcblk1p2 rootwait rw
其中设置了环境变量bootargs,这个环境变量会传递给Linux内核,
console用来设置Linux终端(控制台),也就是通过什么设备来和Linux交互,是串口还是LCD。是串口的话是串口几。这里设置了ttymxc0,因为串口1在MX6ULL下的设备文件就是dev/ttymxc0,后面的115200就是串口波特率设置