Post

关于DragonOS设备及驱动注册规范

关于DragonOS设备及驱动注册规范

设备驱动注册函数/设备注册函数

device_driver_init()

  1. Driver结构体创建;(new())
  2. 平台设备驱动管理注册。(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.