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
14
2
3
4
5
6
7
8
9
10
11
12
13
14
