编写驱动程序:
1 #include
2 #include
3 #include
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
2 #include
3 #include
4 #include
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目录下看到。
手机扫一扫
移动阅读更方便
你可能感兴趣的文章