添加主板默认配置文件 |
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 |
cp mx6ull_14x14_evk_emmc_defconfig mx6ull_iot_emmc_defconfig
修改如下:
(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 文件
(4)修改 imximage.cfg 文件,第34行
(5)修改 Kconfig 文件
(6)修改 MAINTAINERS 文件
config TARGET_MX6ULL_IOT_EMMC
bool "Support mx6ull_iot_emmc"
select MX6ULL
select DM
select DM_THERMAL
如图:
(2)在287行加入以下内容:
source "board/freescale/mx6ull_iot_emmc/Kconfig"
SecureCRT 输出结果如图 :
u-boot驱动修改以下两个文件
(1)mx6ull_iot_emmc.c 找到780行的display结构体变量。
结构体
fb_videomode
里面的成员变量为
LCD
的参数,这些成员变量函数如下:
|
name
:
|
LCD 名字,要和环境变量中的 panel 相等。 |
xres、yres: | 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,也就是不使用隔行扫描。 |
修改如下:
(2)编译uboot并烧录。
会发现LCD并没有显示,因为之前有将环境变量保存到 EMMC 中,uboot 启动以后会先从 EMMC 中读取环境变量,如果 EMMC 中没有环境变量的话才会使用 mx6ull_alientek_emmc.h 中的默认环境变量。
如图,启动后 EMMC 中的环境变量 panel 为TFT43AB
所以需要进入uboot设置环境变量:
setenv panel TFT7016
saveenv
如图,可以看到 已经修改成功了。
屏幕上显示了NXP的LOGO和U-boot版本和编译时间。
(1)修改 PHY 的地址
include/configs目录下mx6ull_iot_emmc.h,325行,修改如图:
(2)删除 uboot 中 74LV595 的驱动代码
2>94行,删除74LV595 的 IO 配置参数结构体
3>135行,iox74lv_init 函数是 74LV595 的初始化函数。171行,iox74lv_set 函数用于控制 74LV595 的 IO 输出电平
4>722行,board_init 会调用 imx_iomux_v3_setup_multiple_pads 和 iox74lv_init 这两个函数来初始化 74lv595 的 GPIO,删除这两个函数。board_init 函数是板子初始化函数,会被 board_init_r 调用。
(3)添加主板网络复位引脚驱动
1>552行,结构体数组 fec1_pads 和 fec2_pads 是 ENET1 和 ENET2 这两个网口的 IO 配置参数,在这两个数组中添加两个网口的复位 IO 配置参数。
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);
(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
(5)重新编译烧录
可以看到 “Net: FEC1”,提示当前使用的 FEC1 这个网口,即ENET2
(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 //保存环境变量
ping服务器地址:
(7)ENET1测试
include/configs目录下mx6ull_iot_emmc.h,331行。
CONFIG_FEC_ENET_DEV 用于选择使用哪个网口,默认为 1,也就是选择ENET2。改为0,测试ENET1是否可用
编译烧录,可以看到输出信息为“Net: FEC0”,提示当前使用的 FEC0 这个网口,即ENET1
board/freescale/mx6ull_iot_emmc目录下mx6ull_iot_emmc.c,801行,checkboard函数
修改如图:
编译烧录,可以看到板名已经修改了