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
在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
在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
uboot中每个板子都有一对应的文件夹来存放级,比如开发上外设驱动等。
在board/freescale/目录下,复制原厂的板级文件夹
cd board/freescale/
cp mx6ullevk/ -r mx6ull_myself
重命名原来的.c文件
cd mx6ull_myself
mv mx6ullevk.c mx6ull_myself.c
对\board\freescale\mx6ull_myself板级文件下的Makefile
修改目标编译文件
obj-y := mx6ull_myself.o
对\board\freescale\mx6ull_myself板级文件下的imximage.cfg
修改开发板插件路径
将
PLUGIN board/freescale/mx6ullevk/plugin.bin 0x00907000
改为
PLUGIN board/freescale/mx6ull_myself /plugin.bin 0x00907000
修改结果如下:
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
修改为:
MX6ULL_MYSELF BOARD
M: Peng Fan <[email protected]>
S: Maintained
F: board/freescale/mx6ull_myself/
F: include/configs/mx6ull_myself.h
在arch/arm/cpu/armv7/mx6/Kconfig下,大约207行添加以下内容:
config TARGET_MX6ULL_MYSELF
bool "Support mx6ull_myself"
select MX6ULL
select DM
select DM_THERMAL
source "board/freescale/mx6ull_myself/Kconfig"
#!/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
因无屏幕无法验证
此时开发板虽然正常启动,但是网卡是无法驱动的,我们需要对网卡的驱动进行修改
提示:正点原子阿尔法开发板有两个网口,mini版的只有一个,使用的是ENET2
mini版的原理图:
#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
在板子的.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)
在 board_init 函数中删除iox74lv的函数调用
imx_iomux_v3_setup_multiple_pads(iox_pads, ARRAY_SIZE(iox_pads));
iox74lv_init();
在 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),
修改 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);
}
}
在路径 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 似乎不行,不知道为啥。
#!/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