把NXP官方Uboot源码修改为支持韦东山的I.MX6ULL开发板的个人Uboot
目录
修改参考的是正点原子的开发板教程,由于正点原子和韦东山的开发板不一样,所以如果你使用的是正点原子的开发板,那么下面的步骤不适合你使用,但是可以参考
首先下载 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一下主机地址,如果成功说明可以了,不成功的话请你细心检查
**************************************************************************