linux总线设备驱动模型——总线bus_basic
程序员文章站
2022-07-06 13:38:50
设备元素模型总线驱动设备总线总线是处理器和设备之间的通道,在设备模型中,所有的设备都通过总线相连,甚至是内部的虚拟总线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
目录下看到
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
上一篇: MySQL 如何连接对应的客户端进程
下一篇: MySQL(二)select检索数据