欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-04-28 07:59:31
...

目录

在其顶层目录下编译  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板子

在此基础上修改LCD驱动

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


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

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

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

链接: https://pan.baidu.com/s/1bRqR9acRGHlKln5N3nmJTQ  密码: gihk
--来自百度网盘超级会员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 $< [email protected]

修改 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 <[email protected]>
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