首页 > 其他分享 >gpio子系统与pinctrl子系统通用API

gpio子系统与pinctrl子系统通用API

时间:2024-03-23 22:44:27浏览次数:29  
标签:struct 句柄 pinctrl state API gpio 子系统 设备

此篇不涉及gpio子系统和pinctrl原理解释,只列举相关操作函数:  

通用的GPIO操作:

1. gpio_request(unsigned gpio, const char *label):向内核申请指定gpio,所申请的IO口会被内核记录 参数:gpio:申请IO口编号 ,label:申请者的名字,随便。 返回:int值,成功:0;失败:负数 注:在使用gpio口之前,应先用gpio_request()申请gpio口。 若申请成功,则说明该gpio口未被使用。 若申请失败,则说明该gpio口不存在或未被释放。   2. gpio_set_value(unsigned gpio, int value):设置gpio口的值 参数:gpio:要设置的IO口编号 ,value:要设置的值(0或1) 返回:无   3. gpio_get_value(unsigned gpio):获取gpio口的值 参数:gpio:要获取的IO口编号 返回:int值,IO口状态   4. gpio_direction_input(unsigned gpio):设置gpio为输入功能 参数:gpio:要设置的IO口编号 返回:int值   5. gpio_direction_output(unsigned gpio, int value):设置gpio为输出功能,同时设置gpio输出的值 参数:gpio:要设置的IO口编号 ,value:要设置的值(0或1) 返回:int值 注:一般来说,设置一个GPIO口为输出,先执行一次gpio_direction_output,然后接下来只需执行gpio_set_value就行了。   6. gpio_free(unsigned gpio):释放gpio口,释放的IO口会在内核记录消除 注:在使用完gpio口之后,应及时释放gpio口。释放的io,可以再次被申请。  

通用PINCTRL操作:

重要结构体:
struct pinctrl {
    struct device *dev;                    // 指向拥有该 pinctrl 结构体的设备的设备结构体指针。
    const char *name;                      // pinctrl 的名称,用于标识该 pinctrl 结构体所管理的设备引脚配置
    struct module *owner;                  // 指向拥有该 pinctrl 结构体的模块的模块结构体指针
    struct list_head pin_ctrls;            // 用于存储与该 pinctrl 相关的 pin control 结构体的链表头
    const struct pinctrl_ops *ops;         // 指向 pinctrl 操作函数的指针,包含了对该 pinctrl 结构体进行操作的函数指针
};

struct pinctrl_state {
    struct list_head node;                // 用于将 struct pinctrl_state 结构体链接到状态列表中的节点
    const char *name;                     // 状态的名称,用于标识不同的状态
    unsigned long *pins;                  // 一个无符号长整型数组,存储了设备需要配置的引脚号
    unsigned int num_pins;                // 表示 pins 数组中引脚的数量
    struct pinctrl *p;                    // 指向该状态所属的 pinctrl 句柄的指针。
};
相关函数: 1、struct pinctrl *devm_pinctrl_get(struct device *dev):从设备树中获取指定设备的 pinctrl 句柄 参数:dev 是设备结构体指针,代表需要获取 pinctrl 句柄的设备。 返回值:如果成功,返回一个指向 struct pinctrl 结构体的指针;如果失败,返回一个错误指针或错误码。   2、struct pinctrl_state *pinctrl_lookup_state(struct pinctrl *p, const char *state_name):查找给定 pinctrl 句柄中的特定状态 参数:p 是 pinctrl 句柄,state_name 是需要查找的状态名称。 返回值:如果找到对应状态,返回一个指向 struct pinctrl_state 结构体的指针;否则返回 NULL   3、int pinctrl_select_state(struct pinctrl *p, struct pinctrl_state *s);:选择并激活指定的状态,以配置设备的引脚 参数:p是要配置的设备的 pinctrl 句柄,s是要应用到设备引脚的状态 返回 0 表示成功,负值表示出现错误。   4、void pinctrl_put(struct pinctrl *p);用于释放 pinctrl 句柄的函数 参数:p表示要释放的 pinctrl 句柄,释放后该句柄将不再可用 无返回值   5、struct pinctrl *pinctrl_get(struct device *dev);获取指定设备的 pinctrl 结构体的函数 参数:dev是指向要获取 pinctrl 结构体的设备结构体指针 成功获取到指定设备的 pinctrl 结构体,则返回该 pinctrl 结构体的指针;获取失败或者该设备没有配置 pinctrl,则返回 NULL   pinctrl_get和pinctrl_put结合使用,效果等于devm_pinctrl_get devm开头表示设备管理(device management)的函数,使用devm_前缀表示它是一种设备管理资源,并且会与设备的生命周期进行关联。所以devm_pinctrl_get获取到的pinctrl句柄不用释放

标签:struct,句柄,pinctrl,state,API,gpio,子系统,设备
From: https://www.cnblogs.com/lethe1203/p/18091841

相关文章

  • vue2 在 main.js 中定义全局函数,在二次封装的 api\index.js 中引用全局函数 GPT4 Tur
    在Vue2中,你可以通过Vue的原型系统来定义全局函数,然后在整个应用的任何组件中使用这些函数。同样,你也可以在其他JavaScript文件中使用这些函数,比如你提到的二次封装的API文件。下面是如何实现这一过程的步骤:###第一步:在`main.js`中定义全局函数在Vue项目的入口文件`main.js`中,你......
  • 微服务设计中API Gateway设计
            SpringCloudGateway、Kong和Zuul都是流行的API网关解决方案,它们在微服务架构中扮演着至关重要的角色,今天我们来说说SpringCloudGateway,在后续的文章中我在对其他两个组件进行介绍        SpringCloudGateway是SpringCloud微服务生态系......
  • 实时汇率API查询接口接入方法:支持逐笔报价、批量订阅、历史日K线、周K、月K
    在进行量化回测时,确实需要支持逐笔报价、批量订阅、以及获取历史日K线、周K线、月K线等功能,这些功能对于编写有效的交易策略和分析市场数据至关重要。一般来说,在进行量化回测时,我们可以选择使用专业的量化交易平台或软件,这些平台通常会提供相应的API接口来支持逐笔报价、批量订阅......
  • .net 7 WebAPI 跨域配置(应用跨域、静态资源跨域)
    varbuilder=WebApplication.CreateBuilder(args);//Addservicestothecontainer.builder.Services.AddCors(options=>{options.AddPolicy("any",builder=>{//应用请求跨域builder.SetIsOriginAllowed(_=>true).AllowAnyO......
  • 使用 Pyqt5 GUI 页面请求 FastAPI 后端 API,实现逻辑功能
    使用PyQt5+FastAPI+SQLAlchemy+Redis+Celery做一个登录注册页(四)本文将介绍用PyQt5+FastAPI+SQLAlchemy+Redis+Celery做的一个登录注册页,使用邮箱接收验证码,本文介绍是前后端分离的实现方式,厚后端使用FastAPI+SQLAlchemy+Redis+Celery,你可以将PyQt5改为PySide2以获得更宽松......
  • FastApi中使用ORM
    1、介绍在应用的开发过程中肯定会使用到数据库,FastApi中是一个异步的web框架配合异步的ORMTortoise能让FastAPI的并发性能,而且TortoiseORM是受DjangoORM框架启发的,从DjangoORM移动TortoiseORM就很平滑。#安装pipinstallfastapipipinstalltortoise-orm2、项目......
  • 使用FastAPI+SQLAlchemy+Redis+Celery 编写一个完整的用户登录验证API
    使用PyQt5+FastAPI+SQLAlchemy+Redis+Celery做一个登录注册页(三)本文将介绍用PyQt5+FastAPI+SQLAlchemy+Redis+Celery做的一个登录注册页,使用邮箱接收验证码,本文介绍是前后端分离的实现方式,厚后端使用FastAPI+SQLAlchemy+Redis+Celery,你可以将PyQt5改为PySide2以获得更宽松......
  • API接口开发规范
    API接口是不同软件系统之间进行通信的重要方式,良好的API接口设计规范可以提高系统的可维护性、可扩展性和易用性。本文介绍了一套详细的API接口开发规范,包括命名规范、请求和响应规范、安全规范等内容,旨在帮助开发团队统一规范API接口的设计和实现。一、命名规范URL命名规范使......
  • 关于 WebApi 返回值的探究
    关于WebApi返回值的探究写这篇文章的原因主要是,工作时间长了,各种乱七八糟的项目和框架都见识过了,前端后端都写过,怎么说也算得上是全栈了,见过一堆不规范的代码,特别是这个webapi的返回值问题这里以asp.netcore为例,不讨论MVC的情况IActionResult和ActionResult这里主要是想......
  • SpringBoot3.x与SpringDoc OpenApi之Swagger接口排序
    直接使用Swagger之后,发现所有的Controller接口菜单都是无序的先看一下效果 就是利用了一下SpringDoc提供的接口做了一下自定义排序1.在Controller上加上注解@Tag(name="MenuController",description="1-菜单管理")这里需要注意description属性,在下面的代码里......