更好的阅读体验请见: uboot启动流程分析
添加自己的开发板
uboot的板级配置文件在顶层目录的*configs
*文件夹里,
cp mx6ull_14x14_evk_emmc_defconfig mx6ull_jarvis_emmc_defconfig
复制一份mx6ull_14x14_evk_emmc_defconfig
,这是NXP针对imx6ull这个板子的配置文件,复制改成自己的mx6ull_jarvis_emmc_defconfig
修改mx6ull_jarvis_emmc_defconfig
,加粗部分是自己修改的。
CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=board/freescale/**mx6ull_jarvis_emmc**/imximage.cfg,MX6ULL_EVK_EMMC_REWORK" CONFIG_ARM=y CONFIG_ARCH_MX6=y CONFIG_TARGET_**MX6ULL_JARVIS_EMMC**=y CONFIG_CMD_GPIO=y
添加开发板对应的头文件
使用命令cp mx6ullevk.h mx6ull_jarvis_emmc.h
,在 目 录 include/configs
下 添 加 开 发 板 对 应 的 头 文 件 , 复 制 include/configs/mx6ullevk.h
,并重命名为mx6ull_jarvis_emmc.h
。
添加开发板对应的板级文件夹
cd board/freescale/ cp mx6ullevk/ -r mx6ull_jarvis_emmc cd mx6ull_jarvis_emmc mv mx6ullevk.c mx6ull_jarvis_emmc.c
修改*board/freescale/mx6ull_jarvis_emmc/Makefile
*。
# (C) Copyright 2015 Freescale Semiconductor, Inc. # # SPDX-License-Identifier: GPL-2.0+ # obj-y := **mx6ull_jarvis_emmc.o** extra-$(CONFIG_USE_PLUGIN) := plugin.bin $(obj)/plugin.bin: $(obj)/plugin.o $(OBJCOPY) -O binary --gap-fill 0xff $< $@
修改*board/freescale/mx6ull_jarvis_emmc/imximage.cfg
*34行。
改为PLUGIN board/freescale/
mx6ull_jarvis_emmc
/plugin.bin 0x00907000
修改*board/freescale/mx6ull_jarvis_emmc/Kconfig
*。
if **TARGET_MX6ULL_JARVIS_EMMC** config SYS_BOARD default "**mx6ull_jarvis_emmc**" config SYS_VENDOR default "freescale" config SYS_CONFIG_NAME default "**mx6ull_jarvis_emmc**" endif
修改*board/freescale/mx6ull_jarvis_emmc/MAINTAINERS
*
MX6ULLEVK BOARD M: Peng Fan <peng.fan@nxp.com> S: Maintained F: board/freescale/mx6ull_alientek_emmc/ F: include/configs/mx6ull_alientek_emmc.h F: configs/mx6ull_14x14_evk_defconfig F: configs/mx6ull_9x9_evk_defconfig
修改uboot图形界面配置文件*arch/arm/cpu/armv7/mx6/Kconfig
*
在207行后加入
config TARGET_MX6ULL_JARVIS_EMMC bool "Support mx6ull_jarvis_emmc" select MX6ULL select DM select DM_THERMAL
然后在endif前加入
source "board/freescale/mx6ull_jarvis_emmc/Kconfig"
编译测试
修改uboot顶层Makefile
在250行添加
ARCH = arm CROSS_COMPILE = arm-linux-gnueabihf-
如果uboot工程里没有执行过make mx6ull_jarvis_emmc_defconfig
,就先执行一下,然后再执行make
。
烧写
拨码开关设置到USB,选择u-boot.imx文件,烧写,烧写完后设置拨码开关从EMMC启动。
看到找不到网络设备和不支持屏幕,还要修改屏幕驱动和eth相关的东西。
屏幕&网络驱动移植
正点原子imx6ull开发板使用的PHY芯片是 LAN8720A。
原子这款开发板与NXP官方的原理图是一样的,除了phy的复位脚不同。
从原理图看到ENET1,对应eth0网口,复位脚接到了GPIO5_IO07。
ENET2,对应eth1网口,复位脚接到了GPIO5_IO08。
软件层面的修改
修改*include/configs/mx6ull_jarvis_emmc.h
*
大概在333行的位置。
#if (CONFIG_FEC_ENET_DEV == 0) #define IMX_FEC_BASE ENET_BASE_ADDR **#define CONFIG_FEC_MXC_PHYADDR 0x0** #define CONFIG_FEC_XCV_TYPE RMII #elif (CONFIG_FEC_ENET_DEV == 1) #define IMX_FEC_BASE ENET2_BASE_ADDR #define CONFIG_FEC_MXC_PHYADDR 0x1 #define CONFIG_FEC_XCV_TYPE RMII #endif #define CONFIG_ETHPRIME "FEC" #define CONFIG_PHYLIB #define **CONFIG_PHY_SMSC** #endif
修改*board/freescale/mx6ull_jarvis_emmc/mx6ull_jarvis_emmc.c
*
内容比较多,一共修改了3个文件,内容较多,输出diff。
- board/freescale/mx6ull_jarvis_emmc/mx6ull_jarvis_emmc.c
- drivers/net/phy/phy.c
- include/configs/mx6ull_jarvis_emmc.h
踩坑
记录我踩的一个坑,由于编译工具链版本太高,导致调用htons
函数有问题。
使用GCC4.9的工具链没问题。
ps:我是哆哆,一枚二本机械狗,从华为外包逆袭到芯片原厂公司,目前从业于半导体行业,在一家芯片原厂公司任职Linux固件工程师,喜欢阅读内核源码,深入操作系统的世界,除此之外,星主还喜欢个人成长,秉承终身学习,终身成长,坚持运动。
星主从最开始玩51单片机,到stm32,然后玩Linux,逼自己看过很多书籍,自学的过程走过很多弯路,最后也如愿以偿。所以,我想把我的经验分享给朋友们。同时,打造一个嵌入式圈子,欢迎所有嵌入式行业的朋友进来。期待你的关注!