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