概述
目录
一、什么是pinctrl子系统
二、里面包含的文件(分析源码)
三、pinctrl子系统结构体和API函数
四、pinctrl子系统到API函数
五、pinctrl系统设备树
六、pinctrl使用实例:
正文:
一、什么是pinctrl子系统
省略:
二、里面包含的文件(分析源码)
pinctl子系统源码列表:(linux-3.1.4/drivers/pinctrl)
查找相关的文件(ls *.o )即是被编译过的文件
core.c core.h pinctrl子系统的核心文件
pinctl-utils.c pinctl-utils.h pinctrl子系统的一些utility(用途)接口函数
pinmux.c pinmux.h 管脚复用相关的文件
pinconf,c pinconf,h 管脚上下啦,管脚驱动能力
devicetree.c devicetree.h pinctrl设备树解析文件
pinctrl-xxx.c 各种pin control 的low level driver
三、pinctrl子系统结构体和API函数
下层由厂家提供的结构体:
struct pinctrl {
struct list_head node; //内核链表
struct device *dev; //设备的父类
struct list_head states; //管脚状态链表
struct pinctrl_state *state; //管脚状态结构体
struct list_head dt_maps; //设备树映射链表
struct kref users ; //内核引用计数
};
struct pinctrl_state {
struct list_head node; //管脚状态
const char *name; //名字
struct list_head settings; //管脚设置链表
};
struct pinctrl_setting {
struct list_head node; //管脚设置链表
enum pinctrl_map_type type; //管脚的配置类型
struct pinctrl_dev *pctldev; //pinctrl_dev指针
union {
struct pinctrl_setting_mux mux; //复用功能设置
struct pinctrl_setting_configs configs; //配置的设置
} data;
};
struct pinctrl_setting_mux {
unsigned group; //组号
unsigned func; //功能序号
};
struct pinctrl_setting_configs {
unsigned group_or_pin; //组或者管脚号
unsigned long *configs; //配置
unsigned num_configs; //配置个数
};
四、pinctrl子系统的API函数
A、获取一个pinctrl结构体
1. struct pinctrl *devm_pinctrl_get(struct device *dev)
参数1:设备结构体
返回值:成功返回pinctrl 结构体指针,失败返回NULL
B、归还结构体给系统
void devm_pinctrl_put(struct pinctrl * p )
参数:向系统归还pinctrl
返回值: 无
C、查询pinctrl状态
static struct pinctrl_state * pinctrl_lookup_state(struct pinctrl *p,const char *name)
参数1:pinctrl指针
参数2: 状态名
返回值:成功返回来pinctrl_state 结构体 失败返回NULL
D、设置pinctrl的状态
static inline int pinctrl_select_state(struct pinctrl *p,struct pinctrl_state *s)
参数1:pinctrl 结构体指针
参数2:要设置的状态
返回值:成功 0 失败返回错误码
五、pinctrl系统设备树
伪代码使用pinctrl
、pinctrl使用实例:
添加设备树内容:
pinctrl@11400000{
disp_on:disp_on {
samsung,pins=“gpd0-1”
samsung,pin-function = <2>
};
disp_off:disp_off {
samsung,pins=“gpd0-1”
samsung,pin-function = <0>
};
}
lcd-backlight { //背光灯引脚
compatible = “pinctrl-disp”
pinctrl-names = "turn_on ",“turn_off”
pincrtl-0 = <&disp_on>
pinctr-1 = <&disp_off>
}
打开对应的设备树文件:然后添加进去,重新编译设备树。
int _init model_init() {
return platform_driver_register(platform_driver );
}
int _-exit modul_exit() {
return platform_driver_unregister(platform_driver );
}
onst struct of_device_id of_match_table[] = {
{
compatible = "pinctrl-disp //按照设备树来匹配
},
{ …},
{…}
};
struct platform_driver platfor = {
int (*probe)(struct platform_device *);
int (*remove)(struct platform_device *);
struct device_driver driver;
driver = {
.name = “hello”
.owner = “THIS_MODULE”
.of_device_id = of_match_table;
};
int modue_probe(struct platform_device *) {
pinctrl = devm_pinctrl_get(&platfor.dev); //获取到这个结构体
//这个name 是设备树里面的那个 获取pinctrl状态
pinctrl_state = pinctrl_state * pinctrl_lookup_state(struct pinctrl *p,turn_on )
pinctrl_select_state(struct pinctrl *p,turn_off ) // 设置这个状态结构体
}
int module_remove(struct platform_device *) {
devm_pinctrl_put(struct pinctrl * p ) //向系统释放pinctrl
}
最后
以上就是激动跳跳糖为你收集整理的kernel驱动-pinctrl子系统的全部内容,希望文章能够帮你解决kernel驱动-pinctrl子系统所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复