gpio子系统在sysfs中构建leds类

2023-10-31

1、内核配置

CONFIG_GPIO_SYSFS=y
CONFIG_GPIOLIB=y

(1)CONFIG_GPIO_SYSFS:决定sysfs是否支持gpio子系统,也就是能否在"/sys/class/“目录下看到gpio类;
(2)CONFIG_GPIOLIB:决定是否将”/drivers/gpio/gpiolib.c"编译进内核,如果选择否则在内核和驱动中不能使用gpio子系统相关的函数接口;
总结:CONFIG_GPIOLIB一般都是选择y,因为其他驱动会用到内核gpio子系统;CONFIG_GPIO_SYSFS根据自己的需求来进行选择,如果你不需要通过"/sys/class/gpio"目录下的文件来操作gpio口,就不需要开启;

2、gpio类创建过程

2.1、函数调用关系

gpiolib_sysfs_init()
	class_register(&gpio_class);	//创建gpio类
	gpiochip_export()
		sysfs_create_group()	//设置设备的属性

2.2、gpio类创建

2.2.1、postcore_initcall宏

#define __define_initcall(level,fn,id) \
	static initcall_t __initcall_##fn##id __used \
	__attribute__((__section__(".initcall" level ".init"))) = fn

#define postcore_initcall(fn)		__define_initcall("2",fn,2)

postcore_initcall(gpiolib_sysfs_init);

(1)gpiolib_sysfs_init()函数是创建gpio类的函数,内部调用class_register()函数进行创建;
(2)相当于定义了一个类型为initcall_t的静态局部变量__initcall_gpiolib_sysfs_init2,变量被赋值为gpiolib_sysfs_init函数指针,变量被赋予段属性".initcall2.init"。这样会保证在内核启动过程中自动调用gpiolib_sysfs_init()函数,创建好gpio类。

2.2.2、gpio_class 全局变量

//类属性
static struct class_attribute gpio_class_attrs[] = {
	__ATTR(export, 0200, NULL, export_store),
	__ATTR(unexport, 0200, NULL, unexport_store),
	__ATTR_NULL,
};

//类的信息
static struct class gpio_class = {
	.name =		"gpio",	//类的名字
	.owner =	THIS_MODULE,	//类的所有者

	.class_attrs =	gpio_class_attrs,	//类的属性
};

//调用关系
gpiolib_sysfs_init()
	class_register(&gpio_class);	//创建gpio类

(1)gpio_class变量类型是struct class结构体,所以调用class_register()函数创建类后,会看到/sys/class/gpio目录;
(2)/sys/class/gpio目录下有export和unexport文件,是因为在创建gpio类时,给类属性赋值了(gpio_class_attr[]变量);
(3)export和unexport是用于导出、撤销gpio口的,详情参见博客:《应用层通过/sys/class/gpio文件操作gpio口》

2.3、gpio类的设备属性设置

2.3.1、DEVICE_ATTR宏定义

#define __ATTR(_name,_mode,_show,_store) { \
	.attr = {.name = __stringify(_name), .mode = _mode },	\
	.show	= _show,					\
	.store	= _store,					\
}

#define DEVICE_ATTR(_name, _mode, _show, _store) \
	struct device_attribute dev_attr_##_name = __ATTR(_name, _mode, _show, _store)
	

用来定义一个struct device_attribute结构体变量,该类型的变量表示设备的属性,也就是将来在gpio类下的设备都有哪些文件夹;

2.3.3、DEVICE_ATTR宏定义展开分析

static DEVICE_ATTR(ngpio, 0444, chip_ngpio_show, NULL);


展开:
	struct device_attribute dev_attr_ngpio =  { \
		.attr = {.name = ngpio, .mode = 0444 },	\
		.show	= chip_ngpio_show,					\
		.store	= NULL,					\
	}

定义了struct device_attribute类型的变量dev_attr_ngpio,将来gpio类的设备目录里会看到ngpio文件,权限是0444,读ngpio文件调用函数chip_ngpio_show,因为store是NULL,所以ngpio文件不可写。

2.3.4、gpiochip_attr_group 全局变量

static const struct attribute *gpiochip_attrs[] = {
	&dev_attr_base.attr,
	&dev_attr_label.attr,
	&dev_attr_ngpio.attr,
	NULL,
};

static const struct attribute_group gpiochip_attr_group = {
	.attrs = (struct attribute **) gpiochip_attrs,
};

gpiochip_attr_group变量是个struct attribute 结构体指针数组,每一个成员都是gpio设备的一个属性,sysfs_create_group()函数
会读取gpiochip_attr_group变量去给gpio类的设备创建一系列属性;

3、把gpio端口创建为gpio类下的设备

函数调用关系

//在注册gpio资源时创建
gpiochip_add()
	gpiochip_export
	
//在创建gpio类时创建
gpiolib_sysfs_init()
	class_register(&gpio_class);	//创建gpio类
	gpiochip_export()

(1)在两个地方会为每个gpio端口创建gpio类的设备,一个是注册gpio端口资源时,另一个是在初始化gpio框架的sysfs时;
(2)struct gpio_chip结构体的exported变量是用来标记该端口的状态,gpio端口在初始化后exported变量会被置1,在创建的时候回去检查标志位, 所以不用担心重复创建;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

gpio子系统在sysfs中构建leds类 的相关文章

  • 如何在shell中输出返回码?

    我正在尝试通过调用自定义 shell 脚本sh bin sh c myscript sh gt log txt 2 gt 1 echo 该命令的输出是创建的后台进程的 PID 我想指导 bin sh保存返回码myscript sh到某个文件
  • iptables通过注释删除特定规则

    我需要删除一些具有相同评论的规则 例如 我有带有 comment test it 的规则 所以我可以像这样获得它们的列表 sudo iptables t nat L grep test it 但是我怎样才能删除所有带有注释 测试它 的 PR
  • PHP 无法打开流:是一个目录

    非常简单的 PHP 脚本 我在我亲自设置的 Ubuntu Web 服务器上的 EE 模板中运行 我知道这与权限有关 并且我已经将我尝试写入的目录的所有者更改为 Apache 用户 我得到的错误是 遇到 PHP 错误 严重性 警告 消息 fi
  • jq中如何分组?

    这是 json 文档 name bucket1 clusterName cluster1 name bucket2 clusterName cluster1 name bucket3 clusterName cluster2 name bu
  • 查找哪些页面不再与写入时复制共享

    假设我在 Linux 中有一个进程 我从中fork 另一个相同的过程 后forking 因为原始进程将开始写入内存 Linux写时复制机制将为进程提供与分叉进程使用的不同的唯一物理内存页 在执行的某个时刻 我如何知道原始进程的哪些页面已被写
  • ftrace:仅打印trace_printk()的输出

    是否可以只转储trace printk 输出于trace文件 我的意思是过滤掉函数跟踪器 或任何其他跟踪器 中的所有函数 一般来说 您可以在选项目录中关闭选项 sys kernel debug tracing options Use ls显
  • 如何通过ssh检查ubuntu服务器上是否存在php和apache

    如何通过ssh检查Ubuntu服务器上apache是 否安装了php和mysql 另外如果安装的话在哪个目录 如果安装了其他软件包 例如 lighttpd 那么它在哪里 确定程序是否已安装的另一种方法是使用which命令 它将显示您正在搜索
  • 在脚本内使用不带密码的 sudo

    由于某种原因 我需要作为用户在没有 sudo 的情况下运行脚本 script sh 该脚本需要 root 权限才能工作 我认为将 sudo 放入 script sh 中是唯一的解决方案 让我们举个例子 script sh bin sh su
  • 如何使用 GOPATH 的 Samba 服务器位置?

    我正在尝试将 GOPATH 设置为共享网络文件夹 当我进入 export GOPATH smb path to shared folder I get go GOPATH entry is relative must be absolute
  • “make install”将库安装在 /usr/lib 而不是 /usr/lib64

    我正在尝试在 64 位 CentOS 7 2 上构建并安装一个库 为了这个目的我正在跑步 cmake DCMAKE BUILD TYPE Release DCMAKE INSTALL PREFIX usr DCMAKE C COMPILER
  • Linux - 从第二个选项卡获取文本

    假设我们有这样的文件 一些文本11 一些文本12 一些文本13 一些文本21 一些文本22 一些文本23 文本由制表符分隔 我们知道第 1 列中的一些文本 但希望从第 2 列中获取文本 我知道我可以通过以下方式获取线路 grep somet
  • 在两次之间每分钟执行一次 Cronjob

    我需要在 crontab 中每分钟运行一个 bash 脚本8 45am and 9 50am每天的 Code 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 8 home pull sh gt ho
  • 监视目录的更改

    很像一个类似的问题 https stackoverflow com questions 112276 directory modification monitoring 我正在尝试监视 Linux 机器上的目录以添加新文件 并希望在这些新文
  • 如何在c linux中收听特定接口上的广播?

    我目前可以通过执行以下操作来收听我编写的简单广播服务器 仅广播 hello int fd socket PF INET SOCK DGRAM 0 struct sockaddr in addr memset addr 0 sizeof ad
  • 如何构建任务“gems:install”

    我正在将 Rails 应用程序部署到 Linux 服务器 并且缺少一些 rake 任务 包括 rake gems install 和 rake db 我正在运行来自 GEM 的 Rails 2 3 4 为什么是这样 我该如何解决 我可以以某
  • Urwid:使光标不可见

    我正在使用 urwid 它是一个用于在 ncurses 中设计终端用户界面的 Python 框架 但有一件事我在 urwid 中无法做到 而这在 Curses 中很容易做到 使光标不可见 现在 选择按钮时光标是可见的 而且看起来很丑 有办法
  • 监控子进程的内存使用情况

    我有一个 Linux 守护进程 它分叉几个子进程并监视它们是否崩溃 根据需要重新启动 如果父进程可以监视子进程的内存使用情况 以检测内存泄漏并在超出一定大小时重新启动子进程 那就太好了 我怎样才能做到这一点 您应该能够从 proc PID
  • 如何允许应用程序声明“https”方案 URI? (即如何从 https URL 打开桌面应用程序?)

    目前我正在尝试为 OAuth 2 0 授权流程创建一个客户端 实际上是一个本机应用程序 并且在规范中就在这儿 https www rfc editor org rfc rfc8252 section 7 2据说有 3 种方法来处理重定向 U
  • Gearman,php 扩展问题:使用终端在 .. 中找不到类“GearmanWorker”,但可以在浏览器上使用

    我最近在 ubuntu 10 04 上安装了 gearman 并安装了它的 pecl 扩展 现在 当我在浏览器中运行一个 php 文件时 其中包含 client new GearmanWorker die var Dump client I
  • 让 TeXstudio 在 linux mint 中工作:找不到文件“url.sty”。

    刚刚切换到 Linux Mint 以前的顽固 Windows 用户 我在尝试安装 TeXstudio 时遇到一些问题 Sudo apt get install texstudio 给了我一个正确的安装 至少 我是这么认为的 但是当我尝试构建

随机推荐

  • IP地址分类(A类 B类 C类 D类 E类)

    IP地址由四段组成 每个字段是一个字节 8位 最大值是255 IP地址由两部分组成 即网络地址和主机地址 网络地址表示其属于互联网的哪一个网络 主机地址表示其属于该网络中的哪一台主机 二者是主从关系 IP地址的四大类型标识的是网络中的某台主
  • 如何完美解答面试问题——HashMap的扩容机制(JDK1.7)

    大家好 我是孤焰 今天要谈一谈在面试过程中几乎被每个面试官都会提到的一个问题 HashMap的扩容机制是什么 由于我也是刚刚学习编程的小白 所以此篇博文将参考了多篇博文 最后总结而成 此篇博文仅介绍JDK1 8版本之前的HashMap扩容机
  • Unity3D 动画操作

    导入模型 https blog csdn net shenqiankk article details 100064940 方式一 Animator animation SetBool 状态转换的参数 true false 在创建对象前 先
  • 【计算机网络】数据链路层(一):数据帧和物理寻址

    数据链路层是物理层的上层 物理层是把电脑连接起来的物理手段 它主要规定了网络的一些电气属性 其作用是负责传送0和1的电信号 数据链路层位于物理层的上层 简单的阐述它的作用就是确定0和1的分组方式 下面我们就详细的介绍数据链路层 上面是TCP
  • 阿里云DNS 新增云上线路的智能解析功能

    简介 企业在云上部署单元化架构或内部服务链路时 需要考虑让数据 单元 离用户更近 避免跨单元获取数据 以此来满足自身低延时的诉求 阿里云DNS 新增基于云上链路的调度功能 进一步优化DNS智能解析 给云上用户提供更精准的流量调度能力 传统解
  • 基于STM32串口通信的ESP8266WiFi模块使用

    掌握esp8266的使用可以实现真正的万物物联 esp8266wifi通信对于MCU而言归结到底还是串口或spi通信 因此 掌握RS232通信协议 SPI通信协议以及esp8266的配置就可以基本搞定WiFi模块的使用 参考文章 1 ESP
  • 安全帽佩戴检测算法模型训练详细流程

    一 任务描述 实际施工现场需要对每个进出的人员进行安全帽监测 对未佩戴安全帽的人员平台进行风险告警 通知工作人员并记录下来 主要包括三类目标物体 头盔 helmet 人 person 和人头 head 二 实现流程 1 数据集 直接用的网络
  • C++I/O输入输出

    1 流和缓冲区 我们通常说的流 可以理解为从一个地方流向另一个地方 在C 中的I O是指的输入 输出端口 那么I O流就可以简单的理解为在外部设备和内存之间的数据流动 直白的讲 流实际上是一个字节序列 即 字节流 而C 程序把输入输出看做字
  • WIN11修改右键菜单默认展开

    想要展开右键菜单 像Windows 10那样 首先打开Terminal写入注册表项 展开 reg exe add HKCU Software Classes CLSID 86ca1aa0 34aa 4e8b a509 50c905bae2a
  • JAVA中的数据结构和底层原理

    JAVA中的数据结构简述 JAVA中常用的数据结构主要有这样几种分类 List 可存储相同的值 确切讲是a equals b 时 二者都可存储 我们会挑选适宜连续存储的ArrayList和链式存储的LinkedList进行介绍 Set 不可
  • 数据结构-leetcode-环形链表

    解题图解 代码如下 bool hasCycle struct ListNode head struct ListNode fast head 在这里fast是快指针 head作为low指针 因为这个题不需要做修改也只需返回true或fals
  • Web API

    文章目录 Web API基本认知 获取DOM元素 根据Css选择器来获取DOM元素 其它获取DOM元素方法 操作元素内容 操作元素属性 常用属性 元素样式属性 表单元素属性 定时器 间歇函数 定时器 延时函数 事件监听 事件类型 事件对象
  • RV1126_RV1109从设备树中读取native-mode节点信息流程

    1 video of display timing c struct display timings of get display timings 在该函数中获取native mode节点信息 返回值就是获取到的timing 下步查看谁调用
  • 时序预测

    时序预测 MATLAB实现基于PSO BiLSTM BiLSTM时间序列预测对比 目录 时序预测 MATLAB实现基于PSO BiLSTM BiLSTM时间序列预测对比 效果一览 基本描述 程序设计 参考资料 效果一览 基本描述 MATLA
  • Shiro实战学习笔记(4)- 整合springboot(1)

    1 shiro整合spring boot gt
  • 恒玄BES2300XX系列常用接口(2)

    hal cmu sys reboot 复位 hal norflash disable protection HAL NORFLASH ID 0 flash闪存禁用保护 define ANC MODE SWITCH WITHOUT FADE
  • vue脚手架、npm、node

    vue cli vue脚手架 cli gt command line interface 命令行界面 vue脚手架可以快速 安全的构建vue项目 vue cli 脚手架 需要使用npm cnpm包管理工具进行安装 npm npm是一种js语
  • C++ 一行代码删除string字符串中的“\n“、“\r“、“\t“ 和 所有空白字符

    这篇博客记录如何删除C 字符串中的回车 换行 制表符和所有的空白字符 方式一 示例 std string str n r t abc n t r cba r t n std cout lt lt str lt lt std endl 运行截
  • Websocket握手

    当客户端想要使用 WebSocket 协议与服务端进行通信时 首先需要确定服务端是否支持 WebSocket 协议 因此 WebSocket 协议的第一步是进行握手 WebSocket 握手采用 HTTP Upgrade 机制 客户端可以发
  • gpio子系统在sysfs中构建leds类

    1 内核配置 CONFIG GPIO SYSFS y CONFIG GPIOLIB y 1 CONFIG GPIO SYSFS 决定sysfs是否支持gpio子系统 也就是能否在 sys class 目录下看到gpio类 2 CONFIG