日期:2014-05-16  浏览次数:20709 次

在linux系统的fsysfs中创建总线,以及为总线增加设备和驱动
注册总线三步曲:
  1. 注册总线
bus_register(&my_bus_type);
  1. 创建属性文件
bus_create_file(&my_bus_type, &bus_attr_version);
  1. 注册总线设备
device_register(&my_bus);
总线由struct bus_type结构来表示,如第一步的my_bus_type, 定义在<linux/device.h>中
该结构管理着总线的名字,总线设备匹配,总线内设备的热插拔等事情,如
struct bus_type my_bus_type = {
.name = "my_bus",
.match = my_match,
.hotplug = my_hotplug,
};
总线的名字就是显示在/sys/bus/目录下的名字,如上面的my_bus。当总线上有新设备或新驱动被添加时,会一次或多次调用match函数。 在为用户空间产生热插拔事件前,可以通过hotplug函数添加环境变量,这个工作不是必要的。
总线属性由 struct bus_attribute结构来描述,在代码中使用
#define BUS_ATTR(_name, _mode, _show, _store)
来创建和初始化。
struct bus_attribute {
struct attribute attr;
ssize_t (*show)(struct bus_type *bus, char *buf);
ssize_t (*store)(struct bus_type *bus, const char *buf, size_t count);
};
比如要在my_bus目录下定义一个属性文件version,代表bus的版本,则可以这样写:
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);
if (bus_create_file(&my_bus_type, &bus_attr_version))
printk(KERN_NOTICE "Fail to create version attribute!\n");
每一个总线本身也是一个设备,所以也需要注册总线设备,在linux2.6.32及以后的内核中,总线设备的名字由init_name来表示,以及dev_nam