【正点原子I.MX6U-MINI】u-boot过程移植详解

news2024/9/23 14:37:09

正点原子的I.MX6ULL开发板参考的是NXP官方的I.MX6ULL EVK开发板做的硬件

Linux的移植要复杂的多,在移植Linux之前我们需要先移植一个 bootloader 代码,这个 bootloader 代码用于启动Linux 内核,bootloader有很多,常用的就是 U-Boot。移植好U-Boot以后再移植Linux 内核,移植完Linux内核以后Linux还不能正常启动,还需要再移植一个根文件系统(rootfs),根文件系统里面包含了一些最常用的命令和文件。所以 U-Boot、Linux kernel 和 rootfs 这三者一起构成了一个完整的Linux 系统,一个可以正常使用、功能完善的 Linux 系统

uboot 的全称是Universal Boot Loader,uboot是一个遵循GPL协议的开源软件,uboot是一
个裸机代码,可以看作是一个裸机综合例程。现在的uboot已经支持液晶屏、网络、USB 等高
级功能。

Linux 系统要启动就必须需要一个 bootloader 程序,也就说芯片上电以后先运行一段bootloader程序。这段bootloader程序会先初始化DDR等外设,然后将Linux内核从flash(NAND,NOR FLASH,SD,MMC 等)拷贝到 DDR 中,最后启动 Linux 内核。当然了,bootloader 的实际工作要复杂的多,但是它最主要的工作就是启动Linux 内核,bootloader和Linux内核的关系就跟PC上的 BIOS 和Windows的关系一样,bootloader就相当于BIOS。所以我们要先搞定bootloader,很庆幸,有很多现成的bootloader 软件可以使用,比如U-Boot、vivi、RedBoot等。

一、U-Boot命令

=> help
?       - alias for 'help'
base    - print or set address offset
bdinfo  - print Board Info structure
bmode   - sd1|sd2|qspi1|normal|usb|sata|ecspi1:0|ecspi1:1|ecspi1:2|ecspi1:3|esdhc1|esdhc2|esdhc3|esdhc4 [noreset]
boot    - boot default, i.e., run 'bootcmd'
bootd   - boot default, i.e., run 'bootcmd'
bootelf - Boot from an ELF image in memory
bootm   - boot application image from memory
bootp   - boot image via network using BOOTP/TFTP protocol
bootvx  - Boot vxWorks from an ELF image
bootz   - boot Linux zImage image from memory
clocks  - display clocks
cmp     - memory compare
coninfo - print console devices and information
cp      - memory copy
crc32   - checksum calculation
dcache  - enable or disable data cache
dhcp    - boot image via network using DHCP/TFTP protocol
dm      - Driver model low level access
echo    - echo args to console
editenv - edit environment variable
env     - environment handling commands
erase   - erase FLASH memory
exit    - exit script
ext2load- load binary file from a Ext2 filesystem
ext2ls  - list files in a directory (default /)
ext4load- load binary file from a Ext4 filesystem
ext4ls  - list files in a directory (default /)
ext4size- determine a file's size
ext4write- create a file in the root directory
false   - do nothing, unsuccessfully
fatinfo - print information about filesystem
fatload - load binary file from a dos filesystem
fatls   - list files in a directory (default /)
fatsize - determine a file's size
fatwrite- write file into a dos filesystem
fdt     - flattened device tree utility commands
flinfo  - print FLASH memory information
fstype  - Look up a filesystem type
fuse    - Fuse sub-system
go      - start application at address 'addr'
gpio    - query and control gpio pins
help    - print command description/usage
i2c     - I2C sub-system
icache  - enable or disable instruction cache
iminfo  - print header information for application image
imxtract- extract a part of a multi-image
itest   - return true/false on integer compare
load    - load binary file from a filesystem
loadb   - load binary file over serial line (kermit mode)
loads   - load S-Record file over serial line
loadx   - load binary file over serial line (xmodem mode)
loady   - load binary file over serial line (ymodem mode)
loop    - infinite loop on address range
ls      - list files in a directory (default /)
md      - memory display
mdio    - MDIO utility commands
mii     - MII utility commands
mm      - memory modify (auto-incrementing address)
mmc     - MMC sub system
mmcinfo - display MMC info
mtest   - simple RAM read/write test
mw      - memory write (fill)
nfs     - boot image via network using NFS protocol
nm      - memory modify (constant address)
ping    - send ICMP ECHO_REQUEST to network host
pmic    - PMIC
printenv- print environment variables
protect - enable or disable FLASH write protection
reset   - Perform RESET of the CPU
run     - run commands in an environment variable
save    - save file to a filesystem
saveenv - save environment variables to persistent storage
setenv  - set environment variables
setexpr - set environment variable as the result of eval expression
sf      - SPI flash sub-system
showvar - print local hushshell variables
size    - determine a file's size
sleep   - delay execution for some time
source  - run script from memory
test    - minimal test like /bin/sh
tftpboot- boot image via network using TFTP protocol
true    - do nothing, successfully
usb     - USB sub-system
usbboot - boot from USB device
version - print monitor, compiler and linker version

二、U-Boot移植

uboot 的移植并不是说我们完完全全的从零开始将uboot 移植到我们现在所使用的开发板或者开发平台上。这个对于我们来说基本是不可能的,这个工作一般是半导体厂商做的,半导体厂商负责将 uboot 移植到他们的芯片上,因此半导体厂商都会自己做一个开发板,这个开发板就叫做原厂开发板,比如大家学习STM32的时候听说过的discover开发板就是ST自己做的。

半导体厂商会将uboot 移植到他们自己的原厂开发板上,测试好以后就会将这个uboot发布出去,这就是大家常说的原厂BSP包。我们一般做产品的时候就会参考原厂的开发板做硬件,然后在原厂提供的BSP包上做修改,将uboot或者linux kernel移植到我们的硬件上。这个就是uboot 移植的一般流程:

  • ①、在uboot中找到参考的开发平台,一般是原厂的开发板。
  • ②、参考原厂开发板移植uboot到我们所使用的开发板上。

1、移植NXP官方的uboot到开发板

正点原子的I.MX6ULL开发板参考的是NXP官方的I.MX6ULL EVK开发板做的硬件。因此在移植 uboot的时候就可以以NXP官方的I.MX6ULL EVK开发板为蓝本。将 NXP官方的uboot移植到正点原子的I.MX6ULL开发板上。

1、编译一下NXP官方I.MX6ULL EVK开发板对应的uboot。

  • mx6ull开头的是I.MX6ULL 开发板的
  • 9x9mm 和 14x14mm 表示芯片的尺寸,正点原子使用的是14x14mm的芯片
  • 正点原子的I.MX6ULL有EMMC 和NAND两个版本的,我买的版本是EMMC版本的(flash)

使用如下命令编译NXP官方I.MX6ULL EVK开发板的uboot:

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

编译完成以后会生成u-boot.bin、u-boot.imx 等文件。

2、烧写验证与驱动测试

imxdownload软件拷贝到uboot源码根目录下,然后使用imxdownload软件将u-boot.bin烧写到 SD 卡中,烧写命令如下:

chmod 777 imxdownload //给予 imxdownload 可执行权限
./imxdownload u-boot.bin /dev/sdg  //烧写 u-boot.bin 到 SD 卡中

烧写完成以后将SD卡插入 I.MX6U-ALPHA 开发板的TF卡槽中,最后设置开发板从SD卡启动。打开 SecureCRT,设置好开发板所使用的串口并打开,复位开发板,SecureCRT 接收到。

 从图可以看出,uboot 启动正常,虽然我们用的是NXP官方I.MX6ULL开发板的uboot,但是在正点原子的I.MX6ULL开发板上是可以正常启动的,而且DRAM识别正确,为512MB。如果用的NAND版本的核心版的话uboot启动会失败!因为NAND核心版用的 256MB的DRAM。

3、SD 卡和 EMMC 驱动检查
检查一下SD卡和EMMC驱动是否正常,使用命令 mmc list 列出当前的 MMC 设备
从图可以看出,mmc 设备0 是SD 卡,SD卡容量为3.8GB,这个和我所使用的SD卡信息相符,说明 SD卡驱动正常。

再来检查MMC设备1,输入如下命令:

mmc dev 1
mmc info


从图可以看出,mmc设备1为EMMC,容量为3.6GB,说明 EMMC 驱动也成功,SD卡和EMMC的驱动都没问题。

4 、LCD 驱动检查

如果 uboot 中的 LCD 驱动正确的话,启动 uboot 以后 LCD 上应该会显示出NXP的 logo,如果你用的不是正点原子的 4.3 寸 480x272 分辨率的屏幕的话,那么 LCD 就不会显示NXP的logo 界面。因为 NXP 官方 I.MX6ULL 开发板的屏幕就是 4.3 寸 480x272 分辨率的,所以 uboot 默认 LCD 驱动是 4.3 寸 480x272 分辨率的。如果使用其他分辨率的 LCD 就需要修改 LCD 驱动。

5、网络驱动检查

boot 启动的时候提示Board Net Initialization FailedNo ethernet found这两行,说明网络驱动也有问题,正常情况下应该是如图所示提示


总结一下NXP官方I.MX6ULL EVK开发板的uboot在正点原子EMMC 版本I.MX6ULL开发板上的运行情况:

  • ① uboot 启动正常,DRAM 识别正确,SD 卡和EMMC驱动正常。
  • ② uboot 里面的LCD驱动默认是给 4.3 寸 480x272 分辨率的,如果使用的其他分辨率的屏幕需要修改驱动。
  • ③ 网络不能工作,识别不出来网络信息,需要修改驱动。

2、在 U-Boot中添加自己的开发板

1、添加开发板默认配置文件

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

cd configs
cp mx6ull_14x14_evk_emmc_defconfig mx6ull_alientek_emmc_defconfig

然后将文件mx6ull_alientek_emmc_defconfig中的内容改成下面的:


2、添加开发板对应的头文件

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

cp include/configs/mx6ullevk.h mx6ull_alientek_emmc.h

拷贝完成以后将:

#ifndef __MX6ULLEVK_CONFIG_H
#define __MX6ULLEVK_CONFIG_H

改为:

#ifndef __MX6ULL_ALIENTEK_EMMC_CONFIG_H
#define __MX6ULL_ALIENTEK_EMMC_CONFIG_H


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

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

uboot 中每个板子都有一个对应的文件夹来存放板级文件,比如开发板上外设驱动文件等等。NXP 的 I.MX 系列芯片的所有板级文件夹都存放在board/freescale目录下,在这个目录下有个名为mx6ullevk 的文件夹,这个文件夹就是NXP官方I.MX6ULL EVK开发板的板级文件夹。复制mx6ullevk,将其重命名为mx6ull_alientek_emmc,命令如下:

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


1 、修改mx6ull_alientek_emmc目录下的Makefile

将 mx6ull_alientek_emmc 下的 Makefile 文件内容改为如下所示

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

将imximage.cfg中的下面一句:

PLUGIN board/freescale/mx6ullevk/plugin.bin 0x00907000

改为:

PLUGIN board/freescale/mx6ull_alientek_emmc /plugin.bin 0x00907000


3 、修改mx6ull_alientek_emmc 目录下的 Kconfig 文件

修改 Kconfig 文件,修改后的内容如下:


4 、修改mx6ull_alientek_emmc 目录下的MAINTAINERS文件

修改 MAINTAINERS 文件,修改后的内容如下:

3、修改 U-Boot 图形界面配置文件

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


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

5、使用新添加的板子配置编译 uboot

使用如下命令来编译对应的 uboot:

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_14x14_ddr512_emmc_defconfig
make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j12

编译完成以后uboot源码多了一些文件,其中u-boot.bin就是编译出来的uboot二进制文件。uboot是个裸机程序,因此需要在其前面加上头部(IVT、DCD等数据)才能在I.MX6U上执行,u-boot.imx文件就是添加头部以后的u-boot.bin,u-boot.imx 就是我们最终要烧写到开发板中的uboot 镜像文件。

编译完成以后就使用imxdownload将新编译出来的u-boot.bin烧写到 SD 卡中测试,注意这时候编译出来的uboot的LCD驱动和网络驱动是有问题的。

6、LCD 驱动修改

一般 uboot 中修改驱动基本都是在xxx.h和xxx.c这两个文件中进行的,xxx 为板子名称,比如 mx6ull_alientek_emmc.h 和 mx6ull_alientek_emmc.c 这两个文件。

一般修改 LCD 驱动重点注意以下几点:
①、LCD 所使用的 GPIO,查看uboot中LCD的IO配置是否正确。
②、LCD 背光引脚GPIO的配置。
③、LCD 配置参数是否正确。

正点原子的 I.MX6U-ALPHA 开发板 LCD 原理图和 NXP 官方 I.MX6ULL 开发板一致,也就是 LCD的IO和背光IO都一样的,所以IO部分就不用修改了。需要修改的之后LCD参数,打开文件 mx6ull_alientek_emmc.c,找到如下所示内容:

  • name :LCD 名字,要和环境变量中的 panel 相等。
  • xres 、yres :LCD X 轴和 Y 轴像素数量。
  • pixclock:像素时钟,每个像素时钟周期的长度,单位为皮秒。
  • left_margin :HBP,水平同步后肩。
  • right_margin :HFP,水平同步前肩。
  • upper_margin:VBP,垂直同步后肩。
  • lower_margin:VFP,垂直同步前肩。
  • hsync_len :HSPW,行同步脉宽。
  • vsync_len:VSPW,垂直同步脉宽。
  • vmode :大多数使用 FB_VMODE_NONINTERLACED,也就是不使用隔行扫描。

这里的参数要根据你的屏幕对应上面的参数要一一对应,不能错。

7、网络驱动修改

1 、I.MX6U-MINI开发板网络简介

I.MX6UL/ULL 内部有个以太网 MAC 外设,也就是 ENET,需要外接一个 PHY 芯片来实现网络通信功能,也就是内部 MAC+外部 PHY 芯片的方案

大家可能听过 DM9000 这个网络芯片,在一些没有内部MAC的CPU中,比如三星的2440,4412 等,就会采用DM9000来实现联网功能。DM9000提供了一个类似 SRAM 的访问接口,主控 CPU 通过这个接口即可与DM9000 进行通信,DM9000 就是一个 MAC+PHY 芯片。这个方案就相当于外部 MAC+外部PHY,那么 I.MX6U 这样的内部 MAC+PHY 芯片与 DM9000 方案比有什么优势吗?

那优势大了去了!首先就是通信效率和速度,一般 SOC 内部的MAC是带有一个专用DMA 的,专门用于处理网络数据包,采用SRAM来读写DM9000的速度是压根就没法和内部 MAC+外部 PHY 芯片的速度比。采用外部 DM9000 完全是无奈之举,谁让 2440,4412 这些芯片内部没有以太网外设呢,现在又想用有线网络,没有办法只能找个 DM9000 的方案。从这里也可以看出,三星的 2440、4412 这些芯片设计之初就不是给工业产品用的,他们是给消费类电子使用的,比如手机、平板等,手机或平板要上网,可以通过 WIFI 或者 4G,我是没有见过哪个手机或者平板上网是要接根网线的。正点原子的 I.MX6U-ALPHA 开发板也可以通过 WIFI 或者 4G 上网。

I.MX6UL-MINI有一个网络接口 ENET2,使用 LAN8720A 作为 PHY 芯片。NXP 官方的I.MX6ULL EVK 开发板使用 KSZ8081 这颗 PHY 芯片,LAN8720A 相比 KSZ8081 具有体积小、外围器件少、价格便宜等优点。直接使用 KSZ8081 固然可以,但是我们在实际的产品中不一定会使用 KSZ8081,有时候为了降低成本会选择其他的 PHY 芯片,这个时候就有个问题:换了PHY 芯片以后网络驱动怎么办?为此,正点原子的 I.MX6U开发板将 ENET2的PHY 换成了 LAN8720A,这样就可以给大家讲解更换 PHY 芯片以后如何调整网络驱动,使网络工作正常。

MX6ULL
STM32F407

ENET2的网络PHY芯片为LAN8720A,通过RMII接口与I.MX6ULL 相连,正点原子I.MX6U-MINI开发板的 ENET2引脚与 NXP 官方的 I.MX6ULL EVK 开发板基本一样,唯独复位引脚不同。从图可以看出,正点原子 I.MX6U-MINI开发板的 ENET2 复位引脚ENET2_RST 接到了 I.M6ULL 的 SNVS_TAMPER8 这个引脚上。LAN8720A 内部是有寄存器的,I.MX6ULL 会读取 LAN8720 内部寄存器来判断当前的物理链接状态、连接速度(10M 还是 100M)和双工状态(半双工还是全双工)。

I.MX6ULL通过MDIO接口来读取 PHY 芯片的内部寄存器,MDIO 接口有两个引脚,ENET_MDC 和 ENET_MDIO,ENET_MDC 提供时钟,ENET_MDIO 进行数据传输。一个 MIDO 接口可以管理 32 个 PHY 芯片,同一个 MDIO 接口下的这些 PHY 使用不同的器件地址来做区分,MIDO 接口通过不同的器件地址即可访问到相应的 PHY 芯片

注意:LAN8720A 可以通过PHYAD0引脚来配置,该引脚与RXER引脚复用,芯片内部自带下拉电阻,当硬复位结束后, LAN8720A会读取该引脚电平,作为器件的SMI 地址,接下拉电阻时(浮空也可以,因为芯片内部自带了下拉电阻),设置 SMI 地址为 0,当外接上拉电阻后,可以设置为 1。对于正点原子mx6ull-mini板来说LAN8720芯片第10引脚RXER接了上拉电阻,所以PHY芯片地址为1。对于正点原子stm32f407板来说LAN8720芯片第10引脚RXER悬空,所以PHY芯片地址为0。

I.MX6U-MINI开发板ENET2上连接的LAN8720A器件地址为0X1,所示我们要修改 ENET2网络驱动的话重点就三点:

  • ①、ENET2 的复位引脚,从上图可以看出,ENET2 的复位引脚ENET2_RST接到了I.MX6ULL 的 SNVS_TAMPER8 上。
  • ②、ENET2 所使用的 PHY 芯片器件地址,从图可以看出,PHY 器件地址为0X1。

2、网络 PHY 地址修改
首先修改uboot中的ENET2 的 PHY 地址和驱动,打开mx6ull_alientek_emmc.h这个文件,找到如下代码:

#ifdef CONFIG_CMD_NET
326 #define CONFIG_CMD_PING
327 #define CONFIG_CMD_DHCP
328 #define CONFIG_CMD_MII
329 #define CONFIG_FEC_MXC
330 #define CONFIG_MII
331 #define CONFIG_FEC_ENET_DEV 1
332
333 #if (CONFIG_FEC_ENET_DEV == 0)
334 #define IMX_FEC_BASE ENET_BASE_ADDR
335 #define CONFIG_FEC_MXC_PHYADDR 0x2
336 #define CONFIG_FEC_XCV_TYPE RMII
337 #elif (CONFIG_FEC_ENET_DEV == 1)
338 #define IMX_FEC_BASE ENET2_BASE_ADDR
339 #define CONFIG_FEC_MXC_PHYADDR 0x1
340 #define CONFIG_FEC_XCV_TYPE RMII
341 #endif
342 #define CONFIG_ETHPRIME "FEC"
343
344 #define CONFIG_PHYLIB
345 #define CONFIG_PHY_MICREL
346 #endif

第331行的宏CONFIG_FEC_ENET_DEV用于选择使用哪个网口,默认为1,也就是选择ENET2。第 335 行为ENET1的PHY地址,默认是 0X2,第 339 行为ENET2 的 PHY地址,默认为0x1。根据前面的分析可知,正点原子的I.MX6U-MINI开发板ENET1的PHY地址为0X0,ENET2的PHY地址为 0X1,所以需要将第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公司生产的。所以示例代码有三处要修改:

  • ①、修改 ENET1 网络 PHY 的地址。
  • ②、修改 ENET2 网络 PHY 的地址。
  • ③、使能 SMSC 公司的 PHY 驱动。

修改后的网络 PHY 地址参数如下所示:

325 #ifdef CONFIG_CMD_NET
326 #define CONFIG_CMD_PING
327 #define CONFIG_CMD_DHCP
328 #define CONFIG_CMD_MII
329 #define CONFIG_FEC_MXC
330 #define CONFIG_MII
331 #define CONFIG_FEC_ENET_DEV 1
332
333 #if (CONFIG_FEC_ENET_DEV == 0)
334 #define IMX_FEC_BASE ENET_BASE_ADDR
335 #define CONFIG_FEC_MXC_PHYADDR 0x0
336 #define CONFIG_FEC_XCV_TYPE RMII
337 #elif (CONFIG_FEC_ENET_DEV == 1)
338 #define IMX_FEC_BASE ENET2_BASE_ADDR
339 #define CONFIG_FEC_MXC_PHYADDR 0x1
340 #define CONFIG_FEC_XCV_TYPE RMII
341 #endif
342 #define CONFIG_ETHPRIME "FEC"
343
344 #define CONFIG_PHYLIB
345 #define CONFIG_PHY_SMSC
346 #endif

3 、删除 uboot 中 74LV595 的驱动代码

boot 中网络 PHY 芯片地址修改完成以后就是网络复位引脚的驱动修改了,因为 NXP 官方I.MX6ULL EVK 开发板使用 74LV595 来扩展 IO,两个网络的复位引脚就是由 74LV595 来控制的。正点原子的 I.MX6U-ALPHA 开发板并没有使用 74LV595,所以需要修改。ENET1 的复位引脚连接到SNVS_TAMPER7 上,对应 GPIO5_IO07,ENET2 的复位引脚连接到 SNVS_TAMPER8 上,对应 GPIO5_IO08。详细过程参考
【正点原子】i.MX6U嵌入式linux驱动开发指南v1.5.pdf的33.2.7小结

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

ENET1 和 ENET2 的复位 IO 初始化,将这两个 IO 设置为输出并且硬件复位一下 LAN8720A,这个硬件复位很重要!否则可能导致 uboot 无法识别 LAN8720A。

详细过程参考
【正点原子】i.MX6U嵌入式linux驱动开发指南v1.5.pdf的33.2.7小结

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

大功基本上告成,还差最后一步,uboot中的LAN8720A驱动有点问题,打开文件drivers/net/phy/phy.c,找到函数genphy_update_link,这是个通用 PHY 驱动函数,此函数用于更新PHY的连接状态和速度。使用 LAN8720A 的时候需要在此函数中添加一些代码。至此网络的复位引脚驱动修改完成,重新编译uboot,然后将u-boot.bin 烧写到SD卡中并启动。


从图中可以看到Net: FEC1这一行,提示当前使用的 FEC1 这个网口,也就是 ENET2。在 uboot 中使用网络之前要先设置几个环境变量,命令如下:

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

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

ping 192.168.10.100


从图可以看出,有host 192.168.10.100is alive这句,说明 ping 主机成功,说明ENET2网络工作正常。

如果想测试一下ENET1的网络是否正常工作,打开mx6ull_alientek_emmc.h,将 CONFIG_FEC_ENET_DEV 改为 0,然后重新编译一下 uboot 并烧写到 SD 卡中重启。重启开
发板,uboot 输出信息中看到Net: FEC0这一行,提示当前使用的 FEC0这个网口,也就是 ENET1。不过MINI板板子上只有一个网口就是只使用了ENET2。

8、其他需要修改的地方

在 uboot 启动信息中会有Board: MX6ULL 14x14 EVK这一句,也就是说板子名字为MX6ULL 14x14 EVK,要将其改为我们所使用的板子名字,比如MX6ULL ALIENTEK ZHIGUOXIN。打开文件 mx6ull_alientek_emmc.c,找到函数checkboard,将其改为如下所示内容:

int checkboard(void)
{
	if (is_mx6ull_9x9_evk())
		puts("Board: MX6ULL 9x9 EVK\n");
	else
		puts("Board: MX6ULL ALIENTEK ZHIGUOXIN\n");
	return 0;
}


至此uboot的驱动部分就修改完成了,uboot移植也完成了,uboot的最终目的就是启动Linux内核,所以需要通过启动Linux内核来判断uboot移植是否成功。在启动 Linux 内核之前我们先来学习两个重要的环境变量bootcmd和bootargs。

环境变量 bootcmd

bootcmd保存着uboot默认命令,uboot倒计时结束以后就会执行bootcmd中的命令。这些命令一般都是用来启动 Linux内核的(比如读取 EMMC 或者 NAND Flash 中的 Linux 内核镜像文件和设备树文件到 DRAM 中,然后启动 Linux 内核)。可以在uboot 启动以后进入命令行设置 bootcmd 环境变量的值。如果 EMMC 或者 NAND 中没有保存 bootcmd 的值,那么 uboot 就会使用默认的值,板子第一次运行 uboot 的时候都会使用默认值来设置bootcmd环境变量

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/98571.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

蓝桥杯C/C++百校真题赛(1期)Day3题解(等差数列、回路计数)

Q1 等差数列 由于保证了题目给出的一定是一个等差数列的部分项,且等差数列具有单调性质,所以根据大小排序后最小的did_idi​就是所求等差数列的公差ddd, 又因为求的是最小,所以n(an−a1)/d1,特别的,当ana1,d0时,特判输…

[数据库]复习杂项

(画师蓝鸟mo13tto) 数据库笔记(补充)——候选码的确定方法 求最小依赖集 最小函数依赖集Fm的定义,求法以及举例 当然这篇文章后半部分有误:【通俗易懂】关系模式范式分解教程 3NF与BCNF口诀!小白也能看…

企业数字化转型:数据集成是成功的关键

按照数据的生命周期,我们通常将大数据技术分为数据集成、数据存储、批/流处理、数据查询与分析、数据调度与编排、数据开发、BI 7 个部分。 数据集成是什么? 可以看到数据集成在数据生命周期的最前面位置,它负责将多个来自不同数据源的数据…

[附源码]计算机毕业设计Python保护濒危动物公益网站(程序+源码+LW文档)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等…

vue3 中的响应式设计原理

Vue 3 中的响应式原理可谓是非常之重要,通过学习 Vue3 的响应式原理,不仅能让我们学习到 Vue.js 的一些设计模式和思想,还能帮助我们提高项目开发效率和代码调试能力。 一、Vue 3 响应式使用 1. Vue 3 中的使用 当我们在学习 Vue 3 的时候&…

51单片机——动态数码管实验,小白讲解,相互学习

多位数码管介绍: 多位数码管,即两个或两个以上单个数码管并列集中在一起形成一体的数码管。当多位一体时,他们内部的公共端是独立的,二负责显示什么数字的段线(a-dp)全部是连接在一起的,独立的公…

中国水文地质图集

概述 水文地质图集部分来源于 《中华人民共和国水文地质图集》(地质出版社1979年版)的GIS数字化版(数据格式:JPEG),图集是由全国性、地区性和分省/自治区/直辖市等三类图幅组成,共68幅图(实际收集到55幅图)。 主要内容包括:水文地质图、地下热水分布图、水化学图、…

数据结构C语言版 —— 栈的实现

文章目录栈1. 基本概念2. 栈的实现1) 初始化栈2) 栈的扩容3) 判断栈是否为空4) 入栈5) 出栈6) 获取栈顶元素7) 获取栈中元素个数8) 销毁栈栈 1. 基本概念 栈(Stack):一种特殊的线性表,其只限定于在表尾进行插入或者删除操作。进行数据插入和删除操作的…

RocketMq02_复制刷盘、Broker常用模式、磁盘阵列、集群搭建

文章目录①. 单机版本安装与启动②. 控制台的安装与启动③. 复制刷盘、Broker集群模式④. 磁盘阵列 - RAID⑤.JBOD、RAID0⑥. RAID1、RAID10、01⑦. 搭建集群 - 异步两主两从①. 单机版本安装与启动 ①. 系统要求是64位的,JDK要求是1.8及其以上版本的 ②. 将下载的安装包上传到…

NFT及智能合约开发

文章目录1.Web3.01.1 GameFi1.2 DeFi1.3 dApp2.NFT2.1 NFT Applications2.2 NFT Earning2.3 NFT结构2.3 IPFS2.4 Wallet3.Smart Contract3.1 Smart Contract System3.2 Smart Contract Development3.2.1 Language3.2.2 IDE3.2.3 BlockChain3.2.4 FrontEnd3.2.5 NFT Test WebSit…

《Mysql是怎样运行的》

客户端查询mysql版本:select version(); 1 第1章 装作自己是个小白-重新认识MySQL 1.1 MySQL的客户端/服务器架构每个进程都有一个唯一的编号,称为 进程ID ,英文名叫 PID ,这个编号是在我们启动程序的时候由操作系统随…

IDEA运行SpringBoot项目常见问题【统一答疑】

【辰兮要努力】:hello你好我是辰兮,很高兴你能来阅读,昵称是希望自己能不断精进,向着优秀程序员前行! 博客来源于项目以及编程中遇到的问题总结,偶尔会有读书分享,我会陆续更新Java前端、后台、…

PRISEMI芯导科技推出PDG7115直驱型E-Mode氮化镓功率IC

PRISEMI芯导科技推出PDG7115直驱型E-Mode氮化镓功率IC 氮化镓以开关速度快,导阻低,低输入输出电荷的优势,应用在快充上逐渐取代了传统的高压硅MOS管。使用氮化镓取代硅MOS管,不仅降低了开关损耗,提高充电器的转换效率…

SpringBoot RabbitMq 六大模式

目录 依赖、配置 简单队列 模型 代码示例 工作队列 模型 代码示例 订阅模式 模型 代码示例 路由模式 模型 代码示例 主题模式 模型 代码示例 RPC 依赖、配置 依赖&#xff1a; <dependency> <groupId>org.springframework.boot</groupId&g…

三分查找算法

目录 一 算法简介 详细介绍 两种基本方法 二 算法实践 1&#xff09;实数三分 拓展&#xff1a;秦九韶算法计算多项式 方法1&#xff1a;直接模拟累加 方法二&#xff1a;根据秦九韶算法 1&#xff09;模板三分法 题目描述 解法 2&#xff09;三分求极值 题目描述 …

3D激光里程计其四:点云线面特征提取

3D激光里程计其四&#xff1a;点云线面特征提取1. 点云线面特征提取1.1 按线数分割1.2 计算曲率1.3 按曲率大小筛选特征点2. 基于线面特征的位姿变化2.1 帧间关联2.1.1 点云位姿转换2.1.2 线特征关联2.1.3 面特征关联2.2 残差函数2.2.1 线特征2.2.2 面特征2.3 位姿优化2.3.1 线…

数据结构——二叉树2.0

✅<1>主页&#xff1a;我的代码爱吃辣 &#x1f4c3;<2>知识讲解&#xff1a;数据结构——二叉树 &#x1f525;<3>创作者&#xff1a;我的代码爱吃辣 ☂️<4>开发环境&#xff1a;Visual Studio 2022 &#x1f4ac;<5>前言&#xff1a;上期讲了…

尚医通-医院接口设置(七)

&#xff08;1&#xff09;后台系统-医院设置接口-需求和准备 &#xff08;2&#xff09;后台系统-医院设置接口-创建基础类 &#xff08;3&#xff09;医院设置接口-查询和逻辑删除 &#xff08;4&#xff09;医院的设置接口-统一返回结果定义 &#xff08;5&#xff09;医…

[附源码]Python计算机毕业设计Django校园代取快递系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

知到/智慧树——大学生心理健康(华东政法大学)参考答案

目录 注&#xff1a;有些图片上传异常&#xff0c;请以参考答案为准&#xff0c;不要以蓝色选项为全部答案。 第一章测试 第二章测试 第三章测试 第四章测试 第五章测试 第六章测试 第七章测试 第八章测试 第九章测试 第十章测试 第十一章测试 第十二章测试 第一章…