1 use core::{ 2 any::Any, 3 sync::atomic::{AtomicBool, AtomicI32, Ordering}, 4 }; 5 6 use alloc::{ 7 string::{String, ToString}, 8 sync::{Arc, Weak}, 9 vec::Vec, 10 }; 11 use log::error; 12 use system_error::SystemError; 13 14 use crate::{ 15 driver::base::{ 16 class::Class, 17 device::{ 18 bus::Bus, device_manager, device_number::DeviceNumber, driver::Driver, Device, 19 DeviceCommonData, DeviceKObjType, DeviceState, DeviceType, IdTable, 20 }, 21 kobject::{KObjType, KObject, KObjectCommonData, KObjectState, LockedKObjectState}, 22 kset::KSet, 23 platform::{ 24 platform_device::{platform_device_manager, PlatformDevice}, 25 platform_driver::{platform_driver_manager, PlatformDriver}, 26 }, 27 }, 28 filesystem::kernfs::KernFSInode, 29 libs::rwlock::{RwLock, RwLockReadGuard, RwLockWriteGuard}, 30 }; 31 32 use self::serial8250_pio::{send_to_serial8250_pio_com1, serial8250_pio_port_early_init}; 33 34 use super::{uart_manager, UartDriver, UartPort}; 35 36 mod serial8250_pio; 37 38 static mut SERIAL8250_ISA_DEVICES: Option<Arc<Serial8250ISADevices>> = None; 39 static mut SERIAL8250_ISA_DRIVER: Option<Arc<Serial8250ISADriver>> = None; 40 41 #[inline(always)] 42 #[allow(dead_code)] 43 fn serial8250_isa_devices() -> &'static Arc<Serial8250ISADevices> { 44 unsafe { SERIAL8250_ISA_DEVICES.as_ref().unwrap() } 45 } 46 47 #[inline(always)] 48 #[allow(dead_code)] 49 fn serial8250_isa_driver() -> &'static Arc<Serial8250ISADriver> { 50 unsafe { SERIAL8250_ISA_DRIVER.as_ref().unwrap() } 51 } 52 53 #[inline(always)] 54 pub(super) fn serial8250_manager() -> &'static Serial8250Manager { 55 &Serial8250Manager 56 } 57 58 /// 标记serial8250是否已经初始化 59 static mut INITIALIZED: bool = false; 60 61 #[derive(Debug)] 62 pub(super) struct Serial8250Manager; 63 64 impl Serial8250Manager { 65 /// 初始化串口设备(在内存管理初始化之前) 66 pub fn early_init(&self) -> Result<(), SystemError> { 67 // todo: riscv64: 串口设备初始化 68 #[cfg(not(target_arch = "riscv64"))] 69 serial8250_pio_port_early_init()?; 70 return Ok(()); 71 } 72 73 /// 初始化serial8250设备、驱动 74 /// 75 /// 应当在设备驱动模型初始化之后调用这里 76 /// 77 /// 参考 https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/tty/serial/8250/8250_core.c?r=&mo=30224&fi=1169#1169 78 pub fn init(&self) -> Result<(), SystemError> { 79 // 初始化serial8250 isa设备 80 let serial8250_isa_dev = Serial8250ISADevices::new(); 81 unsafe { 82 SERIAL8250_ISA_DEVICES = Some(serial8250_isa_dev.clone()); 83 } 84 85 let serial8250_isa_driver = Serial8250ISADriver::new(); 86 unsafe { 87 SERIAL8250_ISA_DRIVER = Some(serial8250_isa_driver.clone()); 88 } 89 // todo: 把端口绑定到isa_dev、 isa_driver上 90 self.register_ports(&serial8250_isa_driver, &serial8250_isa_dev); 91 92 serial8250_isa_dev.set_driver(Some(Arc::downgrade( 93 &(serial8250_isa_driver.clone() as Arc<dyn Driver>), 94 ))); 95 // todo: 把驱动注册到uart层、tty层 96 uart_manager().register_driver(&(serial8250_isa_driver.clone() as Arc<dyn UartDriver>))?; 97 98 // 把驱动注册到platform总线 99 platform_driver_manager() 100 .register(serial8250_isa_driver.clone() as Arc<dyn PlatformDriver>)?; 101 102 // 注册isa设备到platform总线 103 platform_device_manager() 104 .device_add(serial8250_isa_dev.clone() as Arc<dyn PlatformDevice>) 105 .map_err(|e| { 106 unsafe { 107 SERIAL8250_ISA_DEVICES = None; 108 } 109 return e; 110 })?; 111 112 unsafe { 113 INITIALIZED = true; 114 } 115 116 return Ok(()); 117 } 118 119 /// 把uart端口与uart driver、uart device绑定 120 /// 121 /// 参考 https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/tty/serial/8250/8250_core.c?r=&mo=30224&fi=1169#553 122 fn register_ports( 123 &self, 124 uart_driver: &Arc<Serial8250ISADriver>, 125 devs: &Arc<Serial8250ISADevices>, 126 ) { 127 self.bind_pio_ports(uart_driver, devs); 128 } 129 130 /// 把uart端口与uart driver绑定 131 /// 132 /// 参考 https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/tty/serial/serial_core.c?fi=uart_add_one_port#3048 133 pub(self) fn uart_add_one_port( 134 &self, 135 _uart_driver: &Arc<Serial8250ISADriver>, 136 _port: &dyn UartPort, 137 ) -> Result<(), SystemError> { 138 return Ok(()); 139 // todo!("Serial8250Manager::uart_add_one_port") 140 } 141 } 142 143 /// 所有的8250串口设备都应该实现的trait 144 #[allow(dead_code)] 145 trait Serial8250Port: UartPort { 146 fn device(&self) -> Option<Arc<Serial8250ISADevices>> { 147 None 148 } 149 fn set_device(&self, device: Option<&Arc<Serial8250ISADevices>>); 150 } 151 152 #[derive(Debug)] 153 #[cast_to([sync] Device, PlatformDevice)] 154 struct Serial8250ISADevices { 155 /// 设备id是否自动分配 156 id_auto: AtomicBool, 157 /// 平台设备id 158 id: AtomicI32, 159 160 inner: RwLock<InnerSerial8250ISADevices>, 161 name: &'static str, 162 kobj_state: LockedKObjectState, 163 } 164 165 impl Serial8250ISADevices { 166 pub fn new() -> Arc<Self> { 167 let r = Arc::new(Self { 168 id_auto: AtomicBool::new(false), 169 id: AtomicI32::new(Serial8250PlatformDeviceID::Legacy as i32), 170 inner: RwLock::new(InnerSerial8250ISADevices::new()), 171 name: "serial8250", 172 kobj_state: LockedKObjectState::new(None), 173 }); 174 175 device_manager().device_default_initialize(&(r.clone() as Arc<dyn Device>)); 176 177 return r; 178 } 179 } 180 181 impl PlatformDevice for Serial8250ISADevices { 182 fn pdev_id(&self) -> (i32, bool) { 183 return ( 184 self.id.load(Ordering::SeqCst), 185 self.id_auto.load(Ordering::SeqCst), 186 ); 187 } 188 189 fn set_pdev_id(&self, id: i32) { 190 self.id.store(id, Ordering::SeqCst); 191 } 192 193 fn set_pdev_id_auto(&self, id_auto: bool) { 194 self.id_auto.store(id_auto, Ordering::SeqCst); 195 } 196 197 fn pdev_name(&self) -> &str { 198 return self.name; 199 } 200 201 fn is_initialized(&self) -> bool { 202 return self.inner.read().device_state == DeviceState::Initialized; 203 } 204 205 fn set_state(&self, set_state: DeviceState) { 206 self.inner.write().device_state = set_state; 207 } 208 } 209 210 impl Device for Serial8250ISADevices { 211 fn is_dead(&self) -> bool { 212 false 213 } 214 fn bus(&self) -> Option<Weak<dyn Bus>> { 215 self.inner.read().device_common.bus.clone() 216 } 217 218 fn set_bus(&self, bus: Option<Weak<dyn Bus>>) { 219 self.inner.write().device_common.bus = bus; 220 } 221 222 fn dev_type(&self) -> DeviceType { 223 DeviceType::Serial 224 } 225 226 fn id_table(&self) -> IdTable { 227 return IdTable::new(self.name.to_string(), None); 228 } 229 230 fn driver(&self) -> Option<Arc<dyn Driver>> { 231 self.inner.read().device_common.driver.clone()?.upgrade() 232 } 233 234 fn set_driver(&self, driver: Option<Weak<dyn Driver>>) { 235 self.inner.write().device_common.driver = driver; 236 } 237 238 fn can_match(&self) -> bool { 239 self.inner.read().device_common.can_match 240 } 241 242 fn set_can_match(&self, can_match: bool) { 243 self.inner.write().device_common.can_match = can_match; 244 } 245 246 fn state_synced(&self) -> bool { 247 true 248 } 249 250 fn set_class(&self, _class: Option<Weak<dyn Class>>) { 251 todo!() 252 } 253 254 fn dev_parent(&self) -> Option<Weak<dyn Device>> { 255 self.inner.read().device_common.parent.clone() 256 } 257 258 fn set_dev_parent(&self, dev_parent: Option<Weak<dyn Device>>) { 259 self.inner.write().device_common.parent = dev_parent; 260 } 261 } 262 263 impl KObject for Serial8250ISADevices { 264 fn as_any_ref(&self) -> &dyn Any { 265 self 266 } 267 268 fn set_inode(&self, inode: Option<Arc<KernFSInode>>) { 269 self.inner.write().kobject_common.kern_inode = inode; 270 } 271 272 fn inode(&self) -> Option<Arc<KernFSInode>> { 273 self.inner.read().kobject_common.kern_inode.clone() 274 } 275 276 fn parent(&self) -> Option<Weak<dyn KObject>> { 277 self.inner.read().kobject_common.parent.clone() 278 } 279 280 fn set_parent(&self, parent: Option<Weak<dyn KObject>>) { 281 self.inner.write().kobject_common.parent = parent; 282 } 283 284 fn kset(&self) -> Option<Arc<KSet>> { 285 self.inner.read().kobject_common.kset.clone() 286 } 287 288 fn set_kset(&self, kset: Option<Arc<KSet>>) { 289 self.inner.write().kobject_common.kset = kset; 290 } 291 292 fn kobj_type(&self) -> Option<&'static dyn KObjType> { 293 Some(&DeviceKObjType) 294 } 295 296 fn set_kobj_type(&self, _ktype: Option<&'static dyn KObjType>) { 297 // 不允许修改 298 } 299 300 fn name(&self) -> String { 301 self.name.to_string() 302 } 303 304 fn set_name(&self, _name: String) {} 305 306 fn kobj_state(&self) -> RwLockReadGuard<KObjectState> { 307 self.kobj_state.read() 308 } 309 310 fn kobj_state_mut(&self) -> RwLockWriteGuard<KObjectState> { 311 self.kobj_state.write() 312 } 313 314 fn set_kobj_state(&self, state: KObjectState) { 315 *self.kobj_state.write() = state; 316 } 317 } 318 319 #[derive(Debug)] 320 struct InnerSerial8250ISADevices { 321 kobject_common: KObjectCommonData, 322 device_common: DeviceCommonData, 323 device_state: DeviceState, 324 } 325 326 impl InnerSerial8250ISADevices { 327 fn new() -> Self { 328 Self { 329 kobject_common: KObjectCommonData::default(), 330 device_common: DeviceCommonData::default(), 331 device_state: DeviceState::NotInitialized, 332 } 333 } 334 } 335 336 /// Serial 8250平台设备的id 337 /// 参考 https://code.dragonos.org.cn/xref/linux-6.1.9/include/linux/serial_8250.h?fi=PLAT8250_DEV_LEGACY#49 338 #[derive(Debug)] 339 #[repr(i32)] 340 enum Serial8250PlatformDeviceID { 341 Legacy = -1, 342 } 343 344 #[derive(Debug)] 345 346 struct InnerSerial8250ISADriver { 347 bus: Option<Weak<dyn Bus>>, 348 kobj_type: Option<&'static dyn KObjType>, 349 kset: Option<Arc<KSet>>, 350 parent_kobj: Option<Weak<dyn KObject>>, 351 kern_inode: Option<Arc<KernFSInode>>, 352 devices: Vec<Arc<dyn Device>>, 353 } 354 355 impl InnerSerial8250ISADriver { 356 fn new() -> Self { 357 Self { 358 bus: None, 359 kobj_type: None, 360 kset: None, 361 parent_kobj: None, 362 kern_inode: None, 363 devices: Vec::new(), 364 } 365 } 366 } 367 368 #[derive(Debug)] 369 #[cast_to([sync] Driver, PlatformDriver)] 370 #[allow(dead_code)] 371 struct Serial8250ISADriver { 372 inner: RwLock<InnerSerial8250ISADriver>, 373 name: &'static str, 374 kobj_state: LockedKObjectState, 375 self_ref: Weak<Self>, 376 } 377 378 impl Serial8250ISADriver { 379 pub fn new() -> Arc<Self> { 380 let r = Arc::new(Self { 381 inner: RwLock::new(InnerSerial8250ISADriver::new()), 382 name: "serial8250", 383 kobj_state: LockedKObjectState::new(None), 384 self_ref: Weak::default(), 385 }); 386 387 unsafe { 388 let p = r.as_ref() as *const Self as *mut Self; 389 (*p).self_ref = Arc::downgrade(&r); 390 } 391 392 return r; 393 } 394 } 395 396 impl UartDriver for Serial8250ISADriver { 397 fn device_number(&self) -> DeviceNumber { 398 todo!() 399 } 400 401 fn max_devs_num(&self) -> i32 { 402 todo!() 403 } 404 } 405 406 impl PlatformDriver for Serial8250ISADriver { 407 fn probe(&self, device: &Arc<dyn PlatformDevice>) -> Result<(), SystemError> { 408 let isa_dev = device 409 .clone() 410 .arc_any() 411 .downcast::<Serial8250ISADevices>() 412 .map_err(|_| { 413 error!("Serial8250ISADriver::probe: device is not a Serial8250ISADevices"); 414 SystemError::EINVAL 415 })?; 416 isa_dev.set_driver(Some(self.self_ref.clone())); 417 418 return Ok(()); 419 } 420 421 fn remove(&self, _device: &Arc<dyn PlatformDevice>) -> Result<(), SystemError> { 422 todo!() 423 } 424 425 fn shutdown(&self, _device: &Arc<dyn PlatformDevice>) -> Result<(), SystemError> { 426 todo!() 427 } 428 429 fn suspend(&self, _device: &Arc<dyn PlatformDevice>) -> Result<(), SystemError> { 430 todo!() 431 } 432 433 fn resume(&self, _device: &Arc<dyn PlatformDevice>) -> Result<(), SystemError> { 434 todo!() 435 } 436 } 437 438 impl Driver for Serial8250ISADriver { 439 fn id_table(&self) -> Option<IdTable> { 440 None 441 } 442 443 fn devices(&self) -> Vec<Arc<dyn Device>> { 444 self.inner.read().devices.clone() 445 } 446 447 fn add_device(&self, device: Arc<dyn Device>) { 448 self.inner.write().devices.push(device); 449 } 450 451 fn delete_device(&self, device: &Arc<dyn Device>) { 452 let mut inner = self.inner.write(); 453 454 inner.devices.retain(|d| !Arc::ptr_eq(d, device)); 455 } 456 457 fn bus(&self) -> Option<Weak<dyn Bus>> { 458 self.inner.read().bus.clone() 459 } 460 461 fn set_bus(&self, bus: Option<Weak<dyn Bus>>) { 462 self.inner.write().bus = bus; 463 } 464 } 465 466 impl KObject for Serial8250ISADriver { 467 fn as_any_ref(&self) -> &dyn core::any::Any { 468 self 469 } 470 471 fn set_inode(&self, inode: Option<Arc<KernFSInode>>) { 472 self.inner.write().kern_inode = inode; 473 } 474 475 fn inode(&self) -> Option<Arc<KernFSInode>> { 476 self.inner.read().kern_inode.clone() 477 } 478 479 fn parent(&self) -> Option<Weak<dyn KObject>> { 480 self.inner.read().parent_kobj.clone() 481 } 482 483 fn set_parent(&self, parent: Option<Weak<dyn KObject>>) { 484 self.inner.write().parent_kobj = parent; 485 } 486 487 fn kset(&self) -> Option<Arc<KSet>> { 488 self.inner.read().kset.clone() 489 } 490 491 fn set_kset(&self, kset: Option<Arc<KSet>>) { 492 self.inner.write().kset = kset; 493 } 494 495 fn kobj_type(&self) -> Option<&'static dyn KObjType> { 496 self.inner.read().kobj_type 497 } 498 499 fn set_kobj_type(&self, ktype: Option<&'static dyn KObjType>) { 500 self.inner.write().kobj_type = ktype; 501 } 502 503 fn name(&self) -> String { 504 "serial8250".to_string() 505 } 506 507 fn set_name(&self, _name: String) {} 508 509 fn kobj_state(&self) -> RwLockReadGuard<KObjectState> { 510 self.kobj_state.read() 511 } 512 513 fn kobj_state_mut(&self) -> RwLockWriteGuard<KObjectState> { 514 self.kobj_state.write() 515 } 516 517 fn set_kobj_state(&self, state: KObjectState) { 518 *self.kobj_state.write() = state; 519 } 520 } 521 522 /// 临时函数,用于向默认的串口发送数据 523 pub fn send_to_default_serial8250_port(s: &[u8]) { 524 #[cfg(target_arch = "x86_64")] 525 send_to_serial8250_pio_com1(s); 526 527 #[cfg(target_arch = "riscv64")] 528 { 529 crate::arch::driver::sbi::console_putstr(s); 530 } 531 } 532