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类 的相关文章

随机推荐

  • 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