注册自定义总线

1、在/sys/bus下注册一个自定义总线

#include<linux/module.h>
#include<linux/init.h>
#include<linux/kernel.h>
#include<linux/kobject.h>
#include<linux/slab.h>
#include<linux/sysfs.h>
#include<linux/device.h>
#include "my_bus.h"

#if 0
struct bus_type {
	const char		*name;
	const char		*dev_name;
	struct device		*dev_root;
	struct device_attribute	*dev_attrs;	/* use dev_groups instead */
	const struct attribute_group **bus_groups;
	const struct attribute_group **dev_groups;
	const struct attribute_group **drv_groups;

	int (*match)(struct device *dev, struct device_driver *drv);
	int (*uevent)(struct device *dev, struct kobj_uevent_env *env);
	int (*probe)(struct device *dev);
	int (*remove)(struct device *dev);
	void (*shutdown)(struct device *dev);

	int (*online)(struct device *dev);
	int (*offline)(struct device *dev);

	int (*suspend)(struct device *dev, pm_message_t state);
	int (*resume)(struct device *dev);

	const struct dev_pm_ops *pm;

	const struct iommu_ops *iommu_ops;

	struct subsys_private *p;
	struct lock_class_key lock_key;
};
int bus_register(struct bus_type *bus)
#endif

struct bus_type my_bus = {
	.name = "my_bus",
	.match = my_bus_match,
	.probe = my_bus_probe,
};

int my_bus_match(struct device *dev, struct device_driver *drv)
{
	
	return (strcmp(dev_name(dev),drv->name) == 0);
}

int my_bus_probe(struct device *dev)
{
	struct device_driver *drv = dev->driver;
	if(drv->probe)
		drv->probe(dev);
	return 0;
}

static int my_bus_init(void)
{
     int ret;
	ret = bus_register(&my_bus);
	
     return ret;
}

static void my_bus_exit(void)
{
     bus_unregister(&my_bus);
}

module_init(my_bus_init);
module_exit(my_bus_exit);
MODULE_LICENSE("GPL");
//my_bus.h
#ifndef _ATTR_H_
#define _ATTR_H_

int my_bus_match(struct device *dev, struct device_driver *drv);
int my_bus_probe(struct device *dev);

#endif

在这里插入图片描述

2、在总线目录下创建自己的属性文件

#include<linux/module.h>
#include<linux/init.h>
#include<linux/kernel.h>
#include<linux/kobject.h>
#include<linux/slab.h>
#include<linux/sysfs.h>
#include<linux/device.h>
#include "my_bus.h"

#if 0
struct bus_type {
	const char		*name;
	const char		*dev_name;
	struct device		*dev_root;
	struct device_attribute	*dev_attrs;	/* use dev_groups instead */
	const struct attribute_group **bus_groups;
	const struct attribute_group **dev_groups;
	const struct attribute_group **drv_groups;

	int (*match)(struct device *dev, struct device_driver *drv);
	int (*uevent)(struct device *dev, struct kobj_uevent_env *env);
	int (*probe)(struct device *dev);
	int (*remove)(struct device *dev);
	void (*shutdown)(struct device *dev);

	int (*online)(struct device *dev);
	int (*offline)(struct device *dev);

	int (*suspend)(struct device *dev, pm_message_t state);
	int (*resume)(struct device *dev);

	const struct dev_pm_ops *pm;

	const struct iommu_ops *iommu_ops;

	struct subsys_private *p;
	struct lock_class_key lock_key;
};
int bus_register(struct bus_type *bus)
static struct bus_attribute bus_attr_uevent = __ATTR(uevent, S_IWUSR, NULL,
						     bus_uevent_store);

int bus_create_file(struct bus_type *bus, struct bus_attribute *attr)

struct bus_attribute {
	struct attribute	attr;
	ssize_t (*show)(struct bus_type *bus, char *buf);
	ssize_t (*store)(struct bus_type *bus, const char *buf, size_t count);
};
void bus_remove_file(struct bus_type *bus, struct bus_attribute *attr)
#endif

struct bus_type my_bus = {
	.name = "my_bus",
	.match = my_bus_match,
	.probe = my_bus_probe,
};
static struct bus_attribute my_bus_attr = __ATTR(attr1, 0660, my_bus_attr_show,my_bus_attr_store);

ssize_t my_bus_attr_show(struct bus_type *bus, char *buf)
{
	ssize_t ret;
	ret = sprintf(buf,"this is in my_bus_attr_show\n");

	return ret;
}
ssize_t my_bus_attr_store(struct bus_type *bus, const char *buf, size_t count)
{
	printk("my_bus_attr_store:buf = %s\n",buf);
	return count;
}

int my_bus_match(struct device *dev, struct device_driver *drv)
{
	
	return (strcmp(dev_name(dev),drv->name) == 0);
}

int my_bus_probe(struct device *dev)
{
	struct device_driver *drv = dev->driver;
	if(drv->probe)
		drv->probe(dev);
	return 0;
}

static int my_bus_init(void)
{
     int ret;
	ret = bus_register(&my_bus);
	ret = bus_create_file(&my_bus, &my_bus_attr);
	
     return ret;
}

static void my_bus_exit(void)
{
     bus_remove_file(&my_bus, &my_bus_attr);
	bus_unregister(&my_bus);
}

module_init(my_bus_init);
module_exit(my_bus_exit);
MODULE_LICENSE("GPL");
#ifndef _ATTR_H_
#define _ATTR_H_

int my_bus_match(struct device *dev, struct device_driver *drv);
int my_bus_probe(struct device *dev);

ssize_t my_bus_attr_show(struct bus_type *bus, char *buf);
ssize_t my_bus_attr_store(struct bus_type *bus, const char *buf, size_t count);
#endif

在这里插入图片描述

3、一些结构体和api介绍

3.1 struct bus_type

The bus type of the device
在这里插入图片描述

3.2 bus_register

注册一个总线
在这里插入图片描述

3.3 bus_unregister

去除一个总线
在这里插入图片描述

3.4 bus_create_file

总线目录下创建属性文件api
在这里插入图片描述

3.5 struct bus_attribute

在这里插入图片描述

相关推荐

  1. Spring定义注解

    2024-07-13 06:14:04       34 阅读
  2. 定义注解【项目篇】

    2024-07-13 06:14:04       39 阅读
  3. 定义防抖注解

    2024-07-13 06:14:04       31 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-13 06:14:04       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-13 06:14:04       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-13 06:14:04       58 阅读
  4. Python语言-面向对象

    2024-07-13 06:14:04       69 阅读

热门阅读

  1. yarn使用

    2024-07-13 06:14:04       25 阅读
  2. C语言排序之快速排序

    2024-07-13 06:14:04       26 阅读
  3. 基于Go1.19的站点模板爬虫详细介绍

    2024-07-13 06:14:04       23 阅读