编写驱动程序:

 1 #include <linux/init.h>
 2 #include <linux/module.h>
 3 #include <linux/device.h>
 4 
 5 struct bus_type my_bus = {
 6     .name = "my_bus",
 7 };
 8 
 9 static int __init my_bus_init (void)
10 {
11     int ret;
12     
13     ret = bus_register(&my_bus);    //注册一条总线
14     if (ret != 0) {
15         return ret;
16     }
17     
18     return 0;
19 }
20 
21 static void __exit my_bus_exit (void)
22 {
23     bus_unregister(&my_bus);
24 }
25 
26 module_init(my_bus_init);
27 module_exit(my_bus_exit);
28 
29 MODULE_LICENSE("GPL");

这个程序很简单,只是在初始化的时候加载了一条总线,该总线的名字为“my_bus”,用insmod加载之后可以在/sys/bus目录下看到一个叫my_bus的目录,如下图:

 

进到my_bus目录之后用ls -l命令,可以看到devices和drivers是两个目录,但是这两个目录都是空的,因为这条总线上没有任何设备和驱动,drivers_autoprobe、drivers_probe、uevent应该是三个默认的总线方法。

 

 如果将程序进行一定修改:

 1 #include <linux/init.h>
 2 #include <linux/module.h>
 3 #include <linux/device.h>
 4 #include <linux/string.h>
 5 
 6 struct bus_type my_bus = {
 7     .name = "my_bus",
 8 };
 9 
10 //用于得到属性
11 char Version[] = "my bus version 1.0";
12 ssize_t show_version(struct bus_type *bus, char *buf)
13 {
14     return snprintf(buf, PAGE_SIZE, "%s", Version);
15 }
16 
17 BUS_ATTR(version, S_IRUGO, show_version, NULL);
18 
19 static int __init my_bus_init (void)
20 {
21     int ret;
22     
23     ret = bus_register(&my_bus);    //注册一条总线
24     if (ret != 0) {
25         return ret;
26     }
27     
28     if (bus_create_file(&my_bus, &bus_attr_version)) {    //给一个bus创建一个属性
29         printk("fail to create my bus file");
30     }
31     return 0;
32 }
33 
34 static void __exit my_bus_exit (void)
35 {
36     bus_unregister(&my_bus);
37 }
38 
39 module_init(my_bus_init);
40 module_exit(my_bus_exit);
41 
42 MODULE_LICENSE("GPL");

这时因为给bus创建了一个名为version的属性,因此在my_bus目录下可以看到一个叫version的文件,如下图:

 

 打印该文件可以看到写入的version值:

 可以创建多个属性,创建的属性都可以在my_bus目录下看到。