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