4.平台设备+class内创建sysfs的节点+简单的dts调用

本文详细解析了平台设备驱动的构建过程,包括使用设备树(DTS)描述设备信息和创建class进行系统管理。通过实例讲解了如何在5.1内核中创建class和驱动,以及如何通过DTS获取设备属性如ADB值。

前言:其实通常驱动都只是修修改改,很少需要重零开始一个个字母敲的。但是,我总觉得不重新敲,心里对学习驱动框架很不踏实。像是平台设备,有多少新手不懂为啥写成这样呢。可能吧,我比较菜。以前平台设备,设备树,sysfs经常改,但都是我心里不清楚逻辑的。经过一段时间的研究终于大概清楚了。

目录

1.平台设备

2.例子(用设备树的)

接下来,我开始分解:

2.1 class的创建字段

效果图:

2.2 DTS获取部分


1.平台设备

平台设备就和其他总线一样,比如i2c总线。只是平台设备的总线是 人为注册 的。作用就是分开 设备 和 驱动 。体现一个 机制 与 策略 分离。

组成:

虚拟的总线platform_bus_type:这个我们一般不用管,用kernel的 bus 框架创造的。

设备device: 用了给设备的描述信息。比如引脚口,触发方式等等。但是随着设备牌子种类越来越多,那么就有很多if语句去判断设备信息。这个东西很多时候被dts取代了。在后面内核会发现有 驱动 无对应匹配的 驱动 情况。那么就是把设备的描述信息在设备树写着。

驱动driver:在设备或者设备树给了描述信息后,写驱动给设备的机制。

ps1:平台设备是个框架,这个三个组成部分一者占一个c文件。总线我们不用管。我们填充好 驱动 和 设备 就行了。在有设备树的情况下,填充 驱动 与 dts 。

ps2:写了框架不代表 传统意义上的驱动创建好。比如sysfs的class,/dev/这些东西还得在driver文件里面写好。应该继续写 字符设备 或者 复杂设备 ,创建class节点

2.例子(用设备树的)

/*
kernel 5.1
*/

#include<linux/platform_device.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/sysfs.h>

static int class_test = 0;

static ssize_t class_test_show(struct class *class, struct class_attribute *attr, char *buf)
{
	return (sprintf(buf, "%u\n", class_test));
}

static ssize_t class_test_store(struct class *class, struct class_attribute *attr, const char *buf, size_t len)
{
	int rc;
	rc = kstrtouint(buf, 0, &class_test);
	if (rc < 0)
		pr_err("get class_test value failed!\n");
	return len;
}

static struct class_attribute class_test_add = 
    __ATTR(class_test, 0664, class_test_show, class_test_store);

static struct attribute *Odin_fan_class_attrs[] = {
	&class_test_add.attr,
	NULL,
};

ATTRIBUTE_GROUPS(Odin_fan_class);  
//先创造 Odin_fan_class_groups ,里面再包含 Odin_fan_class_attrs

static struct class Odin_fan_class = {
    .name = "Odin_pi_fan",
    .owner = THIS_MODULE,
    .class_groups = Odin
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值