i.mx6ull uboot移植

uboot官网

i.mx6ull uboot移植

  • 一、移植NXP官方的uboot
    • 1、编译NXP官方的uboot
    • 2、烧录到板子测试是否能启动
    • 3、添加新的开发板配置
      • a.修改默认配置文件
      • b.修改头文件
      • c.添加板级文件
      • c.修改开发板配置文件_Makefile
      • d.修改开发板配置文件_imximage.cfg
      • e.修改开发板配置文件_Kconfig
      • f.修改开发板配置文件_MAINTAINERS
      • g.修改uboot支持图形界面配置
    • 4、编译烧录验证
  • 二、修改LCD驱动
  • 三、修改网络驱动
    • 1、修改驱动
      • a. 修改网络PHY地址
      • b. 删除74LV595的驱动代码
        • aa、引脚替换
        • ab、删除初始化函数
        • ac.将iox74lv_set也删除掉
        • ad.删除函数调用
      • c.添加复位引脚驱动
      • d.设置IO的驱动
      • e.修改通用PHY 驱动函数
    • 2、编译烧录验证

一、移植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 <[email protected]>
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 

i.mx6ull uboot移植_第1张图片
翻到下面添加source

source "board/freescale/mx6ull_myself/Kconfig"

i.mx6ull uboot移植_第2张图片

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版的原理图:
i.mx6ull uboot移植_第3张图片

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

i.mx6ull uboot移植_第4张图片

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,将其删掉
i.mx6ull uboot移植_第5张图片

ac.将iox74lv_set也删除掉

i.mx6ull uboot移植_第6张图片

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; 
}

i.mx6ull uboot移植_第7张图片
按照教程使用 #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

你可能感兴趣的:(i.mx6ull,linux,驱动开发)