编写驱动程序:
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目录下看到。