把NXP官方Uboot源码修改为支持韦东山的I.MX6ULL开发板的个人Uboot

目录

在其顶层目录下编译

添加属于自己的mx6ull板子

在此基础上修改LCD驱动

修改网络驱动

 



修改参考的是正点原子的开发板教程,由于正点原子和韦东山的开发板不一样,所以如果你使用的是正点原子的开发板,那么下面的步骤不适合你使用,但是可以参考

首先下载 linux 上面使用  minicom  串口工具,自行去下载使用

NXP 维护 uboot源码  百度网盘地址

链接: https://pan.baidu.com/s/1XFgogbB6umr6ROe26iXkqA  密码: wlbj
--来自百度网盘超级会员V2的分享

在其顶层目录下编译


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

运用之前的烧写知识烧入SD 卡,启动minicom发现uboot是可以正常启动的
但是可以直观的发现  LCD 和 网络驱动不匹配 需要做一些修改  LCD倒是不关心,但是网络驱动是必须要在uboot上面改好的,为了后面的NFS网络挂载等功能的学习

首先建立VScode工作空间  
怎么屏蔽一个项目空间不需要的文件?方法是在 VSCode 文件目录菜单最上面上建名为“.vscode”的文件夹
在.vscode 文件夹中新建一个名为“settings.json”的文件,然后在 settings.json 中输入如下这种格式的句子
然后刷新VScode就会发现相应的文件被屏蔽了

{
    "search.exclude": {
        "**/*.o":true,
        "**/*.su":true,
        "**/*.cmd":true,
        "arch/arc":true,
        "**/*.o":true,
        "**/*.su":true,
        "**/*.cmd":true,
        "arch/arc":true,
        "arch/avr32":true,
        "arch/blackfin":true,
        "arch/m68k":true,
        "arch/microblaze":true,
        "arch/mips":true,
         "arch/nds32":true,
         "arch/nios2":true,
         "arch/openrisc":true,
         "arch/powerpc":true,
         "arch/sandbox":true,
         "arch/sh":true,
         "arch/sparc":true,
         "arch/x86":true,
         "arch/arm/mach*":true,
         "arch/arm/cpu/arm11*":true,
         "arch/arm/cpu/arm720t":true,
         "arch/arm/cpu/arm9*":true,
         "arch/arm/cpu/armv7m":true,
         "arch/arm/cpu/armv8":true,
         "arch/arm/cpu/pxa":true,
         "arch/arm/cpu/sa1100":true,
         "board/[a-e]*":true,
         "board/[g-z]*":true,
         "board/[0-9]*":true,
         "board/[A-Z]*":true,
         "board/fir*":true,
         "board/freescale/b*":true,
         "board/freescale/l*":true,
         "board/freescale/m5*":true,
         "board/freescale/mp*":true,
         "board/freescale/c29*":true,
         "board/freescale/cor*":true,
         "board/freescale/mx7*":true,
         "board/freescale/mx2*":true,
         "board/freescale/mx3*":true,
         "board/freescale/mx5*":true,
         "board/freescale/p*":true,
         "board/freescale/q*":true,
 "board/freescale/t*":true,
 "board/freescale/v*":true,
 "configs/[a-l]*":true,
 "configs/[n-z]*":true,
 "configs/[A-Z]*":true,
 "configs/M[a-z]*":true,
 "configs/M[A-Z]*":true,
 "configs/M[0-9]*":true,
 "configs/m[a-w]*":true,
 "configs/m[0-9]*":true,
 "configs/[0-9]*":true,
 "include/configs/[a-l]*":true,
 "include/configs/[n-z]*":true,
 "include/configs/[A-Z]*":true,
 "include/configs/m[a-w]*":true,
    },

    "files.exclude": {
        "**/*.o":true,
        "**/*.su":true,
        "**/*.cmd":true,
        "arch/arc":true,
        "**/*.o":true,
       "**/*.su":true,
       "**/*.cmd":true,
       "arch/arc":true,
       "arch/avr32":true,
       "arch/blackfin":true,
       "arch/m68k":true,
       "arch/microblaze":true,
       "arch/mips":true,
        "arch/nds32":true,
        "arch/nios2":true,
        "arch/openrisc":true,
        "arch/powerpc":true,
        "arch/sandbox":true,
        "arch/sh":true,
        "arch/sparc":true,
        "arch/x86":true,
        "arch/arm/mach*":true,
        "arch/arm/cpu/arm11*":true,
        "arch/arm/cpu/arm720t":true,
        "arch/arm/cpu/arm9*":true,
        "arch/arm/cpu/armv7m":true,
        "arch/arm/cpu/armv8":true,
        "arch/arm/cpu/pxa":true,
        "arch/arm/cpu/sa1100":true,
        "board/[a-e]*":true,
        "board/[g-z]*":true,
        "board/[0-9]*":true,
        "board/[A-Z]*":true,
        "board/fir*":true,
        "board/freescale/b*":true,
        "board/freescale/l*":true,
        "board/freescale/m5*":true,
        "board/freescale/mp*":true,
        "board/freescale/c29*":true,
        "board/freescale/cor*":true,
        "board/freescale/mx7*":true,
        "board/freescale/mx2*":true,
        "board/freescale/mx3*":true,
        "board/freescale/mx5*":true,
        "board/freescale/p*":true,
        "board/freescale/q*":true,
"board/freescale/t*":true,
"board/freescale/v*":true,
"configs/[a-l]*":true,
"configs/[n-z]*":true,
"configs/[A-Z]*":true,
"configs/M[a-z]*":true,
"configs/M[A-Z]*":true,
"configs/M[0-9]*":true,
"configs/m[a-w]*":true,
"configs/m[0-9]*":true,
"configs/[0-9]*":true,
"include/configs/[a-l]*":true,
"include/configs/[n-z]*":true,
"include/configs/[A-Z]*":true,
"include/configs/m[a-w]*":true,
     }
 }

然后下面的添加和修改uboot

添加属于自己的mx6ull板子

到这个目录下面复制一份文件属于自己
  cd configs/
  cp mx6ull_14x14_evk_emmc_defconfig mx6ull_hjd_uboot_emmc_defconfig

在文件相应地方修改一下名字

CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=board/freescale/mx6ull_hjd_uboot_emmc/imximage.cfg,MX6ULL_EVK_EMMC_REWORK"
CONFIG_ARM=y
CONFIG_ARCH_MX6=y
CONFIG_TARGET_MX6ULL_HJD_UBOOT_EMMC=y
CONFIG_CMD_GPIO=y


到这个目录下面复制一份文件属于自己
  cd include/configs
  cp mx6ullevk.h mx6ull_hjd_uboot_emmc.h
把防止重定义的头宏定义名字改成自己的即可

 mx6ull_hjd_uboot_emmc.h里面有很多宏定义,这些宏定义基本用于配置 uboot,也有一些
 I.MX6ULL 的 配 置 项 目 。 如 果 我 们 自 己 要 想 使 能 或 者 禁 止 uboot 的 某 些 功 能 , 那 就 在
mx6ull_hjd_uboot_emmc.h 里面做修改即可

复制一份板级文件夹给自己
cd board/freescale/
cp mx6ullevk/ -r mx6ull_hjd_uboot_emmc

cd mx6ull_hjd_uboot_emmc
mv mx6ullevk.c  mx6ull_hjd_uboot_emmc.c

 

修改 mx6ull_hjd_uboot_emmc 目录下的 Makefile 文件

obj-y  := mx6ull_hjd_uboot_emmc.o

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

修改 mx6ull_hjd_uboot_emmc 目录下的 imximage.cfg 文件

#ifdef CONFIG_USE_PLUGIN
/*PLUGIN    plugin-binary-file    IRAM_FREE_START_ADDR*/
PLUGIN    board/freescale/mx6ull_hjd_uboot_emmc/plugin.bin 0x00907000
#else

修改 mx6ull_hjd_uboot_emmc 目录下的 Kconfig 文件


if TARGET_MX6ULL_HJD_UBOOT_EMMC

config SYS_BOARD
    default "mx6ull_hjd_uboot_emmc"

config SYS_VENDOR
    default "freescale"

config SYS_SOC
    default "mx6"

config SYS_CONFIG_NAME
    default "mx6ull_hjd_uboot_emmc"
    
endif

修改 mx6ull_hjd_uboot_emmc 目录下的 MAINTAINERS 文件

MX6ULL_HJD_TEST_UBOOT _EMMC BOARD
M:    Peng Fan
S:    Maintained
F:    board/freescale/mx6ull_hjd_uboot_emmc/
F:    include/configs/mx6ull_hjd_uboot_emmc.h

修改 U-Boot 图形界面配置文件
uboot 是支持图形界面配置,关于 uboot 的图形界面配置下一章会详细的讲解。修改文件
arch/arm/cpu/armv7/mx6/Kconfig(如果用的 I.MX6UL 的话,应该修改 arch/arm/Kconfig 这个文
件),在 207 行加入如下内容:

config TARGET_MX6ULL_HJD_UBOOT_EMMC
    bool "Support mx6ull_hjd_uboot_emmc"
    select MX6ULL
    select DM
    select DM_THERMAL

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

 source "board/freescale/mx6ull_hjd_uboot_emmc/Kconfig"


在 uboot 启动信息中会有“Board: MX6ULL 14x14 EVK”这一句,也就是说板子名字为
“MX6ULL 14x14 EVK”,要将其改为我们所使用的板子名字,打开板级文件夹下面的 mx6ull_hjd_uboot_emmc.c,找到函数
checkboard,将其下面的名字改掉即可

编译下载启动
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_hjd_uboot_emmc_defconfig
make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j16

到这里基于NXP的uboot添加自己的板子成功了


在此基础上修改LCD驱动

去 board/freescale/
mx6ull_hjd_uboot_emmc.c
找到下面函数修改如下

struct display_info_t const displays[] = {{
    .bus = MX6UL_LCDIF1_BASE_ADDR,
    .addr = 0,
    .pixfmt = 24,
    .detect = NULL,
    .enable    = do_enable_parallel_lcd,
    .mode    = {
        .name            = "TFT_HJD",
        .xres           = 1024,
        .yres           = 600,
        .pixclock       = 19531,
        .left_margin    = 140,
        .right_margin   = 160,
        .upper_margin   = 20,
        .lower_margin   = 12,
        .hsync_len      = 20,
        .vsync_len      = 3,
        .sync           = 0,
        .vmode          = FB_VMODE_NONINTERLACED
} } };

去/include/configs    mx6ull_hjd_uboot_emmc.h
下面把所有
panel=TFT43AB
修改成
panel=TFT_HJD

编译下载启动

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

********************************************************************************************************************
修改网络驱动

 

通过原理图发现韦东山的I.MX6ULL开发板开发板上面只有一个 lan8720 芯片,并且使用的是第二个网口 地址是0x1 接下来修改

首先修改 uboot 中的 ENET1 和 ENET2 的 PHY 地址和驱动,打开 mx6ull_hjd_uboot_emmc.h
这个文件
2、修改 ENET2 网络 PHY 的地址。
3、使能 SMSC 公司的 PHY 驱动。

将第 335 行的宏 CONFIG_FEC_MXC_PHYADDR改为 0x0。

第 345 行定了一个宏 CONFIG_PHY_MICREL,此宏用于使能 uboot 中 Micrel 公司的 PHY
驱动, KSZ8081 这颗 PHY 芯片就是 Micrel 公司生产的,不过 Micrel 已经被 Microchip 收购了。
如果要使用 LAN8720A,那么就得

将 CONFIG_PHY_MICREL 改为 CONFIG_PHY_SMSC,

也就是使能 uboot 中的 SMSC 公司中的 PHY 驱动,因为 LAN8720A 就是 SMSC 公司生产的。所

uboot 中 网络 PHY 芯 片地 址 修 改 完 成 以 后就 是网 络 复 位 引 脚 的 驱动 修改 了 , 打 开
mx6ull_hjd_uboot_emmc.c


#define IOX_SDI
IMX_GPIO_NR(5, 10)
#define IOX_STCP IMX_GPIO_NR(5, 7)
#define IOX_SHCP IMX_GPIO_NR(5, 11)
#define IOX_OE
IMX_GPIO_NR(5, 8)
示例代码 33.2.7.3 中以 IOX 开头的宏定义是 74LV595 的相关 GPIO,因为 NXP 官方
I.MX6ULL EVK 开发板使用 74LV595 来扩展 IO,两个网络的复位引脚就是由 74LV595 来控制
的。替换为如下所示代码:
示例代码 33.2.7.4 修改后的网络引脚
#define ENET2_RESET IMX_GPIO_NR(5, 6)


继续在 mx6ull_alientek_emmc.c 中找到如下代码:
示例代码 33.2.7.5 74LV595 引脚配置
static iomux_v3_cfg_t const iox_pads[] = {
/* IOX_SDI */
MX6_PAD_BOOT_MODE0__GPIO5_IO10 | MUX_PAD_CTRL(NO_PAD_CTRL),
/* IOX_SHCP */
MX6_PAD_BOOT_MODE1__GPIO5_IO11 | MUX_PAD_CTRL(NO_PAD_CTRL),
/* IOX_STCP */
MX6_PAD_SNVS_TAMPER7__GPIO5_IO07 | MUX_PAD_CTRL(NO_PAD_CTRL),
/* IOX_nOE */
MX6_PAD_SNVS_TAMPER8__GPIO5_IO08 | MUX_PAD_CTRL(NO_PAD_CTRL),
};

删除  继续找到

iox74lv_init 函数是 74LV595 的初始化函数,iox74lv_set 函数用于控制 74LV595 的 IO 输出
电平,将这两个函数全部删除掉!

找到 board_init 函数
board_init 会调用 imx_iomux_v3_setup_multiple_pads 和 iox74lv_init 这两个函数来初始化
74lv595 的 GPIO,将这两行删除掉

添加 I.MX6U-ALPHA 开发板网络复位引脚驱动

找到iomux_v3_cfg_t const fec1_pads[]

结构体数组 fec1_pads 和 fec2_pads 是 ENET1 和 ENET2 这两个网口的 IO 配置参数,在这

fec2_pads数组中添加网口的复位 IO 配置参数

MX6_PAD_SNVS_TAMPER6__GPIO5_IO06| MUX_PAD_CTRL(NO_PAD_CTRL),                      

找到函数 setup_iomux_fec

在第二个网口下面添加
    gpio_direction_output(ENET2_RESET, 1);
    gpio_set_value(ENET2_RESET, 0);
    mdelay(20);
    gpio_set_value(ENET2_RESET, 1);


修改 drivers/net/phy/phy.c 文件中的函数 genphy_update_link

,uboot 中的 LAN8720A 驱动有点问题,打开文件
drivers/net/phy/phy.c,找到函数 genphy_update_link,这是个通用 PHY 驱动函数,此函数用于更
新 PHY 的连接状态和速度。使用 LAN8720A 的时候需要在此函数中添加以下2代码


#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

编译下载启动
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_hjd_uboot_emmc_defconfig
make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j16

可以看到看到“Net: FEC1”这一行,提示当前使用的 FEC1 这个网口

配置网咯

服务器地址,也就是 Ubuntu 的有线网卡地址 自己配置好

ubootl里IP设置例如:

//开发板 IP 地址
setenv ipaddr 192.168.0.55
//开发板网卡 MAC 地址
setenv ethaddr 00:04:9f:04:d2:35
//开发板默认网关
setenv gatewayip 192.168.0.1
//开发板子网掩码
setenv netmask 255.255.255.0
//服务器地址,也就是 Ubuntu 的有线网卡地址
setenv serverip 192.168.0.66
//保存环境变量
saveenv

到这里ping一下主机地址,如果成功说明可以了,不成功的话请你细心检查

**************************************************************************

你可能感兴趣的:(嵌入式,linux)