欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  网络运营

linux总线设备驱动模型——总线bus_basic

程序员文章站 2022-04-14 11:23:09
设备元素模型总线驱动设备总线总线是处理器和设备之间的通道,在设备模型中,所有的设备都通过总线相连,甚至是内部的虚拟总线platform。在设备模型中,总线由bus_type结构表示,定义在中。struct bus_type {const char*name;//总线名字struct bus_attribute*bus_attrs;//总线属性struct device_attribute*dev_attrs...

设备元素模型

  • 总线
  • 驱动
  • 设备

总线

总线是处理器和设备之间的通道,在设备模型中,所有的设备都通过总线相连,甚至是内部的虚拟总线platform。在设备模型中,总线由bus_type结构表示,定义在<linux/device.h>中。

struct bus_type {
	const char		*name;							//总线名字
	struct bus_attribute	*bus_attrs;				//总线属性
	struct device_attribute	*dev_attrs;				//设备属性
	struct driver_attribute	*drv_attrs;				//驱动属性
	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 (*suspend)(struct device *dev, pm_message_t state);
	int (*resume)(struct device *dev);
	const struct dev_pm_ops *pm;
	struct bus_type_private *p;
};

总线的注册/删除

  • 总线的注册使用:若成功,新的总线将被添加进系统,并在sysfs文件系统的/sys/bus目录下看到

linux总线设备驱动模型——总线bus_basic

bus_register(struct bus_type *bus)

  • 总线的删除使用
void bus_unregister(struct bus_type *bus)

总线方法

  • 当一个新设备或者驱动被添加到总线时,该方法被调用。
  • 用于判断制定的驱动程序是否能处理指定的设备,若可以,返回非零值。
int (*match)(struct device *dev,struct device_driver *drv)

  • 在为用户空间产生热插拔事件之前,这个方法允许总线添加环境变量
int (*uevent)(struct device *dev,char *envp,int num_envp,char *buffer,int buffer_size)

总线属性

  • 总线属性由结构bus_attribute描述。
struct bus_attribute{
	struct attribute attr;
	ssize_t (*show)(struct bus_type *,char *buf);
	ssize_t (*store)(struct bus_type *,const char *buf,size_t count);
};
  • 创建属性
int bus_create_file(struct bus_type *bus,struct bus_attribute *attr)
  • 删除属性
void bus_remove_file(struct bus_type *bus,struct bus_attribute *attr)

bus_basic源码!!!!!!

#include <linux/device.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/string.h>


static char *Version = "$Revision: 1.0 $";

static int my_match(struct device *dev,struct device_driver *driver){
	return !strncmp(dev_name(dev),driver->name,strlen(driver->name));
}

struct bus_type my_bus_type = {
	.name = "my_bus",
	.match = my_match
};

static ssize_t show_bus_version(struct bus_type *bus,char *buf){
	return snprintf(buf,PAGE_SIZE,"%s\n",Version);
}

static BUS_ATTR(version,S_IRUGO,show_bus_version,NULL);

static int my_bus_init(void){
	int ret;
	//注册总线
	ret = bus_register(&my_bus_type);
	if(ret)
		return ret;
	
	//创建属性文件
	if(bus_create_file(&my_bus_type,&bus_attr_version))
		printk(KERN_NOTICE "fail to create bus_attr_version");
	
	return ret;
}

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



MODULE_LICENSE("GPL");
module_init(my_bus_init);
module_exit(my_bus_exit);


关于2.6.32内核bus_id的问题请点击

linux总线设备驱动模型——总线bus_basic

运行结果

linux总线设备驱动模型——总线bus_basic
查看sys/bus/目录

linux总线设备驱动模型——总线bus_basic

本文地址:https://blog.csdn.net/Bruce_4/article/details/107952797