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

设备元素模型

  • 总线
  • 驱动
  • 设备
总线

总线是处理器和设备之间的通道,在设备模型中,所有的设备都通过总线相连,甚至是内部的虚拟总线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/目录

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值