添加阿尔法开发板
一、添加阿尔法开发板默认配置文件
①、在ubuntu下创建vscode工程,找到NXP,EVK的配置文件
②、将配置文件拷贝一份,重新命名为你自己板子的配置文件
第一行imximage.cfg是编译后的u-boot.imx给u-boot.bin添加的头部信息。
将其改成
CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=board/freescale/mx6ull_alientek_
emmc/imximage.cfg,MX6ULL_EVK_EMMC_REWORK"
因为board/freescale文件夹下每有mx6ull_alientek_emmc的文件夹所以得添加一个
第四行改成
CONFIG_TARGET_MX6ULL_ALIENTEK_EMMC=y
二、添加板子对应的头文件
不同板子,有一些不同的配置信息,一般在一个头文件中配置,每个板子有一个,对于NXP官方的EVK板子,头文件在include/configs里面。
将头文件中EVK的改成ALIENTEK_EMMC。
mx6ull_alientek_emmc.h 里面有很多宏定义,这些宏定义基本用于配置 uboot,也有一些
I.MX6ULL 的配置项目。如果我们自己要想使能或者禁止 uboot 的某些功能,那就在
mx6ull_alientek_emmc.h 里面做修改即可。
三、添加板子对应的板级文件夹
每个板子都有一个板级文件,将EVK板级文件拷贝成ALIENTEK的板级文件。
将mx6ull_alientek_emmc中 .c文件,Makefile,imximage.cfg,kconfig,MAINTAINERS文件的evk改成alientek。
四、修改uboot的配置界面
arch/arm/cpu/armv7/mx6/Kconfig加入板子的图形界面的配置
新建一个shell脚本编译一下。
编译成.o文件说明编译成功。
修改驱动
一、LCD修改
①、LCD使用的IO是否正确
②、LCD配置参数是否正确
注:根据不同型号的TFTLCD配置不同。
以1024X600为例:
name: LCD 名字,要和环境变量中的 panel 相等。
xres、 yres: LCD X 轴和 Y 轴像素数量。
pixclock:像素时钟,每个像素时钟周期的长度,单位为皮秒。
left_margin: HBP,水平同步后肩。
right_margin: HFP,水平同步前肩。
upper_margin: VBP,垂直同步后肩。
lower_margin: VFP,垂直同步前肩。
hsync_len: HSPW,行同步脉宽。
vsync_len: VSPW,垂直同步脉宽。
vmode: 大多数使用 FB_VMODE_NONINTERLACED,也就是不使用隔行扫描。
可以看出,这些参数和我们第二十四章讲解 RGB LCD 的时候参数基本一样,唯一不同的
像素时钟 pixclock 的含义不同,以正点原子的 7 寸 1024*600 分辨率的屏幕(ATK7016)为例,
屏幕要求的像素时钟为 51.2MHz,
编译下载后:
panel环境变量表示LCD的ID所以还得修改panel。
在mx6ull_alientek_emmc.h文件中,吧所有的panel都改成7016
重新编译后屏幕显示NXP官网 的界面。
二、网络驱动修改
简介:
I.MX6UL/ULL 内部有个以太网 MAC 外设,也就是 ENET,需要外接一个 PHY 芯片来实
现网络通信功能,也就是内部 MAC+外部 PHY 芯片的方案。大家可能听过 DM9000 这个网络
芯片,在一些没有内部 MAC 的 CPU 中,比如三星的 2440, 4412 等,就会采用 DM9000 来实
现联网功能。 DM9000 提供了一个类似 SRAM 的访问接口,主控 CPU 通过这个接口即可与
DM9000 进行通信, DM9000 就是一个 MAC+PHY 芯片。这个方案就相当于外部 MAC+外部
PHY
I.MX6UL/ULL 有两个网络接口 ENET1 和 ENET2,正点原子的 I.MX6U-ALPHA 开发板提
供了这两个网络接口,其中 ENET1 和 ENET2 都使用 LAN8720A 作为 PHY 芯片。
LAN8720驱动,因为所有的PHY,前32个寄存器都是一样的,因此,uboot里面已经写好了通用的PHY驱动,所以不用修改。
1、ENET1
ENET1 的网络 PHY 芯片为 LAN8720A,通过 RMII 接口与 I.MX6ULL 相连,正点原子
I.MX6U-ALPHA 开发板的 ENET1 引脚与 NXP 官方的 I.MX6ULL EVK 开发板基本一样,唯独
复位引脚不同。从图 可以看出,正点原子 I.MX6U-ALPHA 开发板的 ENET1 复位引脚
ENET1_RST 接到了 I.M6ULL 的 SNVS_TAMPER7 这个引脚上。
LAN8720A 内部是有寄存器的, I.MX6ULL 会读取 LAN8720 内部寄存器来判断当前的物
理链接状态、连接速度(10M 还是 100M)和双工状态(半双工还是全双工)。 I.MX6ULL 通过 MDIO
接口来读取 PHY 芯片的内部寄存器, MDIO 接口有两个引脚, ENET_MDC 和 ENET_MDIO,
ENET_MDC 提供时钟, ENET_MDIO 进行数据传输。一个 MDIO 接口可以管理 32 个 PHY 芯
片,同一个 MDIO 接口下的这些 PHY 使用不同的器件地址来做区分, MIDO 接口通过不同的
器件地址即可访问到相应的 PHY 芯片。 I.MX6U-ALPHA 开发板 ENET1 上连接的 LAN8720A
器件地址为 0X0,所示我们要修改 ENET1 网络驱动的话重点就三点:
①、 ENET1 复位引脚初始化。
②、 LAN8720A 的器件 ID。
③、 LAN8720 驱动
2、ENET2
关于 ENET2 网络驱动的修改也注意一下三点:
①、 ENET2 的复位引脚,从图 33.2.7.2 可以看出, ENET2 的复位引脚 ENET2_RST 接到了
I.MX6ULL 的 SNVS_TAMPER8 上。
②、 ENET2 所使用的 PHY 芯片器件地址,从图 33.2.7.2 可以看出, PHY 器件地址为 0X1。
③、 LAN8720 驱动, ENET1 和 ENET2 都使用的 LAN8720,所以驱动肯定是一样的。
2、网络 PHY 地址修改
网络PHY地址修改:
在mx6ull_alientek_emmc.h中
①、 ADDR:改为对应网口的ADDR地址
②、删除 uboot mx6ull_alientek_emmc.c中 74LV595 的驱动代码
IOX 开头的宏定义是 74LV595 的相关 GPIO,因为 NXP 官方I.MX6ULL EVK 开发板使用 74LV595 来扩展 IO,两个网络的复位引脚就是由 74LV595 来控制的。正点原子的 I.MX6UALPHA 开发板并没有使用 74LV595,因此我们将代码删除掉,替换为如下所示代码
#define ENET1_RESET IMX_GPIO_NR(5, 7)
#define ENET2_RESET IMX_GPIO_NR(5, 8)
删除74LV595引脚配置和初始化。
在borad_init()中,初始化了74LV595,也将其删掉
③、添加阿尔法开发板网络复位引脚的驱动
④、修改 drivers/net/phy/phy.c 文件中的函数 genphy_update_link
#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
注: 在mx6ull_alientek_emmc.h中要定义宏CONFIG_PHY_SMSC
验证
重新编译 uboot,然后将 u-boot.bin 烧写到 SD 卡中并启动
显示Net:FEC1证明修改没问题,接下来ping一下ubuntu
ipaddr:开发板ID自己设置。
ethaddr:开发板网卡MAC地址,一般固定的。
gatewayip:默认网关
netmask:子网掩码,固定的。
serverip:ubuntu地址。
证明网络添加正确。