1 use super::device::{
2 bus::{bus_driver_register, bus_register, Bus, BusDriver, BusState},
3 driver::Driver,
4 Device, DeviceError, DeviceState, DeviceType, IdTable,
5 };
6 use crate::{filesystem::vfs::IndexNode, libs::spinlock::SpinLock, syscall::SystemError};
7 use alloc::{
8 collections::{BTreeMap, BTreeSet},
9 sync::Arc,
10 vec::Vec,
11 };
12 use core::fmt::Debug;
13 use platform_device::PlatformDevice;
14 use platform_driver::PlatformDriver;
15
16 pub mod platform_device;
17 pub mod platform_driver;
18
19 /// @brief: platform总线匹配表
20 /// 总线上的设备和驱动都存在一份匹配表
21 /// 根据匹配表条目是否匹配来辨识设备和驱动能否进行匹配
22 #[derive(Debug)]
23 pub struct CompatibleTable(BTreeSet<&'static str>);
24
25 /// @brief: 匹配表操作方法集
26 impl CompatibleTable {
27 /// @brief: 创建一个新的匹配表
28 /// @parameter id_vec: 匹配条目数组
29 /// @return: 匹配表
30 #[inline]
31 #[allow(dead_code)]
new(id_vec: Vec<&'static str>) -> CompatibleTable32 pub fn new(id_vec: Vec<&'static str>) -> CompatibleTable {
33 CompatibleTable(BTreeSet::from_iter(id_vec.iter().cloned()))
34 }
35
36 /// @brief: 判断两个匹配表是否能够匹配
37 /// @parameter other: 其他匹配表
38 /// @return: 如果匹配成功,返回true,否则,返回false
39 #[allow(dead_code)]
matches(&self, other: &CompatibleTable) -> bool40 pub fn matches(&self, other: &CompatibleTable) -> bool {
41 for id in &self.0 {
42 if other.0.contains(id) {
43 return true;
44 }
45 }
46 return false;
47 }
48 }
49
50 #[derive(Debug)]
51 pub struct LockedPlatformBusDriver(SpinLock<PlatformBusDriver>);
52
53 impl LockedPlatformBusDriver {
54 /// @brief: 创建一个platform总线加锁驱动,该驱动用于匹配plaform总线
55 /// @parameter: None
56 /// @return: platfor总线驱动
57 #[inline]
58 #[allow(dead_code)]
new() -> LockedPlatformBusDriver59 pub fn new() -> LockedPlatformBusDriver {
60 LockedPlatformBusDriver(SpinLock::new(PlatformBusDriver::new()))
61 }
62
63 /// @brief: 获取该驱动的匹配表
64 /// @parameter: None
65 /// @return: 驱动的匹配表
66 #[inline]
67 #[allow(dead_code)]
get_compatible_table(&self) -> CompatibleTable68 fn get_compatible_table(&self) -> CompatibleTable {
69 CompatibleTable::new(vec!["platform"])
70 }
71
72 /// @brief: 根据设备标识符获取platform总线上的设备
73 /// @parameter id_table: 设备标识符
74 /// @return: 总线上的设备
75 #[inline]
76 #[allow(dead_code)]
get_device(&self, id_table: &IdTable) -> Option<Arc<dyn PlatformDevice>>77 fn get_device(&self, id_table: &IdTable) -> Option<Arc<dyn PlatformDevice>> {
78 let device_map = &self.0.lock().devices;
79 return device_map.get(id_table).cloned();
80 }
81
82 /// @brief: 根据设备驱动标识符获取platform总线上的驱动
83 /// @parameter id_table: 设备驱动标识符
84 /// @return: 总线上的驱动
85 #[inline]
86 #[allow(dead_code)]
get_driver(&self, id_table: &IdTable) -> Option<Arc<dyn PlatformDriver>>87 fn get_driver(&self, id_table: &IdTable) -> Option<Arc<dyn PlatformDriver>> {
88 let driver_map = &self.0.lock().drivers;
89 return driver_map.get(id_table).cloned();
90 }
91
92 /// @brief: 注册platform类型驱动
93 /// @parameter driver: platform类型驱动,该驱动需要实现PlatformDriver trait
94 /// @return: 注册成功,返回Ok(()),,注册失败,返回BusError类型
95 #[allow(dead_code)]
register_platform_driver(&self, driver: Arc<dyn PlatformDriver>) -> Result<(), DeviceError>96 fn register_platform_driver(&self, driver: Arc<dyn PlatformDriver>) -> Result<(), DeviceError> {
97 let id_table = driver.get_id_table();
98
99 let drivers = &mut self.0.lock().drivers;
100 // 如果存在同类型的驱动,返回错误
101 if drivers.contains_key(&id_table) {
102 return Err(DeviceError::DriverExists);
103 } else {
104 drivers.insert(id_table.clone(), driver.clone());
105 return Ok(());
106 }
107 }
108
109 /// @brief: 卸载platform类型驱动
110 /// @parameter driver: platform类型驱动,该驱动需挂载在plaform总线之上
111 /// @return: None
112 #[allow(dead_code)]
113 #[inline]
unregister_platform_driver(&mut self, driver: Arc<dyn PlatformDriver>)114 fn unregister_platform_driver(&mut self, driver: Arc<dyn PlatformDriver>) {
115 let id_table = driver.get_id_table();
116 self.0.lock().drivers.remove(&id_table);
117 }
118
119 /// @brief: 注册platform类型设备
120 /// @parameter driver: platform类型设备,该驱动需要实现PlatformDevice trait
121 /// @return: 注册成功,返回Ok(()),,注册失败,返回BusError类型
122 #[allow(dead_code)]
register_platform_device( &mut self, device: Arc<dyn PlatformDevice>, ) -> Result<(), DeviceError>123 fn register_platform_device(
124 &mut self,
125 device: Arc<dyn PlatformDevice>,
126 ) -> Result<(), DeviceError> {
127 let id_table = device.get_id_table();
128
129 let devices = &mut self.0.lock().devices;
130 if devices.contains_key(&id_table) {
131 return Err(DeviceError::DeviceExists);
132 } else {
133 devices.insert(id_table.clone(), device.clone());
134 return Ok(());
135 }
136 }
137
138 /// @brief: 卸载platform类型设备
139 /// @parameter device: platform类型设备,该驱设备需挂载在plaform总线之上
140 /// @return: None
141 #[inline]
142 #[allow(dead_code)]
unregister_platform_device(&mut self, device: Arc<dyn PlatformDevice>)143 fn unregister_platform_device(&mut self, device: Arc<dyn PlatformDevice>) {
144 let id_table = device.get_id_table();
145 self.0.lock().devices.remove(&id_table);
146 }
147
148 /// @brief: 匹配platform类型驱动
149 /// @parameter driver: platform类型驱动
150 /// @return: 如果匹配成功,返回成功驱动的设备数,否则,返回BusError类型
151 #[allow(dead_code)]
driver_match_device(&self, driver: Arc<dyn PlatformDriver>) -> Result<i32, DeviceError>152 fn driver_match_device(&self, driver: Arc<dyn PlatformDriver>) -> Result<i32, DeviceError> {
153 let mut num = 0;
154 let devices = &self.0.lock().devices;
155
156 for (_dev_id_table, device) in devices.iter() {
157 if device
158 .get_compatible_table()
159 .matches(&driver.get_compatible_table())
160 {
161 if !device.is_initialized() {
162 // 设备未初始化,调用驱动probe函数
163 match driver.probe(device.clone()) {
164 Ok(()) => {
165 num = num + 1;
166 device.set_state(DeviceState::Initialized)
167 }
168 // 可以驱动很多设备,一个设备初始化出错即返回
169 Err(_) => return Err(DeviceError::InitializeFailed),
170 }
171 }
172 }
173 }
174 if num == 0 {
175 return Err(DeviceError::NoDeviceForDriver);
176 } else {
177 return Ok(num);
178 }
179 }
180
181 /// @brief: 匹配platform上的设备
182 /// @parameter driver: platform类型设备
183 /// @return: 如果匹配成功,返回Ok(()),否则,返回BusError类型
184 #[allow(dead_code)]
device_match_driver(&self, device: Arc<dyn PlatformDevice>) -> Result<(), DeviceError>185 fn device_match_driver(&self, device: Arc<dyn PlatformDevice>) -> Result<(), DeviceError> {
186 let drivers = &mut self.0.lock().drivers;
187 for (_drv_id_table, driver) in drivers.into_iter() {
188 if driver
189 .get_compatible_table()
190 .matches(&device.get_compatible_table())
191 {
192 match driver.probe(device.clone()) {
193 Ok(_driver) => {
194 // 将设备状态置为已初始化
195 device.set_state(DeviceState::Initialized);
196 return Ok(());
197 }
198 Err(_) => return Err(DeviceError::InitializeFailed),
199 }
200 }
201 }
202 return Err(DeviceError::NoDriverForDevice);
203 }
204 }
205
206 /// @brief: platform总线驱动
207 #[derive(Debug)]
208 pub struct PlatformBusDriver {
209 drivers: BTreeMap<IdTable, Arc<dyn PlatformDriver>>, // 总线上所有驱动
210 devices: BTreeMap<IdTable, Arc<dyn PlatformDevice>>, // 总线上所有设备
211 sys_info: Option<Arc<dyn IndexNode>>,
212 }
213
214 impl PlatformBusDriver {
215 /// @brief: 创建一个platform总线驱动,该驱动用于匹配plaform总线
216 /// @parameter: None
217 /// @return: platfor总线驱动
218 #[inline]
219 #[allow(dead_code)]
new() -> Self220 pub fn new() -> Self {
221 Self {
222 drivers: BTreeMap::new(),
223 devices: BTreeMap::new(),
224 sys_info: None,
225 }
226 }
227 }
228
229 /// @brief: 为PlatformBusDriver实现Driver trait
230 impl Driver for LockedPlatformBusDriver {
231 #[inline]
as_any_ref(&self) -> &dyn core::any::Any232 fn as_any_ref(&self) -> &dyn core::any::Any {
233 self
234 }
235
236 #[inline]
get_id_table(&self) -> IdTable237 fn get_id_table(&self) -> IdTable {
238 IdTable::new("PlatformBusDriver", 0)
239 }
240
241 #[inline]
242 #[allow(dead_code)]
sys_info(&self) -> Option<Arc<dyn IndexNode>>243 fn sys_info(&self) -> Option<Arc<dyn IndexNode>> {
244 return self.0.lock().sys_info.clone();
245 }
246
247 #[inline]
248 #[allow(dead_code)]
set_sys_info(&self, sys_info: Option<Arc<dyn IndexNode>>)249 fn set_sys_info(&self, sys_info: Option<Arc<dyn IndexNode>>) {
250 self.0.lock().sys_info = sys_info;
251 }
252 }
253
254 /// @brief: 为PlatformBusDriver实现BusDriver trait
255 impl BusDriver for LockedPlatformBusDriver {
is_empty(&self) -> bool256 fn is_empty(&self) -> bool {
257 if self.0.lock().devices.is_empty() && self.0.lock().drivers.is_empty() {
258 return true;
259 } else {
260 return false;
261 }
262 }
263 }
264
265 #[derive(Debug)]
266 pub struct LockedPlatform(SpinLock<Platform>);
267
268 impl LockedPlatform {
269 /// @brief: 创建一个加锁的platform总线实例
270 /// @parameter: None
271 /// @return: platform总线实例
new() -> LockedPlatform272 pub fn new() -> LockedPlatform {
273 LockedPlatform(SpinLock::new(Platform::new()))
274 }
275
276 /// @brief: 获取总线的匹配表
277 /// @parameter: None
278 /// @return: platform总线匹配表
279 #[inline]
280 #[allow(dead_code)]
get_compatible_table(&self) -> CompatibleTable281 fn get_compatible_table(&self) -> CompatibleTable {
282 CompatibleTable::new(vec!["platform"])
283 }
284
285 /// @brief: 判断总线是否初始化
286 /// @parameter: None
287 /// @return: 已初始化,返回true,否则,返回false
288 #[inline]
289 #[allow(dead_code)]
is_initialized(&self) -> bool290 fn is_initialized(&self) -> bool {
291 let state = self.0.lock().state;
292 match state {
293 BusState::Initialized => true,
294 _ => false,
295 }
296 }
297
298 /// @brief: 设置总线状态
299 /// @parameter set_state: 总线状态BusState
300 /// @return: None
301 #[inline]
set_state(&self, set_state: BusState)302 fn set_state(&self, set_state: BusState) {
303 let state = &mut self.0.lock().state;
304 *state = set_state;
305 }
306
307 /// @brief: 获取总线状态
308 /// @parameter: None
309 /// @return: 总线状态
310 #[inline]
311 #[allow(dead_code)]
get_state(&self) -> BusState312 fn get_state(&self) -> BusState {
313 let state = self.0.lock().state;
314 return state;
315 }
316
317 /// @brief:
318 /// @parameter: None
319 /// @return: 总线状态
320 #[inline]
321 #[allow(dead_code)]
set_driver(&self, driver: Option<Arc<LockedPlatformBusDriver>>)322 fn set_driver(&self, driver: Option<Arc<LockedPlatformBusDriver>>) {
323 self.0.lock().driver = driver;
324 }
325 }
326
327 /// @brief: platform总线
328 #[derive(Debug, Clone)]
329 pub struct Platform {
330 state: BusState, // 总线状态
331 driver: Option<Arc<LockedPlatformBusDriver>>, // 总线驱动
332 sys_info: Option<Arc<dyn IndexNode>>, // 总线sys information
333 }
334
335 /// @brief: platform方法集
336 impl Platform {
337 /// @brief: 创建一个platform总线实例
338 /// @parameter: None
339 /// @return: platform总线实例
new() -> Self340 pub fn new() -> Self {
341 Self {
342 state: BusState::NotInitialized,
343 driver: Option::None,
344 sys_info: Option::None,
345 }
346 }
347 }
348
349 /// @brief: 为Platform实现Device trait,platform总线也是一种设备,属于总线设备类型
350 impl Device for LockedPlatform {
351 #[inline]
352 #[allow(dead_code)]
get_type(&self) -> DeviceType353 fn get_type(&self) -> DeviceType {
354 return DeviceType::Bus;
355 }
356
357 #[inline]
358 #[allow(dead_code)]
get_id_table(&self) -> IdTable359 fn get_id_table(&self) -> IdTable {
360 IdTable::new("platform", 0)
361 }
362
363 #[inline]
set_sys_info(&self, sys_info: Option<Arc<dyn IndexNode>>)364 fn set_sys_info(&self, sys_info: Option<Arc<dyn IndexNode>>) {
365 self.0.lock().sys_info = sys_info;
366 }
367
368 #[inline]
369 #[allow(dead_code)]
sys_info(&self) -> Option<Arc<dyn IndexNode>>370 fn sys_info(&self) -> Option<Arc<dyn IndexNode>> {
371 return self.0.lock().sys_info.clone();
372 }
373 }
374
375 /// @brief: 为Platform实现Bus trait,platform总线是一种总线设备
376 impl Bus for LockedPlatform {}
377
378 /// @brief: 初始化platform总线
379 /// @parameter: None
380 /// @return: None
platform_bus_init() -> Result<(), SystemError>381 pub fn platform_bus_init() -> Result<(), SystemError> {
382 let platform_driver: Arc<LockedPlatformBusDriver> = Arc::new(LockedPlatformBusDriver::new());
383 let platform_device: Arc<LockedPlatform> = Arc::new(LockedPlatform::new());
384 bus_register(platform_device.clone()).map_err(|e| e.into())?;
385 platform_device.set_state(BusState::Initialized);
386 platform_device.set_driver(Some(platform_driver.clone()));
387 bus_driver_register(platform_driver.clone()).map_err(|e| e.into())?;
388
389 return Ok(());
390 }
391