1 use alloc::{collections::BTreeMap, string::String, sync::Arc};
2
3 use crate::{
4 filesystem::{
5 sysfs::{
6 devices::{sys_device_register, sys_device_unregister},
7 SYS_DEVICES_INODE,
8 },
9 vfs::IndexNode,
10 },
11 libs::spinlock::SpinLock,
12 syscall::SystemError,
13 };
14 use core::{any::Any, fmt::Debug};
15
16 pub mod bus;
17 pub mod driver;
18
19 lazy_static! {
20 pub static ref DEVICE_MANAGER: Arc<LockedDeviceManager> = Arc::new(LockedDeviceManager::new());
21 }
22
23 pub trait KObject: Any + Send + Sync + Debug {}
24
25 /// @brief: 设备号实例
26 #[derive(Debug, Clone, Copy, Eq, PartialEq, Ord, PartialOrd)]
27 pub struct DeviceNumber(usize);
28
29 impl Default for DeviceNumber {
default() -> Self30 fn default() -> Self {
31 DeviceNumber(0)
32 }
33 }
34
35 impl From<usize> for DeviceNumber {
from(dev_t: usize) -> Self36 fn from(dev_t: usize) -> Self {
37 DeviceNumber(dev_t)
38 }
39 }
40
41 impl Into<usize> for DeviceNumber {
into(self) -> usize42 fn into(self) -> usize {
43 self.0
44 }
45 }
46
47 impl DeviceNumber {
48 /// @brief: 设备号创建
49 /// @parameter: dev_t: 设备号
50 /// @return: 设备号实例
new(dev_t: usize) -> DeviceNumber51 pub fn new(dev_t: usize) -> DeviceNumber {
52 Self(dev_t)
53 }
54
55 /// @brief: 获取主设备号
56 /// @parameter: none
57 /// @return: 主设备号
major(&self) -> usize58 pub fn major(&self) -> usize {
59 (self.0 >> 20) & 0xfff
60 }
61
62 /// @brief: 获取次设备号
63 /// @parameter: none
64 /// @return: 次设备号
minor(&self) -> usize65 pub fn minor(&self) -> usize {
66 self.0 & 0xfffff
67 }
68 }
69
70 /// @brief: 根据主次设备号创建设备号实例
71 /// @parameter: major: 主设备号
72 /// minor: 次设备号
73 /// @return: 设备号实例
mkdev(major: usize, minor: usize) -> DeviceNumber74 pub fn mkdev(major: usize, minor: usize) -> DeviceNumber {
75 DeviceNumber(((major & 0xfff) << 20) | (minor & 0xfffff))
76 }
77
78 /// @brief: 设备类型
79 #[allow(dead_code)]
80 #[derive(Debug, Eq, PartialEq)]
81 pub enum DeviceType {
82 Bus,
83 Net,
84 Gpu,
85 Input,
86 Block,
87 Rtc,
88 Serial,
89 Intc,
90 PlatformDev,
91 }
92
93 /// @brief: 设备标识符类型
94 #[derive(Debug, Clone, Hash, PartialOrd, PartialEq, Ord, Eq)]
95 pub struct IdTable(&'static str, u32);
96
97 /// @brief: 设备标识符操作方法集
98 impl IdTable {
99 /// @brief: 创建一个新的设备标识符
100 /// @parameter name: 设备名
101 /// @parameter id: 设备id
102 /// @return: 设备标识符
new(name: &'static str, id: u32) -> IdTable103 pub fn new(name: &'static str, id: u32) -> IdTable {
104 Self(name, id)
105 }
106
107 /// @brief: 将设备标识符转换成name
108 /// @parameter None
109 /// @return: 设备名
to_name(&self) -> String110 pub fn to_name(&self) -> String {
111 return format!("{}:{}", self.0, self.1);
112 }
113 }
114
115 /// @brief: 设备当前状态
116 #[derive(Debug, Clone, Copy)]
117 pub enum DeviceState {
118 NotInitialized = 0,
119 Initialized = 1,
120 UnDefined = 2,
121 }
122
123 /// @brief: 设备错误类型
124 #[derive(Debug, Copy, Clone)]
125 pub enum DeviceError {
126 DriverExists, // 设备已存在
127 DeviceExists, // 驱动已存在
128 InitializeFailed, // 初始化错误
129 NoDeviceForDriver, // 没有合适的设备匹配驱动
130 NoDriverForDevice, // 没有合适的驱动匹配设备
131 RegisterError, // 注册失败
132 }
133
134 impl Into<SystemError> for DeviceError {
into(self) -> SystemError135 fn into(self) -> SystemError {
136 match self {
137 DeviceError::DriverExists => SystemError::EEXIST,
138 DeviceError::DeviceExists => SystemError::EEXIST,
139 DeviceError::InitializeFailed => SystemError::EIO,
140 DeviceError::NoDeviceForDriver => SystemError::ENODEV,
141 DeviceError::NoDriverForDevice => SystemError::ENODEV,
142 DeviceError::RegisterError => SystemError::EIO,
143 }
144 }
145 }
146
147 /// @brief: 将u32类型转换为设备状态类型
148 impl From<u32> for DeviceState {
from(state: u32) -> Self149 fn from(state: u32) -> Self {
150 match state {
151 0 => DeviceState::NotInitialized,
152 1 => DeviceState::Initialized,
153 _ => todo!(),
154 }
155 }
156 }
157
158 /// @brief: 将设备状态转换为u32类型
159 impl From<DeviceState> for u32 {
from(state: DeviceState) -> Self160 fn from(state: DeviceState) -> Self {
161 match state {
162 DeviceState::NotInitialized => 0,
163 DeviceState::Initialized => 1,
164 DeviceState::UnDefined => 2,
165 }
166 }
167 }
168
169 /// @brief: 所有设备都应该实现该trait
170 pub trait Device: KObject {
171 /// @brief: 本函数用于实现动态转换
172 /// @parameter: None
173 /// @return: any
as_any_ref(&'static self) -> &'static dyn core::any::Any174 fn as_any_ref(&'static self) -> &'static dyn core::any::Any;
175
176 /// @brief: 获取设备类型
177 /// @parameter: None
178 /// @return: 实现该trait的设备所属类型
dev_type(&self) -> DeviceType179 fn dev_type(&self) -> DeviceType;
180
181 /// @brief: 获取设备标识
182 /// @parameter: None
183 /// @return: 该设备唯一标识
id_table(&self) -> IdTable184 fn id_table(&self) -> IdTable;
185
186 /// @brief: 设置sysfs info
187 /// @parameter: None
188 /// @return: 该设备唯一标识
set_sys_info(&self, sys_info: Option<Arc<dyn IndexNode>>)189 fn set_sys_info(&self, sys_info: Option<Arc<dyn IndexNode>>);
190
191 /// @brief: 获取设备的sys information
192 /// @parameter id_table: 设备标识符,用于唯一标识该设备
193 /// @return: 设备实例
sys_info(&self) -> Option<Arc<dyn IndexNode>>194 fn sys_info(&self) -> Option<Arc<dyn IndexNode>>;
195 }
196
197 /// @brief Device管理器(锁)
198 #[derive(Debug)]
199 pub struct LockedDeviceManager(SpinLock<DeviceManager>);
200
201 impl LockedDeviceManager {
new() -> LockedDeviceManager202 fn new() -> LockedDeviceManager {
203 LockedDeviceManager(SpinLock::new(DeviceManager::new()))
204 }
205
206 /// @brief: 添加设备
207 /// @parameter id_table: 总线标识符,用于唯一标识该总线
208 /// @parameter dev: 设备实例
209 /// @return: None
210 #[inline]
211 #[allow(dead_code)]
add_device(&self, id_table: IdTable, dev: Arc<dyn Device>)212 pub fn add_device(&self, id_table: IdTable, dev: Arc<dyn Device>) {
213 let mut device_manager = self.0.lock();
214 device_manager.devices.insert(id_table, dev);
215 }
216
217 /// @brief: 卸载设备
218 /// @parameter id_table: 总线标识符,用于唯一标识该设备
219 /// @return: None
220 #[inline]
221 #[allow(dead_code)]
remove_device(&self, id_table: &IdTable)222 pub fn remove_device(&self, id_table: &IdTable) {
223 let mut device_manager = self.0.lock();
224 device_manager.devices.remove(id_table);
225 }
226
227 /// @brief: 获取设备
228 /// @parameter id_table: 设备标识符,用于唯一标识该设备
229 /// @return: 设备实例
230 #[inline]
231 #[allow(dead_code)]
get_device(&self, id_table: &IdTable) -> Option<Arc<dyn Device>>232 pub fn get_device(&self, id_table: &IdTable) -> Option<Arc<dyn Device>> {
233 let device_manager = self.0.lock();
234 device_manager.devices.get(id_table).cloned()
235 }
236
237 /// @brief: 获取设备管理器的sys information
238 /// @parameter id_table: 设备标识符,用于唯一标识该设备
239 /// @return: 设备实例
240 #[inline]
241 #[allow(dead_code)]
sys_info(&self) -> Option<Arc<dyn IndexNode>>242 fn sys_info(&self) -> Option<Arc<dyn IndexNode>> {
243 return self.0.lock().sys_info.clone();
244 }
245 }
246
247 /// @brief Device管理器
248 #[derive(Debug, Clone)]
249 pub struct DeviceManager {
250 devices: BTreeMap<IdTable, Arc<dyn Device>>, // 所有设备
251 sys_info: Option<Arc<dyn IndexNode>>, // sys information
252 }
253
254 impl DeviceManager {
255 /// @brief: 创建一个新的设备管理器
256 /// @parameter: None
257 /// @return: DeviceManager实体
258 #[inline]
new() -> DeviceManager259 fn new() -> DeviceManager {
260 DeviceManager {
261 devices: BTreeMap::new(),
262 sys_info: Some(SYS_DEVICES_INODE()),
263 }
264 }
265 }
266
267 /// @brief: 设备注册
268 /// @parameter: name: 设备名
269 /// @return: 操作成功,返回(),操作失败,返回错误码
device_register<T: Device>(device: Arc<T>) -> Result<(), DeviceError>270 pub fn device_register<T: Device>(device: Arc<T>) -> Result<(), DeviceError> {
271 DEVICE_MANAGER.add_device(device.id_table(), device.clone());
272 match sys_device_register(&device.id_table().to_name()) {
273 Ok(sys_info) => {
274 device.set_sys_info(Some(sys_info));
275 return Ok(());
276 }
277 Err(_) => Err(DeviceError::RegisterError),
278 }
279 }
280
281 /// @brief: 设备卸载
282 /// @parameter: name: 设备名
283 /// @return: 操作成功,返回(),操作失败,返回错误码
device_unregister<T: Device>(device: Arc<T>) -> Result<(), DeviceError>284 pub fn device_unregister<T: Device>(device: Arc<T>) -> Result<(), DeviceError> {
285 DEVICE_MANAGER.add_device(device.id_table(), device.clone());
286 match sys_device_unregister(&device.id_table().to_name()) {
287 Ok(_) => {
288 device.set_sys_info(None);
289 return Ok(());
290 }
291 Err(_) => Err(DeviceError::RegisterError),
292 }
293 }
294