os/fs/sysfs/
device_registry.rs1use 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#[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#[derive(Clone)]
26pub struct NetworkDeviceInfo {
27 pub name: String,
28 pub ifindex: u32,
29 pub device: Arc<dyn NetDevice>,
30}
31
32#[derive(Clone)]
34pub struct TtyDeviceInfo {
35 pub name: String,
36 pub major: u32,
37 pub minor: u32,
38}
39
40#[derive(Clone)]
42pub struct InputDeviceInfo {
43 pub name: String,
44 pub id: u32,
45}
46
47#[derive(Clone)]
49pub struct RtcDeviceInfo {
50 pub name: String,
51 pub id: u32,
52 pub device: Arc<dyn RtcDriver>,
53}
54
55pub fn list_block_devices() -> Vec<BlockDeviceInfo> {
57 let drivers = BLK_DRIVERS.read();
58 drivers
59 .iter()
60 .enumerate()
61 .map(|(idx, driver)| {
62 let name = format!("vd{}", (b'a' + idx as u8) as char);
64 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
78pub 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 Arc::clone(driver).as_net_arc().map(|net_dev| {
88 NetworkDeviceInfo {
89 name: net_dev.name().to_string(),
90 ifindex: (idx + 1) as u32, device: net_dev,
92 }
93 })
94 })
95 .collect()
96}
97
98pub fn find_block_device(name: &str) -> Option<BlockDeviceInfo> {
100 list_block_devices()
101 .into_iter()
102 .find(|dev| dev.name == name)
103}
104
105pub fn find_net_device(name: &str) -> Option<NetworkDeviceInfo> {
107 list_net_devices().into_iter().find(|dev| dev.name == name)
108}
109
110pub fn list_tty_devices() -> Vec<TtyDeviceInfo> {
112 let drivers = DRIVERS.read();
113 let mut ttys = Vec::new();
114
115 ttys.push(TtyDeviceInfo {
117 name: "console".to_string(),
118 major: 5,
119 minor: 1,
120 });
121
122 ttys.push(TtyDeviceInfo {
124 name: "tty0".to_string(),
125 major: 4,
126 minor: 0,
127 });
128
129 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, });
141 }
142
143 ttys
144}
145
146pub 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
160pub 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 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}