我是靠谱客的博主 激动跳跳糖,最近开发中收集的这篇文章主要介绍kernel驱动-pinctrl子系统,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

目录
一、什么是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子系统所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(64)

评论列表共有 0 条评论

立即
投稿
返回
顶部