xref: /DragonOS/kernel/src/driver/base/device/init.rs (revision a03c4f9dee5705207325c56629c0ccd219168f10)
106d5e247SLoGin use alloc::{string::ToString, sync::Arc};
2b087521eSChiichen 
306d5e247SLoGin use crate::{
4*a03c4f9dSLoGin     driver::base::{
506d5e247SLoGin         device::{
6*a03c4f9dSLoGin             sys_dev_kset, DeviceManager, DEVICES_KSET_INSTANCE, DEVICE_MANAGER, DEV_KSET_INSTANCE,
706d5e247SLoGin         },
806d5e247SLoGin         kobject::KObject,
906d5e247SLoGin         kset::KSet,
1006d5e247SLoGin     },
1106d5e247SLoGin     kdebug, kinfo,
1206d5e247SLoGin     syscall::SystemError,
1306d5e247SLoGin };
14b087521eSChiichen 
1506d5e247SLoGin pub fn devices_init() -> Result<(), SystemError> {
1606d5e247SLoGin     // 创建 `/sys/devices` 目录
1706d5e247SLoGin     {
1806d5e247SLoGin         let devices_kset = KSet::new("devices".to_string());
1906d5e247SLoGin         devices_kset
2006d5e247SLoGin             .register(None)
2106d5e247SLoGin             .expect("register devices kset failed");
2206d5e247SLoGin 
2306d5e247SLoGin         unsafe {
2406d5e247SLoGin             DEVICES_KSET_INSTANCE = Some(devices_kset);
2506d5e247SLoGin             // 初始化全局设备管理器
2606d5e247SLoGin             DEVICE_MANAGER = Some(DeviceManager::new());
2706d5e247SLoGin         }
2806d5e247SLoGin     }
2906d5e247SLoGin 
3006d5e247SLoGin     // 创建 `/sys/dev` 目录
3106d5e247SLoGin     {
3206d5e247SLoGin         let dev_kset = KSet::new("dev".to_string());
3306d5e247SLoGin         dev_kset.register(None).expect("register dev kset failed");
3406d5e247SLoGin         unsafe {
3506d5e247SLoGin             DEV_KSET_INSTANCE = Some(dev_kset);
3606d5e247SLoGin         }
3706d5e247SLoGin     }
3806d5e247SLoGin 
3906d5e247SLoGin     // 创建 `/sys/dev/block` 目录
4006d5e247SLoGin     {
4106d5e247SLoGin         kdebug!("create /sys/dev/block");
4206d5e247SLoGin         let dev_kset = sys_dev_kset();
4306d5e247SLoGin         let dev_block_kset = KSet::new("block".to_string());
4406d5e247SLoGin         let parent = dev_kset.clone() as Arc<dyn KObject>;
4506d5e247SLoGin         dev_block_kset.set_parent(Some(Arc::downgrade(&parent)));
4606d5e247SLoGin 
4706d5e247SLoGin         dev_block_kset
4806d5e247SLoGin             .register(Some(dev_kset))
4906d5e247SLoGin             .expect("register dev block kset failed");
5006d5e247SLoGin     }
5106d5e247SLoGin 
5206d5e247SLoGin     // 创建 `/sys/dev/char` 目录
5306d5e247SLoGin     {
5406d5e247SLoGin         kdebug!("create /sys/dev/char");
5506d5e247SLoGin         let dev_kset = sys_dev_kset();
5606d5e247SLoGin         let dev_char_kset = KSet::new("char".to_string());
5706d5e247SLoGin         let parent = dev_kset.clone() as Arc<dyn KObject>;
5806d5e247SLoGin         dev_char_kset.set_parent(Some(Arc::downgrade(&parent)));
5906d5e247SLoGin 
6006d5e247SLoGin         dev_char_kset
6106d5e247SLoGin             .register(Some(dev_kset))
6206d5e247SLoGin             .expect("register dev char kset failed");
6306d5e247SLoGin     }
6406d5e247SLoGin 
6506d5e247SLoGin     kinfo!("devices init success");
66*a03c4f9dSLoGin 
6706d5e247SLoGin     return Ok(());
6806d5e247SLoGin }
69