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分区中的文件

image-20240705233911902

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就是串口波特率设置

By karlren

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注