原创
1. 下载
NXP官方uboot仓库地址为: https://github.com/Freescale/u-boot-fslc。
这里为了保持版本统一,使用正点原子资料包中提供的原厂linux:uboot-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和网络问题。
二、移植uboot1. 新建单板
(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.h
和xxx.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_RST | SNVS_TAMPER7/GPIO5_IO07 |
ENET2_RST | SNVS_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.c
和include/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.
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博客