i.mx6ull uboot移植

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版的原理图:
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
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

第四维度4

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值