13、注册一个自己的总线实验 *
一、总线注册 API 函数
我们进入开发板的/sys/bus 目录下, /sys/bus 是 Linux 系统中的一个目录, 用于表示总线(bus) 子系统的根目录。 如果我们自己注册一个总线, 会在此目录下显示。
- bus_register 是一个向 Linux 内核添加自定义总线类型的函数。
函数形式:
C
int bus_register(struct bus_type *bus);
1
参数 bus 是指向总线类型结构体的指针,用来指定要注册的总线。函数返回 0 表示注册成功,负数表示失败。
- bus_unregister 是用来取消已注册总线的函数。
函数形式:
C
void bus_unregister(struct bus_type *bus);
1
参数同样传入总线类型结构体的指针,用于撤销之前通过 bus_register 注册的总线。
二、实验程序
我们编写驱动代码, 驱动中定义了一个名为 "mybus" 的自定义总线, 并指定了该总线的匹配回调函数 mybus_match 和探测回调函数 mybus_probe。
C
#include <linux/module.h>
#include <linux/init.h>
#include <linux/slab.h>
#include <linux/configfs.h>
#include <linux/kernel.h>
#include <linux/kobject.h>
#include <linux/device.h>
int mybus_match(struct device *dev, struct device_driver *drv)
{
return (strcmp(dev_name(dev), drv->name) == 0);
};
int mybus_probe(struct device *dev)
{
struct device_driver *drv = dev->driver;
if (drv->probe)
drv->probe(dev);
return 0;
};
struct bus_type mybus = {
.name = "mybus",
.match = mybus_match,
.probe = mybus_probe,
};
// 模块的初始化函数
static int bus_init(void)
{
int ret;
ret = bus_register(&mybus);
return 0;
}
// 模块退出函数
static void bus_exit(void)
{
bus_unregister(&mybus);
}
module_init(bus_init); // 指定模块的初始化函数
module_exit(bus_exit); // 指定模块的退出函数
MODULE_LICENSE("GPL"); // 模块使用的许可证
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45