imx6ull-系统移植篇11——U-Boot 移植(下)

目录

前言

移植过程

添加开发板默认配置文件

添加开发板对应的头文件

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

[修改Makefile 文件](#修改Makefile 文件)

[修改imximage.cfg 文件](#修改imximage.cfg 文件)

[修改Kconfig 文件](#修改Kconfig 文件)

[修改MAINTAINERS 文件](#修改MAINTAINERS 文件)

[修改 U-Boot 图形界面配置文件](#修改 U-Boot 图形界面配置文件)

[编译 uboot](#编译 uboot)

[LCD 驱动修改](#LCD 驱动修改)

修改源文件

修改头文件

修改环境变量

网络驱动修改

网络原理图

[网络 PHY 地址修改](#网络 PHY 地址修改)

删除原网络驱动

网络复位引脚驱动

修改板子名字


前言

在系统移植篇10:U-Boot 移植(上),我们已经将NXP官方的U-Boot在正点原子开发板上跑起来了,能跑但存在着一些问题。所以,本讲内容是学习如何在 uboot 中添加我们的开发板或者开发平台。

移植过程

添加开发板默认配置文件

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

cpp 复制代码
cd configs
cp mx6ull_14x14_evk_emmc_defconfig mx6ull_alientek_emmc_defconfig

打开文件 mx6ull_alientek_emmc_defconfig,内容如下:

将文件 mx6ull_alientek_emmc_defconfig 中的内容中,第1.4行修改成下面的:

cpp 复制代码
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

添加开发板对应的头文件

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

cpp 复制代码
cp include/configs/mx6ullevk.h include/configs/mx6ull_alientek_emmc.h

打开mx6ull_alientek_emmc.h文件,可见:

将这个条件编译修改为以下:

cpp 复制代码
#ifndef __MX6ULL_ALIENTEK_EMMC_CONFIG_H
#define __MX6ULL_ALIENTEK_EMMC_CONFIG_H

mx6ull_alientek_emmc.h 里面有很多宏定义。

主要包含:

  1. ​基础配置​​ - CPU信息显示、内存分配、板级初始化等

  2. ​存储接口配置​​ - MMC/SD、NAND Flash、QSPI Flash

  3. ​外设配置​​ - UART、I2C、USB、以太网等

  4. ​启动环境设置​​ - 环境变量、启动参数、生产模式设置

  5. ​特殊功能​​ - 视频显示、温度监测、Android支持等

如果我们自己要想使能或者禁止 uboot 的某些功能,那就在mx6ull_alientek_emmc.h 里面做修改即可。

cpp 复制代码
/*
 * Copyright (C) 2016 Freescale Semiconductor, Inc.
 * Configuration settings for the Freescale i.MX6UL 14x14 EVK board.
 * SPDX-License-Identifier: GPL-2.0+
 */
#ifndef __MX6ULL_ALIENTEK_EMMC_CONFIG_H
#define __MX6ULL_ALIENTEK_EMMC_CONFIG_H

/* 头文件包含说明:
 * mx6_common.h包含i.MX6系列通用配置,如果当前文件中未找到某些配置,
 * 可能定义在mx6_common.h中
 */
#include <asm/arch/imx-regs.h>
#include <linux/sizes.h>
#include "mx6_common.h"
#include <asm/imx-common/gpio.h>

/* 内存配置说明:
 * 9x9 EVK开发板使用256MB DRAM,正点原子I.MX6U-ALPHA开发板使用512MB DDR3
 * 通过CONFIG_TARGET_MX6ULL_9X9_EVK宏区分不同开发板
 */
#ifdef CONFIG_TARGET_MX6ULL_9X9_EVK
#define PHYS_SDRAM_SIZE        SZ_256M  // 9x9 EVK开发板DRAM大小
#define CONFIG_BOOTARGS_CMA_SIZE   "cma=96M "
#else
#define PHYS_SDRAM_SIZE        SZ_512M  // 默认DRAM大小(14x14 EVK或正点原子开发板)
#define CONFIG_BOOTARGS_CMA_SIZE   ""
#undef CONFIG_LDO_BYPASS_CHECK      // 14x14 EVK使用DCDC,不需要PMIC旁路检查
#endif

/* 基础功能配置 */
#define CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
#define CONFIG_DISPLAY_CPUINFO       // 启动时输出CPU信息
#define CONFIG_DISPLAY_BOARDINFO     // 启动时输出板级信息
#define CONFIG_SYS_MALLOC_LEN        (16 * SZ_1M)  // 内存池大小16MB
#define CONFIG_BOARD_EARLY_INIT_F    // 使能board_early_init_f函数
#define CONFIG_BOARD_LATE_INIT       // 使能board_late_init函数

/* 串口配置说明:
 * 使用UART1作为控制台,基地址为0x02020000
 * 寄存器定义见arch/arm/include/asm/arch-mx6/imx-regs.h
 */
#define CONFIG_MXC_UART
#define CONFIG_MXC_UART_BASE         UART1_BASE

/* 存储接口配置 */
#ifdef CONFIG_FSL_USDHC
#define CONFIG_SYS_FSL_ESDHC_ADDR    USDHC2_BASE_ADDR  // EMMC控制器基地址

/* NAND与USDHC2引脚冲突处理 */
#ifdef CONFIG_SYS_USE_NAND
#define CONFIG_SYS_FSL_USDHC_NUM     1  // 使用NAND时只有1个USDHC
#else
#define CONFIG_SYS_FSL_USDHC_NUM     2  // 默认有2个USDHC(EMMC+SD卡)
#endif
#endif

/* I2C配置说明:
 * 使能I2C1和I2C2,速度100kHz
 * 9x9 EVK使用PFUZE3000电源管理IC,地址0x08
 */
#define CONFIG_CMD_I2C
#ifdef CONFIG_CMD_I2C
#define CONFIG_SYS_I2C
#define CONFIG_SYS_I2C_MXC
#define CONFIG_SYS_I2C_MXC_I2C1      // 使能I2C1
#define CONFIG_SYS_I2C_MXC_I2C2      // 使能I2C2
#define CONFIG_SYS_I2C_SPEED         100000

/* 仅9X9 EVK需要PMIC配置 */
#define CONFIG_POWER
#define CONFIG_POWER_I2C
#define CONFIG_POWER_PFUZE3000
#define CONFIG_POWER_PFUZE3000_I2C_ADDR  0x08
#endif

/* 环境变量存储配置 */
#define CONFIG_SYS_MMC_IMG_LOAD_PART    1  // 从MMC分区1加载镜像

/* NAND分区设置 */
#ifdef CONFIG_SYS_BOOT_NAND
#define CONFIG_MFG_NAND_PARTITION "mtdparts=gpmi-nand:64m(boot),16m(kernel),16m(dtb),1m(misc),-(rootfs) "
#else
#define CONFIG_MFG_NAND_PARTITION ""
#endif

/* 生产模式环境设置 */
#define CONFIG_MFG_ENV_SETTINGS \
    "mfgtool_args=setenv bootargs console=${console},${baudrate} " \
        CONFIG_BOOTARGS_CMA_SIZE \
        "rdinit=/linuxrc " \
        "g_mass_storage.stall=0 g_mass_storage.removable=1 " \
        "g_mass_storage.file=/fat g_mass_storage.ro=1 " \
        "g_mass_storage.idVendor=0x066F g_mass_storage.idProduct=0x37FF "\
        "g_mass_storage.iSerialNumber=\"\" "\
        CONFIG_MFG_NAND_PARTITION \
        "clk_ignore_unused "\
        "\0" \
    "initrd_addr=0x83800000\0" \
    "initrd_high=0xffffffff\0" \
    "bootcmd_mfg=run mfgtool_args;bootz ${loadaddr} ${initrd_addr} ${fdt_addr};\0"

/* 启动配置(完整定义见原始文件) */
#if defined(CONFIG_SYS_BOOT_NAND)
    // NAND启动配置...
#else
    // MMC/SD卡启动配置...
#endif

/* 内存测试配置 */
#define CONFIG_CMD_MEMTEST
#define CONFIG_SYS_MEMTEST_START    0x80000000
#define CONFIG_SYS_MEMTEST_END      (CONFIG_SYS_MEMTEST_START + 0x8000000)

/* 内存映射配置 */
#define CONFIG_NR_DRAM_BANKS        1       // DRAM BANK数量
#define PHYS_SDRAM                  MMDC0_ARB_BASE_ADDR  // DRAM起始地址0x80000000
#define CONFIG_SYS_SDRAM_BASE       PHYS_SDRAM
#define CONFIG_SYS_INIT_RAM_ADDR    IRAM_BASE_ADDR      // OCRAM起始地址0x00900000
#define CONFIG_SYS_INIT_RAM_SIZE    IRAM_SIZE           // OCRAM大小128KB

/* 栈指针设置 */
#define CONFIG_SYS_INIT_SP_OFFSET \
    (CONFIG_SYS_INIT_RAM_SIZE - GENERATED_GBL_DATA_SIZE)
#define CONFIG_SYS_INIT_SP_ADDR \
    (CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_SP_OFFSET)

/* MMC环境配置 */
#define CONFIG_SYS_MMC_ENV_DEV      1       // 默认MMC设备(USDHC2/EMMC)
#define CONFIG_SYS_MMC_ENV_PART     0       // 默认使用第0分区
#define CONFIG_MMCROOT              "/dev/mmcblk1p2"  // 根文件系统分区

/* QSPI Flash配置 */
#ifdef CONFIG_FSL_QSPI
#define CONFIG_QSPI_BASE            QSPI0_BASE_ADDR
#define CONFIG_QSPI_MEMMAP_BASE     QSPI0_AMBA_BASE
#define CONFIG_SF_DEFAULT_BUS       0
#define CONFIG_SF_DEFAULT_CS        0
#define CONFIG_SF_DEFAULT_SPEED     40000000
#define CONFIG_SF_DEFAULT_MODE      SPI_MODE_0
#endif

/* NAND配置 */
#ifdef CONFIG_SYS_USE_NAND
#define CONFIG_CMD_NAND
#define CONFIG_NAND_MXS
#define CONFIG_SYS_MAX_NAND_DEVICE  1
#define CONFIG_SYS_NAND_BASE        0x40000000
#endif

/* 环境变量存储位置 */
#define CONFIG_ENV_SIZE             SZ_8K
#if defined(CONFIG_ENV_IS_IN_MMC)
#define CONFIG_ENV_OFFSET           (12 * SZ_64K)  // EMMC环境变量偏移
#elif defined(CONFIG_ENV_IS_IN_SPI_FLASH)
#define CONFIG_ENV_OFFSET           (768 * 1024)   // SPI Flash偏移
#elif defined(CONFIG_ENV_IS_IN_NAND)
#define CONFIG_ENV_OFFSET           (60 << 20)     // NAND偏移60MB
#define CONFIG_ENV_SIZE             (128 << 10)    // NAND环境大小128KB
#endif

/* 网络配置说明:
 * ENET1 PHY地址0x2,ENET2 PHY地址0x1
 * 正点原子开发板两个PHY均使用RMII接口
 */
#define CONFIG_FEC_ENET_DEV         1       // 默认使用ENET2
#if (CONFIG_FEC_ENET_DEV == 0)
#define IMX_FEC_BASE                ENET_BASE_ADDR
#define CONFIG_FEC_MXC_PHYADDR      0x2
#elif (CONFIG_FEC_ENET_DEV == 1)
#define IMX_FEC_BASE                ENET2_BASE_ADDR
#define CONFIG_FEC_MXC_PHYADDR      0x1
#endif

/* 显示配置 */
#define CONFIG_VIDEO
#define CONFIG_VIDEO_LOGO           // 使能LOGO显示
#define CONFIG_CMD_BMP              // 使能BMP图片显示命令

#endif /* __MX6ULL_ALIENTEK_EMMC_CONFIG_H */

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

uboot 中每个板子都有一个对应的文件夹来存放板级文件,NXP 官方 I.MX6ULL EVK 开发板的板级文件夹存放在 board/freescale/mx6ullevk 。

复制 mx6ullevk,将其重命名为 mx6ull_alientek_emmc,命令如下:

cpp 复制代码
cd board/freescale/
cp mx6ullevk/ -r mx6ull_alientek_emmc

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

cpp 复制代码
cd mx6ull_alientek_emmc
mv mx6ullevk.c mx6ull_alientek_emmc.c

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

修改Makefile 文件

将上图标红的obj-y,改为 mx6ull_alientek_emmc.o,这样才会编译 mx6ull_alientek_emmc.c这个文件。

cpp 复制代码
obj-y  := mx6ull_alientek_emmc.o

修改imximage.cfg 文件

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

将上图标红的代码修改为以下:

cpp 复制代码
PLUGIN board/freescale/mx6ull_alientek_emmc /plugin.bin 0x00907000

修改Kconfig 文件

修改 mx6ull_alientek_emmc 目录下的 Kconfig 文件:

全部内容修改为以下:

cpp 复制代码
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 目录下的 MAINTAINERS 文件:

全部内容修改为如下:

cpp 复制代码
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 行左右加入如下内容:

代码如下:

cpp 复制代码
config TARGET_MX6ULL_ALIENTEK_EMMC
	bool "Support mx6ull_alientek_emmc"
	select MX6ULL
	select DM
	select DM_THERMAL

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

代码如下:

cpp 复制代码
source "board/freescale/mx6ull_alientek_emmc/Kconfig"

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

编译 uboot

使用新添加的板子配置编译 uboot,在 uboot 根目录下新建一个名为 mx6ull_alientek_emmc.sh 的 shell 脚本,脚本内容如下:

cpp 复制代码
#!/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

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

cpp 复制代码
chmod 777 mx6ull_alientek_emmc.sh //给予可执行权限,一次即可
./mx6ull_alientek_emmc.sh //运行脚本编译 uboot

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

cpp 复制代码
grep -nR "mx6ull_alientek_emmc.h"

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

编译完成以后就使用 imxdownload 将新编译出来的 u-boot.bin 烧写到 SD 卡中测试, SecureCRT 输出结果如图:

LCD 驱动修改

一般修改 LCD 驱动重点注意以下几点:

  • LCD 所使用的 GPIO,查看 uboot 中 LCD 的 IO 配置是否正确。
  • LCD 背光引脚 GPIO 的配置。
  • LCD 配置参数是否正确。

虽然笔者太穷了没有购买LCD,但是都学到这里了,还是做一些笔记(万一以后有钱了呢~)。

修改源文件

在board/freescale/mx6ull_alientek_emmc/路径下,打开文件 mx6ull_alientek_emmc.c,找到如下内容:

将这段代码替换为以下:

cpp 复制代码
struct display_info_t const displays[] = {{
	.bus = MX6UL_LCDIF1_BASE_ADDR,
 	.addr = 0,
 	.pixfmt = 24,
	.detect = NULL,
	 .enable = do_enable_parallel_lcd,
	.mode = {
 		.name = "TFT7016",
		 .xres = 1024,
 		.yres = 600,
 		.pixclock = 19531,
 		.left_margin = 140, //HBPD
 		.right_margin = 160, //HFPD
 		.upper_margin = 20, //VBPD
 		.lower_margin = 12, //VFBD
 		.hsync_len = 20, //HSPW
 		.vsync_len = 3, //VSPW
 		.sync = 0,
 		.vmode = FB_VMODE_NONINTERLACED
 } } };

修改头文件

修改include/configs/路径下的mx6ull_alientek_emmc.h文件,

将所有 panel=TFT43AB 修改为:

cpp 复制代码
panel=TFT7016

修改完成以后重新编译一遍 uboot 并烧写到 SD 中启动,重启以后 LCD 驱动一般就会工作正常。

修改环境变量

在 uboot 命令模式输入"print"来查看环境变量 panel 的值:

如果 EMMC 中的环境变量 panel 不等于 TFT7016,那么 LCD 显示肯定不正常,我们只需要在uboot 中修改 panel 的值为 TFT7016 即可,在 uboot 的命令模式下输入如下命令:

cpp 复制代码
setenv panel TFT7016
saveenv

保存,重启 uboot,再看LCD是否工作正常。

网络驱动修改

网络原理图

I.MX6U-ALPHA 开发板 ENET1 的网络原理图如图:

ENET1 的网络 PHY芯片为 SR8201F(器件地址为 0X2),通过 RMII 接口与 I.MX6ULL 相连,复位引脚ENET1_RST接到了 I.M6ULL 的 SNVS_TAMPER7 这个引脚上。

要修改 ENET1 网络驱动的话重点就三点:

  • ENET1 复位引脚初始化。
  • SR8201F 的器件 ID
  • SR8201F 驱动

再来看一下 ENET2 的原理图,如图:

ENET2 网络驱动的修改注意点如下:

  • ENET2 的复位引脚,ENET2_RST 接到了I.MX6ULL 的 SNVS_TAMPER8 上。
  • ENET2 所使用的 PHY 芯片器件地址为 0X1。
  • SR8201F 驱动

网络 PHY 地址修改

首先修改 uboot 中的 ENET1 和 ENET2 的 PHY 地址和驱动,打开include/configs/路径下的mx6ull_alientek_emmc.h文件。

网络相关驱动代码如下:

上述代码理论上有三处要修改:

  • 修改 ENET1 网络 PHY 的地址。
  • 修改 ENET2 网络 PHY 的地址。
  • 使能 REALTEK 公司的 PHY 驱动。

前面我们分析过:正点原子开发板的ENET1 的 PHY 地址默认是 0X2, ENET2 的 PHY 地址默认为 0x1。所有代码里phy地址不需要修改了。

使能phy驱动是通过宏,将CONFIG_PHY_MICREL替换为**#define CONFIG_PHY_REALTEK。**

修改后的代码如下:

cpp 复制代码
#ifdef CONFIG_CMD_NET  // 如果启用网络功能
#define CONFIG_CMD_PING    // 启用ping命令
#define CONFIG_CMD_DHCP    // 启用DHCP自动获取IP功能
#define CONFIG_CMD_MII     // 启用MII管理命令(用于PHY寄存器调试)
#define CONFIG_FEC_MXC     // 启用飞思卡尔以太网控制器驱动
#define CONFIG_MII         // 启用标准MII接口支持
#define CONFIG_FEC_ENET_DEV        1  // 默认使用ENET2网口(0=ENET1,1=ENET2)

/* 网口1(ENET1)配置 */
#if (CONFIG_FEC_ENET_DEV == 0)
#define IMX_FEC_BASE            ENET_BASE_ADDR  // ENET1寄存器基地址
#define CONFIG_FEC_MXC_PHYADDR          0x2     // ENET1的PHY地址(原理图决定)
#define CONFIG_FEC_XCV_TYPE             RMII    // 接口类型为RMII
/* 网口2(ENET2)配置 */
#elif (CONFIG_FEC_ENET_DEV == 1)
#define IMX_FEC_BASE            ENET2_BASE_ADDR // ENET2寄存器基地址
#define CONFIG_FEC_MXC_PHYADDR          0x1     // ENET2的PHY地址(原理图决定)
#define CONFIG_FEC_XCV_TYPE             RMII    // 接口类型为RMII
#endif
#define CONFIG_ETHPRIME          "FEC"  // 默认网口名称

/* PHY芯片驱动配置 */
#define CONFIG_PHYLIB            // 启用通用PHY库
#define CONFIG_PHY_REALTEK        // 使用对应公司的PHY驱动(如SR8201F)
#endif

删除原网络驱动

我们使用的phy芯片和NXP官方uboot里用到的不一致,所有没必要保留这部分驱动,也就是要删除 uboot 中 74LV595 的驱动代码,,并且修改网络复位引脚的驱动。

在board/freescale/mx6ull_alientek_emmc/路径下,打开文件 mx6ull_alientek_emmc.c,找到如下内容:

将上图中74LV595 的相关 GPIO删除。用以下代码替代:

cpp 复制代码
#define ENET1_RESET IMX_GPIO_NR(5, 7)
#define ENET2_RESET IMX_GPIO_NR(5, 8)

ENET1 的复位引脚连接到 SNVS_TAMPER7 上,对应 GPIO5_IO07, ENET2 的复位引脚连接到 SNVS_TAMPER8 上,对应 GPIO5_IO08。

在文件 mx6ull_alientek_emmc.c中,删除74LV595 的 IO 配置参数结构体:

在文件 mx6ull_alientek_emmc.c中,删除函数 iox74lv_init:

在文件 mx6ull_alientek_emmc.c中,删除函数iox74lv_set:

在 mx6ull_alientek_emmc.c 中找到 board_init 函数,此函数是板子初始化函数,会被board_init_r 调用。board_init 会调用 imx_iomux_v3_setup_multiple_pads 和 iox74lv_init 这两个函数来初始化74lv595 的 GPIO,将这两行删除掉。

至此, mx6ull_alientek_emmc.c 中关于 74LV595 芯片的驱动代码都删除掉了,接下来就是添加 I.MX6U-ALPHA 开发板两个网络复位引脚了。

网络复位引脚驱动

在board/freescale/mx6ull_alientek_emmc/路径下,打开文件 mx6ull_alientek_emmc.c,找到如下内容:

结构体数组 fec1_pads 和 fec2_pads 是 ENET1 和 ENET2 这两个网口的 IO 配置参数,在这两个数组中分别添加两个网口的复位 IO 配置参数:

fec1中最后一行加上:

cpp 复制代码
MX6_PAD_SNVS_TAMPER7__GPIO5_IO07 | MUX_PAD_CTRL(NO_PAD_CTRL),

fec2中最后一行加上:

cpp 复制代码
MX6_PAD_SNVS_TAMPER8__GPIO5_IO08 | MUX_PAD_CTRL(NO_PAD_CTRL),

继续在文件 mx6ull_alientek_emmc.c 中找到函数 setup_iomux_fec:

函数 setup_iomux_fec 就是根据 fec1_pads 和 fec2_pads 这两个网络 IO 配置数组来初始化I.MX6ULL 的网络 IO。

我们需要在其中添加网络复位 IO 的初始化代码,并且复位一下 PHY 芯片,修改后的 setup_iomux_fec 函数如下:

cpp 复制代码
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);
	 }
	 mdelay(150); /* 复位结束后至少延时 150ms 才能正常使用*/
 }

包含ENET1 和 ENET2 的复位 IO 初始化,将这两个 IO 设置为输出并且硬件复位一下 LAN8720A,这个硬件复位很重要。

最后复位结束以后一定要至少延时 150ms 才能操作 SR8201F,这个在 SR8201F 数据手册里面有详细要求的, 否则会导致 uboot 无法识别 SR8201F。

至此网络的复位引脚驱动修改完成,重新编译 uboot,然后将 u-boot.bin 烧写到 SD 卡中并启动, uboot 启动信息如图:

可以看到"Net: FEC1"这一行,提示当前使用的 FEC1 这个网口,也就是 ENET2。

在 uboot 中使用网络之前要先设置几个环境变量,命令如下:

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

设置好环境变量以后就可以在 uboot 中使用网络了,用网线将 I.MX6U-ALPHA 上的 ENET2与电脑或者路由器连接起来,保证开发板和电脑在同一个网段内。

可以通过 ping 命令来测试一下网络连接:

如果想测试一下 ENET1 的网络是否正常工作,打开 mx6ull_alientek_emmc.h,将 CONFIG_FEC_ENET_DEV 改为 0,然后重新编译一下 uboot 并烧写到 SD 卡中重启。

uboot 输出信息如图:

ping 主机也成功,就说明 ENET1 网络工作正常。

修改板子名字

在 uboot 启动信息中会打印板子名称,"Board: MX6ULL 14x14 EVK",要将其改为我们所使用的板子名字,比如" MX6ULL ALIENTEK EMMC"。

在board/freescale/mx6ull_alientek_emmc/路径下,打开文件 mx6ull_alientek_emmc.c,找到如下内容:

puts函数的打印内容修改为自己的板子。比如我是这样的:

cpp 复制代码
int checkboard(void)
{
	if (is_mx6ull_9x9_evk())
		puts("Board: MX6ULL 9x9 EVK\n");
	else
		puts("Board: MX6ULL ALIENTEK EMMC\n");
	return 0;
}

修改完成以后重新编译 uboot 并烧写到 SD 卡中验证, uboot 启动信息如图:

至此 uboot 的驱动部分就修改完成了, uboot 移植也完成了。

uboot 的最终目的就是启动 Linux 内核,所以需要通过启动 Linux 内核来判断 uboot 移植是否成功。我们下讲内容再来继续学习。

相关推荐
t198751282 小时前
在Ubuntu 22.04系统上安装libimobiledevice
linux·运维·ubuntu
skywalk81632 小时前
linux安装Code Server 以便Comate IDE和CodeBuddy等都可以远程连上来
linux·运维·服务器·vscode·comate
晚风吹人醒.3 小时前
缓存中间件Redis安装及功能演示、企业案例
linux·数据库·redis·ubuntu·缓存·中间件
Hard but lovely4 小时前
linux: pthread库的使用和理解
linux
这儿有一堆花5 小时前
Kali Linux:探测存活到挖掘漏洞
linux·运维·服务器
松涛和鸣6 小时前
从零开始理解 C 语言函数指针与回调机制
linux·c语言·开发语言·嵌入式硬件·排序算法
皮小白6 小时前
ubuntu开机检查磁盘失败进入应急模式如何修复
linux·运维·ubuntu
邂逅星河浪漫7 小时前
【CentOS】虚拟机网卡IP地址修改步骤
linux·运维·centos
hhwyqwqhhwy7 小时前
linux 驱动开发相关
linux·驱动开发
IT逆夜7 小时前
实现Yum本地仓库自动同步的完整方案(CentOS 7)
linux·运维·windows