mod.rs 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. use core::{fmt::Debug, sync::atomic::AtomicU32};
  2. use alloc::sync::Arc;
  3. use system_error::SystemError;
  4. use crate::{driver::base::device::device_number::DeviceNumber, mm::VirtAddr};
  5. use self::serial8250::serial8250_manager;
  6. use super::tty_driver::TtyDriver;
  7. pub mod serial8250;
  8. pub trait UartDriver: Debug + Send + Sync + TtyDriver {
  9. fn device_number(&self) -> DeviceNumber;
  10. /// 获取最大的设备数量
  11. fn max_devs_num(&self) -> i32;
  12. // todo: 获取指向console的指针(在我们系统里面,将来可能是改进后的Textui Window)
  13. }
  14. /// 串口端口应当实现的trait
  15. ///
  16. /// 参考 https://code.dragonos.org.cn/xref/linux-6.1.9/include/linux/serial_core.h#428
  17. pub trait UartPort {
  18. fn iobase(&self) -> Option<usize> {
  19. None
  20. }
  21. fn membase(&self) -> Option<VirtAddr> {
  22. None
  23. }
  24. fn serial_in(&self, offset: u32) -> u32;
  25. fn serial_out(&self, offset: u32, value: u32);
  26. fn divisor(&self, baud: BaudRate) -> (u32, DivisorFraction);
  27. fn set_divisor(&self, baud: BaudRate) -> Result<(), SystemError>;
  28. fn baud_rate(&self) -> Option<BaudRate>;
  29. fn startup(&self) -> Result<(), SystemError>;
  30. fn shutdown(&self);
  31. fn handle_irq(&self) -> Result<(), SystemError>;
  32. }
  33. int_like!(BaudRate, AtomicBaudRate, u32, AtomicU32);
  34. int_like!(DivisorFraction, u32);
  35. #[inline(always)]
  36. #[allow(dead_code)]
  37. pub(super) fn uart_manager() -> &'static UartManager {
  38. &UartManager
  39. }
  40. #[derive(Debug)]
  41. pub(super) struct UartManager;
  42. impl UartManager {
  43. /// todo: 把uart设备注册到tty层
  44. ///
  45. /// 参考 https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/tty/serial/serial_core.c?fi=uart_register_driver#2720
  46. pub fn register_driver(&self, _driver: &Arc<dyn UartDriver>) -> Result<(), SystemError> {
  47. return Ok(());
  48. }
  49. }
  50. pub fn serial_early_init() -> Result<(), SystemError> {
  51. serial8250_manager().early_init()?;
  52. return Ok(());
  53. }
  54. pub(super) fn serial_init() -> Result<(), SystemError> {
  55. serial8250_manager().init()?;
  56. return Ok(());
  57. }