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
}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用\[1\]: pinctrl子系统是Linux内核中的一个框架,用于统一管理不同系统芯片的引脚控制和配置。在pinctrl子系统中,有一个主要的结构体struct pinctrl_dev,用于表示一个引脚控制器设备。一般系统只会有一个struct pinctrl_dev实例。通过调用pinctrl_register_pins函数,可以为每个引脚分配一个独立的struct pin_desc结构体,并进行相应的赋值。struct pin_desc是pinctrl子系统用来管理每个引脚的最小单元。 引用\[2\]: 在pinctrl子系统中,引脚控制器并不只有一个,而是可以有多个。在设备树中,含有pinctrl-names和pinctrl-0属性的节点会拥有一个struct pinctrl结构体。pinctrl-names和pinctrl-0属性中的内容指定了要控制的引脚。有时候会遇到多个pinctrl-names和pinctrl-0属性,可以通过这种方式来配置不同的引脚控制。 引用\[3\]: pinctrl子系统的目的是为了统一各种不同的系统芯片中的引脚管理。在ARM的各种SOC芯片中,一个引脚可以被复用为不同功能的引脚,例如GPIO、SPI、I2C、UART等。pinctrl子系统的引入正是为了解决这种复用问题,使得不同SOC厂商的引脚管理能够在Linux内核中得到统一。 #### 引用[.reference_title] - *1* *3* [Linux pinctrl子系统框架流程详解(基于Kernel 3.16,arm,设备树)](https://blog.csdn.net/ZHONGkunjia/article/details/89873417)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [基于Linux的Pinctrl子系统框架源码分析](https://blog.csdn.net/qq_42017846/article/details/127795402)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值