200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > UBOOT移植(基于百问网IMX6ULL_PRO开发板)

UBOOT移植(基于百问网IMX6ULL_PRO开发板)

时间:2024-01-23 15:26:36

相关推荐

UBOOT移植(基于百问网IMX6ULL_PRO开发板)

文章目录

1. 引言1.1 Uboot源码目录1.2 与移植相关的目录 2. 烧写NXP官方开发板的uboot编译测试2.1 查找官方开发板的默认配置文件2.2 编译并烧写2.2.1 编译uboot2.2.2 烧写uboot至开发板 2.3 问题分析 3. 在Uboot中添加自己的开发板3.1 添加并修改开发板的默认配置文件3.2 添加并修改开发板对应的头文件3.3 添加并修改开发板对应的板级文件夹3.4 修改Uboot图形化配置界面的相关文件3.5 添加并修改设备树文件3.6 编译Uboot并烧写至开发板3.6 问题分析 4. 修改网络驱动4.1 相关基础4.2 修改驱动4.2.1 修改mx6ull_100ask_pro_emmc.h文件4.2.2 修改mx6ull_100ask_pro_emmc.c文件 4.3 编译与烧写Uboot

1. 引言

本文使用的开发板是百问网IMX6ULL_PRO开发板,使用的Uboot源码版本为.03。

1.1 Uboot源码目录

1.2 与移植相关的目录

2. 烧写NXP官方开发板的uboot编译测试

2.1 查找官方开发板的默认配置文件

找到NXP官网开发板的默认配置文件mx6ull_14x14_evk_emmc_defconfig,文件路径为Uboot-.03/configs

2.2 编译并烧写

2.2.1 编译uboot

在uboot源码的根目录下执行以下命令,编译uboot。

make distclean# 清除之前编译时生成的所有文件make mx6ull_14x14_evk_emmc_defconfig# 编译NXP官方evk开发板的默认配置文件,编译后会生成.config文件make -j4# 根据Makefile指定规则编译uboot

使用以上命令编译Uboot后,会在uboot源码的根目录下生成u-boot-dtb.imx文件

2.2.2 烧写uboot至开发板

生成u-boot-dtb.imx文件后就可以将其烧写至开发板EMMC或SD卡中,烧写方式有三种,如下:

使用开发板上的Linux系统来烧写在windows下使用百问网提供的USB烧写工具100ask_imx6ull_flashing_tool.exe来烧写在windows下使用正点原子提供的USB烧写工具imxdownload来烧写

本文使用第一种方法来烧写uboot至开发板,使用该方法的前提是开发板上已经运行了Linux系统并且挂在了nfs共享文件夹。如果要烧写至EMMC,则执行如下命令:

echo 0 > /sys/block/mmcblk1boot0/force_ro # 取消此分区的只读保护dd if=u-boot-dtb.imx of=/dev/mmcblk1boot0 bs=512 seek=2 # 实际烧写命令echo 1 > /sys/block/mmcblk1boot0/force_ro # 打开此分区的只读保护

如果要烧写至SD卡,则执行如下命令:

dd if=u-boot-dtb.imx of=/dev/mmcblk0 bs=512 seek=2

2.3 问题分析

将u-boot-dtb.imx文件烧写至emmc后重启开发板,可以看到uboot打印出如下信息:

可以看到图片中有Net: No ethernet found字样,即没有发现网卡。 然后,在uboot的命令行使用如下命令测试emmc是否正常:

mmc list# 查询mmc设备列表mmc dev x# 查询指定的emmc设备mmcinfo# 打印mmc信息

结果如下:

可以看出emmc正常。

因此,移植uboot时,可以对NXP官方imx6ullevk开发板的uboot文件进行修改,然后修复网络驱动,作为我们自己开发板的uboot。

3. 在Uboot中添加自己的开发板

3.1 添加并修改开发板的默认配置文件

1. 添加

在路径uboot-.03/configs下复制一份nxp官方imx6ullevk开发板的默认配置文件并重命名,作为我们自己开发板的默认配置文件。指令如下:

cp configs/mx6ull_14x14_evk_emmc_defconfig configs/mx6ull_100ask_pro_emmc_defconfig

此处的mx6ull_100ask_pro_emmc_defconfig即为我们自己开发板的默认配置文件。

2. 修改

创建好默认配置文件之后,要对其进行修改。首先使用如下命令用vim编辑器打开默认配置文件:

vi configs/mx6ull_100ask_pro_emmc_defconfig

修改前文件内容如下:

1 CONFIG_ARM=y2 CONFIG_ARCH_MX6=y3 CONFIG_TARGET_MX6ULL_14X14_EVK=y# 目标板名字4 CONFIG_VIDEO=y5 CONFIG_DEFAULT_DEVICE_TREE="imx6ull-14x14-evk-emmc"# 设备树名字,不带.dtb6 CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=board/freescale/mx6ullevk/imximage.cfg"# 系统外部操作7 CONFIG_BOOTDELAY=38 CONFIG_BOARD_EARLY_INIT_F=y9 CONFIG_HUSH_PARSER=y

此时,要修改的分别为第1、5、6行,修改后的配置文件如下:

1 CONFIG_ARM=y2 CONFIG_ARCH_MX6=y3 CONFIG_TARGET_MX6ULL_100ASK_PRO_EMMC=y4 CONFIG_VIDEO=y5 CONFIG_DEFAULT_DEVICE_TREE="imx6ull-100ask-pro-emmc"6 CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=board/freescale/mx6ull_100ask_pro_emmc/imximage.cfg"7 CONFIG_BOOTDELAY=38 CONFIG_BOARD_EARLY_INIT_F=y9 CONFIG_HUSH_PARSER=y

至此,我们自己开发板的默认配置文件就添加好了。

3.2 添加并修改开发板对应的头文件

1. 添加

在路径uboot-.03/include/configs下复制一份nxp官方imx6ullevk开发板的头文件文件并重命名,作为我们自己开发板的头文件。指令如下:

cp include/configs/mx6ullevk.h include/configs/mx6ull_100ask_pro_emmc.h

此处的mx6ull_100ask_pro_emmc.h即为我们自己开发板的头文件。在该头文件中定义了许多uboot后续会用到的宏,并且对开发板的相关特性进行了配置,比如配置开发板的哪个网卡作为默认网卡。

2. 修改

添加完头文件之后,需要对头文件进行修改。使用如下命令用vim编辑器打开头文件:

vi include/configs/mx6ull_100ask_pro_emmc.h

修改前头文件第9、10行如下:

9 #ifndef __MX6ULLEVK_CONFIG_H10 #define __MX6ULLEVK_CONFIG_H

修改后,头文件的第9、10行如下:

9 #ifndef __MX6ULL_100ASK_PRO_EMMC_CONFIG_H10 #define __MX6ULL_100ASK_PRO_EMMC_CONFIG_H

头文件到此添加完成。

3.3 添加并修改开发板对应的板级文件夹

uboot中的每个板子都有一个对应的文件夹来存放板级文件,比如开发板上外设驱动文件等等。NXP的I.MX系列芯片的所有板级文件都存放在board/freescale目录下。

1.添加

在路径uboot-.03/board/freescale赋值NXP官方EVK 开发板的板级文件夹并重命名,指令如下:

cp -r /board/freescale/mx6ullevk/ /board/freescale/mx6ull_100ask_pro_emmc

其中mx6ull_100ask_pro_emmc即为我们自己的板级文件夹。

2. 修改

使用如下命令进入到mx6ull_100ask_pro_emmc目录中:

cd /board/freescale/mx6ull_100ask_pro_emmc

使用ls命令可以看到如下文件:

book@100ask:~/100ask_imx6ull-sdk/Uboot-.03/board/freescale/mx6ull_100ask_pro_emmc$ lsimximage.cfg imximage_lpddr2.cfg Kconfig MAINTAINERS Makefile mx6ullevk.c plugin.S README

接下来需要逐一进行修改。

首先,将mx6ullevk.c文件重命名为mx6ull_100ask_pro_emmc.c命令如下:

mv mx6ullevk.c mx6ull_100ask_pro_emmc.c

然后,因为修改了.c文件,所以需要修改一下Makefile文件。先使用如下命令用vim编辑器打开Makefiile文件。

vi Makefile

修改前Makefile文件如下:

1 # (C) Copyright Freescale Semiconductor, Inc.2 #3 # SPDX-License-Identifier:GPL-2.0+4 #56 obj-y := mx6ullevk.o

修改后Makefile文件如下:

1 # (C) Copyright Freescale Semiconductor, Inc.2 #3 # SPDX-License-Identifier:GPL-2.0+4 #56 obj-y := mx6ull_100ask_pro_emmc.o

接着,修改imximage.cfg文件。先使用vim编辑器打开该文件:

vi imximage.cfg

该文件只需要修改第35行,修改前如下:

33 #ifdef CONFIG_USE_IMXIMG_PLUGIN34 /*PLUGIN plugin-binary-file IRAM_FREE_START_ADDR*/35 PLUGIN board/freescale/mx6ullevk/plugin.bin 0x0090700036 #else

修改后如下:

33 #ifdef CONFIG_USE_IMXIMG_PLUGIN34 /*PLUGIN plugin-binary-file IRAM_FREE_START_ADDR*/35 PLUGIN board/freescale/mx6ull_100ask_pro_emmc/plugin.bin 0x0090700036 #else

之后,修改Kconfig文件。同样,先使用vim编辑器打开该文件,如下:

vi Kconfig

Kconfig文件主要修改第1、4、10行,修改前Kconfig文件如下:

1 if TARGET_MX6ULL_14X14_EVK || TARGET_MX6ULL_9X9_EVK23 config SYS_BOARD4 default "mx6ullevk"56 config SYS_VENDOR7 default "freescale"89 config SYS_CONFIG_NAME10 default "mx6ullevk"1112 endif

修改后Kconfig文件如下:

1 if TARGET_MX6ULL_1100ASK_PRO_EMMC23 config SYS_BOARD4 default "mx6ull_100ask_pro_emmc"56 config SYS_VENDOR7 default "freescale"89 config SYS_CONFIG_NAME10 default "mx6ull_100ask_pro_emmc"1112 endif

最后,需要修改的是MAINTAINERS文件。使用vim编辑器打开:

vi MAINTAINERS

修改前该文件如下:

1 MX6ULLEVK BOARD2 M:Peng Fan <peng.fan@>3 S:Maintained4 F:board/freescale/mx6ullevk/5 F:include/configs/mx6ullevk.h6 F:configs/mx6ull_14x14_evk_defconfig7 F:configs/mx6ull_14x14_evk_plugin_defconfig

修改后如下:

1 MX6ULL_100ASK_PRO_EMMC BOARD2 M:Peng Fan <peng.fan@>3 S:Maintained4 F:board/freescale/mx6ull_100ask_pro_emmc/5 F:include/configs/mx6ull_100ask_pro_emmc.h6 F:configs/mx6ull_100ask_pro_emmc_defconfig

主要修改了第1、4、5、6行,因为我们没有用两个配置文件,所以删除掉第7行。至此,板级文件夹就添加完成了。

3.4 修改Uboot图形化配置界面的相关文件

在路径uboot-.03/arch/arm/cpu/armv7/mx6/下找到Kconfig文件,并使用vim编辑器打开。在文件中添加代码:

332 select DM_THERMAL333334 config TARGET_MX6ULL_14X14_EVK335 bool "Support mx6ull_14x14_evk"336 select BOARD_LATE_INIT337 select MX6ULL338 select DM339 select DM_THERMAL340341 config TARGET_MX6ULL_100ASK_PRO_EMMC342 bool "Support mx6ull_100ask_pro_emmc"343 select BOARD_LATE_INIT344 select MX6ULL345 select DM346 select DM_THERMAL347348 config TARGET_MX6ULL_9X9_EVK

如上,341~346行是我们添加的代码。之后,在文档的末尾,endif之前添加代码,如下:

537 source "board/freescale/mx6sxscm/Kconfig"538 source "board/freescale/mx6ull_100ask_pro_emmc/Kconfig"539540 endif

其中,第538行是我们添加的代码

至此,图形化配置界面就修改完成了。

3.5 添加并修改设备树文件

因为我们在3.1节的默认配置文件中修改了设备树的名字,所以,我们还应该在uboot中添加我们自己的设备树文件。

1. 添加

在路径arch/arm/dts/下复制一份nxp官方imx6ullevk开发板的设备树文件并重命名,作为我们自己开发板的设备树文件。指令如下:

cp arch/arm/dts/imx6ull-14x14-evk.dts arch/arm/dts/imx6ull-100ask-pro-emmc.dts

此处的imx6ull-100ask-pro-emmc.dts即为我们自己开发板的设备树文件。

2. 修改

因为我们添加了一个.dts文件,所以需要修改Makefile把这个文件编译出来,不然会报错.

在路径arch/arm/dts/下找到Makefile文件,使用vim编辑器打开,进行修改,如下:

364 imx6dqscm-1gb-qwks-rev3-fix-ldo.dtb \365 imx6dqscm-1gb-qwks-rev2-interleave-android-ldo.dtb \366 imx6dqscm-1gb-qwks-rev3-interleave-android-ldo.dtb \367 imx6sxscm-1gb-evb-ldo.dtb \368 imx6ull-100ask-pro-emmc.dtb369370 dtb-$(CONFIG_MX7) += imx7-colibri.dtb \

其中,第368行是添加的我们自己的设备树文件

3.6 编译Uboot并烧写至开发板

经过以上过程,就在uboot中添加了我们自己的开发板相关文件,接下来就可以进行编译并烧写uboot了,过程与2.2小节相同

注意:编译默认配置文件的时候应该编译我们自己的默认配置文件mx6ull_100ask_pro_emmc_defconfig,如下:

make mx6ull_100ask_pro_emmc_defconfig

3.6 问题分析

到目前为止我们添加的文件其实还是nxp官方的,只是换了名字而已,所以烧进板子之后还是会显示没有发现网卡

4. 修改网络驱动

4.1 相关基础

ETHERNET的接口实质是MAC通过MII总线控制PHY通信的过程。在发送数据时,MAC协议可以判断是否可以发送数据,如果可以发送,则给数据加上一些控制信息,最终将数据以及控制信息以规定的格式发送到物理层;在接收数据的时候,MAC协议首先判断输入的信息是否发生了传输错误,如果没有,则去掉控制信息发送至LLC层。

1. PHY

物理接口收发器,它实现了物理层。IEEE-802.3标准定义了以太网PHY,它包括了MII/GMII(介质独立接口)子层,PCS(物理编码子层),PMA(物理介质附加)子层,PMD(物理介质相关)子层,MDI子层。

2. MAC

MAC即Media Access Control,即媒体访问控制子层协议。该协议位于OSI七层协议中数据链路层的下半部分,主要负责控制与连接物理层的物理介质

3. MII总线

在IEEE-802.3中规定的,MII总线是一种用于将不同类型的PHY与相同网络控制器(MAC)相连接的通用总线,使用网络控制器可以用同样的硬件接口与任何PHY通信。

IMX6ULL芯片内部有个以太网MAC外设,也就是ENET,需要外接一个PHY芯片来实现网络通信功能,也就是内部MAC+外部PHY芯片的方案。NXP官方的EVK开发板使用的外部PHY芯片为KSZ1081,而百问网的6ULL_PRO开发板使用的外部PHY芯片为LAN8720A,这就是为什么用NXP官方的默认配置文件会找不到网络的原因。接下来对网络驱动进行修改。

4.2 修改驱动

修改网络驱动主要涉及两个文件,如下:

mx6ull_100ask_pro_emmc.h文件,该文件在uboot源码中的路径为uboot-.03/include/configsmx6ull_100ask_pro_emmc.c文件,该文件在我们上面创建的板级文件夹中,路径为uboot-.03/board/freescale/mx6ull_100ask_pro_emmc

4.2.1 修改mx6ull_100ask_pro_emmc.h文件

使用vim编辑器打开该文件:

vi include/configs/mx6ull_100ask_pro_emmc.h

在文件中找到关于网卡的定义,如下:

308 #ifdef CONFIG_CMD_NET309 #define CONFIG_CMD_MII310 #define CONFIG_FEC_MXC311 #define CONFIG_MII312 #define CONFIG_FEC_ENET_DEV 1313314 #if (CONFIG_FEC_ENET_DEV == 0)315 #define IMX_FEC_BASEENET_BASE_ADDR316 #define CONFIG_FEC_MXC_PHYADDR0x0317 #define CONFIG_FEC_XCV_TYPE RMII318 #ifdef CONFIG_DM_ETH319 #define CONFIG_ETHPRIME "eth0"320 #else321 #define CONFIG_ETHPRIME "FEC0"322 #endif323 #elif (CONFIG_FEC_ENET_DEV == 1)324 #define IMX_FEC_BASEENET2_BASE_ADDR325 #define CONFIG_FEC_MXC_PHYADDR0x1326 #define CONFIG_FEC_XCV_TYPE RMII327 #ifdef CONFIG_DM_ETH328 #define CONFIG_ETHPRIME "eth1"329 #else330 #define CONFIG_ETHPRIME "FEC1"331 #endif332 #endif333334 #define CONFIG_PHYLIB335 #define CONFIG_LIB_RAND336 #define CONFIG_PHY_SMSC337 #define CONFIG_FEC_MXC_MDIO_BASE ENET2_BASE_ADDR338 #endif

第312行的宏CONFIG_FEC_ENET_DEV用于选择使用哪个网口,默认为1,也就是选择ENET2。

第325行的宏CONFIG_FEC_MXC_PHYADDR表示所使用网口的PHY地址(ENET2的PHY地址),默认为0x1。查看开发板的原理图如下:

可以看出百问网IMX6ULL_PRO开发板的PHY芯片地址为0x1,因此此处ENET2的PHY地址就不用修改。

第336行定义了一个宏,该宏用于使能PHY芯片的产厂家提供的驱动。NXP官方使用的KSZ8081芯片是Micrel公司生产的,所以该宏为CONFIG_PHY_MICREL;百问网的IMX6ULL_PRO开发板使用的外部PHY芯片是SMSC公司生产的,所以该宏为CONFIG_PHY_SMSC

4.2.2 修改mx6ull_100ask_pro_emmc.c文件

使用vim编辑器打开该文件:

vi board/freescale/mx6ull_100ask_pro_emmc/mx6ull_100ask_pro_emmc.c

可以看出该文件内是一些板载设备的驱动,比如LCD屏的驱动、Nand Flash的驱动,但是我们没有找到关于网卡的引脚定义或初始化函数,因此我们需要自己添加。

1. 添加引脚数组

根据开发板的原理图在文件中添加网卡的引脚数组,如下:

477 static iomux_v3_cfg_t const fec2_pads[] = {478 /* MX6_PAD_GPIO1_IO06__ENET2_MDIO | MUX_PAD_CTRL(ENET_PAD_CTRL), */479 MX6_PAD_GPIO1_IO06__ENET2_MDIO | MUX_PAD_CTRL(MDIO_PAD_CTRL),480481 MX6_PAD_GPIO1_IO07__ENET2_MDC | MUX_PAD_CTRL(ENET_PAD_CTRL),482483 MX6_PAD_ENET2_TX_DATA0__ENET2_TDATA00 | MUX_PAD_CTRL(ENET_PAD_CTRL),484 MX6_PAD_ENET2_TX_DATA1__ENET2_TDATA01 | MUX_PAD_CTRL(ENET_PAD_CTRL),485486 /* MX6_PAD_ENET2_TX_CLK__ENET2_TX_CLK | MUX_PAD_CTRL(ENET_CLK_PAD_CTRL), */487 MX6_PAD_ENET2_TX_CLK__ENET2_REF_CLK2 | MUX_PAD_CTRL(ENET_CLK_PAD_CTRL),488489 MX6_PAD_ENET2_TX_EN__ENET2_TX_EN | MUX_PAD_CTRL(ENET_PAD_CTRL),490491 MX6_PAD_ENET2_RX_DATA0__ENET2_RDATA00 | MUX_PAD_CTRL(ENET_PAD_CTRL),492 MX6_PAD_ENET2_RX_DATA1__ENET2_RDATA01 | MUX_PAD_CTRL(ENET_PAD_CTRL),493 MX6_PAD_ENET2_RX_EN__ENET2_RX_EN | MUX_PAD_CTRL(ENET_PAD_CTRL),494 MX6_PAD_ENET2_RX_ER__ENET2_RX_ER | MUX_PAD_CTRL(ENET_PAD_CTRL),495496 MX6_PAD_SNVS_TAMPER6__GPIO5_IO06 | MUX_PAD_CTRL(NO_PAD_CTRL),497498 };

2. 添加初始化代码

定义好引脚数组后,添加初始化函数,如下:

499/* 初始化网卡需要的IO口,复位一下外部PHY芯片 */500 static void setup_iomux_fec(int fec_id)501 {502 if (fec_id == 0)503 return;504 else{505 /* 初始化引脚 */506 imx_iomux_v3_setup_multiple_pads(fec2_pads,ARRAY_SIZE(fec2_pads));507 /* 初始化LAN8720A 复位引脚不同需要修改*/508 gpio_request(IMX_GPIO_NR(5,6), "net reset");509510 gpio_direction_output(IMX_GPIO_NR(5,6),1);511 gpio_direction_output(IMX_GPIO_NR(5,6),0);512 mdelay(20);513 gpio_direction_output(IMX_GPIO_NR(5,6),1);514515 }516 }517/* 初始化网卡 */518 int board_eth_init(bd_t *bis)519 {520 int ret;521522 setup_iomux_fec(CONFIG_FEC_ENET_DEV);523524 ret = fecmxc_initialize_multi(bis, CONFIG_FEC_ENET_DEV,525 CONFIG_FEC_MXC_PHYADDR, IMX_FEC_BASE);526527 return ret;528 }

3. 添加宏定义以及头文件

在添加引脚数组和初始化函数时,引入了新的宏ENET_PAD_CTRL和函数fecmxc_initialize_multi,所以需要在文件中添加宏的定义和函数的所在的头文件,如下:

定义宏:

46 #define ENET_PAD_CTRL (PAD_CTL_PUS_100K_UP | PAD_CTL_PUE |\47 PAD_CTL_SPEED_HIGH |\48 PAD_CTL_DSE_48ohm | PAD_CTL_SRE_FAST)4950 #define ENET_CLK_PAD_CTRL (PAD_CTL_SPEED_MED | \51 PAD_CTL_DSE_120ohm | PAD_CTL_SRE_FAST)

添加头文件:

25 #include <netdev.h>

最后,因为我们没有用到设备树,所以需要在configs/mx6ull_100ask_pro_emmc_defconfig中注释掉CONFIG_DM_ETH这个控制选项,该选项用来控制是否从设备树取相关的资源。如下:

46 CONFIG_USB_EHCI_HCD=y47 CONFIG_USB_STORAGE=y48 CONFIG_FSL_QSPI=y49 # CONFIG_DM_ETH=y

第49行是注释的CONFIG_DM_ETH控制选项。

4.3 编译与烧写Uboot

编译与烧写Uboot的过程如2.2节所示,此处不再重复,结果如下:

U-Boot .03-g8ba4c5bb19-dirty (Mar 24 - 05:02:26 -0400)CPU: Freescale i.MX6ULL rev1.1 696 MHz (running at 396 MHz)CPU: Industrial temperature grade (-40C to 105C) at 40CReset cause: PORModel: Freescale i.MX6 ULL 14x14 EVK BoardBoard: MX6ULL 100ASK_PRO_EMMCDRAM: 512 MiBMMC: FSL_SDHC: 0, FSL_SDHC: 1Display: TFT7016 (1024x600)Video: 1024x600x24In: serialOut: serialErr: serialNet: , FEC1Normal BootHit any key to stop autoboot: 0

可以看到已经检测到了网卡2。

至此Uboot就移植完了,本文参考了正点原子和百问网的用户手册以及这篇文章基于百问网IMX6ULL_PRO开发板的Uboot移植(Uboot-.03)写得很详细,很好,可以参考。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。