天天看點

imx6ull系統移植--uboot1、添加自己的開發闆2、移植驅動3、其他修改

導讀:本文将介紹從NXP官方uboot開始移植uboot到正點原子Alfalfa開發闆的實際操作步驟,使用的晶片是imx6ull,LCD螢幕為4.3寸800*480。

目錄

  • 1、添加自己的開發闆
    • 1.1 添加配置檔案
    • 1.2 添加闆級頭檔案
    • 1.3 添加闆級檔案夾
    • 1.4 修改圖形界面配置檔案
  • 2、移植驅動
    • 2.1 LCD驅動
      • 2.1.1 修改displays結構體
      • 2.1.2 取消LCD引腳複位
    • 2.2 網絡驅動修改
      • 2.2.1 修改配置頭檔案
      • 2.2.2 修改my_emmc.c檔案
      • 2.2.3 修改phy.c檔案
      • 2.2.4 改用FEC0網絡 (非必須)
  • 3、其他修改
    • 3.1 添加編譯腳本
    • 3.2 修改列印開發闆名稱

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 <[email protected]>
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

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

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

繼續閱讀