Uboot移植入门

声明

本博客所记录的关于正点原子i.MX6ULL开发板的学习笔记,(内容参照正点原子I.MX6U嵌入式linux驱动开发指南,可在正点原子官方获取正点原子Linux开发板 — 正点原子资料下载中心 1.0.0 文档,旨在如实记录我在学校学习该开发板过程中所遭遇的各类问题以及详细的解决办法。其初衷纯粹是为了个人知识梳理、学习总结以及日后回顾查阅方便,同时也期望能为同样在学习这款开发板的同学或爱好者提供一些解决问题的思路和参考。我尽力保证内容的准确性和可靠性,但由于个人知识水平和实践经验有限,若存在错误或不严谨之处,恳请各位读者批评指正。

责任声明:虽然我力求提供有效的问题解决办法,但由于开发板使用环境、硬件差异、软件版本等多种因素的影响,我的笔记内容不一定适用于所有情况。对于因参考本笔记而导致的任何直接或间接损失,我不承担任何法律责任。使用本笔记内容的读者应自行承担相关风险,并在必要时寻求专业技术支持。

1. NXP

1.1 NXPuboot源码下载

Linux 系统要启动就必须需要一个 bootloader 程序,也就说芯片上电以后先运行一段bootloader 程序。这段bootloader程序会先初始化DDR等外设,然后将Linux内核从flash(NAND, NOR FLASH, SD, MMC 等)拷贝到 DDR 中,最后启动 Linux 内核。

uboot 的全称是 Universal Boot Loader, uboot 是一个遵循 GPL 协议的开源软件, uboot 是一个裸机代码,可以看作是一个裸机综合例程。uboot 官网为The U-Boot Documentation — Das U-Boot unknown version documentation

在官网下载源码,点击图左侧Build U-Boot 中的“Obtaining the source”,

复制git clone https://source.denx.de/u-boot/u-boot.git跳转,可能需要魔法。

或者从正点原子官方获取i.MX6ULL Linux阿尔法开发板 — 正点原子资料下载中心 1.0.0 文档,路径为1、程序源码->4、NXP官方原版Uboot和Linux->uboot-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2

2. NXP 官方开发板 uboot 编译测试

将uboot压缩包传输到ubuntu下,使用命令解压

tar -xjvf uboot-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2

在移植之前,我们先编译一下 NXP 官方 I.MX6ULL EVK 开发板对应的 uboot,首先是配置uboot,configs 目录下有很多跟 I.MX6UL/6ULL 有关的配置

可以看出有很多的默认配置文件,其中以 mx6ul 开头的是 I.MX6UL 芯片的, mx6ull 开头的是 I.MX6ULL 开发板的。 I.MX6UL/6ULL 有 9x9mm 和 14x14mm 两种尺寸的,所以我们可以看到会有mx6ull_9x9和mx6ull_14x14开头的默认配置文件。我们使用的是14x14mm的芯片,所以关注 mx6ull_14x14 开头的默认配置文件。正点原子的I.MX6ULL有EMMC和NAND 两个版本的,因此只需要关注mx6ull_14x14_evk_emmc_defconfigmx6ull_14x14_evk_nand_defconfig这两个配置文件就行了。

2.1NXP 官方开发板 uboot 编译测试

找到 NXP 官方 I.MX6ULL EVK 开发板对应的默认配置文件以后就可以编译一下,使用如下编译 uboot

首先在 Ubuntu 中安装 ncurses 库,否则编译会报错,安装命令如下:

sudo apt-get install libncurses5-dev

然后使用如下命令编译:

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_14x14_evk_emmc_defconfig

make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j16

编译完成以后结果如图

在编译的时候需要输入 ARCH 和 CORSS_COMPILE这两个变量的值,这样太麻烦了。我们可以直接在顶层 Makefile 中直接给 ARCH 和CORSS_COMPILE 赋值,修改如图

这样我们就可以使用如下简短的命令来编译 uboot 了:

make mx6ull_14x14_evk_emmc_defconfig

make V=1 -j16

如果既不想修改 uboot 的顶层 Makefile,又想编译的时候不用输入那么多,那么就直接创建个 shell 脚本就行了,shell脚本名为 mx6ull_14x14_emmc.sh,然后在 shell 脚本里面输入如下内容:

1 #!/bin/bash

2 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean

3 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihfmx6ull_14x14_evk_emmc_defconfig

4 make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j16

给可执行权限,使用命令:

chmod 777 mx6ull_14x14_emmc.sh

使用 mx6ull_14x14_emmc.sh 脚本编译 uboot 的时候每次都会清理一下工程,然后全部重新编译,编译的时候直接执行这个脚本就行了,命令如下:

./mx6ull_14x14_evk_emmc.sh

编译完成以后会生成 u-boot.bin、 u-boot.imx 等文件,但是这些文件是 NXP 官方 I.MX6ULL EVK 开发板。

3. 烧写验证与驱动测试

将 imxdownload 软件(i.MX6ULL Linux阿尔法开发板 — 正点原子资料下载中心 1.0.0 文档)拷贝到 uboot 源码根目录下,然后使用 imxdownload 软件将 u-boot.bin烧写到 SD 卡中,烧写命令如下:

chmod 777 imxdownload //给予 imxdownload 可执行权限
./imxdownload u-boot.bin /dev/sdd //烧写到 SD 卡中,不能烧写到/dev/sda 或 sda1 里面

烧写完成以后将 SD 卡插入 I.MX6U-ALPHA 开发板的 TF 卡槽中,最后设置开发板从 SD卡启动。打开 SecureCRT,设置好开发板所使用的串口并打开,复位开发板, SecureCRT 接收到如下图

可以看出,uboot 启动正常,虽然我们用的是 NXP 官方 I.MX6ULL 开发板的uboot,但是在正点原子的 I.MX6ULL 开发板上是可以正常启动的。而且 DRAM 识别正确,为512MB,如果用的 NAND 版本的核心版的话 uboot 启动会失败!因为 NAND 核心版用的 256MB的 DRAM。

1SD 卡和 EMMC 驱动检查

检查一下 SD 卡和 EMMC 驱动是否正常,使用命令 mmc list 列出当前的 MMC 设备

可以看出当前有两个 MMC 设备,检查每个 MMC 设备信息,先检查 MMC 设备 0,输入如下命令:

mmc dev 0

mmc info

结果如下所示:

mmc 设备 0 是 SD 卡, SD 卡容量为 28.9GB,这个和我所使用的SD 卡信息相符,说明 SD 卡驱动正常。再来检查 MMC 设备 1,方法相同,mmc 设备 1 为 EMMC。

2LCD 驱动检查

如果 uboot 中的 LCD 驱动正确的话,启动 uboot 以后 LCD 上应该会显示出 NXP 的 logo,如下图

如果你用的不是正点原子的 4.3 寸 480x272 分辨率的屏幕的话,那么 LCD 就不会显示33.1.3.5 所示 logo 界面。因为 NXP 官方 I.MX6ULL 开发板的屏幕就是 4.3 寸 480x272 分辨率的,所以 uboot 默认 LCD 驱动是 4.3 寸 480x272 分辨率的。我这是已经修改LCD后的,所以正常显示了。

3、网络驱动

uboot 启动的时候提示“Board Net Initialization Failed”和“No ethernet found.”这两行,说明网络驱动也有问题,正常情况下应该是如图所示Net FEC1:

这是因为正点原子开发板的网络芯片复位引脚和 NXP 官方开发板不一样,因此需要修改驱动。

总结一下 NXP 官方 I.MX6ULL EVK 开发板的 uboot 在正点原子 EMMC 版本 I.MX6ULL开发板上的运行情况:

①、 uboot 启动正常, DRAM 识别正确, SD 卡和 EMMC 驱动正常。

②、 uboot 里面的 LCD 驱动默认是给 4.3 寸 480x272 分辨率的,如果使用的其他分辨率的屏幕需要修改驱动。

③、网络不能工作,识别不出来网络信息,需要修改驱动。

接下来我们要做的工作如下:

①、前面我们一直使用着 NXP 官方开发板的 uboot 配置,接下来需要在 uboot 中添加我们自己的开发板,也就是正点原子的 I.MX6ULL 开发板。

②、解决 LCD 驱动和网络驱动的问题

2. 在 U-Boot 中添加自己的开发板

2.2 添加开发板默认配置文件

在 configs 目录下创建默认配置文件,复制 mx6ull_14x14_evk_emmc_defconfig,然后重命名为 mx6ull_alientek_emmc_defconfig,命令如下:

cd configs

cp mx6ull_14x14_evk_emmc_defconfig mx6ull_alientek_emmc_defconfig

将文件 mx6ull_alientek_emmc_defconfig 中的内容改成下面的:

CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=board/freescale/mx6ull_alientek_emmc/imximage.cfg,MX6ULL_EVK_EMMC_REWORK"

CONFIG_ARM=y

CONFIG_ARCH_MX6=y

CONFIG_TARGET_MX6ULL_ALIENTEK_EMMC=y

CONFIG_CMD_GPIO=y

mx6ull_alientek_emmc_defconfig 基本和 mx6ull_14x14_evk_emmc_defconfig 中的内容一样,只是第 1 行和第 4 行做了修改

2.3 添加开发板对应的头文件

在 目 录 include/configs 下 添 加 I.MX6ULL-ALPHA 开 发 板 对 应 的 头 文 件 , 复 制include/configs/mx6ullevk.h,并重命名为 mx6ull_alientek_emmc.h,命令如下:

cp include/configs/mx6ullevk.h include/configs/mx6ull_alientek_emmc.h

拷贝完成以后将:

#ifndef __MX6ULLEVK_CONFIG_H

#define __MX6ULLEVK_CONFIG_H

改为:

#ifndef __MX6ULL_ALIENTEK_EMMC_CONFIG_H

#define __MX6ULL_ALIENTEK_EMMC_CONFIG_H

mx6ull_alientek_emmc.h 文件的主要功能就是配置或者裁剪 uboot。如果需要某个功能的话就在里面添加这个功能对应的 CONFIG_XXX 宏即可,如果不需要某个功能的话就删除掉对应的宏即可。

2.4 添加开发板对应的板级文件夹

uboot 中每个板子都有一个对应的文件夹来存放板级文件,比如开发板上外设驱动文件等等。 NXP 的 I.MX 系列芯片的所有板级文件夹都存放在 board/freescale 目录下,在这个目录下有个名为 mx6ullevk 的文件夹,这个文件夹就是 NXP 官方 I.MX6ULL EVK 开发板的板级文件夹。复制 mx6ullevk,将其重命名为 mx6ull_alientek_emmc,命令如下:

cd board/freescale/

cp mx6ullevk/ -r mx6ull_alientek_emmc

进 入 mx6ull_alientek_emmc 目 录 中 , 将 其 中 的 mx6ullevk.c 文 件 重 命 名 为mx6ull_alientek_emmc.c,命令如下:

cd mx6ull_alientek_emmc

mv mx6ullevk.c mx6ull_alientek_emmc.c

进 入 mx6ull_alientek_emmc 目 录 中 , 将 其 中 的 mx6ullevk.c 文 件 重 命 名 为mx6ull_alientek_emmc.c,命令如下:

cd mx6ull_alientek_emmc

mv mx6ullevk.c mx6ull_alientek_emmc.c

需要对 mx6ull_alientek_emmc 目录下的文件做一些修改:

1、 修改 mx6ull_alientek_emmc 目录下的 Makefile 文件

将 mx6ull_alientek_emmc 下的 Makefile 文件内容改为如下所示:

第 6 行的 obj-y,改为 mx6ull_alientek_emmc.o,这样才会编译 mx6ull_alientek_emmc.c这个文件。

2、修改 mx6ull_alientek_emmc 目录下的 imximage.cfg 文件

将 imximage.cfg 中的下面一句:

PLUGIN board/freescale/mx6ullevk/plugin.bin 0x00907000

改为:

PLUGIN board/freescale/mx6ull_alientek_emmc /plugin.bin 0x00907000

修改后的内容如下:

3、修改 mx6ull_alientek_emmc 目录下的 Kconfig 文件

修改后的内容如下:

4、修改 mx6ull_alientek_emmc 目录下的 MAINTAINERS 文件

修改后的内容如下:

2.4 修改 U-Boot 图形界面配置文件

修改文件arch/arm/cpu/armv7/mx6/Kconfig,添加

config TARGET_MX6ULL_ALIENTEK_EMMC

 bool "Support mx6ull_alientek_emmc"

 select MX6ULL

 select DM

 select DM_THERMAL

在最后一行的 endif 的前一行添加如下内容:

source "board/freescale/mx6ull_alientek_emmc/Kconfig"

到此为止, I.MX6U-ALPHA 开发板就已经添加到 uboot 中了,接下来就是编译这个新添加的开发板。

2.5 使用新添加的板子配置编译 uboot

在 uboot 根目录下新建一个名为 mx6ull_alientek_emmc.sh 的 shell 脚本,在这个 shell 脚本里面输入如下内容:

1 #!/bin/bash

2 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean

3 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-

mx6ull_alientek_emmc_defconfig

4 make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j16

给予 mx6ll_alientek_emmc.sh 可执行权限,然后运行脚本来完成编译,命令如下:

chmod 777 mx6ull_alientek_emmc.sh //给予可执行权限,一次即可

./mx6ull_alientek_emmc.sh //运行脚本编译 uboot

等 待 编 译 完 成

 编 译 完成 以 后 输 入 如 下命 令, 查 看 一 下添加 的mx6ull_alientek_emmc.h 这个头文件有没有被引用

grep -nR "mx6ull_alientek_emmc.h"

如果有很多文件都引用了mx6ull_alientek_emmc.h这个头文件,那就说明新板子添加成功

编译完成以后就使用 imxdownload 将新编译出来的 u-boot.bin 烧写到 SD 卡中测试。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值