uboot | 移植NXP官方uboot到imx6ull开发板(2016.03)

 原创

MCUlover6662021-11-08 14:01:56©著作权

文章标签uboot引脚开发板#definesd卡文章分类其他其它阅读数2.2万

一、NXP官方uboot

1. 下载

NXP官方uboot仓库地址为: https://github.com/Freescale/u-boot-fslc

这里为了保持版本统一,使用正点原子资料包中提供的原厂linuxuboot-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2(版本是2016.03)。

2. 编译

设置临时环境变量:

<span style="color:#17233f"><span style="color:#333333"><span style="background-color:#f7f7f7"><span style="color:#000000"><code id="code_id_0" class="language-bash"><span style="color:#1990b8">export</span> <span style="color:#a67f59">ARCH</span><span style="color:#a67f59">=</span>arm
<span style="color:#1990b8">export</span> <span style="color:#a67f59">CROSS_COMPILE</span><span style="color:#a67f59">=</span>arm-linux-gnueabihf-
</code></span></span></span></span>
  • 1.
  • 2.

清理构建:

<span style="color:#17233f"><span style="color:#333333"><span style="background-color:#f7f7f7"><span style="color:#000000"><code id="code_id_1" class="language-bash"><span style="color:#128b4e">make</span> distclean
</code></span></span></span></span>
  • 1.

查看uboot/configs目录下imx6ull相关的单板:
 


NXP官方EVK支持nand和emmc两种,因为我手头的开发板是emmc的,所以这里也选择emmc版本的EVK。

配置单板:

<span style="color:#17233f"><span style="color:#333333"><span style="background-color:#f7f7f7"><span style="color:#000000"><code id="code_id_2" class="language-bash"><span style="color:#128b4e">make</span> mx6ull_14x14_evk_emmc_defconfig
</code></span></span></span></span>
  • 1.

配置好之后编译:

<span style="color:#17233f"><span style="color:#333333"><span style="background-color:#f7f7f7"><span style="color:#000000"><code id="code_id_3" class="language-bash"><span style="color:#128b4e">make</span>
</code></span></span></span></span>
  • 1.

编译成功之后可以看到三个uboot的文件,作用如下。

  • uboot:可执行文件
  • uboot.bin:bin格式可执行文件
  • uboot.imx:适用于NXP工具烧写的可执行文件

3. 烧写到SD卡

<span style="color:#17233f"><span style="color:#333333"><span style="background-color:#f7f7f7"><span style="color:#000000"><code id="code_id_4" class="language-bash">imxdownload u-boot.bin /dev/sdb
</code></span></span></span></span>
  • 1.

4. 执行结果分析

将SD卡插入板子,选择从SD卡启动,查看串口日志:
 


(1)uboot正常启动;
(2)uboot正确识别到DDR,大小为512MB;
(3)检查 SD 卡和EMMC是否正常:

<span style="color:#17233f"><span style="color:#333333"><span style="background-color:#f7f7f7"><span style="color:#000000"><code id="code_id_5" class="language-bash">// 列出当前mmc设备
mmc list

// 查看设备0的信息
mmc dev <span style="color:#c92c2c">0</span>
mmc info

// 查看设备1的信息
mmc dev <span style="color:#c92c2c">1</span>
mmc info
</code></span></span></span></span>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.

SD卡大小16GB,正常:
 


EMMC大小为8GB,正常:

(4)LCD显示设备检查

uboot打印日志中提示LCD显示设备是Display: TFT43AB (480x272),这里我实际连接的是正点原子7寸RGB屏幕,不匹配,所以LCD无显示。

(5)网络设备检查

uboot打印日志中提示未找到网络设备:

<span style="color:#17233f"><span style="color:#333333"><span style="background-color:#f7f7f7"><span style="color:#000000"><code id="code_id_6" class="language-bash">Booting from net <span style="color:#5f6364">..</span>.
No ethernet found.
No ethernet found.
</code></span></span></span></span>
  • 1.
  • 2.
  • 3.

接下来,我们就基于NXP官方提供的uboot,针对正点原子imx6ull开发板进行一些配置参数的修改,修复LCD和网络问题

二、移植uboot

1. 新建单板

(1)新建单板目录,复制官方EVK的单板目录:

<span style="color:#17233f"><span style="color:#333333"><span style="background-color:#f7f7f7"><span style="color:#000000"><code id="code_id_7" class="language-bash"><span style="color:#1990b8">cd</span> board/freescale
<span style="color:#128b4e">cp</span> -rf mx6ullevk/ mx6ullatk
</code></span></span></span></span>
  • 1.
  • 2.

进入新建的目录,进行修改。
① 重命名c文件:

<span style="color:#17233f"><span style="color:#333333"><span style="background-color:#f7f7f7"><span style="color:#000000"><code id="code_id_8" class="language-bash"><span style="color:#1990b8">cd</span> mx6ullatk/
<span style="color:#128b4e">mv</span> mx6ullevk.c mx6ullatk.c
</code></span></span></span></span>
  • 1.
  • 2.

② 修改Makefile:

<span style="color:#17233f"><span style="color:#333333"><span style="background-color:#f7f7f7"><span style="color:#000000"><code id="code_id_9" class="language-bash">obj-y  :<span style="color:#a67f59">=</span> mx6ullatk.o
</code></span></span></span></span>
  • 1.

③ 修改imximage.bin文件:

<span style="color:#17233f"><span style="color:#333333"><span style="background-color:#f7f7f7"><span style="color:#000000"><code id="code_id_10" class="language-c"><span style="color:#c92c2c">#<span style="color:#1990b8">ifdef</span> CONFIG_USE_PLUGIN</span>
<span style="color:#7d8b99"><em>/*PLUGIN    plugin-binary-file    IRAM_FREE_START_ADDR*/</em></span>
PLUGIN	board<span style="color:#a67f59">/</span>freescale<span style="color:#a67f59">/</span>mx6ullatk<span style="color:#a67f59">/</span>plugin<span style="color:#5f6364">.</span>bin <span style="color:#c92c2c">0x00907000</span>
<span style="color:#c92c2c">#<span style="color:#1990b8">else</span></span>
</code></span></span></span></span>
  • 1.
  • 2.
  • 3.
  • 4.

修改Kconfig文件:

<span style="color:#17233f"><span style="color:#333333"><span style="background-color:#f7f7f7"><span style="color:#000000"><code id="code_id_11" class="language-bash"><span style="color:#1990b8">if</span> TARGET_MX6ULL_14X14_ATK

config SYS_BOARD
	default <span style="color:#128b4e">"mx6ullatk"</span>

config SYS_VENDOR
	default <span style="color:#128b4e">"freescale"</span>

config SYS_CONFIG_NAME
	default <span style="color:#128b4e">"mx6ullatk"</span>

endif
</code></span></span></span></span>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.

修改 MAINTAINERS 文件:

<span style="color:#17233f"><span style="color:#333333"><span style="background-color:#f7f7f7"><span style="color:#000000"><code id="code_id_12" class="language-bash">MX6ULLATK BOARD
M:	Mculover666 <span style="color:#a67f59"><</span>mculover666@qq.com<span style="color:#a67f59">></span>
S:	Maintained
F:	board/freescale/mx6ullatk/
F:	include/configs/mx6ullatk.h
F:	configs/mx6ull_14x14_atk_defconfig
</code></span></span></span></span>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

(2)新建开发板默认配置文件:

<span style="color:#17233f"><span style="color:#333333"><span style="background-color:#f7f7f7"><span style="color:#000000"><code id="code_id_13" class="language-bash"><span style="color:#1990b8">cd</span> configs/
<span style="color:#128b4e">cp</span> mx6ull_14x14_evk_emmc_defconfig mx6ull_14x14_atk_emmc_defconfig
</code></span></span></span></span>
  • 1.
  • 2.

修改该文件中的下面两行内容:

<span style="color:#17233f"><span style="color:#333333"><span style="background-color:#f7f7f7"><span style="color:#000000"><code id="code_id_14" class="language-bash"><span style="color:#a67f59">CONFIG_SYS_EXTRA_OPTIONS</span><span style="color:#a67f59">=</span><span style="color:#128b4e">"IMX_CONFIG=board/freescale/mx6ullatk/imximage.cfg,MX6ULL_EVK_EMMC_REWORK"</span>
<span style="color:#a67f59">CONFIG_TARGET_MX6ULL_14X14_ATK</span><span style="color:#a67f59">=</span>y
</code></span></span></span></span>
  • 1.
  • 2.

(3)新建开发板头文件:

<span style="color:#17233f"><span style="color:#333333"><span style="background-color:#f7f7f7"><span style="color:#000000"><code id="code_id_15" class="language-bash"><span style="color:#1990b8">cd</span> include/configs
<span style="color:#128b4e">cp</span> mx6ullevk.h mx6ullatk.h
</code></span></span></span></span>
  • 1.
  • 2.

修改头文件中的内容:

<span style="color:#17233f"><span style="color:#333333"><span style="background-color:#f7f7f7"><span style="color:#000000"><code id="code_id_16" class="language-c"><span style="color:#c92c2c">#<span style="color:#1990b8">ifndef</span> __MX6ULLATK_CONFIG_H</span>
<span style="color:#c92c2c">#<span style="color:#1990b8">define</span> __MX6ULLATK_CONFIG_H</span>
</code></span></span></span></span>
  • 1.
  • 2.

将文件最后关于android的支持去除:

<span style="color:#17233f"><span style="color:#333333"><span style="background-color:#f7f7f7"><span style="color:#000000"><code id="code_id_17" class="language-c"><span style="color:#7d8b99"><em>// #if defined(CONFIG_ANDROID_SUPPORT)</em></span>
<span style="color:#7d8b99"><em>// #include "mx6ullevk_android.h"</em></span>
<span style="color:#7d8b99"><em>// #endif</em></span>
</code></span></span></span></span>
  • 1.
  • 2.
  • 3.

(4)在menuconfig中添加新的单板

仿照其它单板文件,添加:

<span style="color:#17233f"><span style="color:#333333"><span style="background-color:#f7f7f7"><span style="color:#000000"><code id="code_id_18" class="language-bash">config TARGET_MX6ULL_14X14_ATK
	bool <span style="color:#128b4e">"Support mx6ull_14x14_atk"</span>
	<span style="color:#1990b8">select</span> MX6ULL
	<span style="color:#1990b8">select</span> DM
	<span style="color:#1990b8">select</span> DM_THERMAL
</code></span></span></span></span>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

在临近末尾处仿照添加:

<span style="color:#17233f"><span style="color:#333333"><span style="background-color:#f7f7f7"><span style="color:#000000"><code id="code_id_19" class="language-bash"><span style="color:#1990b8">source</span> <span style="color:#128b4e">"board/freescale/mx6ullatk/Kconfig"</span>
</code></span></span></span></span>
  • 1.

(5)新的单板编译测试

至此,添加一个新的单板到uboot中完成,编译测试:

<span style="color:#17233f"><span style="color:#333333"><span style="background-color:#f7f7f7"><span style="color:#000000"><code id="code_id_20" class="language-bash"><span style="color:#128b4e">make</span> distclean
<span style="color:#128b4e">make</span> mx6ull_14x14_atk_emmc_defconfig
<span style="color:#128b4e">make</span>
</code></span></span></span></span>
  • 1.
  • 2.
  • 3.

编译成功后,将bin烧写到SD卡,启动查看效果:
 


和原厂uboot运行效果一样,新建单板成功。

2. 修改适配驱动

uboot中修改驱动配置在xxx.hxxx.c两个文件中,xxx为单板名称

2.1. 修改LCD驱动

检查LCD驱动的思路为
① 检查LCD引脚配置
② 检查屏幕参数配置

① 检查LCD引脚配置:查看原理图,本文所使用的开发板和官方开发板的LCD引脚相同,无需修改;

② 检查屏幕参数配置

本文中使用的是正点原子7寸RGB屏幕,在board/freescale/mx6ullatk/mx6ullatk.c文件中,修改屏幕默认参数配置如下:

<span style="color:#17233f"><span style="color:#333333"><span style="background-color:#f7f7f7"><span style="color:#000000"><code id="code_id_21" class="language-c"><span style="color:#1990b8">struct</span> <span style="color:#1990b8">display_info_t</span> <span style="color:#1990b8">const</span> displays<span style="color:#5f6364">[</span><span style="color:#5f6364">]</span> <span style="color:#a67f59">=</span> <span style="color:#5f6364">{</span><span style="color:#5f6364">{</span>
	<span style="color:#5f6364">.</span>bus <span style="color:#a67f59">=</span> MX6UL_LCDIF1_BASE_ADDR<span style="color:#5f6364">,</span>
	<span style="color:#5f6364">.</span>addr <span style="color:#a67f59">=</span> <span style="color:#c92c2c">0</span><span style="color:#5f6364">,</span>
	<span style="color:#5f6364">.</span>pixfmt <span style="color:#a67f59">=</span> <span style="color:#c92c2c">24</span><span style="color:#5f6364">,</span>
	<span style="color:#5f6364">.</span>detect <span style="color:#a67f59">=</span> <span style="color:#c92c2c">NULL</span><span style="color:#5f6364">,</span>
	<span style="color:#5f6364">.</span>enable	<span style="color:#a67f59">=</span> do_enable_parallel_lcd<span style="color:#5f6364">,</span>
	<span style="color:#5f6364">.</span>mode	<span style="color:#a67f59">=</span> <span style="color:#5f6364">{</span>
		<span style="color:#5f6364">.</span>name			<span style="color:#a67f59">=</span> <span style="color:#128b4e">"TFT7016"</span><span style="color:#5f6364">,</span>
		<span style="color:#5f6364">.</span>xres           <span style="color:#a67f59">=</span> <span style="color:#c92c2c">1024</span><span style="color:#5f6364">,</span>
		<span style="color:#5f6364">.</span>yres           <span style="color:#a67f59">=</span> <span style="color:#c92c2c">600</span><span style="color:#5f6364">,</span>
		<span style="color:#5f6364">.</span>pixclock       <span style="color:#a67f59">=</span> <span style="color:#c92c2c">19351</span><span style="color:#5f6364">,</span>
		<span style="color:#5f6364">.</span>left_margin    <span style="color:#a67f59">=</span> <span style="color:#c92c2c">140</span><span style="color:#5f6364">,</span>
		<span style="color:#5f6364">.</span>right_margin   <span style="color:#a67f59">=</span> <span style="color:#c92c2c">160</span><span style="color:#5f6364">,</span>
		<span style="color:#5f6364">.</span>upper_margin   <span style="color:#a67f59">=</span> <span style="color:#c92c2c">20</span><span style="color:#5f6364">,</span>
		<span style="color:#5f6364">.</span>lower_margin   <span style="color:#a67f59">=</span> <span style="color:#c92c2c">12</span><span style="color:#5f6364">,</span>
		<span style="color:#5f6364">.</span>hsync_len      <span style="color:#a67f59">=</span> <span style="color:#c92c2c">20</span><span style="color:#5f6364">,</span>
		<span style="color:#5f6364">.</span>vsync_len      <span style="color:#a67f59">=</span> <span style="color:#c92c2c">3</span><span style="color:#5f6364">,</span>
		<span style="color:#5f6364">.</span>sync           <span style="color:#a67f59">=</span> <span style="color:#c92c2c">0</span><span style="color:#5f6364">,</span>
		<span style="color:#5f6364">.</span>vmode          <span style="color:#a67f59">=</span> FB_VMODE_NONINTERLACED
<span style="color:#5f6364">}</span> <span style="color:#5f6364">}</span> <span style="color:#5f6364">}</span><span style="color:#5f6364">;</span>
</code></span></span></span></span>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.

接着在include/configs/mx6ullatk.h文件中,修改uboot默认环境变量设置:

<span style="color:#17233f"><span style="color:#333333"><span style="background-color:#f7f7f7"><span style="color:#000000"><code id="code_id_22" class="language-c"><span style="color:#128b4e">"panel=TFT7016\0"</span> \
</code></span></span></span></span>
  • 1.

修改之后,重新编译uboot,烧写到SD卡中运行:


此时,LCD已经成功点亮,显示NXP logo:

2.2. 修改网络驱动

IMX6ULL有两个ENET外设,本文所使用的开发板与官方EVK开发板的区别在于:使用RMII接口连接LAN8720A PHY 芯片,且复位引脚不同,其余引脚相同。

所以修改网络驱动的思路为:

  • ① 修改PHY器件地址
  • ② 修改复位引脚初始化

ENET1原理图如下:
 


ENET2原理图如下:

两个复位引脚分别对应的引脚如下表:

信号引脚
ENET1_RSTSNVS_TAMPER7/GPIO5_IO07
ENET2_RSTSNVS_TAMPER8/GPIO5_IO08

① 修改PHY芯片器件地址

include/configs/mx6ullatk.h文件中修改两个PHY芯片的器件地址:

<span style="color:#17233f"><span style="color:#333333"><span style="background-color:#f7f7f7"><span style="color:#000000"><code id="code_id_23" class="language-c"><span style="color:#c92c2c">#<span style="color:#1990b8">if</span> <span style="color:#5f6364">(</span>CONFIG_FEC_ENET_DEV <span style="color:#a67f59">==</span> <span style="color:#c92c2c">0</span><span style="color:#5f6364">)</span></span>
<span style="color:#c92c2c">#<span style="color:#1990b8">define</span> IMX_FEC_BASE			ENET_BASE_ADDR</span>
<span style="color:#c92c2c">#<span style="color:#1990b8">define</span> CONFIG_FEC_MXC_PHYADDR          <span style="color:#c92c2c">0x0</span></span>
<span style="color:#c92c2c">#<span style="color:#1990b8">define</span> CONFIG_FEC_XCV_TYPE             RMII</span>
<span style="color:#c92c2c">#<span style="color:#1990b8">elif</span> <span style="color:#5f6364">(</span>CONFIG_FEC_ENET_DEV <span style="color:#a67f59">==</span> <span style="color:#c92c2c">1</span><span style="color:#5f6364">)</span></span>
<span style="color:#c92c2c">#<span style="color:#1990b8">define</span> IMX_FEC_BASE			ENET2_BASE_ADDR</span>
<span style="color:#c92c2c">#<span style="color:#1990b8">define</span> CONFIG_FEC_MXC_PHYADDR		<span style="color:#c92c2c">0x1</span></span>
<span style="color:#c92c2c">#<span style="color:#1990b8">define</span> CONFIG_FEC_XCV_TYPE		RMII</span>
<span style="color:#c92c2c">#<span style="color:#1990b8">endif</span></span>
</code></span></span></span></span>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.

② 修改复位引脚驱动

复位引脚在EVK开发板上被74LV595使用,如图:
 


74LV595是串行转并行的一个芯片,通常用来扩展IO引脚,在本文所使用的开发板上未使用,所以在board/freescale/mx6ullatk/mx6ullatk.cinclude/configs/mx6ullatk.h文件中去掉相关代码,去除之后一定要确保编译成功才可以进行后续工作。

接下来在mx6ullatk.c中添加复位引脚配置:

<span style="color:#17233f"><span style="color:#333333"><span style="background-color:#f7f7f7"><span style="color:#000000"><code id="code_id_24" class="language-c"><span style="color:#c92c2c">#<span style="color:#1990b8">define</span> ENET1_RESET <span style="color:#128b4e">IMX_GPIO_NR</span><span style="color:#5f6364">(</span><span style="color:#c92c2c">5</span><span style="color:#5f6364">,</span> <span style="color:#c92c2c">7</span><span style="color:#5f6364">)</span></span>
<span style="color:#c92c2c">#<span style="color:#1990b8">define</span> ENET2_RESET <span style="color:#128b4e">IMX_GPIO_NR</span><span style="color:#5f6364">(</span><span style="color:#c92c2c">5</span><span style="color:#5f6364">,</span> <span style="color:#c92c2c">8</span><span style="color:#5f6364">)</span></span>

<span style="color:#7d8b99"><em>/*
 * pin conflicts for fec1 and fec2, GPIO1_IO06 and GPIO1_IO07 can only
 * be used for ENET1 or ENET2, cannot be used for both.
 */</em></span>
<span style="color:#1990b8">static</span> <span style="color:#1990b8">iomux_v3_cfg_t</span> <span style="color:#1990b8">const</span> fec1_pads<span style="color:#5f6364">[</span><span style="color:#5f6364">]</span> <span style="color:#a67f59">=</span> <span style="color:#5f6364">{</span>
	MX6_PAD_GPIO1_IO06__ENET1_MDIO <span style="color:#a67f59">|</span> <span style="color:#128b4e">MUX_PAD_CTRL</span><span style="color:#5f6364">(</span>MDIO_PAD_CTRL<span style="color:#5f6364">)</span><span style="color:#5f6364">,</span>
	MX6_PAD_GPIO1_IO07__ENET1_MDC <span style="color:#a67f59">|</span> <span style="color:#128b4e">MUX_PAD_CTRL</span><span style="color:#5f6364">(</span>ENET_PAD_CTRL<span style="color:#5f6364">)</span><span style="color:#5f6364">,</span>
	MX6_PAD_ENET1_TX_DATA0__ENET1_TDATA00 <span style="color:#a67f59">|</span> <span style="color:#128b4e">MUX_PAD_CTRL</span><span style="color:#5f6364">(</span>ENET_PAD_CTRL<span style="color:#5f6364">)</span><span style="color:#5f6364">,</span>
	MX6_PAD_ENET1_TX_DATA1__ENET1_TDATA01 <span style="color:#a67f59">|</span> <span style="color:#128b4e">MUX_PAD_CTRL</span><span style="color:#5f6364">(</span>ENET_PAD_CTRL<span style="color:#5f6364">)</span><span style="color:#5f6364">,</span>
	MX6_PAD_ENET1_TX_EN__ENET1_TX_EN <span style="color:#a67f59">|</span> <span style="color:#128b4e">MUX_PAD_CTRL</span><span style="color:#5f6364">(</span>ENET_PAD_CTRL<span style="color:#5f6364">)</span><span style="color:#5f6364">,</span>
	MX6_PAD_ENET1_TX_CLK__ENET1_REF_CLK1 <span style="color:#a67f59">|</span> <span style="color:#128b4e">MUX_PAD_CTRL</span><span style="color:#5f6364">(</span>ENET_CLK_PAD_CTRL<span style="color:#5f6364">)</span><span style="color:#5f6364">,</span>
	MX6_PAD_ENET1_RX_DATA0__ENET1_RDATA00 <span style="color:#a67f59">|</span> <span style="color:#128b4e">MUX_PAD_CTRL</span><span style="color:#5f6364">(</span>ENET_PAD_CTRL<span style="color:#5f6364">)</span><span style="color:#5f6364">,</span>
	MX6_PAD_ENET1_RX_DATA1__ENET1_RDATA01 <span style="color:#a67f59">|</span> <span style="color:#128b4e">MUX_PAD_CTRL</span><span style="color:#5f6364">(</span>ENET_PAD_CTRL<span style="color:#5f6364">)</span><span style="color:#5f6364">,</span>
	MX6_PAD_ENET1_RX_ER__ENET1_RX_ER <span style="color:#a67f59">|</span> <span style="color:#128b4e">MUX_PAD_CTRL</span><span style="color:#5f6364">(</span>ENET_PAD_CTRL<span style="color:#5f6364">)</span><span style="color:#5f6364">,</span>
	MX6_PAD_ENET1_RX_EN__ENET1_RX_EN <span style="color:#a67f59">|</span> <span style="color:#128b4e">MUX_PAD_CTRL</span><span style="color:#5f6364">(</span>ENET_PAD_CTRL<span style="color:#5f6364">)</span><span style="color:#5f6364">,</span>

	<span style="color:#7d8b99"><em>/* RST */</em></span>
	MX6_PAD_SNVS_TAMPER7__GPIO5_IO07 <span style="color:#a67f59">|</span> <span style="color:#128b4e">MUX_PAD_CTRL</span><span style="color:#5f6364">(</span>NO_PAD_CTRL<span style="color:#5f6364">)</span><span style="color:#5f6364">,</span>
<span style="color:#5f6364">}</span><span style="color:#5f6364">;</span>

<span style="color:#1990b8">static</span> <span style="color:#1990b8">iomux_v3_cfg_t</span> <span style="color:#1990b8">const</span> fec2_pads<span style="color:#5f6364">[</span><span style="color:#5f6364">]</span> <span style="color:#a67f59">=</span> <span style="color:#5f6364">{</span>
	MX6_PAD_GPIO1_IO06__ENET2_MDIO <span style="color:#a67f59">|</span> <span style="color:#128b4e">MUX_PAD_CTRL</span><span style="color:#5f6364">(</span>MDIO_PAD_CTRL<span style="color:#5f6364">)</span><span style="color:#5f6364">,</span>
	MX6_PAD_GPIO1_IO07__ENET2_MDC <span style="color:#a67f59">|</span> <span style="color:#128b4e">MUX_PAD_CTRL</span><span style="color:#5f6364">(</span>ENET_PAD_CTRL<span style="color:#5f6364">)</span><span style="color:#5f6364">,</span>

	MX6_PAD_ENET2_TX_DATA0__ENET2_TDATA00 <span style="color:#a67f59">|</span> <span style="color:#128b4e">MUX_PAD_CTRL</span><span style="color:#5f6364">(</span>ENET_PAD_CTRL<span style="color:#5f6364">)</span><span style="color:#5f6364">,</span>
	MX6_PAD_ENET2_TX_DATA1__ENET2_TDATA01 <span style="color:#a67f59">|</span> <span style="color:#128b4e">MUX_PAD_CTRL</span><span style="color:#5f6364">(</span>ENET_PAD_CTRL<span style="color:#5f6364">)</span><span style="color:#5f6364">,</span>
	MX6_PAD_ENET2_TX_CLK__ENET2_REF_CLK2 <span style="color:#a67f59">|</span> <span style="color:#128b4e">MUX_PAD_CTRL</span><span style="color:#5f6364">(</span>ENET_CLK_PAD_CTRL<span style="color:#5f6364">)</span><span style="color:#5f6364">,</span>
	MX6_PAD_ENET2_TX_EN__ENET2_TX_EN <span style="color:#a67f59">|</span> <span style="color:#128b4e">MUX_PAD_CTRL</span><span style="color:#5f6364">(</span>ENET_PAD_CTRL<span style="color:#5f6364">)</span><span style="color:#5f6364">,</span>

	MX6_PAD_ENET2_RX_DATA0__ENET2_RDATA00 <span style="color:#a67f59">|</span> <span style="color:#128b4e">MUX_PAD_CTRL</span><span style="color:#5f6364">(</span>ENET_PAD_CTRL<span style="color:#5f6364">)</span><span style="color:#5f6364">,</span>
	MX6_PAD_ENET2_RX_DATA1__ENET2_RDATA01 <span style="color:#a67f59">|</span> <span style="color:#128b4e">MUX_PAD_CTRL</span><span style="color:#5f6364">(</span>ENET_PAD_CTRL<span style="color:#5f6364">)</span><span style="color:#5f6364">,</span>
	MX6_PAD_ENET2_RX_EN__ENET2_RX_EN <span style="color:#a67f59">|</span> <span style="color:#128b4e">MUX_PAD_CTRL</span><span style="color:#5f6364">(</span>ENET_PAD_CTRL<span style="color:#5f6364">)</span><span style="color:#5f6364">,</span>
	MX6_PAD_ENET2_RX_ER__ENET2_RX_ER <span style="color:#a67f59">|</span> <span style="color:#128b4e">MUX_PAD_CTRL</span><span style="color:#5f6364">(</span>ENET_PAD_CTRL<span style="color:#5f6364">)</span><span style="color:#5f6364">,</span>
	
	<span style="color:#7d8b99"><em>/* RST */</em></span>
	MX6_PAD_SNVS_TAMPER7__GPIO5_IO08 <span style="color:#a67f59">|</span> <span style="color:#128b4e">MUX_PAD_CTRL</span><span style="color:#5f6364">(</span>NO_PAD_CTRL<span style="color:#5f6364">)</span><span style="color:#5f6364">,</span>
<span style="color:#5f6364">}</span><span style="color:#5f6364">;</span>
</code></span></span></span></span>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.

再添加一个硬复位函数,在ETH初始化的时候,硬件复位外部PHY芯片:

<span style="color:#17233f"><span style="color:#333333"><span style="background-color:#f7f7f7"><span style="color:#000000"><code id="code_id_25" class="language-c"><span style="color:#1990b8">static</span> <span style="color:#1990b8">void</span> <span style="color:#128b4e">board_eth_hard_reset</span><span style="color:#5f6364">(</span><span style="color:#1990b8">int</span> fec_id<span style="color:#5f6364">)</span>
<span style="color:#5f6364">{</span>
	<span style="color:#1990b8">if</span> <span style="color:#5f6364">(</span>fec_id <span style="color:#a67f59">==</span> <span style="color:#c92c2c">0</span><span style="color:#5f6364">)</span> <span style="color:#5f6364">{</span>
		<span style="color:#128b4e">gpio_direction_output</span><span style="color:#5f6364">(</span>ENET1_RESET<span style="color:#5f6364">,</span> <span style="color:#c92c2c">1</span><span style="color:#5f6364">)</span><span style="color:#5f6364">;</span>
		<span style="color:#128b4e">gpio_set_value</span><span style="color:#5f6364">(</span>ENET1_RESET<span style="color:#5f6364">,</span> <span style="color:#c92c2c">0</span><span style="color:#5f6364">)</span><span style="color:#5f6364">;</span>
		<span style="color:#128b4e">mdelay</span><span style="color:#5f6364">(</span><span style="color:#c92c2c">20</span><span style="color:#5f6364">)</span><span style="color:#5f6364">;</span>
		<span style="color:#128b4e">gpio_set_value</span><span style="color:#5f6364">(</span>ENET1_RESET<span style="color:#5f6364">,</span> <span style="color:#c92c2c">1</span><span style="color:#5f6364">)</span><span style="color:#5f6364">;</span>
	<span style="color:#5f6364">}</span> <span style="color:#1990b8">else</span> <span style="color:#5f6364">{</span>
		<span style="color:#128b4e">gpio_direction_output</span><span style="color:#5f6364">(</span>ENET2_RESET<span style="color:#5f6364">,</span> <span style="color:#c92c2c">1</span><span style="color:#5f6364">)</span><span style="color:#5f6364">;</span>
		<span style="color:#128b4e">gpio_set_value</span><span style="color:#5f6364">(</span>ENET2_RESET<span style="color:#5f6364">,</span> <span style="color:#c92c2c">0</span><span style="color:#5f6364">)</span><span style="color:#5f6364">;</span>
		<span style="color:#128b4e">mdelay</span><span style="color:#5f6364">(</span><span style="color:#c92c2c">20</span><span style="color:#5f6364">)</span><span style="color:#5f6364">;</span>
		<span style="color:#128b4e">gpio_set_value</span><span style="color:#5f6364">(</span>ENET2_RESET<span style="color:#5f6364">,</span> <span style="color:#c92c2c">1</span><span style="color:#5f6364">)</span><span style="color:#5f6364">;</span>
	<span style="color:#5f6364">}</span>
<span style="color:#5f6364">}</span>

<span style="color:#1990b8">int</span> <span style="color:#128b4e">board_eth_init</span><span style="color:#5f6364">(</span><span style="color:#1990b8">bd_t</span> <span style="color:#a67f59">*</span>bis<span style="color:#5f6364">)</span>
<span style="color:#5f6364">{</span>
	<span style="color:#128b4e">setup_iomux_fec</span><span style="color:#5f6364">(</span>CONFIG_FEC_ENET_DEV<span style="color:#5f6364">)</span><span style="color:#5f6364">;</span>
	<span style="color:#128b4e">board_eth_hard_reset</span><span style="color:#5f6364">(</span>CONFIG_FEC_ENET_DEV<span style="color:#5f6364">)</span><span style="color:#5f6364">;</span>

	<span style="color:#1990b8">return</span> <span style="color:#128b4e">fecmxc_initialize_multi</span><span style="color:#5f6364">(</span>bis<span style="color:#5f6364">,</span> CONFIG_FEC_ENET_DEV<span style="color:#5f6364">,</span>
				       CONFIG_FEC_MXC_PHYADDR<span style="color:#5f6364">,</span> IMX_FEC_BASE<span style="color:#5f6364">)</span><span style="color:#5f6364">;</span>
<span style="color:#5f6364">}</span>
</code></span></span></span></span>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.

编译uboot,下载到SD卡中,运行查看日志:
 


代码中搜索 "address not set"来定位问题,很快就找到根源了:

uboot从环境变量中加载网卡MAC地址,结果MAC地址为空,所以输出错误提示。

解决方案非常简单,在uboot中设置一下MAC地址即可:

<span style="color:#17233f"><span style="color:#333333"><span style="background-color:#f7f7f7"><span style="color:#000000"><code id="code_id_26" class="language-bash">setenv ethaddr 00:04:9f:04:d2:35
saveenv
</code></span></span></span></span>
  • 1.
  • 2.

重启之后可以看到无错误提示,设置ip地址、网关地址、子网掩码:

<span style="color:#17233f"><span style="color:#333333"><span style="background-color:#f7f7f7"><span style="color:#000000"><code id="code_id_27" class="language-bash">setenv ipaddr <span style="color:#c92c2c">192.168</span>.1.101
setenv gatewayip <span style="color:#c92c2c">192.168</span>.1.1
setenv netmask <span style="color:#c92c2c">255.255</span>.255.0
saveenv
</code></span></span></span></span>
  • 1.
  • 2.
  • 3.
  • 4.

接着ping开机主机测试:

<span style="color:#17233f"><span style="color:#333333"><span style="background-color:#f7f7f7"><span style="color:#000000"><code id="code_id_28" class="language-c">ping <span style="color:#c92c2c">192.168</span><span style="color:#c92c2c">.1</span><span style="color:#c92c2c">.100</span>
</code></span></span></span></span>
  • 1.

报如下错误:
 


这个问题实在是太难定位了,查询正点原子移植资料寻求解决办法,修复LAN8720A的代码,编辑drivers/net/phy/phy.c文件中的函数 genphy_update_link,在函数刚进入时添加如下代码:

<span style="color:#17233f"><span style="color:#333333"><span style="background-color:#f7f7f7"><span style="color:#000000"><code id="code_id_29" class="language-c"><span style="color:#c92c2c">#<span style="color:#1990b8">ifdef</span> CONFIG_PHY_SMSC</span>
	<span style="color:#1990b8">static</span> <span style="color:#1990b8">int</span> lan8720_flag <span style="color:#a67f59">=</span> <span style="color:#c92c2c">0</span><span style="color:#5f6364">;</span>
	<span style="color:#1990b8">int</span> bmcr_reg<span style="color:#5f6364">;</span>

	<span style="color:#1990b8">if</span> <span style="color:#5f6364">(</span>lan8720_flag <span style="color:#a67f59">==</span> <span style="color:#c92c2c">0</span><span style="color:#5f6364">)</span> <span style="color:#5f6364">{</span>
		bmcr_reg <span style="color:#a67f59">=</span> <span style="color:#128b4e">phy_read</span><span style="color:#5f6364">(</span>phydev<span style="color:#5f6364">,</span> MDIO_DEVAD_NONE<span style="color:#5f6364">,</span> MII_BMCR<span style="color:#5f6364">)</span><span style="color:#5f6364">;</span>
		<span style="color:#128b4e">phy_write</span><span style="color:#5f6364">(</span>phydev<span style="color:#5f6364">,</span> MDIO_DEVAD_NONE<span style="color:#5f6364">,</span> MII_BMCR<span style="color:#5f6364">,</span> BMCR_RESET<span style="color:#5f6364">)</span><span style="color:#5f6364">;</span>
		<span style="color:#1990b8">while</span> <span style="color:#5f6364">(</span><span style="color:#128b4e">phy_read</span><span style="color:#5f6364">(</span>phydev<span style="color:#5f6364">,</span> MDIO_DEVAD_NONE<span style="color:#5f6364">,</span> MII_BMCR<span style="color:#5f6364">)</span> <span style="color:#a67f59">&</span> <span style="color:#c92c2c">0x8000</span><span style="color:#5f6364">)</span> <span style="color:#5f6364">{</span>
			<span style="color:#128b4e">udelay</span><span style="color:#5f6364">(</span><span style="color:#c92c2c">100</span><span style="color:#5f6364">)</span><span style="color:#5f6364">;</span>
		<span style="color:#5f6364">}</span>
		<span style="color:#128b4e">phy_write</span><span style="color:#5f6364">(</span>phydev<span style="color:#5f6364">,</span> MDIO_DEVAD_NONE<span style="color:#5f6364">,</span> MII_BMCR<span style="color:#5f6364">,</span> bmcr_reg<span style="color:#5f6364">)</span><span style="color:#5f6364">;</span>
		lan8720_flag <span style="color:#a67f59">=</span> <span style="color:#c92c2c">1</span><span style="color:#5f6364">;</span>
	<span style="color:#5f6364">}</span>
<span style="color:#c92c2c">#<span style="color:#1990b8">endif</span>	<span style="color:#7d8b99"><em>/* CONFIG_PHY_SMSC */</em></span></span>
</code></span></span></span></span>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.

重新编译,烧写,测试结果如下:
 


同理,在include/configs/mx6ullatk.h文件中将默认网卡设为0,测试ETH1是否正常:

<span style="color:#17233f"><span style="color:#333333"><span style="background-color:#f7f7f7"><span style="color:#000000"><code id="code_id_30" class="language-c"><span style="color:#c92c2c">#<span style="color:#1990b8">define</span> CONFIG_FEC_ENET_DEV		<span style="color:#c92c2c">0</span></span>
</code></span></span></span></span>
  • 1.

重新编译uboot、烧写,将网线查到ETH1网口上,测试结果如下:

3. 修改启动打印信息

修改board/freescale/mx6ullatk/mx6ullatk.c文件:

<span style="color:#17233f"><span style="color:#333333"><span style="background-color:#f7f7f7"><span style="color:#000000"><code id="code_id_31" class="language-c"><span style="color:#1990b8">int</span> <span style="color:#128b4e">checkboard</span><span style="color:#5f6364">(</span><span style="color:#1990b8">void</span><span style="color:#5f6364">)</span>
<span style="color:#5f6364">{</span>
	<span style="color:#128b4e">puts</span><span style="color:#5f6364">(</span><span style="color:#128b4e">"Board: i.MX6ULL ATK ALPHA\n"</span><span style="color:#5f6364">)</span><span style="color:#5f6364">;</span>

	<span style="color:#1990b8">return</span> <span style="color:#c92c2c">0</span><span style="color:#5f6364">;</span>
<span style="color:#5f6364">}</span>
</code></span></span></span></span>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

三、使用uboot启动内核

1. 从emmc启动

检查emmc中是否有内核文件和设备树文件:
 


查看uboot传递给kernel的启动参数:

这个和本文所使用的开发板出厂烧录的kernel不一致,修改一下保存:

<span style="color:#17233f"><span style="color:#333333"><span style="background-color:#f7f7f7"><span style="color:#000000"><code id="code_id_32" class="language-bash">setenv bootargs <span style="color:#128b4e">'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw'</span>
saveenv
</code></span></span></span></span>
  • 1.
  • 2.

(1)手动启动

手动加载内核到内存中:

<span style="color:#17233f"><span style="color:#333333"><span style="background-color:#f7f7f7"><span style="color:#000000"><code id="code_id_33" class="language-bash">mmc dev <span style="color:#c92c2c">1</span>
fatload mmc <span style="color:#c92c2c">1</span>:1 <span style="color:#c92c2c">80800000</span> zImage
</code></span></span></span></span>
  • 1.
  • 2.


加载设备树到内存中:

<span style="color:#17233f"><span style="color:#333333"><span style="background-color:#f7f7f7"><span style="color:#000000"><code id="code_id_34" class="language-bash">fatload mmc <span style="color:#c92c2c">1</span>:1 <span style="color:#c92c2c">83000000</span> imx6ull-14x14-emmc-7-1024x600-c.dtb
</code></span></span></span></span>
  • 1.

启动内核:

<span style="color:#17233f"><span style="color:#333333"><span style="background-color:#f7f7f7"><span style="color:#000000"><code id="code_id_35" class="language-bash">bootz <span style="color:#c92c2c">80800000</span> - <span style="color:#c92c2c">83000000</span>
</code></span></span></span></span>
  • 1.

可以看到内核成功启动。

(2)使用bootcmd启动

查看nxp uboot官方提供的bootcmd值:
 


不使用这个,直接将上述手动启动的命令写为一条命令,放在bootcmd环境变量中:

<span style="color:#17233f"><span style="color:#333333"><span style="background-color:#f7f7f7"><span style="color:#000000"><code id="code_id_36" class="language-bash">setenv bootcmd <span style="color:#128b4e">'mmc dev 1;fatload mmc 1:1 80800000 zImage;fatload mmc 1:1 83000000 imx6ull-14x14-emmc-7-1024x600-c.dtb;bootz 80800000 - 83000000;'</span>
saveenv
</code></span></span></span></span>
  • 1.
  • 2.

设置完成后,直接启动:

<span style="color:#17233f"><span style="color:#333333"><span style="background-color:#f7f7f7"><span style="color:#000000"><code id="code_id_37" class="language-bash">boot
</code></span></span></span></span>
  • 1.

可以看到内核成功启动:

2. 从网络启动

确保tftp服务正常,且内核和设备树文件已放置在tftp根目录。


设置服务器ip地址:

<span style="color:#17233f"><span style="color:#333333"><span style="background-color:#f7f7f7"><span style="color:#000000"><code id="code_id_38" class="language-bash">setenv serverip <span style="color:#c92c2c">192.168</span>.1.102
</code></span></span></span></span>
  • 1.

设置启动参数:

<span style="color:#17233f"><span style="color:#333333"><span style="background-color:#f7f7f7"><span style="color:#000000"><code id="code_id_39" class="language-bash">setenv bootargs <span style="color:#128b4e">'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw'</span>
</code></span></span></span></span>
  • 1.

保存环境变量:

<span style="color:#17233f"><span style="color:#333333"><span style="background-color:#f7f7f7"><span style="color:#000000"><code id="code_id_40" class="language-bash">saveenv
</code></span></span></span></span>
  • 1.

下载内核到内存中:

<span style="color:#17233f"><span style="color:#333333"><span style="background-color:#f7f7f7"><span style="color:#000000"><code id="code_id_41" class="language-bash">tftp <span style="color:#c92c2c">80800000</span> zImag
</code></span></span></span></span>
  • 1.


下载设备树到内存中:

<span style="color:#17233f"><span style="color:#333333"><span style="background-color:#f7f7f7"><span style="color:#000000"><code id="code_id_42" class="language-bash">tftp <span style="color:#c92c2c">83000000</span> imx6ull-14x14-emmc-7-1024x600-c.dtb
</code></span></span></span></span>
  • 1.


启动内核:

<span style="color:#17233f"><span style="color:#333333"><span style="background-color:#f7f7f7"><span style="color:#000000"><code id="code_id_43" class="language-bash">bootz <span style="color:#c92c2c">80800000</span> - <span style="color:#c92c2c">83000000</span>
</code></span></span></span></span>
  • 1.

启动成功。

uboot | 移植NXP官方uboot到imx6ull开发板(2016.03)_MCUlover666的技术博客_51CTO博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值