2. Sitara硬件平台与板级资源解析
Sitara处理器的板级适配,本质上不是“写驱动”,而是先把硬件资源描述清楚。核心板与底板把SoC引脚、时钟、电源、内存和设备连接关系固定下来,Linux内核再通过设备树(Device Tree)把这些信息翻译成驱动可识别的资源。理解这一层,才能解释为什么同一个驱动在不同板子上表现不同,也才能定位“驱动没问题但设备不工作”的典型故障。
核心板与底板:资源分层与职责边界
以AM335x/AM437x这类Sitara平台为例,核心板通常集成SoC、DDR、eMMC、PMIC和基础晶振,负责最小系统;底板则承载以太网PHY、USB、串口、CAN、LCD、按键和扩展接口。核心板输出的是“SoC引脚 + 电源 + 时钟 + 启动介质”,底板决定“这些引脚接到什么外设、以什么电气形态工作”。因此板级适配的第一步是确认核心板与底板的接口定义,尤其是引脚复用、供电域和参考时钟来源。
例如,核心板上的VDD_CORE由PMIC输出1.1V,底板若把某个外设接在VDDSHV6(3.3V IO域)上,就必须保证该外设的IO电平与3.3V匹配;若误接到1.8V域,即使PinMux配置正确,信号也无法被正确识别。核心板与底板的这种“资源分层”关系,是后续所有配置的起点。
PinMux:一个引脚,多种身份
Sitara的每个引脚通过CTRL_MODULE寄存器选择功能,典型字段包括MUXMODE、PULLUP/PULLDOWN、RXACTIVE和INPUTEN。以AM335x的GPMC_A0引脚为例,MUXMODE=0为GPMC_A0,MUXMODE=1为GPIO1_16,MUXMODE=2为UART2_RXD。设备树中通过pinctrl子节点描述这些寄存器值,内核在启动时写入对应偏移。
&am33xx_pinmux {
uart2_pins: uart2_pins {
pinctrl-single,pins = <
0x1A0 0x31 /* uart2_rxd, mux=1, rx, pull-up */
0x1A4 0x11 /* uart2_txd, mux=1, tx, pull-up */
>;
};
};
&uart2 {
pinctrl-names = "default";
pinctrl-0 = <&uart2_pins>;
status = "okay";
};
这里0x1A0是引脚控制寄存器偏移,0x31表示MUXMODE=1、使能接收、上拉。若把0x31误写成0x30,接收通道未使能,串口只能发不能收。PinMux配置错误是板级调试中最常见的问题之一,且往往表现为“设备树已加载、驱动已probe,但数据不通”。
时钟树与电源域:驱动工作的前提
Sitara的时钟由PRCM模块管理,典型路径为:外部晶振→MPU_PLL/CORE_PLL/PER_PLL→分频器→外设时钟。以UART2为例,其时钟源通常来自PER_PLL,经UART2_CLKCTRL使能后输出48MHz或96MHz。设备树中通过clocks和clock-names引用时钟节点,驱动在probe时调用clk_get和clk_prepare_enable。
电源域方面,VDDS_DDR、VDDSHV6、VDD_CORE分别对应DDR、3.3V IO和核心逻辑。若外设挂在VDDSHV6,而设备树中status为okay但时钟未使能,串口寄存器读写会返回0或超时。实际调试中,可先读/sys/kernel/debug/clk/clk_summary确认时钟频率,再检查dmesg中是否有clk: failed to enable类报错。
内存映射与设备树基础
Sitara采用统一内存映射,典型区域包括:0x0000_0000起始的DDR、0x44E0_0000的CTRL_MODULE、0x4800_0000的UART0、0x4A00_0000的PRCM。设备树中通过reg = <0x48022000 0x2000>描述基地址和长度,驱动用platform_get_resource或devm_ioremap_resource映射。
设备树的基本结构是“节点 + 属性”。根节点下挂soc、chosen、memory等;soc下挂uart2、i2c1、gpio1等外设节点。每个节点通过compatible匹配驱动,通过reg描述地址,通过interrupts描述中断,通过pinctrl-0描述引脚。板级适配的核心工作,就是把这些属性从原理图和芯片手册中提取出来,写成正确的DTS。
调试建议:设备树编译后生成.dtb,可通过dtc -I dtb -O dts反编译核对。若驱动未probe,先检查compatible是否匹配、status是否为okay、pinctrl-0是否引用正确,再检查时钟和电源域。
板级信息描述的完整链路
从硬件到驱动,板级信息经历“原理图→引脚表→DTS→dtb→内核解析→驱动probe”的链路。以UART2为例:原理图确认UART2_RXD接在GPMC_A0,引脚表记录MUXMODE=1、上拉、接收使能;DTS中uart2_pins写入0x1A0 0x31,uart2节点引用该pinctrl并设置status = "okay";内核启动后,omap-serial驱动匹配compatible = "ti,omap4-uart",读取reg映射寄存器,使能时钟,最终生成/dev/ttyS2。此时用echo test > /dev/ttyS2并短接TX/RX,可观察到回显,说明板级描述与驱动链路一致。
若回显失败,按“引脚→时钟→电源→寄存器”顺序排查:先确认PinMux寄存器值,再确认clk_summary中UART2时钟是否使能,再测量VDDSHV6电压,最后读UART2_LCR等寄存器确认配置。这种从硬件到软件的逐层核对,是Sitara板级适配最可靠的方法。