总线:是处理器和设备之间的通道,在设备模型中,所有的设备都通过总线相连,甚至是内部虚拟的“platform”总线。。。。要使用到的头文件<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 subsys_private *p;
};
总线的使用方法:
1、首先要注册 总线 使用的函数是---::
bus_register(struct bus_type *bus);
若成功,则将总线添加到系统中去,并可以在/sys/bus下看到
总线删除函数
bus_unregister(struct bus_type *bus);
2、创建bus属性--在属性中包含了 读取调用的函数和 写操作是调用的函数
总线属性描述结构体
struct bus_attribute {
struct attributeattr;
ssize_t (*show)(struct bus_type *bus, char *buf);
ssize_t (*store)(struct bus_type *bus, const char *buf, size_t count);
};
创建bus属性的函数
bus_create_file(struct bus_type *,struct bus_attribute *);
在创建属性文件的时候要用到 的宏定义
struct bus_attribute {
struct attributeattr;
ssize_t (*show)(struct bus_type *bus, char *buf);
ssize_t (*store)(struct bus_type *bus, const char *buf, size_t count);
};
#define BUS_ATTR(_name, _mode, _show, _store) \
struct bus_attribute bus_attr_##_name = __ATTR(_name, _mode, _show, _store);//注意函数的名字是bus_attr_##_name
删除属性的函数:::
bus_remove_file(struct bus_type *, struct bus_attribute *);
稍后贴代码::::::
#include <linux/device.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/string.h>
MODULE_AUTHOR("David Xie");
MODULE_LICENSE("Dual BSD/GPL");
static char *Version = "$Revision: 1.0 $";
static int my_match(struct device *dev, struct device_driver *driver)
{
return !strncmp(dev->bus_id, 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 __init 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 version attribute!\n");
return ret;
}
static void my_bus_exit(void)
{
bus_unregister(&my_bus_type);
}
module_init(my_bus_init);
module_exit(my_bus_exit);