当前位置:   article > 正文

移植NXP官方U-boot全过程_nxp uboot

nxp uboot

一、NXP官方U-boot编译

1、解压缩官方U-boot

解压缩命令

tar -vxjf uboot-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2 

为了方便,修改文件夹名字,修改完成后如下图所示:

2、修改顶层Makefile

        打开u-boot源码下的Makefile,设置编译架构和交叉编译器

        在其中添加如下两行代码: 

3、首次编译NXP官方u-boot 

        输入以下命令:

make distclean代表的是在编译前先清理工程。
make mx6ull_14x14_evk_emmc_defconfig 表示将该芯片的对应配置文件添加。
( u-boot支持的芯片的配置文件可以在configs中进行查看)
make -j2 代表采用双核进行编译

  1. make distclean
  2. make mx6ull_14x14_evk_emmc_defconfig
  3. make -j2

编译完成如下图所示:

        尽管编译没有报错,但这仅仅是NXP官方的u-boot,和我们自己的开发板有一定的差别,因此对于自己的开发板,应该创建一个新的配置文件进行配置和编译。

二、在U-boot中添加自己的开发板

        1、先在 configs 目录下创建默认配置文件,

复制 mx6ull_14x14_evk_emmc_defconfig,然后重命名为 mx6ull_my_defconfig,命令如下:

  1. cd configs
  2. cp mx6ull_14x14_evk_emmc_defconfig mx6ull_my_defconfig

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

  1. CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=board/freescale/mx6ull_emmc_my/imximage.cfg,MX6ULL_EVK_EMMC_REWORK"
  2. CONFIG_ARM=y
  3. CONFIG_ARCH_MX6=y
  4. CONFIG_TARGET_MX6ULL_EMMC_MY=y
  5. CONFIG_CMD_GPIO=y

        第一行和第四行的代码做出了修改

        2、 添加板子对应的头文件

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

  1. cd include/configs
  2. cp mx6ullevk.h mx6ull_emmc_my.h

拷贝完成以后将:

  1. #ifndef __MX6ULLEVK_CONFIG_H
  2. #define __MX6ULLEVK_CONFIG_H

修改成为:

  1. #ifndef __MX6ULL_EMMC_MY
  2. #define __MX6ULL_EMMC_MY

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

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

        复制 mx6ullevk,将其重命名为 mx6ull_emmc_my,命令如下:

  1. cd board/freescale/
  2. cp mx6ullevk/ -r mx6ull_emmc_my

        进入mx6ull_emmc_my目录中,将 其 中 的 mx6ullevk.c 文件 重命名为mx6ull_emmc_my.c,命令如下:

  1. cd mx6ull_my/
  2. mv mx6ullevk.c mx6ull_emmc_my.c

        修改mx6ull_emmc_my/目录下的Makefile文件,修改完成后如下所示:

  1. # (C) Copyright 2015 Freescale Semiconductor, Inc.
  2. #
  3. # SPDX-License-Identifier: GPL-2.0+
  4. #
  5. obj-y := mx6ull_emmc_my.o
  6. extra-$(CONFIG_USE_PLUGIN) := plugin.bin
  7. $(obj)/plugin.bin: $(obj)/plugin.o
  8. $(OBJCOPY) -O binary --gap-fill 0xff $< $@

        修改 mx6ull_emmc_my/目录下的 imximage.cfg 文件

        修改 mx6ull_emmc_my/目录下的 Kconfig 文件

  1. if TARGET_MX6ULL_EMMC_MY
  2. config SYS_BOARD
  3. default "mx6ull_emmc_my"
  4. config SYS_VENDOR
  5. default "freescale"
  6. config SYS_CONFIG_NAME
  7. default "mx6ull_emmc_my"
  8. endif

        修改 mx6ull_my/目录下的 MAINTAINERS 文件

  1. MX6ULLEVK BOARD
  2. M: Peng Fan <peng.fan@nxp.com>
  3. S: Maintained
  4. F: board/freescale/mx6ull_emmc_my/
  5. F: include/configs/mx6ull_emmc_my.h
  6. F: configs/mx6ull_my_defconfig

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

        修改文件arch/arm/cpu/armv7/mx6/Kconfig

在 207 行加入如下内容:

  1. config TARGET_MX6ULL_MY
  2. bool "Support mx6ull_emmc_my"
  3. select MX6ULL
  4. select DM
  5. select DM_THERMAL

在最后一行endif前加入以下内容:

source "board/freescale/mx6ull_emmc_my/Kconfig"

 三、使用新添加板子的u-boot编译

        编译命令如下:

  1. make distclean
  2. make mx6ull_my_defconfig
  3. make -j2

        编译结果如下:

编译完成以后就使用 imxdownload 将新编译出来的u-boot.bin 烧写到SD卡中测试,测试结果如下:

四、修改LCD驱动

        进入目录board/freescale/mx6ull_emmc_my/,打卡mx6ull_emmc_my.c文件,修改内容如下所示:

  1. struct display_info_t const displays[] = {{
  2. .bus = MX6UL_LCDIF1_BASE_ADDR,
  3. .addr = 0,
  4. .pixfmt = 24,
  5. .detect = NULL,
  6. .enable = do_enable_parallel_lcd,
  7. .mode = {
  8. .name = "TFT7016",
  9. .xres = 1024,
  10. .yres = 600,
  11. .pixclock = 19531,
  12. .left_margin = 140,
  13. .right_margin = 160,
  14. .upper_margin = 20,
  15. .lower_margin = 12,
  16. .hsync_len = 20,
  17. .vsync_len = 3,
  18. .sync = 0,
  19. .vmode = FB_VMODE_NONINTERLACED
  20. } } };

        打开 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文件,找到如下代码进行删除:

  1. #define IOX_SDI IMX_GPIO_NR(5, 10)
  2. #define IOX_STCP IMX_GPIO_NR(5, 7)
  3. #define IOX_SHCP IMX_GPIO_NR(5, 11)
  4. #define IOX_OE IMX_GPIO_NR(5, 8)
  5. static iomux_v3_cfg_t const iox_pads[] = {
  6. /* IOX_SDI */
  7. MX6_PAD_BOOT_MODE0__GPIO5_IO10 | MUX_PAD_CTRL(NO_PAD_CTRL),
  8. /* IOX_SHCP */
  9. MX6_PAD_BOOT_MODE1__GPIO5_IO11 | MUX_PAD_CTRL(NO_PAD_CTRL),
  10. /* IOX_STCP */
  11. MX6_PAD_SNVS_TAMPER7__GPIO5_IO07 | MUX_PAD_CTRL(NO_PAD_CTRL),
  12. /* IOX_nOE */
  13. MX6_PAD_SNVS_TAMPER8__GPIO5_IO08 | MUX_PAD_CTRL(NO_PAD_CTRL),
  14. };
  15. static void iox74lv_init(void)
  16. {
  17. int i;
  18. gpio_direction_output(IOX_OE, 0);
  19. for (i = 7; i >= 0; i--) {
  20. gpio_direction_output(IOX_SHCP, 0);
  21. gpio_direction_output(IOX_SDI, seq[qn_output[i]][0]);
  22. udelay(500);
  23. gpio_direction_output(IOX_SHCP, 1);
  24. udelay(500);
  25. }
  26. gpio_direction_output(IOX_STCP, 0);
  27. udelay(500);
  28. /*
  29. * shift register will be output to pins
  30. */
  31. gpio_direction_output(IOX_STCP, 1);
  32. for (i = 7; i >= 0; i--) {
  33. gpio_direction_output(IOX_SHCP, 0);
  34. gpio_direction_output(IOX_SDI, seq[qn_output[i]][1]);
  35. udelay(500);
  36. gpio_direction_output(IOX_SHCP, 1);
  37. udelay(500);
  38. }
  39. gpio_direction_output(IOX_STCP, 0);
  40. udelay(500);
  41. /*
  42. * shift register will be output to pins
  43. */
  44. gpio_direction_output(IOX_STCP, 1);
  45. };
  46. void iox74lv_set(int index)
  47. {
  48. int i;
  49. for (i = 7; i >= 0; i--) {
  50. gpio_direction_output(IOX_SHCP, 0);
  51. if (i == index)
  52. gpio_direction_output(IOX_SDI, seq[qn_output[i]][0]);
  53. else
  54. gpio_direction_output(IOX_SDI, seq[qn_output[i]][1]);
  55. udelay(500);
  56. gpio_direction_output(IOX_SHCP, 1);
  57. udelay(500);
  58. }
  59. gpio_direction_output(IOX_STCP, 0);
  60. udelay(500);
  61. /*
  62. * shift register will be output to pins
  63. */
  64. gpio_direction_output(IOX_STCP, 1);
  65. for (i = 7; i >= 0; i--) {
  66. gpio_direction_output(IOX_SHCP, 0);
  67. gpio_direction_output(IOX_SDI, seq[qn_output[i]][1]);
  68. udelay(500);
  69. gpio_direction_output(IOX_SHCP, 1);
  70. udelay(500);
  71. }
  72. gpio_direction_output(IOX_STCP, 0);
  73. udelay(500);
  74. /*
  75. * shift register will be output to pins
  76. */
  77. gpio_direction_output(IOX_STCP, 1);
  78. };

        并替换为如下代码:

  1. #define ENET1_RESET IMX_GPIO_NR(5, 7)
  2. #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,将其修改后如下所示:

  1. static void setup_iomux_fec(int fec_id)
  2. {
  3. if (fec_id == 0) {
  4. imx_iomux_v3_setup_multiple_pads(fec1_pads,
  5. ARRAY_SIZE(fec1_pads));
  6. gpio_direction_output(ENET1_RESET, 1);
  7. gpio_set_value(ENET1_RESET, 0);
  8. mdelay(20);
  9. gpio_set_value(ENET1_RESET, 1);
  10. }
  11. else {
  12. imx_iomux_v3_setup_multiple_pads(fec2_pads,
  13. ARRAY_SIZE(fec2_pads));
  14. gpio_direction_output(ENET2_RESET, 1);
  15. gpio_set_value(ENET2_RESET, 0);
  16. mdelay(20);
  17. gpio_set_value(ENET2_RESET, 1);
  18. }
  19. }

        打开文件drivers/net/phy/phy.c,找到函数 genphy_update_link,添加如下代码:


 

六、启动U-boot,设置网络参数 

 

        设置与虚拟机相关的网络参数,我的设置如下:

  1. setenv ipaddr 192.168.10.101
  2. setenv ethaddr 00:04:9f:04:d2:35
  3. setenv gatewayip 192.168.10.1
  4. setenv netmask 255.255.255.0
  5. setenv serverip 192.168.10.100
  6. saveenv

        设置完毕后进行验证,我的主机服务器地址为192.168.10.99,实现ping通:

        至此U-boot移植完毕 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/天景科技苑/article/detail/744488
推荐阅读
相关标签
  

闽ICP备14008679号