掌握Linux设备驱动Pin Control子系统
编者注:嵌入式Linux正成为物联网脊柱,设备驱动是应用与硬件间桥梁。在《Linux设备驱动开发》中,作者John Madieu提供详尽代码丰富指南构建这些驱动。
本节选——书中第14章——深入Pin Control和GPIO,关键领域供需与内核对接定制硬件的开发者。首期介绍Pin Control子系统。
改编自《Linux设备驱动开发》,John Madieu著。
第14章 Pin Control与GPIO子系统
作者:John Madieu
嵌入式Linux中,驱动几乎总与GPIO交互或配置引脚复用。"引脚"是组件物理输出线,许多SoC复用同一引脚实现多功能。例如i.MX6QDL引脚MX6QDL_PAD_SD3_DAT1可作SD数据线、UART RTS/CTS线、FlexCAN Rx线、或通用GPIO。
选择引脚功能的过程称引脚复用,编排此过程的内核组件是引脚控制器。本章第二部分将探讨通用输入输出(GPIO)子系统,一种常见引脚功能。
本章你将:
- 走读Pin Control子系统,学习在设备树中声明pin-control节点。
- 对比遗留整数型GPIO API与新描述符型接口。
- 处理同时用作中断的GPIO。
- 探索专用于GPIO管理的sysfs接口。
Pin Control子系统
pinctrl子系统管理引脚复用和配置。需特定引脚排布的设备须在设备树描述该排布。引脚控制器驱动解析这些描述并相应编程SoC I/O控制器。
子系统提供:
- 引脚复用——单引脚复用多角色(UART TX、GPIO、HSI等),按组或逐针基础。
- 引脚配置——设置电气属性如上拉/下拉、驱动强度、去抖动等。
注:本书聚焦使用pin-controller API;不涵盖编写pin-controller驱动本身。
Pinctrl与设备树
设备树中,pin-controller节点描述所有可用引脚组和功能。每组分配整数ID,可选伴随pinctrl-name将人类可读名映射至ID。
设备绑定指定其所需引脚状态。两属性链接设备至引脚状态:
pinctrl-——指向引脚配置节点的phandle列表。多条目允许设备由多引脚控制器配置或为单控制器组合多节点。pinctrl-name——并行列表为每状态ID分配名。状态0通常命名default,遵循include/linux/pinctrl/pinctrl-state.h定义标准列表。
下方为典型设备树片段,展示两设备引脚配置:

每行遵循格式<PIN_FUNCTION> <PIN_SETTING>:
MX6QDL_PAD_DISP0_DAT15__GPIO5_IO09 0x80000000
MX6QDL_PAD_EIM_D25__UART3_RX_DATA 0x1b0b1
第一标记(MX6QDL_PAD_DISP0_DAT15__GPIO5_IO09)标识引脚功能;第二标记(0x80000000)编码配置位(上拉/下拉、驱动强度等)。这些宏定义于架构专用头文件如arch/arm/boot/dts/imx6q-pinfunc.h。
驱动代码中编程引脚状态,遵循初始化时步骤(典型在probe()):
struct pinctrl *pinctrl;
pinctrl = devm_pinctrl_get_select_default(&pdev->dev);
if (IS_ERR(pinctrl))
dev_warn(&pdev->dev, "pins are not configured from the driver");
辅助函数pinctrl_get_select_default()自动检索并应用default状态。若设备提供init状态,核心将在probe()前应用该状态,随后恢复default除非驱动更改。
完成时用pinctrl_put(pinctrl)或资源管理型devm_pinctrl_put(pinctrl)释放控制器。
来自am335x-evm.dts文件具体示例:
dcan1: d_can@481d0000 {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&d_can1_pins>;
};
匹配驱动中:
pinctrl = devm_pinctrl_get_select_default(&pdev->dev);
if (IS_ERR(pinctrl))
dev_warn(&pdev->dev, "pins are not configured from the driver");
驱动probe()运行时,default引脚配置已就位。
下期将详细介绍GPIO子系统。
经Packt Publishing许可转载。版权所有©2017 Packt Publishing
John Madieu是巴黎嵌入式Linux和内核工程师。他为自动化、交通、医疗、能源、国防客户开发驱动和BSP。John就职于EXPEMB——计算机模块设计先驱,活跃开源倡导者,相信知识共享加速创新。
物联网技术