【imx6ull】将NXP的uboot移植到正点原子EMMC版本流程 非常详解

按照自己的习惯新建目录存放uboot的源码

在正点原子资料获取NXP的uboot,或者进入NXP的官网下载

解压源码 在普通用户存放,而且是用vscode开发的话 不建议加sudo

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

一:添加开发板uboot默认配置文件

        config目录 存放的是默认的配置文件 

        拷贝一份NXP的,然后修改里面文件

cd configs
cp mx6ull_14x14_evk_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

二:添加开发板uboot对应的头文件

        复 制 目录下的  include/configs/mx6ullevk.h, 并重命名为 mx6ull_alientek_emmc.h 

cp include/configs/mx6ullevk.h include/configs/mx6ull_alientek_emmc.h
        mx6ull_alientek_emmc.h  头文件用于配置 uboot,头文件都是“ CONFIG_ ”开头宏定义来实现的,可以实现配置和裁剪
        修改一:条件编译改为 头文件相匹配的宏定义
        
#ifndef __MX6ULLEVK_CONFIG_H
#define __MX6ULLEVK_CONFIG_H

改为

#ifndef __MX6ULL_ALIENTEK_EMMC_CONFIG_H
#define __MX6ULL_ALIENTEK_EMMC_CONFIG_H

三:分析mx6ull_alientek_emmc.h头文件 大概三百多行 我只说EMMC版本有关的

总结:uboot的头文件就是配置文件。配置自己想要的功能。

CONFIG_CMD_**是使能哪些命令,比如:CONFIG_CMD_MEMTEST 使能这个内存函数

CONFIG_SYS_**配置系统的功能,比如:CONFIG_SYS_MEMTEST_START 设置这个函数的开启地址

CONFIG_(设备名)_**配置uboot支持的某个设备,比如CONFIG_VIDEO_BMP_LOGO 启动lcd启动图片bmp的logo

因此能看懂会配置(添加\删除\修改)自己想要的功能就可以啦

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

        uboot 中每个板子都有一个对应的文件夹来存放板级文件
        NXP 的 I.MX 系列芯片的所有板级文件夹都存放在 board/freescale 目录下,在这个目录下
有个名为 mx6ullevk 的文件夹,这个文件夹就是 NXP 官方 I.MX6ULL EVK 开发板的板级文件
夹。
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 目 录

1 、修改 mx6ull_alientek_emmc 目录下的 Makefile 文件
        
        我们重命名了,需要修改对应的文件名字,不然编译找不到
        修改如下:
# (C) Copyright 2015 Freescale Semiconductor, Inc.
#
# SPDX-License-Identifier: GPL-2.0+
# 
obj-y  := mx6ull_alientek_emmc.o

extra-$(CONFIG_USE_PLUGIN) :=  plugin.bin
$(obj)/plugin.bin: $(obj)/plugin.o
	$(OBJCOPY) -O binary --gap-fill 0xff $< $@

        
2 、修改 mx6ull_alientek_emmc 目录下的 imximage.cfg 文件
        
        因为我们新建的板级文件夹需要修改用到的目录
PLUGIN board/freescale/mx6ull_alientek_emmc /plugin.bin 0x00907000

3 、修改 mx6ull_alientek_emmc 目录下的 Kconfig 文件
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

4 、修改 mx6ull_alientek_emmc 目录下的 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

5.修改 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

               第二个

source "board/freescale/mx6ull_alientek_emmc/Kconfig"

好啦,板级文件夹对应的文件添加完咯!!1
        总结:板级文件夹从零写,不太可能,基本都是在原有的基础上修改和适配。发现基本都是 1. 改路径,2. 添加我们的开发板的板级文件夹配置
        这就完了?NO NO NO!! 这只是添加我们开发板的,还有开发板的细节,比如开发板的引脚都一样吗?有的芯片驱动都一样?不一定,所以要学会看数据手册和原理图(努力学习ing)
先编译叭!
五,编译
        在终端太麻烦了,用shell脚本,编写命令
        新建一个shell脚本,名字随便,然后赋可执行权限

ARCH=arm 表示是ARM架构

CROSS_COMPILE=arm-linux-gnueabihf- 表示交叉编译器为 arm-linux-gnueabihf-

#!/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
        
        编译
        
./mx6ull_14x14_emmc.sh

        成功!!

        烧入SD卡

        

六:上板验证

        只接串口线就可以啦!

        看到终端输出,我们可以捋捋需要修改什么?

       1. 自己LCD的分辨率跟NXP不一样,需要修改

        2.以太网需要修改,为了我们后面用uboot通过以太网接口拉取linux内核和设备树,作为一个网络调试做铺垫

        3,板子信息改为正点原子(不是必要)

    现在开始细节修改咯!    我没有LCD屏幕,就只修改网络就可以了

七.网络驱动修改 (后面我会出一期怎么知道要修改哪个引脚)
        
        正点原子的网络方案是怎么样的?
        内部有个以太网 MAC 外设,也就是 ENET ,外接一个 PHY 芯片来实 现网络通信功能,也就是内部 MAC+ 外部 PHY 芯片的方案。          
        I.MX6UL/ULL 有两个网络接口 ENET1 ENET2,其中 ENET1 ENET2 都使用 LAN8720A 作为 PHY 芯片。 NXP 官方的 I.MX6ULL EVK 开发板使用 KSZ8081 这颗 PHY 芯片     
        ENET1 的网络 PHY 芯片为 LAN8720A ,通过 RMII 接口与 I.MX6ULL 相连,正点原子
I.MX6U-ALPHA 开发板的 ENET1 引脚与 NXP 官方的 I.MX6ULL EVK 开发板基本一样,唯独
复位引脚不同。
        因此,修改 ENET1 网络驱动:        
        ①、ENET1 复位引脚初始化。
        ②、LAN8720A 的器件 ID
        ③、LAN8720 驱动
        7.1.网络 PHY 地址修改
                 打开 mx6ull_alientek_emmc.h 头文件 只要修改网络的ENET配置部分就可以了
坑:后面我用ENET2了 
#define CONFIG_PHY_SMSC
        
        
        

        7.2  删除 uboot 74LV595 的驱动代码 也就是NXP的芯片代码
        
                打开 mx6ull_alientek_emmc.c
#define ENET1_RESET IMX_GPIO_NR(5, 7)
#define ENET2_RESET IMX_GPIO_NR(5, 8)

                        

  

7.3 、添加 I.MX6U-ALPHA 开发板网络复位引脚驱动
MX6_PAD_SNVS_TAMPER7__GPIO5_IO07 | MUX_PAD_CTRL(NO_PAD_CTRL),
MX6_PAD_SNVS_TAMPER8__GPIO5_IO08 | MUX_PAD_CTRL(NO_PAD_CTRL),

        

static void setup_iomux_fec(int fec_id)
{
	if (fec_id == 0)
	{
		imx_iomux_v3_setup_multiple_pads(fec1_pads,
						 ARRAY_SIZE(fec1_pads));

		gpio_direction_output(ENET1_RESET, 1);
		gpio_set_value(ENET1_RESET, 0);
		mdelay(20);
		gpio_set_value(ENET1_RESET, 1);
	}
	else
	{
		imx_iomux_v3_setup_multiple_pads(fec2_pads,
						 ARRAY_SIZE(fec2_pads));
		gpio_direction_output(ENET2_RESET, 1);
		gpio_set_value(ENET2_RESET, 0);
		mdelay(20);
		gpio_set_value(ENET2_RESET, 1);

	}
}

7.4、修改 drivers/net/phy/phy.c 文件中的函数 genphy_update_link
#ifdef CONFIG_PHY_SMSC
	static int lan8720_flag = 0;
	int bmcr_reg = 0;
	if (lan8720_flag == 0) {
		bmcr_reg = phy_read(phydev, MDIO_DEVAD_NONE, MII_BMCR); 
		phy_write(phydev, MDIO_DEVAD_NONE, MII_BMCR, BMCR_RESET); 
		while(phy_read(phydev, MDIO_DEVAD_NONE, MII_BMCR) & 0X8000) {
			udelay(100); 
	}	
		phy_write(phydev, MDIO_DEVAD_NONE, MII_BMCR, bmcr_reg); 
		lan8720_flag = 1;
	}
#endif

        

搞定!编译,烧入SD卡!!!

说明,ENET1 正常!!!

设置ENET1的IP 、MAC、默认网关、子网掩码、服务器地址

其中:IP地址、子网掩码、服务器地址自己随意配置,要求前面9位数字相同

MAC 必须是b8:ae:1d:01:00:00

setenv ipaddr 192.168.110.110 //开发板 IP 地址
setenv ethaddr b8:ae:1d:01:00:00 //开发板网卡 MAC 地址
setenv gatewayip 192.168.110.1 //开发板默认网关
setenv netmask 255.255.255.0 //开发板子网掩码
setenv serverip 192.168.110.8 //服务器地址,也就是 Ubuntu 地址
saveenv //保存环境变量

关于服务器通过网线桥接开发板,我可以参考我写的这个

最后!!!host 192.168.******* is alive 表示成功!!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值