106d5e247SLoGin use alloc::{string::ToString, sync::Arc};
2*2eab6dd7S曾俊 use log::info;
3b087521eSChiichen
4*2eab6dd7S曾俊 use crate::driver::base::{
506d5e247SLoGin device::{
6*2eab6dd7S曾俊 set_sys_dev_block_kset, set_sys_dev_char_kset, set_sys_devices_virtual_kset, sys_dev_kset,
7*2eab6dd7S曾俊 sys_devices_kset, DeviceManager, DEVICES_KSET_INSTANCE, DEVICE_MANAGER, DEV_KSET_INSTANCE,
806d5e247SLoGin },
906d5e247SLoGin kobject::KObject,
1006d5e247SLoGin kset::KSet,
1106d5e247SLoGin };
12b087521eSChiichen
1391e9d4abSLoGin use system_error::SystemError;
1491e9d4abSLoGin
devices_init() -> Result<(), SystemError>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
3008a2ee40SLoGin // 创建 `/sys/devices/virtual` 目录
3108a2ee40SLoGin {
3208a2ee40SLoGin let devices_kset = sys_devices_kset();
3308a2ee40SLoGin let virtual_kset = KSet::new("virtual".to_string());
3408a2ee40SLoGin let parent = devices_kset.clone() as Arc<dyn KObject>;
3508a2ee40SLoGin virtual_kset.set_parent(Some(Arc::downgrade(&parent)));
3608a2ee40SLoGin
3708a2ee40SLoGin virtual_kset
3808a2ee40SLoGin .register(Some(devices_kset))
3908a2ee40SLoGin .expect("register virtual kset failed");
4008a2ee40SLoGin unsafe { set_sys_devices_virtual_kset(virtual_kset) };
4108a2ee40SLoGin }
4208a2ee40SLoGin
4306d5e247SLoGin // 创建 `/sys/dev` 目录
4406d5e247SLoGin {
4506d5e247SLoGin let dev_kset = KSet::new("dev".to_string());
4606d5e247SLoGin dev_kset.register(None).expect("register dev kset failed");
4706d5e247SLoGin unsafe {
4806d5e247SLoGin DEV_KSET_INSTANCE = Some(dev_kset);
4906d5e247SLoGin }
5006d5e247SLoGin }
5106d5e247SLoGin
5206d5e247SLoGin // 创建 `/sys/dev/block` 目录
5306d5e247SLoGin {
54*2eab6dd7S曾俊 // debug!("create /sys/dev/block");
5506d5e247SLoGin let dev_kset = sys_dev_kset();
5606d5e247SLoGin let dev_block_kset = KSet::new("block".to_string());
5706d5e247SLoGin let parent = dev_kset.clone() as Arc<dyn KObject>;
5806d5e247SLoGin dev_block_kset.set_parent(Some(Arc::downgrade(&parent)));
5906d5e247SLoGin
6006d5e247SLoGin dev_block_kset
6106d5e247SLoGin .register(Some(dev_kset))
6206d5e247SLoGin .expect("register dev block kset failed");
6308a2ee40SLoGin
6408a2ee40SLoGin unsafe { set_sys_dev_block_kset(dev_block_kset) };
6506d5e247SLoGin }
6606d5e247SLoGin
6706d5e247SLoGin // 创建 `/sys/dev/char` 目录
6806d5e247SLoGin {
69*2eab6dd7S曾俊 // debug!("create /sys/dev/char");
7006d5e247SLoGin let dev_kset = sys_dev_kset();
7106d5e247SLoGin let dev_char_kset = KSet::new("char".to_string());
7206d5e247SLoGin let parent = dev_kset.clone() as Arc<dyn KObject>;
7306d5e247SLoGin dev_char_kset.set_parent(Some(Arc::downgrade(&parent)));
7406d5e247SLoGin
7506d5e247SLoGin dev_char_kset
7606d5e247SLoGin .register(Some(dev_kset))
7706d5e247SLoGin .expect("register dev char kset failed");
7808a2ee40SLoGin
7908a2ee40SLoGin unsafe { set_sys_dev_char_kset(dev_char_kset) };
8006d5e247SLoGin }
8106d5e247SLoGin
82*2eab6dd7S曾俊 info!("devices init success");
83a03c4f9dSLoGin
8406d5e247SLoGin return Ok(());
8506d5e247SLoGin }
86