原文地址:
1. 引言
1.1. 编写目的
本文档主要介绍pinctrl接口使用方法。
1.2. 适应范围
硬件平台:A33
软件版本:Linux-3.4及后续内核版本
1.3. 相关人员
本文档可供系统维护人员、驱动开发人员和测试人员参考。
2. pinctrl子系统
2.1. 概述
许多Soc内部都包含pin控制器,通过pin控制器的寄存器,我们可以配置一个或者一组引脚的功能和特性。
在软件方面,linux内核中提供了pinctrl子系统,目的是为了统一各SoC厂商的pin脚管理,避免各SoC厂商各自实现相同的pin脚管理子系统,减少SoC厂商系统移植工作量。
通过pinctrl驱动可以操作pin控制器,完成如下工作: 1. 枚举并且命名pin控制器可控制的所有引脚; 2. 提供引脚的复用能力;
3. 提供配置引脚的能力,如驱动能力、上拉下拉和数据属性等;
基于sunxi平台实现的pinctrl驱动,是在linux pinctrl驱动通用框架上进行实现与扩张的,平台实现的pinctrl驱动除了拥有以上功能之外,还具有如下功能: 1. 与gpio子系统的交互; 2. 实现pin中断;
2.2. 内核配置
A33平台默认选上pinctrl相关配置。Pinctrl子系统调试信息配置如下: Device Drivers --->
Pin controllers --->
[*] Debug PINCTRL calls
2.3. sys_config.fex
在sys_config中,gpio描述形式为:
port:端口+组内序号<功能分配><内部电阻状态><驱动能力><输出电平> 1. 端口,例如:PA, PB, PC, …… 2. 组内序号,例如:0, 1, 2, ……
3. 功能分配,指定pin脚功能,参考IC datasheet
4. 内部电阻状态,包括三种状态,0:上拉下拉禁用(默认),1:上拉,2:下拉 5. 驱动能力,可配驱动能力四级,分别是0(默认),1,2,3 6. 输出电平,0或者1,只有当pin脚配成输出时才生效
示例:
[uart0]
uart_used = 1 uart_port = 0 uart_type = 2
uart_tx = port:PF2<4><1> uart_rx = port:PF4<4><1>
C
on
fi
den
ti
al
第 6 页 共 11 页
2.4. 模块加载
编进内核,无需加载。
2.5. 依赖资源
sys_config模块。
3. pinctrl接口
常用接口:
? devm_pinctrl_get_select_default
3.1. devm_pinctrl_get
函数原型 struct pinctrl * evm_pinctrl_get(struct device *dev);
函数功能
根据设备获取pin操作句柄,所以的pin操作必须基于此pinctrl句柄。与pinctrl_get接口功能完全一样,只是devm_pinctrl_get会将申请的pinctrl句柄做记账,绑定到设备句柄信息中。
设备驱动申请pin资源,推荐优先使用devm_pinctrl_get接口。 返回值 pinctrl句柄
参数 dev:使用pin的设备,pinctrl子系统会通过设备名与pin配置信息匹配。
3.2. devm_pinctrl_put
函数原型 void devm_pinctrl_put(struct pinctrl *p);
函数功能 释放pinctrl句柄,必须与devm_pinctrl_get配对使用。 返回值 无
参数 p:pinctrl句柄
3.3. pinctrl_lookup_state
函数原型 struct pinctrl_state * pinctrl_lookup_state(struct pinctrl *p, const char *name); 函数功能 查找pin句柄指定状态下的状态句柄。 返回值 状态句柄 参数 p:pinctrl句柄
name:状态名称,A33平台上只有default一种状态
阅读(5133) | 评论(0) | 转发(0) |