赞
踩
解压缩命令
tar -vxjf uboot-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2
为了方便,修改文件夹名字,修改完成后如下图所示:
打开u-boot源码下的Makefile,设置编译架构和交叉编译器
在其中添加如下两行代码:
输入以下命令:
make distclean代表的是在编译前先清理工程。
make mx6ull_14x14_evk_emmc_defconfig 表示将该芯片的对应配置文件添加。
( u-boot支持的芯片的配置文件可以在configs中进行查看)
make -j2 代表采用双核进行编译
- make distclean
- make mx6ull_14x14_evk_emmc_defconfig
- make -j2
编译完成如下图所示:
尽管编译没有报错,但这仅仅是NXP官方的u-boot,和我们自己的开发板有一定的差别,因此对于自己的开发板,应该创建一个新的配置文件进行配置和编译。
复制 mx6ull_14x14_evk_emmc_defconfig,然后重命名为 mx6ull_my_defconfig,命令如下:
- cd configs
- cp mx6ull_14x14_evk_emmc_defconfig mx6ull_my_defconfig
然后将文件 mx6ull_my_defconfig中的内容改成下面的:
- CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=board/freescale/mx6ull_emmc_my/imximage.cfg,MX6ULL_EVK_EMMC_REWORK"
- CONFIG_ARM=y
- CONFIG_ARCH_MX6=y
- CONFIG_TARGET_MX6ULL_EMMC_MY=y
- CONFIG_CMD_GPIO=y
第一行和第四行的代码做出了修改
在目录 include/configs 下 添 加 I.MX6ULL-ALPHA 开 发 板 对 应 的 头 文 件 , 复 制
include/configs/mx6ullevk.h,并重命名为 mx6ull_emmc_my.h,命令如下:
- cd include/configs
- cp mx6ullevk.h mx6ull_emmc_my.h
拷贝完成以后将:
- #ifndef __MX6ULLEVK_CONFIG_H
- #define __MX6ULLEVK_CONFIG_H
修改成为:
- #ifndef __MX6ULL_EMMC_MY
- #define __MX6ULL_EMMC_MY
uboot 中每个板子都有一个对应的文件夹来存放板级文件,比如开发板上外设驱动文件等
等。 NXP 的 I.MX 系列芯片的所有板级文件夹都存放在 board/freescale 目录下。
复制 mx6ullevk,将其重命名为 mx6ull_emmc_my,命令如下:
- cd board/freescale/
- cp mx6ullevk/ -r mx6ull_emmc_my
进入mx6ull_emmc_my目录中,将 其 中 的 mx6ullevk.c 文件 重命名为mx6ull_emmc_my.c,命令如下:
- cd mx6ull_my/
- mv mx6ullevk.c mx6ull_emmc_my.c
修改mx6ull_emmc_my/目录下的Makefile文件,修改完成后如下所示:
- # (C) Copyright 2015 Freescale Semiconductor, Inc.
- #
- # SPDX-License-Identifier: GPL-2.0+
- #
-
- obj-y := mx6ull_emmc_my.o
-
- extra-$(CONFIG_USE_PLUGIN) := plugin.bin
- $(obj)/plugin.bin: $(obj)/plugin.o
- $(OBJCOPY) -O binary --gap-fill 0xff $< $@
修改 mx6ull_emmc_my/目录下的 imximage.cfg 文件
修改 mx6ull_emmc_my/目录下的 Kconfig 文件
- if TARGET_MX6ULL_EMMC_MY
-
- config SYS_BOARD
- default "mx6ull_emmc_my"
-
- config SYS_VENDOR
- default "freescale"
-
- config SYS_CONFIG_NAME
- default "mx6ull_emmc_my"
-
- endif
修改 mx6ull_my/目录下的 MAINTAINERS 文件
- MX6ULLEVK BOARD
- M: Peng Fan <peng.fan@nxp.com>
- S: Maintained
- F: board/freescale/mx6ull_emmc_my/
- F: include/configs/mx6ull_emmc_my.h
- F: configs/mx6ull_my_defconfig
修改文件arch/arm/cpu/armv7/mx6/Kconfig
在 207 行加入如下内容:
- config TARGET_MX6ULL_MY
- bool "Support mx6ull_emmc_my"
- select MX6ULL
- select DM
- select DM_THERMAL
在最后一行endif前加入以下内容:
source "board/freescale/mx6ull_emmc_my/Kconfig"
编译命令如下:
- make distclean
- make mx6ull_my_defconfig
- make -j2
编译结果如下:
编译完成以后就使用 imxdownload 将新编译出来的u-boot.bin 烧写到SD卡中测试,测试结果如下:
进入目录board/freescale/mx6ull_emmc_my/,打卡mx6ull_emmc_my.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 = "TFT7016",
- .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_emmc_my.h,找到所有如下语句:
panel=TFT43AB
修改为:
panel=TFT7016
从先编译和烧写u-boot,启动后如下图所示:
并且屏幕已经亮起来了。
打开mx6ull_emmc_my.h文件找到如下内容,将ENET1的地址修改为0
由于正点原子开发板没有采用74LV595扩展IO,因此需要将74LV595的驱动代码进行删除,打开mx6ull_emmc_my.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)
-
- 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),
- };
-
- static void iox74lv_init(void)
- {
- int i;
-
- gpio_direction_output(IOX_OE, 0);
-
- for (i = 7; i >= 0; i--) {
- gpio_direction_output(IOX_SHCP, 0);
- gpio_direction_output(IOX_SDI, seq[qn_output[i]][0]);
- udelay(500);
- gpio_direction_output(IOX_SHCP, 1);
- udelay(500);
- }
-
- gpio_direction_output(IOX_STCP, 0);
- udelay(500);
- /*
- * shift register will be output to pins
- */
- gpio_direction_output(IOX_STCP, 1);
-
- for (i = 7; i >= 0; i--) {
- gpio_direction_output(IOX_SHCP, 0);
- gpio_direction_output(IOX_SDI, seq[qn_output[i]][1]);
- udelay(500);
- gpio_direction_output(IOX_SHCP, 1);
- udelay(500);
- }
- gpio_direction_output(IOX_STCP, 0);
- udelay(500);
- /*
- * shift register will be output to pins
- */
- gpio_direction_output(IOX_STCP, 1);
- };
-
- void iox74lv_set(int index)
- {
- int i;
-
- for (i = 7; i >= 0; i--) {
- gpio_direction_output(IOX_SHCP, 0);
-
- if (i == index)
- gpio_direction_output(IOX_SDI, seq[qn_output[i]][0]);
- else
- gpio_direction_output(IOX_SDI, seq[qn_output[i]][1]);
- udelay(500);
- gpio_direction_output(IOX_SHCP, 1);
- udelay(500);
- }
-
- gpio_direction_output(IOX_STCP, 0);
- udelay(500);
- /*
- * shift register will be output to pins
- */
- gpio_direction_output(IOX_STCP, 1);
-
- for (i = 7; i >= 0; i--) {
- gpio_direction_output(IOX_SHCP, 0);
- gpio_direction_output(IOX_SDI, seq[qn_output[i]][1]);
- udelay(500);
- gpio_direction_output(IOX_SHCP, 1);
- udelay(500);
- }
-
- gpio_direction_output(IOX_STCP, 0);
- udelay(500);
- /*
- * shift register will be output to pins
- */
- gpio_direction_output(IOX_STCP, 1);
- };
并替换为如下代码:
- #define ENET1_RESET IMX_GPIO_NR(5, 7)
- #define ENET2_RESET IMX_GPIO_NR(5, 8)
将board_init函数中的imx_iomux_v3_setup_multiple_pads 和 iox74lv_init 这两个函数来初始化74lv595 的 GPIO,将这两行删除掉。
继续找到fec1_pads 和 fec2_pads,这两个结构图数组是两个网口的IO参数,需要在里面添加开发板对应的复位引脚,添加完后如下如所示:
setup_iomux_fec 就是根据 fec1_pads 和 fec2_pads 这两个网络 IO 配置数组来初始化
I.MX6ULL 的网络 IO,将其修改后如下所示:
- static void setup_iomux_fec(int fec_id)
- {
- if (fec_id == 0) {
- imx_iomux_v3_setup_multiple_pads(fec1_pads,
- ARRAY_SIZE(fec1_pads));
-
- gpio_direction_output(ENET1_RESET, 1);
- gpio_set_value(ENET1_RESET, 0);
- mdelay(20);
- gpio_set_value(ENET1_RESET, 1);
- }
- else {
- imx_iomux_v3_setup_multiple_pads(fec2_pads,
- ARRAY_SIZE(fec2_pads));
-
- 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,添加如下代码:
设置与虚拟机相关的网络参数,我的设置如下:
- setenv ipaddr 192.168.10.101
- setenv ethaddr 00:04:9f:04:d2:35
- setenv gatewayip 192.168.10.1
- setenv netmask 255.255.255.0
- setenv serverip 192.168.10.100
- saveenv
设置完毕后进行验证,我的主机服务器地址为192.168.10.99,实现ping通:
至此U-boot移植完毕
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。