導讀:本文将介紹從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;
}