Linux设备树下如何将可选GPIO映射至IIO驱动(AD9850场景)
问题与解决方案
问题概述
在Yocto构建的嵌入式Linux系统(Xilinx Zynq-7020 SoC)中,通过AXI SPI IP核与AD9850 DDS芯片通信时,因SPI核单次事务仅支持32位,而AD9850需40位数据传输,故采用SPI外设负责时钟和数据引脚,GPIO手动控制CS(FQ_UPDATE)引脚。目前SPI信号经逻辑分析仪验证正常,但GPIO控制的CS引脚未达预期效果,问题根源是设备树中GPIO未与IIO驱动正确关联。
核心修改思路
驱动通过devm_gpiod_get_optional(&spi->dev, "adi,fq_update", ...)从SPI设备节点获取GPIO资源,因此需将GPIO属性直接添加到AD9850的SPI子节点下,而非单独创建无关联的GPIO节点。
修改后的设备树片段
&amba_pl { // 移除原独立的gpio-dds-cs节点,该节点未与SPI设备绑定,驱动无法识别 }; &dds_spi { num-cs = <1>; status = "okay"; dds: ad9850@0 { label = "dds"; compatible = "ad9850"; reg = <0x0>; spi-max-frequency = <1000000>; // 关联fq_update GPIO,属性名需与驱动中"adi,fq_update"对应,后缀加"-gpios" adi,fq_update-gpios = <&dds_chip_select_gpio 0 1>; // 第三个参数1表示GPIO_ACTIVE_LOW,可根据AD9850引脚实际极性调整 }; };
关键说明
- GPIO属性命名规则:Linux GPIO子系统要求设备树中GPIO属性名为
[prefix]-gpios,驱动中devm_gpiod_get_optional的字符串参数是prefix,这里对应adi,fq_update,因此属性名必须为adi,fq_update-gpios。 - GPIO节点有效性:确保
dds_chip_select_gpio节点在设备树中已正确定义且状态为okay,引脚编号和电平极性需与硬件实际连接一致。 - 驱动无需调整:当前驱动中
devm_gpiod_get_optional的调用逻辑正确,仅需修改设备树即可让驱动成功获取GPIO句柄。
内容的提问来源于stack exchange,提问作者Adam Wilson
相关产品推荐
相关产品推荐

