导读:本文将介绍从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=yCONFIG_ARCH_MX6=yCONFIG_TARGET_MX6ULL_ALIENTEK_EMMC=yCONFIG_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_emmcmv mx6ullevk.c my_emmc.c; #重命名vi Makefile #修改Makefile# 将mx6ullevk.o改为my_emmc.ovi 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_EMMCconfig SYS_BOARDdefault "my_emmc"config SYS_VENDORdefault "freescale"config SYS_SOCdefault "mx6"config SYS_CONFIG_NAMEdefault "my_emmc"endif
修改my_emm目录里的MAINTAINERS文件,vi MAINTAINERS,修改成以下内容:
MX6ULLEVK BOARDM:Peng Fan <peng.fan@>S:MaintainedF:board/freescale/my_emmc/F:include/configs/my_emmc.hF: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 MX6ULLselect DMselect 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_PHYADDR0x0
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_DEV0
3、其他修改
3.1 添加编译脚本
vi make #在根目录建立脚本文件
make distcleanmake my_emmc_defconfigmake -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;}