03、pinctrl api介绍及实验
📢本篇将介绍pinctrl
api
及其使用案例 。
一、pinctrl函数介绍
① 获取设备对应的 pinctrl 结构体指针函数
函数原型:
c
struct pinctrl* pinctrl_get(struct device *dev);
1
头文件: <linux/pinctrl/pinctrl.h>
参数:
dev
:要获取引脚控制器的设备对象指针。
功能: 根据设备对象 dev
,获取该设备关联的 pinctrl(引脚控制器) 结构体指针。
返回值:
- 成功时返回一个指向
struct pinctrl
的指针。 - 失败(如设备不支持)返回
NULL
。
② 释放 pinctrl 指针函数
函数原型:
c
void pinctrl_put(struct pinctrl *p);
1
头文件: <linux/pinctrl/pinctrl.h>
参数:
p
:要释放的 pinctrl 结构体指针。
功能: 释放通过 pinctrl_get()
获取的 pinctrl 资源,避免内存泄漏。
返回值: 无返回值。
③ 查找 pinctrl 状态函数
函数原型:
c
struct pinctrl_state* pinctrl_lookup_state(struct pinctrl *p, const char *name);
1
头文件: <linux/pinctrl/pinctrl.h>
参数:
p
:要查找状态的 pinctrl 结构体指针。name
:要查找的状态名称(例如"default"
或"sleep"
)。
功能: 在指定的 pinctrl 实例中,根据名称查找对应的 引脚配置状态(如引脚模式、电气属性)。
返回值:
- 成功时返回该状态的指针。
- 未找到或出错返回
NULL
。
④ 设置 pinctrl 状态到硬件
函数原型:
c
int pinctrl_select_state(struct pinctrl *p, struct pinctrl_state *s);
1
头文件: <linux/pinctrl/pinctrl.h>
参数:
p
:要操作的 pinctrl 结构体指针。s
:要应用的引脚配置状态指针。
功能: 将指定的引脚配置状态 s
应用到硬件,更新引脚的实际设置(例如切换引脚功能)。
返回值:
- 成功返回
0
。 - 失败返回负数错误码(如
-EINVAL
)。
:::
总结
获取 pinctrl:用设备对象找到对应的引脚控制器。
释放 pinctrl:用完后释放资源,防止内存问题。
查找状态:通过名称(如 "default"
)找到对应的引脚配置。
应用状态:将配置写入硬件,真正控制引脚行为。 :::
使用流程示例:
c
struct pinctrl *p = pinctrl_get(dev);
if (!p)
return -ENODEV;
struct pinctrl_state *s = pinctrl_lookup_state(p, "active");
if (IS_ERR(s)) {
pinctrl_put(p);
return PTR_ERR(s);
}
int ret = pinctrl_select_state(p, s);
if (ret)
// 处理错误
pinctrl_put(p); // 最后释放资源
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
二、案例
- 先查找
pinctrl_lookup_state
- 再指定
效果:GPIO 复用功能改变
pinctrl_select_state
三、定义
C
/**
* pinctrl_select_state() - select/activate/program a pinctrl state to HW
* @p: the pinctrl handle for the device that requests configuration
* @state: the state handle to select/activate/program
*/
int pinctrl_select_state(struct pinctrl *p, struct pinctrl_state *state)
{
if (p->state == state)
return 0;
return pinctrl_commit_state(p, state);
}
EXPORT_SYMBOL_GPL(pinctrl_select_state);
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13