200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > IMX6ULL Uboot 移植

IMX6ULL Uboot 移植

时间:2019-11-24 15:03:42

相关推荐

IMX6ULL Uboot 移植

使用的开发板:正点原子ALPHA V2.2

Uboot简介

在学习STM32的过程中使用过IAP在线升级就会知道,有引导程序+APP程序,即bootloader程序+APP。在学习嵌入式Linux的时候也一样,这个引导程序就是Uboot.

uboot移植主要是根据原厂的uboot移植:芯片厂商通常会做一块自己的评估板并发布BSP,我们使用的就是NXP官方的评估板的Uboot进行裁剪,修改得来我们自己板子的程序。

本次使用的是NXP

官方原版的

uboot-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2

首先把文件原版的Uboot文件拷贝到Ubuntu下并且解压

tar xf uboot-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2 -C ./

解压了之后我们需要看一下配置文件,需要再配置文件里面配置我们的Uboot,这个配置文件就在configs目录下,我们进入configs目录下。

在这一个目录下我们可以看到有很多defconfig结尾的文件,这些就是Uboot每对应一个板子的一个配置文件。由于使用的是正点原子的开发板,使用的是mx6ull_14x14_evk_emmc_defconfig这一个配置文件。找到我们这个配置文件后我们就可以对他进行编译了。

首先清理一下工程

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean

对目标的配置进行编译

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_14x14_evk_emmc_defconfigmake ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j4

然后make进行编译

在这里我们可以看到生成了u-boot.bin和 u-boot.imx文件。

下面我们烧录进开发板里面看看。

我们使用 imxdownload 软件将 u-boot.bin烧写到 SD 卡中

把SD卡插上电脑

查找自己的设备,我这里是/dev/sdb ,切记烧录的时候不可以用/dev/sda 否则Ubuntu就开不了机了!!!

chmod 777 imxdownload ./imxdownload u-boot.bin /dev/sdb //切记不可以使用/dev/sda

然后插SD卡到板子上。

用xshell连接板子。可以看到Uboot已经成功启动了。

但是启动是启动了,但是这时候屏幕和网络无法使用,因为我使用的这款正点原子的开发板驱动和uboot默认的屏幕不一样,因此我们需要修改驱动。

下面开始移植我们自己板子的uboot

首先就是配置文件,我们打开uboot的配置文件目录

在configs 目录下有很多配置文件,可想而知,每一个配置文件就对应一块开发板。

我们找到 mx6ull_14x14_evk_emmc_defconfig, 这是nxp官方的配置文件,我们就是参考它做修改。

cp mx6ull_14x14_evk_emmc_defconfig mx6ull_myuboot_emmc_defconfig

然后复 制

include/configs/mx6ullevk.h,并重命名为 mx6ull_myuboot_emmc.h:

cp mx6ullevk.h mx6ull_myuboot_emmc.h

把mx6ull_myuboot_emmc.h文件的相关配置改成我们自己的。

文件中基本都是“CONFIG_”开头的宏定义,这也说明这个文件的主要功能就是配置或者裁剪 uboot。如果需要某个功能的话就在里面添加这个功能对应的 CONFIG_XXX 宏即可,如果不需要某个功能的话就删除掉对应的宏即可。

添加开发板对应的板级文件夹

进入board/freescale/目录下

cp mx6ullevk/ -r mx6ull_myuboot_emmc

然后进入mx6ull_myuboot_emmc目录修改相应文件的名字

mv mx6ullevk.c mx6ull_myuboot_emmc.c

我们改了c文件后,我们需要更改Mainfile文件

同时修改 imximage.cfg 中的下面一句改成自己的目录

修改Kconfig文件

if TARGET_MX6ULL_MYUBOOT_EMMCconfig SYS_BOARDdefault "mx6ull_myuboot_emmc"config SYS_VENDORdefault "freescale"config SYS_SOCdefault "mx6"config SYS_CONFIG_NAMEdefault "mx6ull_myuboot_emmc"endif

修改 MAINTAINERS 文件

MX6ULLEVK BOARDM:Peng Fan <peng.fan@>S:MaintainedF:board/freescale/mx6ull_myuboot_emmc/F:include/configs/mx6ull_myuboot_emmc.h

uboot 是支持图形界面配置,修改 U-Boot 图形界面配置文件

到此,已经移植好了,下面我们还需要修改LCD驱动和网络驱动。

打开mx6ull_myuboot_emmc.c文件

修改LCD驱动

找到mx6ull_myuboot_emmc.c文件下的

改为如下:

struct display_info_t const displays[] = {{.bus = MX6UL_LCDIF1_BASE_ADDR,.addr = 0,.pixfmt = 24,.detect = NULL,.enable= do_enable_parallel_lcd,.mode= {.name= "ATK4384",.xres = 800,.yres = 480,.pixclock = 32258,.left_margin = 88,.right_margin = 40,.upper_margin = 32,.lower_margin = 13,.hsync_len= 48,.vsync_len= 3,.sync = 0,.vmode= FB_VMODE_NONINTERLACED} } };

下一步注释掉lcd_pads里面的LCD复位

找到do_enable_parallel_lcd函数注释啊掉复位的相关代码

然后找到 mx6ull_myuboot_emmc.h里面的

"panel=AFT43AN\0"改为

“panel=ATK4384\0”

修改网络驱动

网络 PHY 地址修改

修改mx6ull_myuboot_emmc.h 的代码

#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_DEV1#if (CONFIG_FEC_ENET_DEV == 0)#define IMX_FEC_BASEENET_BASE_ADDR#define CONFIG_FEC_MXC_PHYADDR0x0#define CONFIG_FEC_XCV_TYPE RMII#elif (CONFIG_FEC_ENET_DEV == 1)#define IMX_FEC_BASEENET2_BASE_ADDR#define CONFIG_FEC_MXC_PHYADDR0x1#define CONFIG_FEC_XCV_TYPERMII#endif#define CONFIG_ETHPRIME"FEC"#define CONFIG_PHYLIB#define CONFIG_PHY_SMSC#endif

更改好网络PHY芯片地址后我们修改复位引脚,因为官方的Uboot使用74LV595进行扩展IO但是我们的开发板并没有这东西。而是直接接到了IO口,因此我们需要修改驱动

找到以下代码注释掉这是芯片 74LV595的芯片引脚IO

然后加入我们自己的

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

同时删掉 74LV595 的 IO 配置参数结构体,将其删除掉。

接着删掉74LV595的初始化函数

void iox74lv_init(void)

void iox74lv_set(int index)

找到 board_init 函数,此函数是板子初始化函数,会被

board_init_r 调用,board_init 函数内容如下:

删掉 以下代码

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

在这里插入图片描述

接下来就是添加 I.MX6U-ALPHA 开发板两个网络复位引脚了

找到fec1_pads 和 fec2_pads

MX6_PAD_SNVS_TAMPER7__GPIO5_IO07 | MUX_PAD_CTRL(NO_PAD_CTRL)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);}}

修改 drivers/net/phy/phy.c 文件中的函数 genphy_update_link

在函数加入以下代码

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

在此LCD驱动和网络驱动已经修改完成了

我们来编译验证一下!!

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distcleanmake ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_myuboot_emmc_defconfigmake V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j4

编译完成。

最后烧录进行SD卡

./imxdownload u-boot.bin /dev/sdb

屏幕亮起,说明屏幕驱动OK

然后设置板子的网络参数

setenv ipaddr 192.168.1.55 //开发板 IP 地址setenv ethaddr b8:ae:1d:01:00:00 //开发板网卡 MAC 地址setenv gatewayip 192.168.1.1 //开发板默认网关setenv netmask 255.255.255.0 //开发板子网掩码setenv serverip 192.168.1.250 //服务器地址,也就是 Ubuntu 地址saveenv //保存环境变量

最后测试网络连接

网络时通的!!说明网络驱动OK。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。