从NXP EVK到正点原子:手把手教你为IMX6ULL定制专属设备树(DTS)
深度解析i.MX6ULL设备树移植从NXP EVK到正点原子开发板的实战指南1. 设备树技术基础与i.MX6ULL开发环境搭建设备树Device Tree作为现代Linux内核中描述硬件资源的核心机制彻底改变了嵌入式系统对硬件配置的管理方式。在i.MX6ULL平台上设备树文件.dts通过分层结构描述处理器外设、内存映射、中断分配等硬件信息使同一内核镜像能够适配不同硬件变体。设备树核心语法解析/ { compatible fsl,imx6ull; #address-cells 1; #size-cells 1; cpus { cpu0 { operating-points 792000 1225000 528000 1175000 ; }; }; memory80000000 { reg 0x80000000 0x20000000; }; };开发环境配置关键步骤安装交叉编译工具链sudo apt-get install gcc-arm-linux-gnueabihf获取NXP官方Linux内核源码git clone https://github.com/Freescale/linux-fslc.git -b imx_4.1.15_2.0.0基础编译命令make ARCHarm CROSS_COMPILEarm-linux-gnueabihf- imx_v7_defconfig make ARCHarm CROSS_COMPILEarm-linux-gnueabihf- zImage dtbs -j82. 硬件差异分析与设备树移植策略正点原子阿尔法开发板与NXP官方EVK的主要硬件差异硬件模块NXP EVK配置正点原子配置修改要点网络PHYKSZ8081 (地址0x0/0x1)LAN8720A (地址0x0/0x1)PHY驱动选择/复位引脚配置EMMC接口4线模式8线模式总线宽度/时序参数调整核心板尺寸14x14mm工业级核心板引脚复用冲突检查显示接口并行LCDRGB接口时序参数/像素时钟配置关键移植步骤复制基础设备树文件cp arch/arm/boot/dts/imx6ull-14x14-evk.dts arch/arm/boot/dts/imx6ull-alientek-emmc.dts修改Makefile添加新设备树dtb-$(CONFIG_SOC_IMX6ULL) \ imx6ull-14x14-evk.dtb \ imx6ull-alientek-emmc.dtb3. 网络驱动深度适配实战LAN8720A与KSZ8081的主要差异导致需要多层次的驱动适配PHY地址与复位引脚配置fec1 { pinctrl-0 pinctrl_enet1 pinctrl_enet1_reset; phy-mode rmii; phy-handle ethphy0; phy-reset-gpios gpio5 7 GPIO_ACTIVE_LOW; phy-reset-duration 200; status okay; }; iomuxc_snvs { pinctrl_enet1_reset: enet1resetgrp { fsl,pins MX6ULL_PAD_SNVS_TAMPER7__GPIO5_IO07 0x10B0 ; }; };时钟引脚特殊处理需在内核驱动中添加/* drivers/net/ethernet/freescale/fec_main.c */ static int fec_probe(struct platform_device *pdev) { void __iomem *IMX6U_ENET1_TX_CLK; IMX6U_ENET1_TX_CLK ioremap(0X020E00DC, 4); writel(0X14, IMX6U_ENET1_TX_CLK); /* ... */ }PHY驱动修改要点在内核配置中启用SMSC PHY驱动make menuconfig路径Device Drivers → Network device support → PHY Device support → Drivers for SMSC PHYs修改复位时序drivers/net/phy/smsc.cstatic int smsc_phy_reset(struct phy_device *phydev) { /* 添加硬件复位操作 */ gpio_direction_output(phy_reset, 0); msleep(100); gpio_set_value(phy_reset, 1); /* 原有软复位逻辑 */ phy_write(phydev, MII_BMCR, BMCR_RESET); }4. EMMC与时钟系统优化配置8线EMMC配置usdhc2 { pinctrl-names default, state_100mhz, state_200mhz; pinctrl-0 pinctrl_usdhc2_8bit; pinctrl-1 pinctrl_usdhc2_8bit_100mhz; pinctrl-2 pinctrl_usdhc2_8bit_200mhz; bus-width 8; non-removable; status okay; };CPU频率调整策略cpu0 { operating-points /* kHz uV */ 792000 1225000 696000 1225000 528000 1175000 396000 1025000 198000 950000 ; fsl,soc-operating-points /* kHz uV */ 792000 1175000 696000 1175000 528000 1175000 396000 1175000 198000 1175000 ; };频率策略配置选项performance锁定最高频率ondemand按需动态调频powersave优先低功耗5. 调试技巧与常见问题解决设备树调试方法查看解析后的设备树cat /proc/device-tree/model检查特定节点属性ls /sys/firmware/devicetree/base/soc/aips-bus02000000/网络驱动调试信息dmesg | grep -E fec|PHY典型问题解决方案网络不稳定问题检查PHY复位时序是否满足LAN8720A的50ms要求确认TX_CLK引脚SION位已设置writel(0x14, ioremap(0x020E00DC, 4)); // ENET1_TX_CLK writel(0x14, ioremap(0x020E00FC, 4)); // ENET2_TX_CLKEMMC识别失败验证硬件焊接质量检查设备树中电压配置reg_sd1_vmmc { regulator-min-microvolt 3300000; regulator-max-microvolt 3300000; };内核启动卡住检查串口输出定位故障点确认内存配置匹配实际硬件memory80000000 { reg 0x80000000 0x20000000; // 512MB };6. 高级优化与扩展功能实现显示子系统配置以7寸RGB屏为例lcdif { pinctrl-names default; pinctrl-0 pinctrl_lcdif_dat pinctrl_lcdif_ctrl; display display0; status okay; display0: display { bits-per-pixel 24; bus-width 24; display-timings { native-mode timing0; timing0: timing0 { clock-frequency 51200000; hactive 1024; vactive 600; hfront-porch 160; hback-porch 140; hsync-len 20; vback-porch 20; vfront-porch 12; vsync-len 3; hsync-active 0; vsync-active 0; }; }; }; };触摸屏驱动集成i2c2 { ft5426: ft542638 { compatible edt,edt-ft5426; reg 0x38; interrupt-parent gpio1; interrupts 9 IRQ_TYPE_EDGE_FALLING; reset-gpios gpio5 9 GPIO_ACTIVE_LOW; }; };低功耗模式配置gpc { fsl,cpu_pupscr_sw2iso 0xf; fsl,cpu_pupscr_sw 0x0; fsl,cpu_pdnscr_iso2sw 0x1; fsl,cpu_pdnscr_iso 0x1; fsl,ldo-bypass 0; };在实际项目中验证发现将ENET1_TX_CLK引脚的SION位设置为1可显著提高网络稳定性。这个细节在NXP官方文档中并未明确强调但在实际硬件设计中至关重要。