【Linux系统移植】U-boot移植

一、移植U-boot主要步骤表:

添加主板默认配置文件
mx6ull_iot_emmc_defconfig
(官方mx6ull_14x14_evk_emmc_defconfig)
添加主板对应的头文件
include/configs 目录下添加头文件mx6ull_iot_emmc.h
(官方mx6ullevk.h)
配置或者裁剪 uboot
添加开发板对应的板级文件夹
board/freescale 目录下新建mx6ull_iot_emmc文件夹 
(官方mx6ullevk)
1、修改 Makefile 文件
2、修改 imximage.cfg 文件
3、修改Kconfig 文件
4、修改MAINTAINERS 文件
5、mx6ullevk.c 修改为 mx6ull_iot_emmc.c
修改 U-Boot 图形界面配置文件
修改 arch/arm/cpu/armv7/mx6/Kconfig
LCD 驱动修改

u-boot驱动修改以下两个文件

board/freescale/mx6ull_iot_emmc目录下mx6ull_iot_emmc.c

include/configs目录下mx6ull_iot_emmc.h

1、 查看 LCD IO 配置是否正确
2、查看LCD 背光引脚 GPIO 的配置
3、查看LCD 配置参数是否正确(分辨率,像素格式等)
网络驱动修改

PHY 芯片LAN8720A(官方KSZ8081

1、使用RMII 接口与PHY芯片连接,复位引脚IO配置及初始化
2、PHY 芯片器件ID地址
3、 PHY 芯片 驱动
4、删除 74LV595(扩展IO芯片) 驱动代码,添加复位引脚驱动
5、修改 drivers/net/phy/phy.c 文件中的函数 genphy_update_link
其他

1、板子名字,mx6ull_alientek_emmc.c,函数checkboard

 

二、详细移植过程

1、 设置 settings.json ,屏蔽不需要的文件和文件夹

【Linux系统移植】U-boot移植_第1张图片

 

2、添加主板默认配置文件,修改主板名

cp mx6ull_14x14_evk_emmc_defconfig mx6ull_iot_emmc_defconfig

 修改如下:

【Linux系统移植】U-boot移植_第2张图片

 

3、添加主板对应的头文件

cp include/configs/mx6ullevk.h mx6ull_iot_emmc.h

修改: 

【Linux系统移植】U-boot移植_第3张图片

 

4、添加主板对应的板级文件夹

(1)复制并重命名文件夹mx6ullevk

cd board/freescale/
cp mx6ullevk/ -r mx6ull_alientek_emmc

 (2)进入文件夹。复制并重命名文件mx6ullevk.c

cd mx6ull_iot_emmc
mv mx6ullevk.c mx6ull_iot_emmc.c

(3)修改 mx6ull_iot_emmc 目录下的 Makefile 文件

【Linux系统移植】U-boot移植_第4张图片

(4)修改 imximage.cfg 文件,第34行

【Linux系统移植】U-boot移植_第5张图片

(5)修改 Kconfig 文件

【Linux系统移植】U-boot移植_第6张图片

(6)修改 MAINTAINERS 文件

【Linux系统移植】U-boot移植_第7张图片

 

5、修改 U-Boot 图形界面配置文件

修改文件 arch/arm/cpu/armv7/mx6/Kconfig(如果用的 I.MX6UL 的话,应该修改 arch/arm/Kconfig 这个文件)
(1)在207行加入以下内容:
config TARGET_MX6ULL_IOT_EMMC
	bool "Support mx6ull_iot_emmc"
	select MX6ULL
	select DM
	select DM_THERMAL

如图:

【Linux系统移植】U-boot移植_第8张图片

(2)在287行加入以下内容:

source "board/freescale/mx6ull_iot_emmc/Kconfig"

【Linux系统移植】U-boot移植_第9张图片

 

6、编译U-boot,烧录验证是否修改成功

SecureCRT 输出结果如图

【Linux系统移植】U-boot移植_第10张图片

 

7、LCD驱动修改

u-boot驱动修改以下两个文件

  • board/freescale/mx6ull_iot_emmc目录下mx6ull_iot_emmc.c
  • include/configs目录下mx6ull_iot_emmc.h

(1)mx6ull_iot_emmc.c 找到780行的display结构体变量。

结构体 fb_videomode 里面的成员变量为 LCD 的参数,这些成员变量函数如下:
name
LCD 名字,要和环境变量中的 panel 相等。
xresyres LCD X 轴和 Y 轴像素数量。
pixclock 像素时钟,每个像素时钟周期的长度,单位为皮秒。
像素时钟为 51.2MHz ,则pixclock=(1/51200000)*10^12=19531
left_margin HBP,水平同步后肩。
right_margin HFP,水平同步前肩。
upper_margin VBP,垂直同步后肩。
lower_margin VFP,垂直同步前肩。
hsync_len: HSPW,行同步脉宽。
vsync_len VSPW,垂直同步脉宽。
vmode 大多数使用 FB_VMODE_NONINTERLACED,也就是不使用隔行扫描。

修改如下:

【Linux系统移植】U-boot移植_第11张图片

 

(2)编译uboot并烧录。

会发现LCD并没有显示,因为之前有将环境变量保存到 EMMC 中,uboot 启动以后会先从 EMMC 中读取环境变量,如果 EMMC 中没有环境变量的话才会使用 mx6ull_alientek_emmc.h 中的默认环境变量。

如图,启动后 EMMC 中的环境变量 panel 为TFT43AB

【Linux系统移植】U-boot移植_第12张图片

所以需要进入uboot设置环境变量:

setenv panel TFT7016
saveenv

如图,可以看到 已经修改成功了。

【Linux系统移植】U-boot移植_第13张图片

屏幕上显示了NXP的LOGO和U-boot版本和编译时间。

【Linux系统移植】U-boot移植_第14张图片

 

8、网络驱动修改

(1)修改 PHY 的地址

include/configs目录下mx6ull_iot_emmc.h,325行,修改如图:

【Linux系统移植】U-boot移植_第15张图片

 

(2)删除 uboot 74LV595 的驱动代码

NXP 官方 I.MX6ULL EVK 开发板使用 74LV595 来扩展 IO ,两个网络的复位引脚就是由 74LV595 来控制的,不需要则删掉。
 
1>91行,替换   74LV595 的相关GPIO宏定义 
【Linux系统移植】U-boot移植_第16张图片

 

2>94行,删除74LV595 IO 配置参数结构体

【Linux系统移植】U-boot移植_第17张图片

3>135行,iox74lv_init 函数是 74LV595 的初始化函数。171行,iox74lv_set 函数用于控制 74LV595 IO 输出电平

【Linux系统移植】U-boot移植_第18张图片

【Linux系统移植】U-boot移植_第19张图片

4>722行,board_init 会调用 imx_iomux_v3_setup_multiple_pads iox74lv_init 这两个函数来初始化 74lv595 的 GPIO,删除这两个函数。board_init 函数是板子初始化函数,会被 board_init_r 调用。

【Linux系统移植】U-boot移植_第20张图片

 

(3)添加主板网络复位引脚驱动

1>552行,结构体数组 fec1_pads 和 fec2_pads 是 ENET1 和 ENET2 这两个网口的 IO 配置参数,在这两个数组中添加两个网口的复位 IO 配置参数。

【Linux系统移植】U-boot移植_第21张图片

2>582行,函数 setup_iomux_fec 就是根据 fec1_pads fec2_pads 这两个网络 IO 配置数组来初始化 I.MX6ULL 的网络 IO。添加网络复位 IO 的初始化代码,复位 PHY 芯 片。

gpio_direction_output(ENET1_RESET, 1);
gpio_set_value(ENET1_RESET, 0);
mdelay(20);
gpio_set_value(ENET1_RESET, 1);

【Linux系统移植】U-boot移植_第22张图片

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

221行,添加以下代码:

	#ifdef CONFIG_PHY_SMSC
		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;
		 }
	#endif

【Linux系统移植】U-boot移植_第23张图片

(5)重新编译烧录

可以看到 “NetFEC1”,提示当前使用的 FEC1 这个网口,即ENET2

【Linux系统移植】U-boot移植_第24张图片

(6)网口测试

设置环境变量:
setenv ipaddr 192.168.1.108         //开发板 IP 地址
setenv ethaddr 00:02:9a:01:d1:31    //开发板网卡 MAC 地址
setenv gatewayip 192.168.1.1        //开发板默认网关
setenv netmask 255.255.255.0        //开发板子网掩码
setenv serverip 192.168.1.106       //服务器地址,也就是 Ubuntu 地址
saveenv                             //保存环境变量

【Linux系统移植】U-boot移植_第25张图片

ping服务器地址:

 

(7)ENET1测试

include/configs目录下mx6ull_iot_emmc.h,331行。

CONFIG_FEC_ENET_DEV 用于选择使用哪个网口,默认为 1,也就是选择ENET2。改为0,测试ENET1是否可用

【Linux系统移植】U-boot移植_第26张图片

编译烧录,可以看到输出信息为“NetFEC0”,提示当前使用的 FEC0 这个网口,即ENET1

 

【Linux系统移植】U-boot移植_第27张图片

9、主板名称修改

board/freescale/mx6ull_iot_emmc目录下mx6ull_iot_emmc.c,801行,checkboard函数

修改如图:

【Linux系统移植】U-boot移植_第28张图片

编译烧录,可以看到板名已经修改了

【Linux系统移植】U-boot移植_第29张图片

 

你可能感兴趣的:(#,Linux学习之路)