I.MX6ull mini板的uboot移植

前言

    将NXP出的uboot添加自己的板子,移植到I.MX6ull的mini板中,使用的屏幕为4.8寸,分辨率为800x480的LCD显示屏。

行文目录

  • 前言
  • 准备工作
  • 在Uboot中添加自己的开发板
    • 添加文件
      • 添加开发板默认配置文件
      • 添加开发板对应的头文件
      • 添加开发板对应的板级文件夹
    • 修改U-Boot图形界面配置文件
    • LCD与网络驱动修改
  • 参考文献

准备工作

    首先利用FileZilla,将uboot-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2压缩包放进虚拟机中,这里我放到了uboot文件夹中。

在这里插入图片描述

    之后我们将这个压缩包进行解压,解压到当前目录中,随后我们打开VSCode,创建一个新工程,方便我们后续修改。依次按下面的方式打开我们刚刚解压的文件。

File->Open Folder

    打开后我们先将工程保存一下,依次按下面的顺序点击保存工作空间,工作空间的文件名字可以按照自己的想法命名,此处我命名为u-boot.code-workspace

File->Save WorkSpace As

在这里插入图片描述
    进入到configs文件夹中,里面有很多配置文件,我们使用的是mx6ulll系列的,因此向下找到mx6ull开头的配置文件。mx6ull有9x9mm和14x14mm的,整点原子的是14x14mm并且楼主使用的是emmc版,因此我们要修改mx6ull_14x14_evk_emmc_defconfig作为默认配置文件。
在这里插入图片描述
    为了方便编译,我们在顶层的makefile中指定架构和交叉编译器,在其中的环境变量是ARCH和CROSS_COMPILE,如下所示:

在这里插入图片描述
    接下来我们要进入到解压后的路径,使用make指令,调用这个makefile编译uboot,具体指令如下:

make mx6ull_14x14_evk_emmc_defconfig
make V=1 -j16

    看到下面的提示信息就可以确定我们编译成功了。

在这里插入图片描述
    创建一个脚本,其中的内容是刚刚编译uboot的指令,

vi mx6ull_14x14_evk_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

    写完之后保存文件

按完esc后点击 :wq

    然后我们给这个文件执行权限,可以直接给777,需要看到文件的颜色变成绿色,即表示有执行权限了。

chmod 777 mx6ull_14x14_evk_emmc.sh

在这里插入图片描述
    将imxdownload文件拷贝到uboot的根目录下,即刚解压的文件夹目录下。

在这里插入图片描述
    在插入sd卡之前,使用下列指令,查看已有的挂载磁盘,之后插入sd卡后,也要查看一次,看看新的sd卡挂载在哪里
在这里插入图片描述

在这里插入图片描述
    所以我们可以看到,楼主这里的sd是/dev/sdb,下面的sdb1和sdb2是两个分区,此时我们需要用imxdownload将编译后的可执行文件u-boot.bin下载进sd卡中。

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

    出现如下所示即是下载成功
在这里插入图片描述
    我们将开发板调整为SD卡启动(拨码开关调整为:10000010)

在这里插入图片描述

    我们将SD卡或者TF卡插入板子中,清空mobaXterm或者SecureCRT的界面,按下复位按键,可以看到如下信息,在最后出现Hit any key to stop autoboot的那一行会出现3秒倒计时,我们不需要启动内核,因此直接按下回车即可进入uboot模式。

在这里插入图片描述
    此时板子的屏幕上会出现这种画面,因为楼主用的是4.3寸的屏幕,而NXP官方的I.MX6ULL的屏幕就是4.3寸 480x272分辨率,因此LCD驱动是正常的。
在这里插入图片描述

在Uboot中添加自己的开发板

添加文件

添加开发板默认配置文件

    在configs目录下创建默认配置文件,复制的是我们上文用到的mx6ull_14x14_evk_emmc_defconfig,修改命名为mx6ull_alientek_emmc_defconfig,我们后续的修改就是在这上面修改

cd configs
cp mx6ull_14x14_evk_emmc_defconfig mx6ull_alientek_emmc_defconfig

    然后我们回到VSCode,在configs文件夹下找到我们刚创建的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

添加开发板对应的头文件

    我们退回到uboot解压的根目录下,进入include/configs下添加我们板子对应的头文件,复制include/configs/mx6ullevk.h,重命名为mx6ull_alientek_emmc.h

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

    之后将最上面的两行宏定义改为如下所示

#ifndef __MX6ULL_ALIENTEK_EMMC_CONFIG_H
#define __MX6ULL_ALIENTEK_EMMC_CONFIG_H

    后续的修改如下所示,后面的注释会标明在第几行

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

    回到原来的uboot的根目录,然后进入到board文件夹下freescale文件夹,复制mx6ullevk文件夹,重命名为mx6ull_alientek_emmc,这个文件夹就是我们要修改的板级文件夹,同时将里面的mx6ullevk.c重命名为mx6ull_alientek_emmc.c。

cd board/freescale/
cp mx6ullevk/ -r mx6ull_alientek_emmc
cd mx6ull_alientek_emmc
mv mx6ullevk.c mx6ull_alientek_emmc.c

    接下来对mx6ull_alientek_emmc目录下的文件做一些修改
    首先是该目录下的Makefile,修改的地方为第一行,这样才会编译我们刚刚的mx6ull_alientek_emmc.c文件:

obj-y  := mx6ull_alientek_emmc.o

    在同文件夹下的imximage.cfg文件,将第三十四行改为如下所示,将路径要改为当前的mx6ull_alientek_emmc。

PLUGIN	board/freescale/mx6ull_alientek_emmc/plugin.bin 0x00907000     # 第三十四行

    同样在当前文件夹下的Kconfig文件,修改内容如下,主要修改的是第一行,添加config SYS_SOC,修改config SYS_BOARD和config SYS_CONFIG_NAME下的内容:

if TARGET_MX6ULL_ALIENTEK_EMMC

config SYS_BOARD
	default "mx6ull_alientek_emmc"

config SYS_VENDOR
	default "freescale"

config SYS_SOC
	default "mx6"

config SYS_CONFIG_NAME
	default "mx6ull_alientek_emmc"

endif

    修改MAINTAINERS文件,修改结果如下:

MX6ULL_ALIENTEK_EMMC BOARD
M:	Peng Fan <peng.fan@nxp.com>
S:	Maintained
F:	board/freescale/mx6ull_alientek_emmc/
F:	include/configs/mx6ull_alientek_emmc.h

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

    回到根目录,打开arch/arm/cpu/armv7/mx6/Kconfig文件,在207行添加内容:

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"

    至此我们可以编译这个新加板子后的uboot了,返回到根目录下,新建一个新的脚本文件名叫mx6ull_alientek_emmc.sh用来执行make指令。其他地方都和之前的脚本一样,不一样的是第二个make是我们新的板级文件mx6ull_alientek_emmc_defconfig:

#!/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- -j16

    之后我们给这个文件执行权限并执行编译uboot

chmod 777 mx6ull_alientek_emmc.sh
./mx6ull_alientek_emmc.sh

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

LCD与网络驱动修改

struct display_info_t const displays[] = {{
	.bus = MX6UL_LCDIF1_BASE_ADDR,
	.addr = 0,
	.pixfmt = 24,
	.detect = NULL,
	.enable	= do_enable_parallel_lcd,
	.mode	= {
		.name           = "TFT4384",
		.xres           = 800,
		.yres           = 480,
		.pixclock       = 32258,
		.left_margin    = 88,     // HBP
		.right_margin   = 40,     // HFP
		.upper_margin   = 32,	  // VBP
		.lower_margin   = 13,	  // VFP
		.hsync_len      = 48,	  // HSP
		.vsync_len      = 3,	  // VSP
		.sync           = 0,
		.vmode          = FB_VMODE_NONINTERLACED
    }
} };

在这里插入图片描述

int checkboard(void)
{
	if (is_mx6ull_9x9_evk())
		puts("Board: MX6ULL 9x9 EVK\n");
	else
		puts("Board: MX6ULL 14x14 EVK\n");

	return 0;
}

在这里插入图片描述

在这里插入图片描述

bootcmd=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
setenv bootcmd 'mmc dev 1; fatload mmc 1:1 80800000 zImage; fatload mmc 1:1 83000000 imx6ull-alientek-emmc.dtb; bootz 80800000 -83000000;'

在这里插入图片描述

setenv bootargs 'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw'

参考文献

[1] 【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.81

  • 20
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值