作者: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源碼
-
獲取NXP維護的uboot源碼:
git clone https://source.codeaurora.org/external/imx/uboot-imx
-
使用命令
git branch -a
查看分支然后切換到目標分支git checkout imx_v2020.04_5.4.70_2.3.0
-
接下來就基於該分支源碼進行uboot的移植(根目錄下README文件有助於了解uboot的編譯移植)
2.2、交叉編譯器
-
在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
-
將工具解壓至本地
# 創建文件夾 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
-
可以導入工具鏈到環境變量中
# 導入到系統環境變量(對所有用戶有效) 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開發板相關代碼進行
-
查看
board/freescale/mx6ullevk
文件夾下面的README文件說明 -
新建編譯腳本文件
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
-
執行編譯
./make.sh
並等待完成。 -
編譯源碼這一步的目的:一是為了驗證編譯環境是否正常;二是為了下一步移植過程中的代碼分析(一些文件只有在編譯后才會生成)
注意:若是在系統上第一次編譯uboot源碼可能會遇到缺少bison
、flex
的報錯信息導致編譯失敗,只需安裝后重新執行編譯即可
# 語法分析工具
sudo apt install bison
# 詞法分析工具
sudo apt install flex
四、移植
4.1、工程管理
-
Ubuntu上安裝VScode
-
uboot源碼根目錄創建文件夾
.vscode
。使用VScode打開uboot源碼文件夾,然后點擊文件->將工作區另存為...
保存文件名uboot.code-workspace
在.vscode文件夾下。內容如下{ "folders": [ { "path": ".." } ], "settings": { "files.associations": { "*.cfg": "c", "*.S": "c", } } }
-
為了便於文件分析,在搜索和源碼中隱藏一些不需要的文件,保留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, } }
-
安裝
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開發板在源碼中添加自己的開發板文件
-
添加配置文件
cp configs/mx6ull_14x14_evk_emmc_defconfig configs/mx6ull_14x14_topeet_emmc_defconfig
cp include/configs/mx6ullevk.h include/configs/mx6ull_topeet.h
-
添加開發板文件夾
cp -r board/freescale/mx6ullevk/ board/freescale/mx6ull_topeet/
更改文件名:
mv board/freescale/mx6ull_topeet/mx6ullevk.c board/freescale/mx6ull_topeet/mx6ull_topeet.c
-
添加設備樹文件
新版本uboot更多的參考了Linux內核引入了設備樹和驅動模型(Driver Model)。所以移植內容就更多的是設備樹文件的修改。
-
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"
-
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"
-
添加
imx6ul-14x14-topeet.dtsi
和imx6ul-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文件
-
第一處(目標板)
CONFIG_TARGET_MX6ULL_14X14_EVK=y 改為 CONFIG_TARGET_MX6ULL_14X14_TOPEET=y
-
第二處(imximage配置文件)
CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=board/freescale/mx6ullevk/imximage.cfg" 改為 CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=board/freescale/mx6ull_topeet/imximage.cfg"
-
第三處(設備樹)
CONFIG_DEFAULT_DEVICE_TREE="imx6ull-14x14-evk-emmc" 改為 CONFIG_DEFAULT_DEVICE_TREE="imx6ull-14x14-topeet-emmc"
-
第四處(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文件夾
-
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
-
Makefile
文件修改如下obj-y := mx6ull_topeet.o
-
由於
CONFIG_USE_IMXIMG_PLUGIN
沒有使能,所以imximage_lpddr2.cfg
文件和和imximage.cfg
無需修改。否則改動如下PLUGIN board/freescale/mx6ullevk/plugin.bin 0x00907000 改為 PLUGIN board/freescale/mx6ull_topeet/plugin.bin 0x00907000
-
mx6ull_topeet.c
文件修改-
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; }
-
輸出信息修改
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 = <®_can_3v3>; */ status = "okay"; }; &can2 { pinctrl-names = "default"; pinctrl-0 = <&pinctrl_flexcan2>; /* xceiver-supply = <®_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 >; }; */
-
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
-
網絡芯片修改。手上開發板使用的網絡芯片與官方板同款
KSZ8081
,除了復位引腳不同外其他一樣,官方開發板是通過74lv595擴展IO控制復位引腳。修改如下:&fec2 { pinctrl-names = "default"; pinctrl-0 = <&pinctrl_enet2>; phy-mode = "rmii"; phy-handle = <ðphy1>; 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-gpios
、phy-reset-duration
、phy-reset-post-delay
參數在文件drivers/net/fec_mxc.c
中用到。 -
修改設備樹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"
五、編譯啟動
-
修改
make.sh
文件make mx6ull_14x14_evk_emmc_defconfig 改為 make mx6ull_14x14_topeet_emmc_defconfig
執行
./make.sh
等待編譯完成。 -
燒錄至SD卡
sudo dd if=u-boot-dtb.imx of=/dev/sdb bs=1K seek=1 && sync
編譯完成后使用上述命令將uboot固件燒錄至SD卡,
sdb
是我的SD卡掛載到Ubuntu下的名字,可以通過命令ls /dev/sd*
查看掛載了哪些設備來確定燒錄對象。 -
啟動開發板
開發板撥碼開關對應啟動方式:
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