xref: /DragonOS/kernel/src/driver/base/device/init.rs (revision 06d5e247267cb65b84a80f219853ccd0f384b16e)
1 use alloc::{string::ToString, sync::Arc};
2 
3 use crate::{
4     driver::{
5         base::{
6             device::{
7                 sys_dev_kset, DeviceManager, DEVICES_KSET_INSTANCE, DEVICE_MANAGER,
8                 DEV_KSET_INSTANCE,
9             },
10             kobject::KObject,
11             kset::KSet,
12         },
13         uart::uart_device::uart_init,
14     },
15     kdebug, kinfo,
16     syscall::SystemError,
17 };
18 
19 pub fn device_init() -> Result<(), SystemError> {
20     uart_init()?;
21     kinfo!("device init success");
22     return Ok(());
23 }
24 
25 pub fn devices_init() -> Result<(), SystemError> {
26     // 创建 `/sys/devices` 目录
27     {
28         let devices_kset = KSet::new("devices".to_string());
29         devices_kset
30             .register(None)
31             .expect("register devices kset failed");
32 
33         unsafe {
34             DEVICES_KSET_INSTANCE = Some(devices_kset);
35             // 初始化全局设备管理器
36             DEVICE_MANAGER = Some(DeviceManager::new());
37         }
38     }
39 
40     // 创建 `/sys/dev` 目录
41     {
42         let dev_kset = KSet::new("dev".to_string());
43         dev_kset.register(None).expect("register dev kset failed");
44         unsafe {
45             DEV_KSET_INSTANCE = Some(dev_kset);
46         }
47     }
48 
49     // 创建 `/sys/dev/block` 目录
50     {
51         kdebug!("create /sys/dev/block");
52         let dev_kset = sys_dev_kset();
53         let dev_block_kset = KSet::new("block".to_string());
54         let parent = dev_kset.clone() as Arc<dyn KObject>;
55         dev_block_kset.set_parent(Some(Arc::downgrade(&parent)));
56 
57         dev_block_kset
58             .register(Some(dev_kset))
59             .expect("register dev block kset failed");
60     }
61 
62     // 创建 `/sys/dev/char` 目录
63     {
64         kdebug!("create /sys/dev/char");
65         let dev_kset = sys_dev_kset();
66         let dev_char_kset = KSet::new("char".to_string());
67         let parent = dev_kset.clone() as Arc<dyn KObject>;
68         dev_char_kset.set_parent(Some(Arc::downgrade(&parent)));
69 
70         dev_char_kset
71             .register(Some(dev_kset))
72             .expect("register dev char kset failed");
73     }
74 
75     kinfo!("devices init success");
76     device_init()?;
77     return Ok(());
78 }
79