关于DragonOS设备及驱动注册规范
关于DragonOS设备及驱动注册规范
设备驱动注册函数/设备注册函数
device_driver_init()
- Driver结构体创建;(new())
- 平台设备驱动管理注册。(platform_driver_manager().register()) ` device_init()` device实现逻辑
调用设备管理方法信息设备的默认初始化 device_manager().device_default_initialize(&(device.clone() as Arc<dyn Device>));
调用平台设备管理方法进行平台设备的登记
1
2
3
4
5
platform_device_manager()
.device_add(device.clone() as Arc<dyn PlatformDevice>)
.expect("vesa_fb_device_init: platform_device_manager().device_add failed");
使用什么设备来帮助自己的实现,就要调用相对应的设备注册函数来注册
任何一个设备都包括设备本身和设备驱动
设备Device
设备结构体组成
1
2
3
4
5
6
7
8
9
10
11
12
13
- inner:SpinLock<InnerDevice>内部结构(设备实现逻辑)
- kobj_state: LockedKObjectStated #### InnerDevice结构体的主要成员
- bus;
- class
- driver
- kern_inode
- parent
- kset
- kobj_type
- device_state
- pdev_id
- pdev_id_auto
- 其他相关的成员 #### 为Device实现接口 PlatFormDevice ```rust fn pdev_name(&self) -> &str {
Self::NAME
}
fn set_pdev_id(&self, id: i32) {
self.inner.lock().pdev_id = id;
}
fn set_pdev_id_auto(&self, id_auto: bool) {
self.inner.lock().pdev_id_auto = id_auto;
}
fn is_initialized(&self) -> bool {
self.inner.lock().device_state == DeviceState::Initialized
}
fn set_state(&self, set_state: DeviceState) {
self.inner.lock().device_state = set_state;
}
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#### 为Device实现Device接口
```rust
fn dev_type(&self) -> DeviceType {
DeviceType::Char
}
fn id_table(&self) -> IdTable {
IdTable::new(self.name(), None)
}
fn bus(&self) -> Option<Weak<dyn Bus>> {
self.inner.lock().bus.clone()
}
fn set_bus(&self, bus: Option<Weak<dyn Bus>>) {
self.inner.lock().bus = bus;
}
fn set_class(&self, class: Option<Weak<dyn Class>>) {
self.inner.lock().class = class;
}
fn class(&self) -> Option<Arc<dyn Class>> {
let mut guard = self.inner.lock();
let r = guard.class.clone()?.upgrade();
if r.is_none() {
// 为了让弱引用失效
guard.class = None;
}
return r;
}
fn driver(&self) -> Option<Arc<dyn Driver>> {
self.inner.lock().driver.clone()?.upgrade()
}
fn set_driver(&self, driver: Option<Weak<dyn Driver>>) {
self.inner.lock().driver = driver;
}
fn is_dead(&self) -> bool {
false
}
fn can_match(&self) -> bool {
true
}
fn set_can_match(&self, _can_match: bool) {}
fn state_synced(&self) -> bool {
true
}
为Device实现KObject接口
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
fn as_any_ref(&self) -> &dyn core::any::Any {
self
}
fn set_inode(&self, inode: Option<Arc<KernFSInode>>) {
self.inner.lock().kern_inode = inode;
}
fn inode(&self) -> Option<Arc<KernFSInode>> {
self.inner.lock().kern_inode.clone()
}
fn parent(&self) -> Option<Weak<dyn KObject>> {
self.inner.lock().parent.clone()
}
fn set_parent(&self, parent: Option<Weak<dyn KObject>>) {
self.inner.lock().parent = parent;
}
fn kset(&self) -> Option<Arc<KSet>> {
self.inner.lock().kset.clone()
}
fn set_kset(&self, kset: Option<Arc<KSet>>) {
self.inner.lock().kset = kset;
}
fn kobj_type(&self) -> Option<&'static dyn KObjType> {
self.inner.lock().kobj_type
}
fn set_kobj_type(&self, ktype: Option<&'static dyn KObjType>) {
self.inner.lock().kobj_type = ktype;
}
fn name(&self) -> String {
Self::NAME.to_string()
}
fn set_name(&self, _name: String) {
// do nothing
}
fn kobj_state(&self) -> RwLockReadGuard<KObjectState> {
self.kobj_state.read()
}
fn kobj_state_mut(&self) -> RwLockWriteGuard<KObjectState> {
self.kobj_state.write()
}
fn set_kobj_state(&self, state: KObjectState) {
*self.kobj_state.write() = state;
}
为Device实现自己的需求的接口
略
设备驱动程序
Driver结构体
1
2
- inner: InnerDriver
- kobj_state: LockedKObjectState
结构体方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
- new()和设备一样初始化inner和kobj_state
- inner:
- ktype: Option<&'static dyn KObjType>,
- kset: Option<Arc<KSet>>,
- parent: Option<Weak<dyn KObject>>,
- kernfs_inode: Option<Arc<KernFSInode>>,
- devices: Vec<Arc<dyn Device>>,
- bus: Option<Weak<dyn Bus>>,
- self_ref: Weak<VesaFbDriver>, #### 实现PlatformDriver接口
实现Driver接口
实现KObject接口
接口的实现可以参考上面的Device
This post is licensed under CC BY 4.0 by the author.