创建自己的uboot-基于IMX6

学习目标:

Linux 系统要启动就必须需要一个 bootloader 程序,上电后首先运行的程序,初始化DDR等外设,然后将Linux内核从flash(NAND,NOR FLASH,SD,MMC 等)拷贝到 DDR 中,最后启动 Linux 内核,一个启动流程。因此我们需要一个bootloader,目前有很多现成的 bootloader 软件可以使用,比如 U-Boot、vivi、RedBoot 等等,其中以 U-Boot 使用最为广泛,因此我们学习uboot。

根据硬件平台,搭建适合平台的uboot

这里用I.MX6ULL,核心板使用正点原子的emmc-btb版本。

扩展板是自己做的,学习uboot里面硬件主要注意boot模式引脚状态

(1)下面是BOOT模式配置

00:熔丝模式一次性烧录需要谨慎。

01:外部模式(USB/串口写入)。

这个模式可以用官方MfgTool2,把uboot,linux,根文件系统,设备树等烧写到sd卡,emmc,nand,qspi;其中写sd卡时需先拔出sd卡(有文件在里面时),otg使用从模式,MfgTool2识别设备后再接入SD卡。

MFGtool烧录分为两个阶段,第一部分就是将firmware文件夹 下的Uboot、Kernel、device tree、Initramfs加载到内存中,然后在第二阶段,将你要烧录的文件夹下的Uboot、Kernel、device tree、rootfs写入NAND Flash、SD Card或者emmc,然后完成烧录。

10:内部模式(SD/EMMC/NAND/QSPI)

 (2)BOOT模式配置为内部模式后,再配置具体的启动外设

 引脚复用关系如下:

 (3)本次使用普通sd卡方式启动

硬件配置:BOOT_MODE0=0,BOOT_MODE1=0,

BOOTCFG[6]=1,其余BOOTCFG=0。

红色圈的电阻拆下 

UBOOT制作过程:

下图介绍总的框图


 (1)下载uboot源码

方法一:uboot 的全称是 Universal Boot Loader,uboot 是一个遵循 GPL 协议的开源软件,uboot 是一个裸机代码,可以看作是一个裸机综合例程。现在的 uboot 已经支持液晶屏、网络、USB 等高级功能。uboot 官网为 http://www.denx.de/wiki/U-Boot/;我们可以下载里面源码。

方法二:平台用的是I.MX6ULL,可以去NXP官网下载,NXP 就 维 护 的 2016.03 这 个 版 本 的 uboot , 下 载 地 址 为 :

http://git.freescale.com/git/cgit.cgi/imx/uboot-imx.git/tag/?h=imx_v2016.03_4.1.15_2.0.0_ga&id=
rel_imx_4.1.15_2.1.0_ga

方法三:使用第三方uboot,核心板是购买正点原子的,因此可以使用他们针对核心板做的uboot。

 (2)编译与修改uboot文件

2.1下载好nxp的uboot后,找到 NXP 官方 I.MX6ULL EVK 开发板配置文件,命令编译 uboot:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_14x14_evk_emmc_defconfig
make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j16

也可以建一个shell脚本,mx6ull_14x14_emmc.sh在里面输入

#!/bin/bash
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
mx6ull_14x14_evk_emmc_defconfig
make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j16

输入命令./mx6ull_14x14_evk_emmc.sh就可以完成编译,编译完成以后会生成 u-boot.bin、u-boot.imx 等文件

使用下面命令把生成的uboot烧入SD卡内,再放到开发板上可以知道是否启动正常

chmod 777 imxdownload //给予 imxdownload 可执行权限
./imxdownload u-boot.bin /dev/sdb //烧写 u-boot.bin 到 SD 卡中

2.2修改文件适配自己的开发板

2.2.1先在 configs 目录下复制nxp做好的defconfig配置文件,黏贴后修改自己的名字,并修改里面信息

2.2.2再复制/include/configs里面的mx6ullevk.h文件并修改自己的名字,并修改内容

mx6ullevk.h 文件中基本都是“CONFIG_”开头的宏定义,这也说明 mx6ullevk.h 文件的主要功能就是配置或者裁剪 uboot。如果需要某个功能的话就在里面添加这个功能对应的 CONFIG_XXX 宏即可,如果不需要某个功能的话就删除掉对应的宏即可。

第 14 行,添加了头文件 mx6_common.h,如果在 mx6ull_alientek_emmc.h 中没有发现有配
置某个功能或命令,但是实际却存在的话,可以到 mx6_common.h 文件里面去找一下。
第 29~39 行,设置 DRAM 的大小,宏 PHYS_SDRAM_SIZE 就是板子上 DRAM 的大小,
如果用的NXP官方的9X9 EVK开发板的话DRAM大小就为256MB。否则的话默认为512MB,
正点原子的 I.MX6U-ALPHA 开发板用的是 512MB DDR3。
第 50 行,定义宏 CONFIG_DISPLAY_CPUINFO,uboot 启动的时候可以输出 CPU 信息。
第 51 行,定义宏 CONFIG_DISPLAY_BOARDINFO,uboot 启动的时候可以输出板子信息。
第 54 行,CONFIG_SYS_MALLOC_LEN 为 malloc 内存池大小,这里设置为 16MB。
第 56 行,定义宏 CONFIG_BOARD_EARLY_INIT_F,这样 board_init_f 函数就会调用
board_early_init_f 函数。
第 57 行,定义宏 CONFIG_BOARD_LATE_INIT,这样 board_init_r 函数就会调用
board_late_init 函数。
第 59、60 行,使能 I.MX6ULL 的串口功能,宏 CONFIG_MXC_UART_BASE 表示串口寄
存器基地址,这里使用的串口 1,基地址为 UART1_BASE,UART1_BASE 定义在文件
arch/arm/include/asm/arch-mx6/imx-regs.h 中,imx-regs.h 是 I.MX6ULL 寄存器描述文件,根据
imx-regs.h 可得到 UART1_BASE 的值如下:

UART1_BASE= (ATZ1_BASE_ADDR + 0x20000)
=AIPS1_ARB_BASE_ADDR + 0x20000
=0x02000000 + 0x20000

第63、64行, EMMC接在I.MX6ULL的USDHC2上,宏CONFIG_SYS_FSL_ESDHC_ADDR
为 EMMC 所使用接口的寄存器基地址,也就是 USDHC2 的基地址。
第 67~72 行,跟 NAND 相关的宏,因为 NAND 和 USDHC2 的引脚冲突,因此如果使用
NAND 的只能使用一个 USDHC 设备(SD 卡)。如果没有使用 NAND,那么就有两个 USDHC 设
备(EMMC 和 SD 卡),宏 CONFIG_SYS_FSL_USDHC_NUM 表示 USDHC 数量。EMMC 版本的
核心版没有用到 NAND,所以 CONFIG_SYS_FSL_USDHC_NUM=2。
第 75~81,和 I2C 有关的宏定义,用于控制使能哪个 I2C,I2C 的速度为多少。
第 92~96 行,NAND 的分区设置,如果使用 NAND 的话,默认的 NAND 分区为:
"mtdparts=gpmi-nand:64m(boot),16m(kernel),16m(dtb),1m(misc),-(rootfs) "

第 98~111 行,宏 CONFIG_MFG_ENV_SETTINGS 定义了一些环境变量,使用 MfgTool 烧
写系统时候会用到这里面的环境变量。
第 113~202 行 , 通 过 条 件 编 译 来 设 置 宏 CONFIG_EXTRA_ENV_SETTINGS , 宏
CONFIG_EXTRA_ENV_SETTINGS 也是设置一些环境变量,此宏会设置 bootargs 这个环境变
量,后面我们会详细分析这个宏定义。
第 204~217 行,设置宏 CONFIG_BOOTCOMMAND,此宏就是设置环境变量 bootcmd 的
值。后面会详细的分析这个宏定义。
第 220~222 行,设置命令 memtest 相关宏定义,比如使能命令 memtest,设置 memtest 测试
的内存起始地址和内存大小。
第 224 行,宏 CONFIG_SYS_LOAD_ADDR 表示 linux kernel 在 DRAM 中的加载地址,也
就是 linux kernel 在 DRAM 中的存储首地址,CONFIG_LOADADDR=0X80800000。
第 225 行,宏 CONFIG_SYS_HZ 为系统时钟频率,这里为 1000Hz。
第 227 行,宏 CONFIG_STACKSIZE 为栈大小,这里为 128KB。
第 230 行,宏 CONFIG_NR_DRAM_BANKS 为 DRAM BANK 的数量,I.MX6ULL 只有一
个 DRAM BANK,我们也只用到了一个 BANK,所以为 1。

第 231 行,宏 PHYS_SDRAM 为 I.MX6ULL 的 DRAM 控制器 MMDC0 所管辖的 DRAM 范
围起始地址,也就是 0X80000000。
第 233 行,宏 CONFIG_SYS_SDRAM_BASE 为 DRAM 的起始地址。
第 234 行,宏 CONFIG_SYS_INIT_RAM_ADDR 为 I.MX6ULL 内部 IRAM 的起始地址(也
就是 OCRAM 的起始地址),为 0X00900000。
第 235 行,宏 CONFIG_SYS_INIT_RAM_SIZE 为 I.MX6ULL 内部 IRAM 的大小(OCRAM
的大小),为 0X00040000=128KB。
第 237~240 行,宏 CONFIG_SYS_INIT_SP_OFFSET 和 CONFIG_SYS_INIT_SP_ADDR 与
初始 SP 有关,第一个为初始 SP 偏移,第二个为初始 SP 地址。
第256行,宏CONFIG_SYS_MMC_ENV_DEV为默认的MMC设备,这里默认为USDHC2,
也就是 EMMC。
第 257 行,宏 CONFIG_SYS_MMC_ENV_PART 为模式分区,默认为第 0 个分区。
第 258 行,宏 CONFIG_MMCROOT 设置进入 linux 系统的根文件系统所在的分区,这里设
置为"/dev/mmcblk1p2",也就是 EMMC 设备的第 2 个分区。第 0 个分区保存 uboot,第 1 个分
区保存 linux 镜像和设备树,第 2 个分区为 Linux 系统的根文件系统。
第 277~291 行,与 NAND 有关的宏定义,如果使用 NAND 的话。
第 293 行,宏 CONFIG_ENV_SIZE 为环境变量大小,默认为 8KB。
第 294~308 行,宏 CONFIG_ENV_OFFSET 为环境变量偏移地址,这里的偏移地址是相对
于存储器的首地址。如果环境变量保存在 EMMC 中的话,环境变量偏移地址为 12*64KB。如
果环境变量保存在 SPI FLASH 中的话,偏移地址为 768*1024。如果环境变量保存在 NAND 中
的话,偏移地址为 60<<20(60MB),并且重新设置环境变量的大小为 128KB。
第 312~323 行,与 USB 相关的宏定义。
第 325~342 行,与网络相关的宏定义,比如使能 dhcp、ping 等命令。第 331 行的宏
CONFIG_FEC_ENET_DEV 指定 uboot 所使用的网口,I.MX6ULL 有两个网口,为 0 的时候使
用 ENET1,为 1 的时候使用 ENET2。宏 IMX_FEC_BASE 为 ENET 接口的寄存器首地址,宏
CONFIG_FEC_MXC_PHYADDR 为网口 PHY 芯片的地址。宏 CONFIG_FEC_XCV_TYPE 为
PHY 芯片所使用的接口类型,I.MX6U-ALPHA 开发板的两个 PHY 都使用的 RMII 接口。
第 344~END,剩下的都是一些配置宏,比如 CONFIG_VIDEO 宏用于开启 LCD,
CONFIG_VIDEO_LOGO 使能 LOGO 显示,CONFIG_CMD_BMP 使能 BMP 图片显示指令。这
样就可以在 uboot 中显示图片了,一般用于显示 logo。

2.2.3再复制/board/freescale里面的mx6ullevk文件夹并修改自己的名字,并修改内容

imximage.cfg 

 Kconfig

MAINTAINCERS

 Makefile 

复制mx6ullevk.c文件粘贴改成自己的名字(和makeflie内.o文件名一致),并修改里面内容

此文件内包含许多外设驱动,LCD显示,网络

修改网络:

 

 再 drivers/net/phy/phy.c,添加如下代码。

编译和启动uboot:

重新编译 uboot,然后将 u-boot.bin 烧写到 SD 卡中并启动

建一个shell脚本,mx6ull_paopao_emmc.sh在里面输入

#!/bin/bash
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
mx6ull_paopao_emmc_defconfig
make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j16

输入命令./mx6ull_paopao_emmc.sh就可以完成编译,编译完成以后会生成 u-boot.bin、u-boot.imx 等文件

先格式化SD卡

./imxdownload u-boot.bin /dev/sdb 


 插入写好的sd卡,再上电启动,硬件电阻配置是SD卡启动。

启动信息如下:

 再设置ip地址信息网络就可以连接电脑

本次实验平台:

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PAOPAO824

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值