IMX6ULL-移植uboot-imx_v2020.04_5.4.70_2.3.0


作者:zzssdd2

E-mail:zzssdd2@foxmail.com

一、說明

  • 主機系統:Ubuntu 20.04.3 LTS
  • 開發板:TOPEET-IMX6ULL
  • Uboot版本:imx_v2020.04_5.4.70_2.3.0
  • 交叉編譯器:gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf

二、環境搭建

2.1、uboot源碼

  1. 獲取NXP維護的uboot源碼:

    git clone https://source.codeaurora.org/external/imx/uboot-imx
    
  2. 使用命令git branch -a查看分支然后切換到目標分支

    git checkout imx_v2020.04_5.4.70_2.3.0
    
  3. 接下來就基於該分支源碼進行uboot的移植(根目錄下README文件有助於了解uboot的編譯移植)

2.2、交叉編譯器

  1. armDeveloper網站下載交叉編譯工具

    GNU Toolchain for the A-profile Architecture: 10.3-2021.07
    |
    |__ x86_64 Linux hosted cross compilers
    	|
    	|__ AArch32 target with hard float (arm-linux-none-gnueabihf)
    		|
    		|__ gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf.tar.xz 
    
  2. 將工具解壓至本地

    # 創建文件夾
    sudo mkdir /usr/local/arm
    # 拷貝文件
    sudo cp gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf.tar.xz /usr/local/arm/
    # 解壓文件
    sudo tar -vxf /usr/local/arm/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf.tar.xz 
    
  3. 可以導入工具鏈到環境變量中

    # 導入到系統環境變量(對所有用戶有效)
    sudo vim /etc/profile
    export PATH=$PATH:/usr/local/arm/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf/bin
    # 或導入到用戶環境變量(僅對當前用戶有效)
    sudo vim ~/.bashrc 
    export PATH=$PATH:/usr/local/arm/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf/bin
    

三、編譯源碼

手上的開發板參考NXP官方的EVK開發板設計,所以移植都是參考mx6ullevk開發板相關代碼進行

  1. 查看board/freescale/mx6ullevk文件夾下面的README文件說明

  2. 新建編譯腳本文件make.sh 並增加可執行權限chmod +x make.sh

#!/bin/bash

# 若之前已經導入到環境變量則不需要
export PATH=$PATH:/usr/local/arm/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf/bin
# 若已經在頂層Makefile文件中指定則不需要
export ARCH=arm
# 若已經在頂層Makefile文件中指定則不需要
export CROSS_COMPILE=arm-none-linux-gnueabihf-

make distclean
# make mrproper
make mx6ull_14x14_evk_emmc_defconfig
make
  1. 執行編譯./make.sh並等待完成。

  2. 編譯源碼這一步的目的:一是為了驗證編譯環境是否正常;二是為了下一步移植過程中的代碼分析(一些文件只有在編譯后才會生成)

注意:若是在系統上第一次編譯uboot源碼可能會遇到缺少bisonflex的報錯信息導致編譯失敗,只需安裝后重新執行編譯即可

# 語法分析工具
sudo apt install bison 
# 詞法分析工具
sudo apt install flex

四、移植

4.1、工程管理

  1. Ubuntu上安裝VScode

  2. uboot源碼根目錄創建文件夾.vscode。使用VScode打開uboot源碼文件夾,然后點擊文件->將工作區另存為...保存文件名uboot.code-workspace在.vscode文件夾下。內容如下

    {
    	"folders": [
    		{
    			"path": ".."
    		}
    	],
    
    	"settings": {
    		"files.associations": {
    			"*.cfg": "c",
    			"*.S": "c",
    		}
    	}
    }
    
  3. 為了便於文件分析,在搜索和源碼中隱藏一些不需要的文件,保留imx6相關文件。在.vscode目錄下新建文件settings.json,添加以下內容

    {
        "search.exclude": {
            "**/node_modules": true,
            "**/bower_components": true,
            "**/*.code-search": true,
    
            "arch/ar[!m]":true,
            "arch/m*":true,
            "arch/n*":true,
            "arch/p*":true,
            "arch/r*":true,
            "arch/s*":true,
            "arch/x*":true,
            "arch/arm/mach-[a-h,j-z]*":true,
            "arch/arm/mach-i[!m]*":true,
            "arch/arm/mach-imx/i*":true,
            "arch/arm/mach-imx/mx[!6]*":true,
            "arch/arm/cpu/arm[!v]*":true,
            "arch/arm/cpu/armv7m":true,
            "arch/arm/cpu/armv8":true,
            "arch/arm/cpu/pxa":true,
            "arch/arm/cpu/sa1100":true,
            "arch/arm/dts/[a-h,j-z,A-L,N-Z]*":true,
            "arch/arm/dts/imx[!6]*":true,
            "board/[a-e,g-z,0-9,A-Z]*":true,
            "board/fir*":true,
            "board/freescale/[a-l,n-z,A-Z]*":true,
            "board/freescale/m[!x]*":true,
            "board/freescale/mx[!6]*":true,
            "configs/[0-9,a-l,n-z,A-Z]*":true,
            "configs/m[!x]*":true,
            "configs/mx[!6]*":true,
            "include/configs/[0-9,a-l,n-z,A-Z]*":true,
            "include/configs/m[!x]*":true,
            "include/configs/mx[!6]*":true,
        },
    
        "files.exclude": {
            "**/.git": true,
            "**/.svn": true,
            "**/.hg": true,
            "**/CVS": true,
            "**/.DS_Store": true,
            "**/Thumbs.db": true,
    
            "arch/ar[!m]":true,
            "arch/m*":true,
            "arch/n*":true,
            "arch/p*":true,
            "arch/r*":true,
            "arch/s*":true,
            "arch/x*":true,
            "arch/arm/mach-[a-h,j-z]*":true,
            "arch/arm/mach-i[!m]*":true,
            "arch/arm/mach-imx/i*":true,
            "arch/arm/mach-imx/mx[!6]*":true,
            "arch/arm/cpu/arm[!v]*":true,
            "arch/arm/cpu/armv7m":true,
            "arch/arm/cpu/armv8":true,
            "arch/arm/cpu/pxa":true,
            "arch/arm/cpu/sa1100":true,
            "arch/arm/dts/[a-h,j-z,A-L,N-Z]*":true,
            "arch/arm/dts/imx[!6]*":true,
            "board/[a-e,g-z,0-9,A-Z]*":true,
            "board/fir*":true,
            "board/freescale/[a-l,n-z,A-Z]*":true,
            "board/freescale/m[!x]*":true,
            "board/freescale/mx[!6]*":true,
            "configs/[0-9,a-l,n-z,A-Z]*":true,
            "configs/m[!x]*":true,
            "configs/mx[!6]*":true,
            "include/configs/[0-9,a-l,n-z,A-Z]*":true,
            "include/configs/m[!x]*":true,
            "include/configs/mx[!6]*":true,
        }
    }
    
  4. 安裝C/C++插件。在.vscode目錄下新建文件c_cpp_properties.json內容如下

    {
        "configurations": [
            {
                "name": "Linux",
                "includePath": [
                    "${default}"
                ],
                "compilerPath": "/usr/bin/gcc",
                "cStandard": "gnu11",
                "cppStandard": "gnu++14",
                "intelliSenseMode": "linux-gcc-x64",
    
                "forcedInclude": ["${workspaceFolder}/u-boot.cfg"]
            }
        ],
        "version": 4
    }
    

    u-boot.cfg文件為uboot編譯后生成的文件,里面包含源碼中的宏定義配置。

4.2、添加文件

這一步主要是參考mx6ullevk開發板在源碼中添加自己的開發板文件

  1. 添加配置文件

    cp configs/mx6ull_14x14_evk_emmc_defconfig configs/mx6ull_14x14_topeet_emmc_defconfig
    
    cp include/configs/mx6ullevk.h include/configs/mx6ull_topeet.h
    
  2. 添加開發板文件夾

    cp -r board/freescale/mx6ullevk/ board/freescale/mx6ull_topeet/
    

    更改文件名:

    mv board/freescale/mx6ull_topeet/mx6ullevk.c board/freescale/mx6ull_topeet/mx6ull_topeet.c
    
  3. 添加設備樹文件

    新版本uboot更多的參考了Linux內核引入了設備樹驅動模型(Driver Model)。所以移植內容就更多的是設備樹文件的修改。

    1. imx6ull-14x14-topeet-emmc.dts文件:

      添加:

      cp arch/arm/dts/imx6ull-14x14-evk-emmc.dts arch/arm/dts/imx6ull-14x14-topeet-emmc.dts
      

      修改:

      #include "imx6ull-14x14-evk.dts"
      改為
      #include "imx6ull-14x14-topeet.dts"
      
    2. imx6ull-14x14-topeet.dts文件:

      添加

      cp arch/arm/dts/imx6ull-14x14-evk.dts arch/arm/dts/imx6ull-14x14-topeet.dts
      

      修改:

      #include "imx6ul-14x14-evk.dtsi"
      #include "imx6ul-14x14-evk-u-boot.dtsi"
      改為
      #include "imx6ul-14x14-topeet.dtsi"
      #include "imx6ul-14x14-topeet-u-boot.dtsi"
      
    3. 添加 imx6ul-14x14-topeet.dtsiimx6ul-14x14-topeet-u-boot.dtsi 文件

      cp arch/arm/dts/imx6ul-14x14-evk.dtsi arch/arm/dts/imx6ul-14x14-topeet.dtsi
      
      cp arch/arm/dts/imx6ul-14x14-evk-u-boot.dtsi arch/arm/dts/imx6ul-14x14-topeet-u-boot.dtsi 
      

4.3、修改文件

4.3.1、mx6ull_14x14_topeet_emmc_defconfig文件

  1. 第一處(目標板)

    CONFIG_TARGET_MX6ULL_14X14_EVK=y
    改為
    CONFIG_TARGET_MX6ULL_14X14_TOPEET=y
    
  2. 第二處(imximage配置文件)

    CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=board/freescale/mx6ullevk/imximage.cfg"
    改為
    CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=board/freescale/mx6ull_topeet/imximage.cfg"
    
  3. 第三處(設備樹)

    CONFIG_DEFAULT_DEVICE_TREE="imx6ull-14x14-evk-emmc"
    改為
    CONFIG_DEFAULT_DEVICE_TREE="imx6ull-14x14-topeet-emmc"
    
  4. 第四處(74lv595相關,自己的開發板沒有該芯片)

    CONFIG_DM_74X164=y
    改為
    # CONFIG_DM_74X164 is not set
        
    CONFIG_SOFT_SPI=y
    改為
    # CONFIG_SOFT_SPI is not set
    

4.3.2、mx6ull_topeet.h文件修改

添加自己開發板的內容,修改如下:

		"findfdt="\
			"if test $fdt_file = undefined; then " \
				"if test $board_name = ULZ-EVK && test $board_rev = 14X14; then " \
					"setenv fdt_file imx6ulz-14x14-evk.dtb; fi; " \
				"if test $board_name = EVK && test $board_rev = 9X9; then " \
					"setenv fdt_file imx6ull-9x9-evk.dtb; fi; " \
				"if test $board_name = EVK && test $board_rev = 14X14; then " \
					"setenv fdt_file imx6ull-14x14-evk.dtb; fi; " \
				"if test $board_name = TOPEET && test $board_rev = 14X14; then " \
					"setenv fdt_file imx6ull-14x14-topeet.dtb; fi; " \
				"if test $fdt_file = undefined; then " \
					"echo WARNING: Could not determine dtb to use; " \
				"fi; " \
			"fi;\0" \
		"findtee="\
			"if test $tee_file = undefined; then " \
				"if test $board_name = ULZ-EVK && test $board_rev = 14X14; then " \
					"setenv tee_file uTee-6ulzevk; fi; " \
				"if test $board_name = EVK && test $board_rev = 9X9; then " \
					"setenv tee_file uTee-6ullevk; fi; " \
				"if test $board_name = EVK && test $board_rev = 14X14; then " \
					"setenv tee_file uTee-6ullevk; fi; " \
				"if test $board_name = TOPEET && test $board_rev = 14X14; then " \
					"setenv tee_file uTee-6ull_topeet; fi; " \
				"if test $tee_file = undefined; then " \
					"echo WARNING: Could not determine tee to use; " \
				"fi; " \
			"fi;\0" \

4.3.3、mx6ull_topeet文件夾

  1. Kconfig文件修改如下(最后endif之后務必添加換行)

    if TARGET_MX6ULL_14X14_TOPEET
    
    config SYS_BOARD
    	default "mx6ull_topeet"
    
    config SYS_VENDOR
    	default "freescale"
    
    config SYS_CONFIG_NAME
    	default "mx6ull_topeet"
    
    config SYS_TEXT_BASE
    	default 0x87800000
    endif
    
    
  2. Makefile文件修改如下

    obj-y  := mx6ull_topeet.o
    
  3. 由於CONFIG_USE_IMXIMG_PLUGIN沒有使能,所以imximage_lpddr2.cfg文件和和imximage.cfg無需修改。否則改動如下

    PLUGIN	board/freescale/mx6ullevk/plugin.bin 0x00907000
    改為
    PLUGIN	board/freescale/mx6ull_topeet/plugin.bin 0x00907000
    
  4. mx6ull_topeet.c文件修改

    1. LCD電源引腳

      static iomux_v3_cfg_t const lcd_pads[] = {
      	/* Use GPIO for Brightness adjustment, duty cycle = period. */
      	MX6_PAD_GPIO1_IO08__GPIO1_IO08 | MUX_PAD_CTRL(NO_PAD_CTRL),
      	/* Used for LCD power control*/
      	MX6_PAD_LCD_DATA08__GPIO3_IO13 | MUX_PAD_CTRL(NO_PAD_CTRL),
      };
      
      static int setup_lcd(void)
      {
      	enable_lcdif_clock(LCDIF1_BASE_ADDR, 1);
      
      	imx_iomux_v3_setup_multiple_pads(lcd_pads, ARRAY_SIZE(lcd_pads));
      
      	/* Power on the LCD */
      	gpio_request(IMX_GPIO_NR(3, 13), "lcd power");
      	gpio_direction_output(IMX_GPIO_NR(3, 13) , 1);
      
      	/* Reset the LCD */
      	gpio_request(IMX_GPIO_NR(5, 9), "lcd reset");
      	gpio_direction_output(IMX_GPIO_NR(5, 9) , 0);
      	udelay(500);
      	gpio_direction_output(IMX_GPIO_NR(5, 9) , 1);
      
      	/* Set Brightness to high */
      	gpio_request(IMX_GPIO_NR(1, 8), "backlight");
      	gpio_direction_output(IMX_GPIO_NR(1, 8) , 1);
      
      	return 0;
      }
      
    2. 輸出信息修改

      int board_late_init(void)
      {
      #ifdef CONFIG_CMD_BMODE
      	add_board_boot_modes(board_boot_modes);
      #endif
      
      	env_set("tee", "no");
      #ifdef CONFIG_IMX_OPTEE
      	env_set("tee", "yes");
      #endif
      
      #ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
      	env_set("board_name", "TOPEET");
      
      	if (is_mx6ull_9x9_evk())
      		env_set("board_rev", "9X9");
      	else
      		env_set("board_rev", "14X14");
      
      	if (is_cpu_type(MXC_CPU_MX6ULZ)) {
      		env_set("board_name", "ULZ-EVK");
      		env_set("usb_net_cmd", "usb start");
          }
      #endif
      
      	setup_lcd();
      
      #ifdef CONFIG_ENV_IS_IN_MMC
      	board_late_mmc_env_init();
      #endif
      
      	set_wdog_reset((struct wdog_regs *)WDOG1_BASE_ADDR);
      
      	return 0;
      }
      
      
      int checkboard(void)
      {
      	if (is_mx6ull_9x9_evk())
      		puts("Board: MX6ULL 9x9 EVK\n");
      	else if (is_cpu_type(MXC_CPU_MX6ULZ))
      		puts("Board: MX6ULZ 14x14 EVK\n");
      	else
      		puts("Board: MX6ULL 14x14 TOPEET\n");
      
      	return 0;
      }
      

4.3.4、設備樹

  • imx6ull-14x14-topeet.dts文件

    model = "i.MX6 ULL 14x14 EVK Board";
    compatible = "fsl,imx6ull-14x14-evk", "fsl,imx6ull";
    改為
    model = "i.MX6 ULL 14x14 TOPEET Board";
    compatible = "fsl,imx6ull-14x14-topeet", "fsl,imx6ull";
    
  • imx6ul-14x14-topeet.dtsi文件

    1.官方evk開發板使用了一顆擴展IO的芯片74lv595,手上的開發板沒有該芯片,所以需要去掉該芯片相關內容。屏蔽或刪除以下內容:

    	aliases {
    		/*
    		spi5 = &{/spi4};
    		*/
    	};
    
    /*
    	reg_can_3v3: regulator-can-3v3 {
    		compatible = "regulator-fixed";
    		regulator-name = "can-3v3";
    		regulator-min-microvolt = <3300000>;
    		regulator-max-microvolt = <3300000>;
    		gpios = <&gpio_spi 3 GPIO_ACTIVE_LOW>;
    	};
    */
    /*
    	spi4 {
    		compatible = "spi-gpio";
    		pinctrl-names = "default";
    		pinctrl-0 = <&pinctrl_spi4>;
    		status = "okay";
    		pinctrl-assert-gpios = <&gpio5 8 GPIO_ACTIVE_LOW>;
    		gpio-sck = <&gpio5 11 0>;
    		gpio-mosi = <&gpio5 10 0>;
    		cs-gpios = <&gpio5 7 0>;
    		num-chipselects = <1>;
    		#address-cells = <1>;
    		#size-cells = <0>;
    
    		gpio_spi: gpio@0 {
    			compatible = "fairchild,74hc595";
    			gpio-controller;
    			#gpio-cells = <2>;
    			reg = <0>;
    			registers-number = <1>;
    			registers-default = /bits/ 8 <0x57>;
    			spi-max-frequency = <100000>;
    		};
    	};
    */
    
    &can1 {
    	pinctrl-names = "default";
    	pinctrl-0 = <&pinctrl_flexcan1>;
    	/*
    	xceiver-supply = <&reg_can_3v3>;
    	*/
    	status = "okay";
    };
    
    &can2 {
    	pinctrl-names = "default";
    	pinctrl-0 = <&pinctrl_flexcan2>;
    	/*
    	xceiver-supply = <&reg_can_3v3>;
    	*/
    	status = "okay";
    };
    
    /*
    	pinctrl_spi4: spi4grp {
    		fsl,pins = <
    			MX6UL_PAD_BOOT_MODE0__GPIO5_IO10	0x70a1
    			MX6UL_PAD_BOOT_MODE1__GPIO5_IO11	0x70a1
    			MX6UL_PAD_SNVS_TAMPER7__GPIO5_IO07	0x70a1
    			MX6UL_PAD_SNVS_TAMPER8__GPIO5_IO08	0x80000000
    		>;
    	};
    */
    
  1. LCD修改。手上的開發板使用的是1024x600的rgb液晶屏,主要修改display-timings以及電源引腳

    pinctrl_lcdif_dat修改:

    	pinctrl_lcdif_dat: lcdifdatgrp {
    		fsl,pins = <
    			/*
    			MX6UL_PAD_LCD_DATA00__LCDIF_DATA00  0x79
    			MX6UL_PAD_LCD_DATA01__LCDIF_DATA01  0x79
    			MX6UL_PAD_LCD_DATA02__LCDIF_DATA02  0x79
    			*/
    			MX6UL_PAD_LCD_DATA03__LCDIF_DATA03  0x79
    			MX6UL_PAD_LCD_DATA04__LCDIF_DATA04  0x79
    			MX6UL_PAD_LCD_DATA05__LCDIF_DATA05  0x79
    			MX6UL_PAD_LCD_DATA06__LCDIF_DATA06  0x79
    			MX6UL_PAD_LCD_DATA07__LCDIF_DATA07  0x79
    			/*
    			MX6UL_PAD_LCD_DATA08__LCDIF_DATA08  0x79
    			MX6UL_PAD_LCD_DATA09__LCDIF_DATA09  0x79
    			*/
    			MX6UL_PAD_LCD_DATA10__LCDIF_DATA10  0x79
    			MX6UL_PAD_LCD_DATA11__LCDIF_DATA11  0x79
    			MX6UL_PAD_LCD_DATA12__LCDIF_DATA12  0x79
    			MX6UL_PAD_LCD_DATA13__LCDIF_DATA13  0x79
    			MX6UL_PAD_LCD_DATA14__LCDIF_DATA14  0x79
    			MX6UL_PAD_LCD_DATA15__LCDIF_DATA15  0x79
    			/*
    			MX6UL_PAD_LCD_DATA16__LCDIF_DATA16  0x79
    			MX6UL_PAD_LCD_DATA17__LCDIF_DATA17  0x79
    			MX6UL_PAD_LCD_DATA18__LCDIF_DATA18  0x79
    			*/
    			MX6UL_PAD_LCD_DATA19__LCDIF_DATA19  0x79
    			MX6UL_PAD_LCD_DATA20__LCDIF_DATA20  0x79
    			MX6UL_PAD_LCD_DATA21__LCDIF_DATA21  0x79
    			MX6UL_PAD_LCD_DATA22__LCDIF_DATA22  0x79
    			MX6UL_PAD_LCD_DATA23__LCDIF_DATA23  0x79
    		>;
    	};
    

    pinctrl_lcdif_ctrl修改:

    	pinctrl_lcdif_ctrl: lcdifctrlgrp {
    		fsl,pins = <
    			MX6UL_PAD_LCD_CLK__LCDIF_CLK	    0x79
    			MX6UL_PAD_LCD_ENABLE__LCDIF_ENABLE  0x79
    			MX6UL_PAD_LCD_HSYNC__LCDIF_HSYNC    0x79
    			MX6UL_PAD_LCD_VSYNC__LCDIF_VSYNC    0x79
    			/* used for lcd reset */
    			MX6UL_PAD_SNVS_TAMPER9__GPIO5_IO09  0x79
    			/* used for lcd power*/
    			MX6UL_PAD_LCD_DATA08__GPIO3_IO13	0x79
    		>;
    	};
    

    display-timings修改:

    &lcdif {
    	pinctrl-names = "default";
    	pinctrl-0 = <&pinctrl_lcdif_dat
    		     &pinctrl_lcdif_ctrl>;
    
    	display = <&display0>;
    	status = "okay";
    
    	display0: display@0 {
    		bits-per-pixel = <24>;
    		bus-width = <24>;
    
    		display-timings {
    			native-mode = <&timing0>;
    			timing0: timing0 {
    			clock-frequency = <51200000>;
    			hactive = <1024>;
    			vactive = <600>;
    			hfront-porch = <160>;
    			hback-porch = <140>;
    			hsync-len = <20>;
    			vback-porch = <20>;
    			vfront-porch = <12>;
    			vsync-len = <3>;
    
    			hsync-active = <0>;
    			vsync-active = <0>;
    			de-active = <1>;
    			pixelclk-active = <0>;
    			};
    		};
    	};
    };
    

    關於display-timings的說明可以參考uboot源碼下的該文檔:doc/device-tree-bindings/video/display-timing.txt

  2. 網絡芯片修改。手上開發板使用的網絡芯片與官方板同款KSZ8081,除了復位引腳不同外其他一樣,官方開發板是通過74lv595擴展IO控制復位引腳。修改如下:

    &fec2 {
    	pinctrl-names = "default";
    	pinctrl-0 = <&pinctrl_enet2>;
    	phy-mode = "rmii";
    	phy-handle = <&ethphy1>;
    	status = "okay";
    
    	mdio {
    		#address-cells = <1>;
    		#size-cells = <0>;
    
    		ethphy0: ethernet-phy@2 {
    			reg = <2>;
    			micrel,led-mode = <1>;
    			clocks = <&clks IMX6UL_CLK_ENET_REF>;
    			clock-names = "rmii-ref";
    			phy-reset-gpios = <&gpio5 7 GPIO_ACTIVE_LOW>;
    			phy-reset-duration = <10>;
    			phy-reset-post-delay = <10>;
    		};
    
    		ethphy1: ethernet-phy@1 {
    			reg = <1>;
    			micrel,led-mode = <1>;
    			clocks = <&clks IMX6UL_CLK_ENET2_REF>;
    			clock-names = "rmii-ref";
    			phy-reset-gpios = <&gpio5 8 GPIO_ACTIVE_LOW>;
    			phy-reset-duration = <10>;
    			phy-reset-post-delay = <10>;
    		};
    	};
    };
    

    phy-reset-gpiosphy-reset-durationphy-reset-post-delay參數在文件drivers/net/fec_mxc.c中用到。

  3. 修改設備樹Makefile文件arch/arm/dts/Makefile,添加自己的開發板。

    dtb-$(CONFIG_MX6ULL) += \
    	imx6ull-14x14-ddr3-val.dtb \
    	imx6ull-14x14-ddr3-val-epdc.dtb \
    	imx6ull-14x14-ddr3-val-emmc.dtb \
    	imx6ull-14x14-ddr3-val-gpmi-weim.dtb \
    	imx6ull-14x14-ddr3-val-tsc.dtb \
    	imx6ull-14x14-evk.dtb \
    	imx6ull-14x14-evk-emmc.dtb \
    	imx6ull-14x14-topeet-emmc.dtb \
    	imx6ull-14x14-evk-gpmi-weim.dtb \
    	imx6ull-9x9-evk.dtb \
    	imx6ull-colibri.dtb \
    	imx6ull-phytec-segin-ff-rdk-emmc.dtb \
    	imx6ull-dart-6ul.dtb \
    	imx6ull-somlabs-visionsom.dtb \
    	imx6ulz-14x14-evk.dtb \
    	imx6ulz-14x14-evk-emmc.dtb \
    	imx6ulz-14x14-evk-gpmi-weim.dtb
    

4.3.5、其他修改

arch/arm/mach-imx/mx6/Kconfig文件修改:

添加自己開發板平台

config TARGET_MX6ULL_14X14_TOPEET
	bool "Support mx6ull_14x14_topeet"
	select BOARD_LATE_INIT
	select DM
	select DM_THERMAL
	select MX6ULL
	imply CMD_DM

添加自己的開發板Kconfig文件

source "board/freescale/mx6ull_topeet/Kconfig"

五、編譯啟動

  1. 修改make.sh文件

    make mx6ull_14x14_evk_emmc_defconfig
    改為
    make mx6ull_14x14_topeet_emmc_defconfig
    

    執行./make.sh等待編譯完成。

  2. 燒錄至SD卡

    sudo dd if=u-boot-dtb.imx of=/dev/sdb bs=1K seek=1 && sync
    

    編譯完成后使用上述命令將uboot固件燒錄至SD卡,sdb是我的SD卡掛載到Ubuntu下的名字,可以通過命令ls /dev/sd*查看掛載了哪些設備來確定燒錄對象。

  3. 啟動開發板

    開發板撥碼開關對應啟動方式:

    1 2 3 4 5 6 7 8 啟動設備
    0 1 - - - - - - 串行下載(USB _OTG燒寫鏡像)
    1 0 0 0 0 0 1 0 SD 卡啟動
    1 0 1 0 0 1 1 0 EMMC 啟動
    1 0 0 0 1 0 0 1 NAND FLASH 啟動

六、其他

6.1、endif錯誤

board/freescale/mx6ull_topeet/Kconfig:14: 'endif' in different file than 'if'
board/freescale/mx6ull_topeet/Kconfig:3: location of the 'if'
arch/arm/mach-imx/mx6/Kconfig:913: 'endif' in different file than 'if'
board/freescale/mx6ull_topeet/Kconfig:3: location of the 'if'
arch/arm/Kconfig:1893: 'endmenu' in different file than 'menu'
board/freescale/mx6ull_topeet/Kconfig:3: location of the 'menu'
make[1]: *** [scripts/kconfig/Makefile:128:mx6ull_14x14_topeet_emmc_defconfig] 錯誤 1
make: *** [Makefile:539:mx6ull_14x14_topeet_emmc_defconfig] 錯誤 2
scripts/kconfig/conf  --syncconfig Kconfig
board/freescale/mx6ull_topeet/Kconfig:14: 'endif' in different file than 'if'
board/freescale/mx6ull_topeet/Kconfig:3: location of the 'if'
arch/arm/mach-imx/mx6/Kconfig:913: 'endif' in different file than 'if'
board/freescale/mx6ull_topeet/Kconfig:3: location of the 'if'
arch/arm/Kconfig:1893: 'endmenu' in different file than 'menu'
board/freescale/mx6ull_topeet/Kconfig:3: location of the 'menu'
make[2]: *** [scripts/kconfig/Makefile:47:syncconfig] 錯誤 1
make[1]: *** [Makefile:539:syncconfig] 錯誤 2
make: *** 沒有規則可制作目標“include/config/auto.conf”,由“include/config/uboot.release” 需求。 停止。

出現該錯誤的原因是因為我在修改board/freescale/mx6ull_topeet/Kconfig文件時沒有在文件最后endif之后添加換行,在該文件最后敲個換行即可解決。

6.2、Net Error錯誤

U-Boot 2020.04-00001-g44f5949dd9-dirty (Oct 17 2021 - 19:25:28 +0800)

CPU:   i.MX6ULL rev1.1 792 MHz (running at 396 MHz)
CPU:   Industrial temperature grade (-40C to 105C) at 37C
Reset cause: POR
Model: i.MX6 ULL 14x14 TOPEET Board
Board: MX6ULL 14x14 TOPEET
DRAM:  512 MiB
MMC:   FSL_SDHC: 0, FSL_SDHC: 1
Loading Environment from MMC... *** Warning - bad CRC, using default environment

[*]-Video Link 0 (1024 x 600)
        [0] lcdif@21c8000, video
In:    serial
Out:   serial
Err:   serial
switch to partitions #0, OK
mmc0 is current device
flash target is MMC:0
Net:
Error: ethernet@20b4000 address not set.

Error: ethernet@20b4000 address not set.

Error: ethernet@20b4000 address not set.
FEC: can't find phy-handle

Error: ethernet@20b4000 address not set.
Could not get PHY for FEC0: addr 2

Error: ethernet@20b4000 address not set.
FEC: can't find phy-handle

Error: ethernet@20b4000 address not set.
Could not get PHY for FEC0: addr 2
No ethernet found.

若uboot啟動后終端輸出如上錯誤信息,有兩種解決方案:

方案一:

在文件configs/mx6ull_14x14_topeet_emmc_defconfig添加以下內容使能uboot給網卡分配隨機MAC地址的功能,然后重新編譯后燒錄啟動

CONFIG_NET_RANDOM_ETHADDR=y

使能隨機分配MAC功能后結果:

U-Boot 2020.04-00001-g44f5949dd9-dirty (Oct 17 2021 - 21:57:35 +0800)

CPU:   i.MX6ULL rev1.1 792 MHz (running at 396 MHz)
CPU:   Industrial temperature grade (-40C to 105C) at 36C
Reset cause: POR
Model: i.MX6 ULL 14x14 TOPEET Board
Board: MX6ULL 14x14 TOPEET
DRAM:  512 MiB
MMC:   FSL_SDHC: 0, FSL_SDHC: 1
Loading Environment from MMC... *** Warning - bad CRC, using default environment

[*]-Video Link 0 (1024 x 600)
        [0] lcdif@21c8000, video
In:    serial
Out:   serial
Err:   serial
switch to partitions #0, OK
mmc0 is current device
flash target is MMC:0
Net:
Warning: ethernet@20b4000 (eth1) using random MAC address - 5a:49:f1:d9:07:cd
eth1: ethernet@20b4000 [PRIME]Get shared mii bus on ethernet@2188000

Warning: ethernet@2188000 (eth0) using random MAC address - ca:85:77:84:17:ae
, eth0: ethernet@2188000

方案二:

在終端中使用以下命令設置MAC地址

# 設置網卡1
setenv ethaddr ca:38:29:c3:28:30
# 設置網卡2
setenv eth1addr 76:7d:33:a8:f0:e7
# 保存
saveenv
# 重啟
reset

重啟后輸出結果:

U-Boot 2020.04-00001-g44f5949dd9-dirty (Oct 17 2021 - 22:03:25 +0800)

CPU:   i.MX6ULL rev1.1 792 MHz (running at 396 MHz)
CPU:   Industrial temperature grade (-40C to 105C) at 45C
Reset cause: POR
Model: i.MX6 ULL 14x14 TOPEET Board
Board: MX6ULL 14x14 TOPEET
DRAM:  512 MiB
MMC:   FSL_SDHC: 0, FSL_SDHC: 1
Loading Environment from MMC... OK
[*]-Video Link 0 (1024 x 600)
        [0] lcdif@21c8000, video
In:    serial
Out:   serial
Err:   serial
switch to partitions #0, OK
mmc0 is current device
flash target is MMC:0
Net:   eth1: ethernet@20b4000 [PRIME]Get shared mii bus on ethernet@2188000
, eth0: ethernet@2188000


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM