os/fs/sysfs/
device_registry.rs

1//! 设备注册表辅助 - 为 sysfs 提供设备信息访问
2//!
3//! 这个模块不创建新的设备注册表,而是为 sysfs 提供访问现有设备注册表的辅助函数。
4
5use alloc::format;
6use alloc::string::{String, ToString};
7use alloc::sync::Arc;
8use alloc::vec::Vec;
9
10use crate::device::block::BlockDriver;
11use crate::device::net::net_device::NetDevice;
12use crate::device::rtc::RtcDriver;
13use crate::device::{BLK_DRIVERS, DRIVERS, DeviceType};
14
15/// 块设备信息 (用于 sysfs)
16#[derive(Clone)]
17pub struct BlockDeviceInfo {
18    pub name: String,
19    pub major: u32,
20    pub minor: u32,
21    pub device: Arc<dyn BlockDriver>,
22}
23
24/// 网络设备信息 (用于 sysfs)
25#[derive(Clone)]
26pub struct NetworkDeviceInfo {
27    pub name: String,
28    pub ifindex: u32,
29    pub device: Arc<dyn NetDevice>,
30}
31
32/// TTY 设备信息 (用于 sysfs)
33#[derive(Clone)]
34pub struct TtyDeviceInfo {
35    pub name: String,
36    pub major: u32,
37    pub minor: u32,
38}
39
40/// 输入设备信息 (用于 sysfs)
41#[derive(Clone)]
42pub struct InputDeviceInfo {
43    pub name: String,
44    pub id: u32,
45}
46
47/// RTC 设备信息 (用于 sysfs)
48#[derive(Clone)]
49pub struct RtcDeviceInfo {
50    pub name: String,
51    pub id: u32,
52    pub device: Arc<dyn RtcDriver>,
53}
54
55/// 列出所有块设备
56pub fn list_block_devices() -> Vec<BlockDeviceInfo> {
57    let drivers = BLK_DRIVERS.read();
58    drivers
59        .iter()
60        .enumerate()
61        .map(|(idx, driver)| {
62            // 生成设备名: vda, vdb, vdc...
63            let name = format!("vd{}", (b'a' + idx as u8) as char);
64            // VirtIO 块设备的主设备号通常是 254
65            let major = 254;
66            let minor = idx as u32;
67
68            BlockDeviceInfo {
69                name,
70                major,
71                minor,
72                device: driver.clone(),
73            }
74        })
75        .collect()
76}
77
78/// 列出所有网络设备
79pub fn list_net_devices() -> Vec<NetworkDeviceInfo> {
80    let drivers = DRIVERS.read();
81    drivers
82        .iter()
83        .filter(|driver| driver.device_type() == DeviceType::Net)
84        .enumerate()
85        .filter_map(|(idx, driver)| {
86            // 使用 as_net_arc 方法安全地获取 Arc<dyn NetDevice>
87            Arc::clone(driver).as_net_arc().map(|net_dev| {
88                NetworkDeviceInfo {
89                    name: net_dev.name().to_string(),
90                    ifindex: (idx + 1) as u32, // ifindex 从 1 开始
91                    device: net_dev,
92                }
93            })
94        })
95        .collect()
96}
97
98/// 根据名称查找块设备
99pub fn find_block_device(name: &str) -> Option<BlockDeviceInfo> {
100    list_block_devices()
101        .into_iter()
102        .find(|dev| dev.name == name)
103}
104
105/// 根据名称查找网络设备
106pub fn find_net_device(name: &str) -> Option<NetworkDeviceInfo> {
107    list_net_devices().into_iter().find(|dev| dev.name == name)
108}
109
110/// 列出所有 TTY 设备
111pub fn list_tty_devices() -> Vec<TtyDeviceInfo> {
112    let drivers = DRIVERS.read();
113    let mut ttys = Vec::new();
114
115    // console (主设备号 5, 次设备号 1)
116    ttys.push(TtyDeviceInfo {
117        name: "console".to_string(),
118        major: 5,
119        minor: 1,
120    });
121
122    // tty0 (主设备号 4, 次设备号 0)
123    ttys.push(TtyDeviceInfo {
124        name: "tty0".to_string(),
125        major: 4,
126        minor: 0,
127    });
128
129    // 串行设备作为 ttyS*
130    let serial_count = drivers
131        .iter()
132        .filter(|driver| driver.device_type() == DeviceType::Serial)
133        .count();
134
135    for idx in 0..serial_count {
136        ttys.push(TtyDeviceInfo {
137            name: format!("ttyS{}", idx),
138            major: 4,
139            minor: (64 + idx) as u32, // ttyS* 从 64 开始
140        });
141    }
142
143    ttys
144}
145
146/// 列出所有输入设备
147pub fn list_input_devices() -> Vec<InputDeviceInfo> {
148    let drivers = DRIVERS.read();
149    drivers
150        .iter()
151        .filter(|driver| driver.device_type() == DeviceType::Input)
152        .enumerate()
153        .map(|(idx, _driver)| InputDeviceInfo {
154            name: format!("input{}", idx),
155            id: idx as u32,
156        })
157        .collect()
158}
159
160/// 列出所有 RTC 设备
161pub fn list_rtc_devices() -> Vec<RtcDeviceInfo> {
162    let drivers = DRIVERS.read();
163    drivers
164        .iter()
165        .filter(|driver| driver.device_type() == DeviceType::Rtc)
166        .enumerate()
167        .filter_map(|(idx, driver)| {
168            // 使用 as_rtc_arc 方法安全地获取 Arc<dyn RtcDriver>
169            Arc::clone(driver)
170                .as_rtc_arc()
171                .map(|rtc_dev| RtcDeviceInfo {
172                    name: format!("rtc{}", idx),
173                    id: idx as u32,
174                    device: rtc_dev,
175                })
176        })
177        .collect()
178}