当前位置: 移动技术网 > 网络运营>服务器>Linux > linux总线设备驱动模型——总线bus_basic

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

2020年08月14日  | 移动技术网网络运营  | 我要评论
设备元素模型总线驱动设备总线总线是处理器和设备之间的通道,在设备模型中,所有的设备都通过总线相连,甚至是内部的虚拟总线platform。在设备模型中,总线由bus_type结构表示,定义在<linux/device.h>中。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目录下看到

在这里插入图片描述

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的问题请点击

在这里插入图片描述

运行结果

在这里插入图片描述
查看sys/bus/目录

在这里插入图片描述

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

如您对本文有疑问或者有任何想说的,请 点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网