imx6ull系统移植--uboot

导读:本文将介绍从NXP官方uboot开始移植uboot到正点原子Alfalfa开发板的实际操作步骤,使用的芯片是imx6ull,LCD屏幕为4.3寸800*480。

1、添加自己的开发板

1.1 添加配置文件

在configs目录下新建配置文件vi configs/my_emmc_defconfig,输入以下内容

 CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=board/freescale/my_emmc/imximage.cfg,MX6ULL_EVK_EMMC_REWORK"
 CONFIG_ARM=y
 CONFIG_ARCH_MX6=y
 CONFIG_TARGET_MX6ULL_ALIENTEK_EMMC=y
 CONFIG_CMD_GPIO=y

1.2 添加板级头文件

拷贝nxp官方配置文件mx6ullevk.h,修改头文件开头的宏定义名称。

	cp include/configs/mx6ullevk.h my_emmc.h;
	vi include/configs/my_emmc.h
	
	#ifndef __MY_EMMC_H
	#define __MY_EMMC_H

1.3 添加板级文件夹

board/freescale/目录下的文件夹是NXP支持的开发板,下面开始添加自己的板级文件夹:

cd board/freescale/		   #进入开发板目录
cp mx6ullevk/ -r my_emm    #拷贝板级文件夹
cd my_emmc
mv mx6ullevk.c my_emmc.c;  #重命名
vi Makefile #修改Makefile
	# 将mx6ullevk.o改为my_emmc.o
vi imximage.cfg #修改配置文件
	# PLUGIN board/freescale/mx6ullevk/plugin.bin 0x00907000 改为 
	# PLUGIN  board/freescale/my_emmc/plugin.bin 0x00907000

修改my_emm目录里的Kconfig文件,vi Kconfig,修改成以下内容:

if TARGET_MX6ULL_ALIENTEK_EMMC
	
config SYS_BOARD
	default "my_emmc"
		
config SYS_VENDOR
	default "freescale"
		
config SYS_SOC
	default "mx6"
	
config SYS_CONFIG_NAME
	default "my_emmc"

endif

修改my_emm目录里的MAINTAINERS文件,vi MAINTAINERS,修改成以下内容:

MX6ULLEVK BOARD
M:      Peng Fan <peng.fan@nxp.com>
S:      Maintained
F:      board/freescale/my_emmc/
F:      include/configs/my_emmc.h
F:      configs/configs/my_emmc_defconfig

1.4 修改图形界面配置文件

vi arch/arm/cpu/armv7/mx6/Kconfig,在206行下面添加如下内容:

config TARGET_MX6ULL_ALIENTEK_EMMC  #加在TARGET_MX6ULL_9X9_EVK下面,加在206行
	bool "Support my_emmc"
    select MX6ULL
    select DM
    select DM_THERMAL

在Kconfig末尾加上以下内容:

source "board/freescale/my_emmc/Kconfig"

2、移植驱动

2.1 LCD驱动

2.1.1 修改displays结构体

vi board/freescale/my_emmc/my_emmc.c,修改displays结构体成如下内容:

	struct display_info_t const displays[] = {{
	.bus = MX6UL_LCDIF1_BASE_ADDR,
	.addr = 0,
	.pixfmt = 24,
	.detect = NULL,
	.enable	= do_enable_parallel_lcd,
	.mode	= {
		.name			= "TFT7014",
		.xres           = 800,
		.yres           = 480,
		.pixclock       = 19531,
		.left_margin    = 140,
		.right_margin   = 160,
		.upper_margin   = 20,
		.lower_margin   = 12,
		.hsync_len      = 20,
		.vsync_len      = 3,
		.sync           = 0,
		.vmode          = FB_VMODE_NONINTERLACED
} } };

2.1.2 取消LCD引脚复位

将do_enable_parallel_lcd函数(displays结构体上方)里的LCD复位注释,772行到774行:

void do_enable_parallel_lcd(struct display_info_t const *dev)
{
	enable_lcdif_clock(dev->bus);

	imx_iomux_v3_setup_multiple_pads(lcd_pads, ARRAY_SIZE(lcd_pads));

	/* Reset the LCD */
	/* gpio_direction_output(IMX_GPIO_NR(5, 9) , 0);
	udelay(500);
	gpio_direction_output(IMX_GPIO_NR(5, 9) , 1); */

	/* Set Brightness to high */
	gpio_direction_output(IMX_GPIO_NR(1, 8) , 1);
}

注释掉lcd_pads的LCD复位代码,第759行:

static iomux_v3_cfg_t const lcd_pads[] = {
	MX6_PAD_LCD_CLK__LCDIF_CLK | MUX_PAD_CTRL(LCD_PAD_CTRL),
	......
	MX6_PAD_LCD_DATA23__LCDIF_DATA23 | MUX_PAD_CTRL(LCD_PAD_CTRL),

	/* LCD_RST */
	//MX6_PAD_SNVS_TAMPER9__GPIO5_IO09 | MUX_PAD_CTRL(NO_PAD_CTRL),

	/* Use GPIO for Brightness adjustment, duty cycle = period. */
	MX6_PAD_GPIO1_IO08__GPIO1_IO08 | MUX_PAD_CTRL(NO_PAD_CTRL),
};

修改环境变量lcd屏幕类型
vi include/configs/my_emmc.h(116行和140行),将"panel=TFT43AB\0"改为"panel=TFT7014\0"

2.2 网络驱动修改

2.2.1 修改配置头文件

vi include/configs/my_emmc.h,第335行将2改为0

#define CONFIG_FEC_MXC_PHYADDR          0x0

2.2.2 修改my_emmc.c文件

将以下代码

#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)

替换为

#define ENET1_RESET IMX_GPIO_NR(5, 7)
#define ENET2_RESET IMX_GPIO_NR(5, 8)

删除以下代码

static iomux_v3_cfg_t const iox_pads[] = {
	/* IOX_SDI */
	MX6_PAD_BOOT_MODE0__GPIO5_IO10 | MUX_PAD_CTRL(NO_PAD_CTRL),
	......
};

删除74lv相关代码

static void iox74lv_init(void)
{
	int i;
	......
	gpio_direction_output(IOX_STCP, 1);
};

void iox74lv_set(int index)
{
	int i;
	......
	gpio_direction_output(IOX_STCP, 1);
};

在int board_init(void)函数里删除以下代码

	imx_iomux_v3_setup_multiple_pads(iox_pads, ARRAY_SIZE(iox_pads));
	iox74lv_init();

添加网络复位 IO 后的结构体数组

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));
		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));
		gpio_direction_output(ENET2_RESET, 1);
		gpio_set_value(ENET2_RESET, 0);
		mdelay(20);
		gpio_set_value(ENET2_RESET, 1);
	}	
}

2.2.3 修改phy.c文件

在genphy_update_link函数前部添加网络软件复位代码:

int genphy_update_link(struct phy_device *phydev)
{
	unsigned int mii_reg;

	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;
	}
	
	......
	
	return 0;
}

2.2.4 改用FEC0网络 (非必须)

uboot默认使用FEC1网络,如果想要使用FEC0作为网络通信则需要修改配置头文件,vi include/configs/my_emmc.h

#define CONFIG_FEC_ENET_DEV		0

3、其他修改

3.1 添加编译脚本

vi make #在根目录建立脚本文件

make distclean
make my_emmc_defconfig
make -j4

3.2 修改打印开发板名称

vi board/freescale/my_emmc/my_emmc.c(802行)

int checkboard(void)
{
	// if (is_mx6ull_9x9_evk())
	// 	puts("Board: MX6ULL 9x9 EVK\n");
	// else
	// 	puts("Board: MX6*ULL 14x14 EVK\n");
	puts("Board: MX6ULL 800*480\n");

	return 0;
}
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值