i.mx6ull uboot移植
一、移植NXP官方的uboot
1、编译NXP官方的uboot
#!/bin/bash
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_14x14_evk_emmc_defconfig
make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j8
2、烧录到板子测试是否能启动
3、添加新的开发板配置
a.修改默认配置文件
在uboot的configs目录下,复制原厂的配置文件defconfig
cd configs
cp mx6ull_14x14_evk_emmc_defconfig mx6ull_myself_defconfig
修改配置文件为:
CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=board/freescale/mx6ull_myself/imximage.cfg,MX6ULL_EVK_EMMC_REWORK"
CONFIG_ARM=y
CONFIG_ARCH_MX6=y
CONFIG_TARGET_MX6ULL_MYSELF=y
CONFIG_CMD_GPIO=y
主要修改了路径名 /freescale/mx6ull_myself/imximage.cfg
和 CONFIG_TARGET_MX6ULL_MYSELF=y
b.修改头文件
在uboot的include/configs目录下,复制原厂的配置文件defconfig
cd include/configs
cp include/configs/mx6ullevk.h mx6ull_myself.h
将
#ifndef __MX6ULLEVK_CONFIG_H
#define __MX6ULLEVK_CONFIG_H
改为:
#ifndef __MX6ULL_MYSELF_CONFIG_H
#define __MX6ULL_MYSELF_CONFIG_H
c.添加板级文件
uboot中每个板子都有一对应的文件夹来存放级,比如开发上外设驱动等。
在board/freescale/目录下,复制原厂的板级文件夹
cd board/freescale/
cp mx6ullevk/ -r mx6ull_myself
重命名原来的.c文件
cd mx6ull_myself
mv mx6ullevk.c mx6ull_myself.c
c.修改开发板配置文件_Makefile
对\board\freescale\mx6ull_myself板级文件下的Makefile
修改目标编译文件
obj-y := mx6ull_myself.o
d.修改开发板配置文件_imximage.cfg
对\board\freescale\mx6ull_myself板级文件下的imximage.cfg
修改开发板插件路径
将
PLUGIN board/freescale/mx6ullevk/plugin.bin 0x00907000
改为
PLUGIN board/freescale/mx6ull_myself /plugin.bin 0x00907000
e.修改开发板配置文件_Kconfig
修改结果如下:
if TARGET_MX6ULL_MYSELF
config SYS_BOARD
default "mx6ull_myself"
config SYS_VENDOR
default "freescale"
config SYS_SOC
default "mx6"
config SYS_CONFIG_NAME
default "mx6ull_myself"
endif
f.修改开发板配置文件_MAINTAINERS
修改为:
MX6ULL_MYSELF BOARD
M: Peng Fan <peng.fan@nxp.com>
S: Maintained
F: board/freescale/mx6ull_myself/
F: include/configs/mx6ull_myself.h
g.修改uboot支持图形界面配置
在arch/arm/cpu/armv7/mx6/Kconfig下,大约207行添加以下内容:
config TARGET_MX6ULL_MYSELF
bool "Support mx6ull_myself"
select MX6ULL
select DM
select DM_THERMAL
翻到下面添加source
source "board/freescale/mx6ull_myself/Kconfig"
4、编译烧录验证
#!/bin/bash
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_myself_defconfig
make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j8
二、修改LCD驱动
因无屏幕无法验证
三、修改网络驱动
此时开发板虽然正常启动,但是网卡是无法驱动的,我们需要对网卡的驱动进行修改
提示:正点原子阿尔法开发板有两个网口,mini版的只有一个,使用的是ENET2
mini版的原理图:
1、修改驱动
a. 修改网络PHY地址
#ifdef CONFIG_CMD_NET
#define CONFIG_CMD_PING
#define CONFIG_CMD_DHCP
#define CONFIG_CMD_MII
#define CONFIG_FEC_MXC
#define CONFIG_MII
#define CONFIG_FEC_ENET_DEV 1
#if (CONFIG_FEC_ENET_DEV == 0)
#define IMX_FEC_BASE ENET_BASE_ADDR
#define CONFIG_FEC_MXC_PHYADDR 0x0
#define CONFIG_FEC_XCV_TYPE RMII
#elif (CONFIG_FEC_ENET_DEV == 1)
#define IMX_FEC_BASE ENET2_BASE_ADDR
#define CONFIG_FEC_MXC_PHYADDR 0x1
#define CONFIG_FEC_XCV_TYPE RMII
#endif
#define CONFIG_ETHPRIME "FEC"
#define CONFIG_PHYLIB
#define CONFIG_PHY_MICREL
#endif
b. 删除74LV595的驱动代码
aa、引脚替换
在板子的.c文件,找到IO扩展的代码
#define IOX_SDI IMX_GPIO_NR(5, 10)
#define IOX_STCP IMX_GPIO_NR(5, 7)
#define IOX_SHCP IMX_GPIO_NR(5, 11)
#define IOX_OE IMX_GPIO_NR(5, 8)
ENET1 的复位引脚连接到SNVS_TAMPER7 上,对应GPIO5_IO07,
ENET2 的复位引脚连接到SNVS_TAMPER8 上,对应GPIO5_IO08。
所以替换为以太网的复位引脚:
#define ENET1_RESET IMX_GPIO_NR(5, 7)
#define ENET2_RESET IMX_GPIO_NR(5, 8)
ab、删除初始化函数
找到函数iox74lv_init,将其删掉
ac.将iox74lv_set也删除掉
ad.删除函数调用
在 board_init 函数中删除iox74lv的函数调用
imx_iomux_v3_setup_multiple_pads(iox_pads, ARRAY_SIZE(iox_pads));
iox74lv_init();
c.添加复位引脚驱动
在 static iomux_v3_cfg_t const fec1_pads[] 中添加
MX6_PAD_SNVS_TAMPER7__GPIO5_IO07 | MUX_PAD_CTRL(NO_PAD_CTRL),
在 static iomux_v3_cfg_t const fec2_pads[] 中添加
MX6_PAD_SNVS_TAMPER8__GPIO5_IO08 | MUX_PAD_CTRL(NO_PAD_CTRL),
d.设置IO的驱动
修改 setup_iomux_fec 函数为:
static void setup_iomux_fec(int fec_id)
{
if (fec_id == 0)
{
imx_iomux_v3_setup_multiple_pads(fec1_pads,
ARRAY_SIZE(fec1_pads));
// 添加网络复位 IO 的初始化代码并且复位一下 PHY 芯片
gpio_direction_output(ENET1_RESET, 1);
gpio_set_value(ENET1_RESET, 0);
mdelay(20);
gpio_set_value(ENET1_RESET, 1);
}
else
{
imx_iomux_v3_setup_multiple_pads(fec2_pads,
ARRAY_SIZE(fec2_pads));
// 添加网络复位 IO 的初始化代码并且复位一下 PHY 芯片
gpio_direction_output(ENET2_RESET, 1);
gpio_set_value(ENET2_RESET, 0);
mdelay(20);
gpio_set_value(ENET2_RESET, 1);
}
}
e.修改通用PHY 驱动函数
在路径 drivers/net/phy/ 找到 phy.c 文件
在前面添加:
static int lan8720_flag = 0;
int bmcr_reg = 0;
if (lan8720_flag == 0) {
bmcr_reg = phy_read(phydev, MDIO_DEVAD_NONE, MII_BMCR);
phy_write(phydev, MDIO_DEVAD_NONE, MII_BMCR, BMCR_RESET);
while(phy_read(phydev, MDIO_DEVAD_NONE, MII_BMCR) & 0X8000) {
udelay(100);
}
phy_write(phydev, MDIO_DEVAD_NONE, MII_BMCR, bmcr_reg);
lan8720_flag = 1;
}
按照教程使用 #ifdef CONFIG_PHY_SMSC 似乎不行,不知道为啥。
2、编译烧录验证
#!/bin/bash
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_myself_defconfig
make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j8