目录
一、添加或修改的文件
1、添加开发板默认的配置文件
(1)在 configs 目录下创建默认配置文件 mx6ull_alientek_emmc_defconfig,文件内容为:
2、添加开发板对应的头文件
(1) 在 目 录 include/configs 下 添 加 mx6ull_alientek_emmc.h 头文件。
(2) 修改头文件宏定义为:
(3) mx6ull_alientek_emmc.h 文件中基本都是“CONFIG_”开头的宏定义,这也说明此文件的主要功能就是配置或者裁剪 uboot。如果需要某个功能的话就在里面添加这个功能对应的 CONFIG_XXX 宏即可,如果不需要某个功能的话就删除掉对应的宏即可。
3、添加开发板对应的板级文件夹
(1) 在 board/freescale 目录下添加 mx6ull_alientek_emmc 文件夹,修改如下文件:
a. 添加 mx6ull_alientek_emmc.c 文件
b. 修改 Makefile 文件:
c. 修改 imximage.cfg 文件:
d. 修改 Kconfig 文件:
e. 修改 MAINTAINERS 文件:
4、修改 uboot 图形界面配置文件
(1) uboot 是支持图形界面配置,修改文件 arch/arm/cpu/armv7/mx6/Kconfig (如果用的 I.MX6UL 的话,应该修改 arch/arm/Kconfig 这个文件):
a. 在 207 行加入如下内容:
b. 在文件末尾加入如下这一行:
二、编译修改好的uboot(3种方法)
1、直接输入命令行编译:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_alientek_emmc_defconfig
make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j4
2、修改顶层Makefile编译:
(1) 直接在顶层 Makefile 中直接给 ARCH 和CORSS_COMPILE 赋值
(2) 使用如下简短的命令来编译 uboot :
make mx6ull_alientek_emmc_defconfig
make V=1 -j4
3、直接创建个 shell 脚本(常用)
(1) 创建 mx6ull_alientek_emmc.sh 脚本文件,文件内容如下:
#!/bin/bash
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_alientek_emmc_defconfig
make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j4
三、修改bootcmd和bootargs环境变量
1、bootcmd
(1) bootcmd 保存着 uboot 默认命令, uboot 倒计时结束以后就会执行 bootcmd 中的命令;
(2) 找到bootcmd命令:include/env_default.h:
default_environment
"bootcmd=" CONFIG_BOOTCOMMAND // include/configs/mx6ull_alientek_emmc.h
(3) bootcmd(CONFIG_BOOTCOMMAND)命令分析:
(4) 如此复杂的设置就是为了从 EMMC 中读取 zImage 镜像文件和设备树文件, 然后启动Linux 内核;经过分析,那么宏CONFIG_BOOTCOMMAND 就可简化为:
#define CONFIG_BOOTCOMMAND \
"mmc dev 1;" \ //切换到 EMMC
"fatload mmc 1:1 0x80800000 zImage;" \ //读取 zImage 到 0x80800000 处
"fatload mmc 1:1 0x83000000 imx6ull-alientek-emmc.dtb;" \ //读取设备树到 0x83000000 处
"bootz 0x80800000 - 0x83000000;" //启动 Linux 内核
(5) 可以直接在 uboot 中设置 bootcmd 的值,这个值就是保存到 EMMC 中的,命令如下:
setenv bootcmd 'mmc dev 1; fatload mmc 1:1 80800000 zImage; fatload mmc 1:1 83000000 imx6ullalientek-emmc.dtb; bootz 80800000 - 83000000;'
2、bootargs
(1)bootargs 保存着 uboot 传递给 Linux 内核的参数;
(2) 在include/configs/mx6ull_alientek_emmc.h文件中,bootargs 环境变量是由 mmcargs 设置的, mmcargs 环境变量如下:
其中 console=ttymxc0, baudrate=115200, mmcroot=/dev/mmcblk1p2 rootwait rw,因此将
mmcargs 展开以后就是:
mmcargs=setenv bootargs console= ttymxc0, 115200 root= /dev/mmcblk1p2 rootwait rw
a. console:用来设置 linux 终端(或者叫控制台),也就是通过什么设备来和 Linux 进行交互,这里设置 console 为 ttymxc0,因为 linux启动以后 I.MX6ULL 的串口 1 在 linux 下的设备文件就是/dev/ttymxc0,ttymxc0 后面有个“,115200”,这是设置串口的波特率;
b. root:root 用来设置根文件系统的位置, root=/dev/mmcblk1p2 用于指明根文件系统存放在
mmcblk1 设备的分区 2 中。root 后面有“rootwait rw”, rootwait 表示等待 mmc 设备初始化完成以后再挂载,否则的话mmc 设备还没初始化完成就挂载根文件系统会出错的。 rw 表示根文件系统是可以读写的,不加 rw 的话可能无法在根文件系统中进行写操作,只能进行读操作。
四、启动linux内核
1、从 emmc 中启动 linux 内核 (调试完程序后使用)
(1) 先将编译出来的 Linux 镜像文件 zImage 和设备树文件保存在 EMMC 中, uboot 从 EMMC 中读取这两个文件并启动;
(2) 进入 uboot 命令行,输入:ls mmc 1:1 , 看是否能查找的 zImage 和设备树文件;
(3) 设置 bootargs 和 bootcmd这两个环境变量,设置如下:
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
(4) 设置好以后直接输入 boot,或者 run bootcmd 即可启动 Linux 内核,查看启动信息就能看出 linux内核是否正常启动。
2、从网络启动 linux 内核(唯一目的就是为了调试)
(1) 将 linux 镜像文件和根文件系统都放到 Ubuntu 下某个指定的文件夹中,这样每次重新编译 linux 内核或者某个 linux 驱动以后只需要使用 cp 命令将其拷贝到这个指定的文件夹中即可,这样就不用需要频繁的烧写 EMMC,这样就加快了开发速度;我们可以通过 nfs 或者 tftp 从 Ubuntu 中下载 zImage 和设备树文件。
(2) 用 nfs 挂接根文件系统
a. 在虚拟机 安装,配置,然后再启动nfs服务;
b. 虚拟机网络设置成桥接模式;
c. 设置开发板的网络环境:
setenv ipaddr 192.168.1.50 //设置开发板地址
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 //设置虚拟机地址
saveenv
d. 在开发板ping通与虚拟机的地址;
e. 设置开发板 bootargs 环境变量:
setenv bootargs ‘console=ttymxc0,115200 root=/dev/nfs rw nfsroot=192.168.31.116:/home/can/linux/nfs/rootfs ip=192.168.31.50:192.168.31.116:192.168.31.1:255.255.255.0::eth0:off’
f. 设置开发板 bootcmd 环境变量:
setenv bootcmd ‘nfs 80800000 192.168.31.116:/home/can/linux/nfs/zImage;nfs 83000000 192.168.31.116:/home/can/linux/nfs/imx6ull-alientek-emmc.dtb;bootz 80800000 - 8300000’
saveenv
g. 设置好以后直接输入 boot,或者 run bootcmd 即可启动 Linux 内核,查看启动信息就能看出 linux内核是否正常启动。