Linux中pinctrl操作GPIO只需要几步

pinctrl 子系统 apipinctrl 子系统的 api 有很多,对于驱动工程师来说,pinctrl 操作一个 gpio 只需要三步:
1、devm_pinctrl_get2、pinctrl_lookup_state3、pinctrl_select_state在 linux 中,加 devm_ 开头的函数,代表这个函数支持资源管理。一般情况下,我们写一个驱动程序,在程序开头都会申请资源,比如内存、中断号等,万一后面哪一步申请出错,我们要回滚到第一步,去释放已经申请的资源,这样很麻烦。后来 linux 开发出了很多 devm_ 开头的函数,代表这个函数有支持资源管理的版本,不管哪一步出错,只要错误退出,就会自动释放所申请的资源。
1)devm_pinctrl_get:用于获取设备树中自己用 pinctrl 建立的节点的句柄;
2) pinctrl_lookup_state:用于选择其中一个 pinctrl 的状态,同一个 pinctrl 可以有很多状态。比如 gpio50 , 一开始初始化的时候是 i2c ,设备待机时候,我希望切换到普通 gpio 模式,并且配置为下拉输入,省电 。这时候如果 pinctrl 节点有描述,我们就可以在代码中切换 pin 的功能,从 i2c 功能切换成普通 gpio 功能;
3) pinctrl_select_stat:用于真正设置,在上一步获取到某个状态以后,这一步真正设置为这个状态。
对于 pinctrl 子系统的设备树配置,是遵守 service 和 client 结构 。
client 端各个平台基本都是一样的,server 端每个平台都不一样,使用的字符串的配置也不一样。
设备树配置:
//client端,设置不同状态&test { pinctrl-names = default,test_low,test_high; pinctrl-0 = ; pinctrl-1 = ; pinctrl-2 = ; gpio = ; status = okay;};//server 即 pin controller 端,设置 gpio 几种功能状态&gpio5 { test_default:test_default{}; test_low:test_low{ fsl,pins = }; test_high:test_low{ fsl,pins = };};pinctrl.c
#include #include #include #include #include #include #include static int __init mypinctrl_init(void){ int ret = 0; struct pinctrl *pctrl; struct platform_device *pdev; struct pinctrl_state *test_high; struct pinctrl_state *test_low; pctrl = devm_pinctrl_get(&pdev- >dev); if(is_err(pctrl)){ ret = ptr_err(pctrl); printk(devm_pinctrl_get errorn); return ret; } test_high = pinctrl_lookup_state(pctrl,test_high); if(is_err(pctrl)){ ret = ptr_err(test_high); printk(pinctrl_lookup_state test_high errorn); return ret; } test_low = pinctrl_lookup_state(pctrl,test_low); if(is_err(pctrl)){ ret = ptr_err(test_low); printk(pinctrl_lookup_state test_low errorn); return ret; } pinctrl_select_state(pctrl,test_low); udelay(200); pinctrl_select_state(pctrl,test_high); return 0;}static void __exit mypinctrl_exit(void){ printk(%sn,__func__);}module_init(mypinctrl_init);module_exit(mypinctrl_exit);mudule_license(gpl);makefile 与上面相同,只是更改一下编译输出的名字。
这个驱动加载上去,可以切换gpio口的功能状态,我这里只是控制gpio输出高低,具体看你设备树怎么配,比如你可以配置某个gpio一开始是i2c功能,待机时候是普通gpio功能,达到省电的目的。

具有输入OVP的RRIO运算放大器解决了电源排序问题
沉浸式餐厅强势来袭,带你感受不一样的用餐体验
超低功耗高性能 2.4GHz GFSK 无线发射器芯片——SI24R2
QUV紫外线耐候试验箱的技术参数如何
Java虚拟机应用于数字电视机顶盒的研究与实现
Linux中pinctrl操作GPIO只需要几步
智能硬件目前正向混合现实迁跃
长江存储宣布128层QLC 3D NAND闪存芯片研发成功
可拉伸显示器件可在皮肤上实现信息显示
爆发性应用增长催生5G,两大关键技术让梦想照进现实
智慧路灯:点亮城市智能化建设的未来
Arch Linux将要吧zstd作为默认压缩算法提升速度
2021华为开发者大会心得体会
英国将对NVIDIA收购ARM事宜展开调查
华为手机在俄罗斯市场已反超苹果和三星
NXP基于智能卡的安全生产方案
Windows 10有关错误或阻止驱动程序更新
换热器管板渗漏修补原因及解决方法
荣耀V20快充速度到底有多快
华尔街日报:人工智能芯片的效能每两年的可提高一倍