some_serial/ns16550/
mod.rs

1//! NS16550/16450 UART 驱动模块
2//!
3//! 提供两种访问方式:
4//! - IO Port 版本(x86_64 架构)
5//! - MMIO 版本(通用嵌入式平台)
6
7// 公共寄存器定义
8mod registers;
9
10use bitflags::Flags;
11use rdif_serial::{
12    Config, ConfigError, DataBits, InterfaceRaw, InterruptMask, Parity, SetBackError, StopBits,
13    TIrqHandler, TSender, TransferError,
14};
15use registers::*;
16
17#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
18mod pio;
19// MMIO 版本(通用)
20mod mmio;
21
22pub use mmio::*;
23#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
24pub use pio::*;
25
26use crate::{RawReciever, RawSender};
27
28pub trait Kind: Clone + Send + Sync + 'static {
29    fn read_reg(&self, reg: u8) -> u8;
30    fn write_reg(&self, reg: u8, val: u8);
31    fn get_base(&self) -> usize;
32
33    // 类型安全的 bitflags 寄存器访问
34    fn read_flags<F: Flags<Bits = u8>>(&self, reg: u8) -> F {
35        F::from_bits_retain(self.read_reg(reg))
36    }
37
38    fn write_flags<F: Flags<Bits = u8>>(&self, reg: u8, val: F) {
39        self.write_reg(reg, val.bits());
40    }
41}
42
43pub struct Ns16550<T: Kind> {
44    pub(crate) base: T,
45    pub(crate) clock_freq: u32,
46    pub(crate) irq: Option<Ns16550IrqHandler<T>>,
47    pub(crate) tx: Option<crate::Sender>,
48    pub(crate) rx: Option<crate::Reciever>,
49}
50
51impl<T: Kind> InterfaceRaw for Ns16550<T> {
52    type Sender = crate::Sender;
53    type Reciever = crate::Reciever;
54    type IrqHandler = Ns16550IrqHandler<T>;
55
56    fn base_addr(&self) -> usize {
57        self.base.get_base()
58    }
59
60    fn set_config(&mut self, config: &Config) -> Result<(), ConfigError> {
61        // 配置波特率
62        if let Some(baudrate) = config.baudrate {
63            self.set_baudrate_internal(baudrate)?;
64        }
65
66        // 配置数据位
67        if let Some(data_bits) = config.data_bits {
68            self.set_data_bits_internal(data_bits)?;
69        }
70
71        // 配置停止位
72        if let Some(stop_bits) = config.stop_bits {
73            self.set_stop_bits_internal(stop_bits)?;
74        }
75
76        // 配置奇偶校验
77        if let Some(parity) = config.parity {
78            self.set_parity_internal(parity)?;
79        }
80        Ok(())
81    }
82
83    fn baudrate(&self) -> u32 {
84        // 只读方式获取波特率,通过读取 DLL 和 DLH
85        // 注意:如果 DLAB 未设置,读取的可能不是除数值
86        let dll = self.read_reg_u8(UART_DLL) as u16;
87        let dlh = self.read_reg_u8(UART_DLH) as u16;
88        let divisor = dll | (dlh << 8);
89
90        if divisor == 0 {
91            return 0;
92        }
93
94        self.clock_freq / (16 * divisor as u32)
95    }
96
97    fn data_bits(&self) -> DataBits {
98        let lcr: LineControlFlags = self.read_flags(UART_LCR);
99        let wlen = lcr & LineControlFlags::WORD_LENGTH_MASK;
100        if wlen == LineControlFlags::WORD_LENGTH_5 {
101            DataBits::Five
102        } else if wlen == LineControlFlags::WORD_LENGTH_6 {
103            DataBits::Six
104        } else if wlen == LineControlFlags::WORD_LENGTH_7 {
105            DataBits::Seven
106        } else {
107            DataBits::Eight // 默认值
108        }
109    }
110
111    fn stop_bits(&self) -> StopBits {
112        let lcr: LineControlFlags = self.read_flags(UART_LCR);
113        if lcr.contains(LineControlFlags::STOP_BITS) {
114            StopBits::Two
115        } else {
116            StopBits::One
117        }
118    }
119
120    fn parity(&self) -> Parity {
121        let lcr: LineControlFlags = self.read_flags(UART_LCR);
122
123        if !lcr.contains(LineControlFlags::PARITY_ENABLE) {
124            Parity::None
125        } else if lcr.contains(LineControlFlags::STICK_PARITY) {
126            // Stick parity
127            if lcr.contains(LineControlFlags::EVEN_PARITY) {
128                Parity::Space
129            } else {
130                Parity::Mark
131            }
132        } else {
133            // Normal parity
134            if lcr.contains(LineControlFlags::EVEN_PARITY) {
135                Parity::Even
136            } else {
137                Parity::Odd
138            }
139        }
140    }
141
142    fn clock_freq(&self) -> Option<core::num::NonZeroU32> {
143        self.clock_freq.try_into().ok()
144    }
145
146    fn open(&mut self) {
147        self.init();
148    }
149
150    fn close(&mut self) {
151        // 禁用所有中断
152        self.write_flags(UART_IER, InterruptEnableFlags::empty());
153
154        // 禁用 DTR 和 RTS
155        let mut mcr: ModemControlFlags = self.read_flags(UART_MCR);
156        mcr.remove(ModemControlFlags::DATA_TERMINAL_READY | ModemControlFlags::REQUEST_TO_SEND);
157        self.write_flags(UART_MCR, mcr);
158    }
159
160    fn enable_loopback(&mut self) {
161        let mut mcr: ModemControlFlags = self.read_flags(UART_MCR);
162        mcr.insert(ModemControlFlags::LOOPBACK_ENABLE);
163        self.write_flags(UART_MCR, mcr);
164    }
165
166    fn disable_loopback(&mut self) {
167        let mut mcr: ModemControlFlags = self.read_flags(UART_MCR);
168        mcr.remove(ModemControlFlags::LOOPBACK_ENABLE);
169        self.write_flags(UART_MCR, mcr);
170    }
171
172    fn is_loopback_enabled(&self) -> bool {
173        let mcr: ModemControlFlags = self.read_flags(UART_MCR);
174        mcr.contains(ModemControlFlags::LOOPBACK_ENABLE)
175    }
176
177    fn set_irq_mask(&mut self, mask: InterruptMask) {
178        let mut ier = InterruptEnableFlags::empty();
179
180        if mask.contains(InterruptMask::RX_AVAILABLE) {
181            ier.insert(InterruptEnableFlags::RECEIVED_DATA_AVAILABLE);
182            ier.insert(InterruptEnableFlags::RECEIVER_LINE_STATUS);
183        }
184        if mask.contains(InterruptMask::TX_EMPTY) {
185            ier.insert(InterruptEnableFlags::TRANSMITTER_HOLDING_EMPTY);
186        }
187
188        self.write_flags(UART_IER, ier);
189    }
190
191    fn get_irq_mask(&self) -> InterruptMask {
192        let ier: InterruptEnableFlags = self.read_flags(UART_IER);
193        let mut mask = InterruptMask::empty();
194
195        if ier.contains(InterruptEnableFlags::RECEIVED_DATA_AVAILABLE) {
196            mask |= InterruptMask::RX_AVAILABLE;
197        }
198        if ier.contains(InterruptEnableFlags::TRANSMITTER_HOLDING_EMPTY) {
199            mask |= InterruptMask::TX_EMPTY;
200        }
201        // 错误中断暂不映射到 InterruptMask
202        // 用户需要通过状态寄存器检查错误
203
204        mask
205    }
206
207    fn irq_handler(&mut self) -> Option<Self::IrqHandler> {
208        self.irq.take()
209    }
210
211    fn take_tx(&mut self) -> Option<Self::Sender> {
212        self.tx.take()
213    }
214
215    fn take_rx(&mut self) -> Option<Self::Reciever> {
216        self.rx.take()
217    }
218
219    fn set_tx(&mut self, tx: Self::Sender) -> Result<(), SetBackError> {
220        let want = self.base.get_base();
221        match tx {
222            #[cfg(target_arch = "x86_64")]
223            crate::Sender::Ns16550Sender(ref sender) => {
224                let actual = sender.base.get_base();
225                if actual != want {
226                    return Err(SetBackError::new(want, actual));
227                }
228            }
229            crate::Sender::Ns16550MmioSender(ref sender) => {
230                let actual = sender.base.get_base();
231                if actual != want {
232                    return Err(SetBackError::new(want, actual));
233                }
234            }
235            _ => {
236                return Err(SetBackError::new(want, 0)); // 不匹配的类型
237            }
238        }
239        self.tx = Some(tx);
240        Ok(())
241    }
242
243    fn set_rx(&mut self, rx: Self::Reciever) -> Result<(), SetBackError> {
244        let want = self.base.get_base();
245        match rx {
246            #[cfg(target_arch = "x86_64")]
247            crate::Reciever::Ns16550Reciever(ref reciever) => {
248                let actual = reciever.base.get_base();
249                if actual != want {
250                    return Err(SetBackError::new(want, actual));
251                }
252            }
253            crate::Reciever::Ns16550MmioReciever(ref reciever) => {
254                let actual = reciever.base.get_base();
255                if actual != want {
256                    return Err(SetBackError::new(want, actual));
257                }
258            }
259            _ => {
260                return Err(SetBackError::new(want, 0)); // 不匹配的类型
261            }
262        }
263        self.rx = Some(rx);
264        Ok(())
265    }
266}
267
268impl<T: Kind> Ns16550<T> {
269    // 基础 u8 寄存器访问(用于除数寄存器等特殊场景)
270    fn read_reg_u8(&self, reg: u8) -> u8 {
271        self.base.read_reg(reg)
272    }
273
274    fn write_reg_u8(&mut self, reg: u8, val: u8) {
275        self.base.write_reg(reg, val);
276    }
277
278    // 类型安全的 bitflags 寄存器访问
279    fn read_flags<F: Flags<Bits = u8>>(&self, reg: u8) -> F {
280        F::from_bits_retain(self.base.read_reg(reg))
281    }
282
283    fn write_flags<F: Flags<Bits = u8>>(&mut self, reg: u8, val: F) {
284        self.base.write_reg(reg, val.bits());
285    }
286
287    /// 检查是否为 16550+(支持 FIFO)
288    pub fn is_16550_plus(&self) -> bool {
289        // 通过读取 IIR 寄存器的 FIFO 位来判断
290        // IIR 的位7-6在 16550+ 中会显示 FIFO 启用状态
291        let fifo: InterruptIdentificationFlags = self.read_flags(UART_IIR);
292        fifo.contains(InterruptIdentificationFlags::FIFO_ENABLE_MASK)
293    }
294
295    /// 设置波特率
296    fn set_baudrate_internal(&mut self, baudrate: u32) -> Result<(), ConfigError> {
297        if baudrate == 0 || self.clock_freq == 0 {
298            return Err(ConfigError::InvalidBaudrate);
299        }
300
301        let divisor = self.clock_freq / (16 * baudrate);
302        if divisor == 0 || divisor > 0xFFFF {
303            return Err(ConfigError::InvalidBaudrate);
304        }
305
306        // 保存原始 LCR
307        let mut lcr: LineControlFlags = self.read_flags(UART_LCR);
308
309        // 设置 DLAB 以访问波特率除数寄存器
310        lcr.insert(LineControlFlags::DIVISOR_LATCH_ACCESS);
311        self.write_flags(UART_LCR, lcr);
312
313        // 设置除数(使用 u8 方法,因为这是原始数据写入)
314        self.write_reg_u8(UART_DLL, (divisor & 0xFF) as u8);
315        self.write_reg_u8(UART_DLH, ((divisor >> 8) & 0xFF) as u8);
316
317        // 清除 DLAB 位,恢复正常访问
318        lcr.remove(LineControlFlags::DIVISOR_LATCH_ACCESS);
319        self.write_flags(UART_LCR, lcr);
320
321        Ok(())
322    }
323
324    /// 设置数据位
325    fn set_data_bits_internal(&mut self, bits: DataBits) -> Result<(), ConfigError> {
326        let wlen = match bits {
327            DataBits::Five => LineControlFlags::WORD_LENGTH_5,
328            DataBits::Six => LineControlFlags::WORD_LENGTH_6,
329            DataBits::Seven => LineControlFlags::WORD_LENGTH_7,
330            DataBits::Eight => LineControlFlags::WORD_LENGTH_8,
331        };
332
333        let mut lcr: LineControlFlags = self.read_flags(UART_LCR);
334        // 清除旧的数据位设置,然后设置新的
335        lcr.remove(LineControlFlags::WORD_LENGTH_MASK);
336        lcr.insert(wlen);
337        self.write_flags(UART_LCR, lcr);
338
339        Ok(())
340    }
341
342    /// 设置停止位
343    fn set_stop_bits_internal(&mut self, bits: StopBits) -> Result<(), ConfigError> {
344        let mut lcr: LineControlFlags = self.read_flags(UART_LCR);
345        match bits {
346            StopBits::One => lcr.remove(LineControlFlags::STOP_BITS),
347            StopBits::Two => lcr.insert(LineControlFlags::STOP_BITS),
348        }
349        self.write_flags(UART_LCR, lcr);
350        Ok(())
351    }
352
353    /// 设置奇偶校验
354    fn set_parity_internal(&mut self, parity: Parity) -> Result<(), ConfigError> {
355        let mut lcr: LineControlFlags = self.read_flags(UART_LCR);
356
357        // 先清除所有校验相关位
358        lcr.remove(
359            LineControlFlags::PARITY_ENABLE
360                | LineControlFlags::EVEN_PARITY
361                | LineControlFlags::STICK_PARITY,
362        );
363
364        // 根据校验类型设置相应位
365        match parity {
366            Parity::None => {
367                // 已经清除,无需额外操作
368            }
369            Parity::Odd => {
370                lcr.insert(LineControlFlags::PARITY_ENABLE);
371            }
372            Parity::Even => {
373                lcr.insert(LineControlFlags::PARITY_ENABLE | LineControlFlags::EVEN_PARITY);
374            }
375            Parity::Mark => {
376                lcr.insert(LineControlFlags::PARITY_ENABLE | LineControlFlags::STICK_PARITY);
377            }
378            Parity::Space => {
379                lcr.insert(
380                    LineControlFlags::PARITY_ENABLE
381                        | LineControlFlags::EVEN_PARITY
382                        | LineControlFlags::STICK_PARITY,
383                );
384            }
385        }
386
387        self.write_flags(UART_LCR, lcr);
388        Ok(())
389    }
390
391    /// 启用或禁用 FIFO
392    pub fn enable_fifo(&mut self, enable: bool) {
393        if enable && self.is_16550_plus() {
394            let mut fcr = FifoControlFlags::ENABLE_FIFO;
395            fcr.insert(FifoControlFlags::CLEAR_RECEIVER_FIFO);
396            fcr.insert(FifoControlFlags::CLEAR_TRANSMITTER_FIFO);
397            fcr.insert(FifoControlFlags::TRIGGER_1_BYTE);
398            self.write_flags(UART_FCR, fcr);
399        } else {
400            self.write_flags(UART_FCR, FifoControlFlags::empty());
401        }
402    }
403
404    /// 设置 FIFO 触发级别
405    pub fn set_fifo_trigger_level(&mut self, level: u8) {
406        if !self.is_16550_plus() {
407            return;
408        }
409
410        let trigger_value = match level {
411            0..=3 => FifoControlFlags::TRIGGER_1_BYTE,
412            4..=7 => FifoControlFlags::TRIGGER_4_BYTES,
413            8..=11 => FifoControlFlags::TRIGGER_8_BYTES,
414            _ => FifoControlFlags::TRIGGER_14_BYTES,
415        };
416
417        // 读取当前 FCR 设置,清除触发级别位,然后设置新的触发级别
418        let mut fcr: FifoControlFlags = self.read_flags(UART_FCR);
419        fcr.remove(FifoControlFlags::TRIGGER_LEVEL_MASK);
420        fcr.insert(trigger_value);
421        self.write_flags(UART_FCR, fcr);
422    }
423
424    /// 初始化 UART
425    fn init(&mut self) {
426        // 禁用所有中断
427        self.write_flags(UART_IER, InterruptEnableFlags::empty());
428
429        // 确保传输器启用(设置 DTR 和 RTS)
430        let mut mcr: ModemControlFlags = self.read_flags(UART_MCR);
431        mcr.insert(ModemControlFlags::DATA_TERMINAL_READY | ModemControlFlags::REQUEST_TO_SEND);
432        self.write_flags(UART_MCR, mcr);
433    }
434
435    /// 检查 FIFO 是否启用
436    pub fn is_fifo_enabled(&self) -> bool {
437        if !self.is_16550_plus() {
438            return false;
439        }
440        // 通过检查 IIR 的 FIFO 位来判断
441        let iir: InterruptIdentificationFlags = self.read_flags(UART_IIR);
442        iir.contains(InterruptIdentificationFlags::FIFO_ENABLE_MASK)
443    }
444}
445
446pub struct Ns16550Sender<T: Kind> {
447    pub(crate) base: T,
448}
449
450impl<T: Kind> TSender for Ns16550Sender<T> {
451    fn write_byte(&mut self, byte: u8) -> bool {
452        RawSender::write_byte(self, byte)
453    }
454}
455
456pub struct Ns16550Reciever<T: Kind> {
457    pub(crate) base: T,
458}
459
460impl<T: Kind> RawReciever for Ns16550Reciever<T> {
461    fn read_byte(&mut self) -> Option<Result<u8, TransferError>> {
462        let lsr: LineStatusFlags = self.base.read_flags(UART_LSR);
463
464        // 按优先级检查错误(从高到低)
465        if lsr.contains(LineStatusFlags::OVERRUN_ERROR) {
466            let b = self.base.read_reg(UART_RBR);
467            return Some(Err(TransferError::Overrun(b)));
468        }
469
470        if lsr.contains(LineStatusFlags::PARITY_ERROR) {
471            let _b = self.base.read_reg(UART_RBR);
472            return Some(Err(TransferError::Parity));
473        }
474
475        if lsr.contains(LineStatusFlags::FRAMING_ERROR) {
476            let _b = self.base.read_reg(UART_RBR);
477            return Some(Err(TransferError::Framing));
478        }
479
480        if lsr.contains(LineStatusFlags::BREAK_INTERRUPT) {
481            let _b = self.base.read_reg(UART_RBR);
482            return Some(Err(TransferError::Break));
483        }
484
485        if lsr.contains(LineStatusFlags::DATA_READY) {
486            let b = self.base.read_reg(UART_RBR);
487            return Some(Ok(b));
488        }
489        None
490    }
491}
492
493pub struct Ns16550IrqHandler<T: Kind> {
494    pub(crate) base: T,
495}
496
497impl<T: Kind> TIrqHandler for Ns16550IrqHandler<T> {
498    fn clean_interrupt_status(&self) -> InterruptMask {
499        let iir: InterruptIdentificationFlags = self.base.read_flags(UART_IIR);
500        let mut mask = InterruptMask::empty();
501
502        // 检查是否有中断挂起
503        if iir.contains(InterruptIdentificationFlags::NO_INTERRUPT_PENDING) {
504            return mask;
505        }
506
507        // 获取中断ID(需要提取bit 1-3)
508        let interrupt_id = iir & InterruptIdentificationFlags::INTERRUPT_ID_MASK;
509
510        // 使用精确匹配而不是 contains
511        if interrupt_id == InterruptIdentificationFlags::RECEIVER_LINE_STATUS
512            || interrupt_id == InterruptIdentificationFlags::RECEIVED_DATA_AVAILABLE
513            || interrupt_id == InterruptIdentificationFlags::CHARACTER_TIMEOUT
514        {
515            // 接收数据可用中断或字符超时中断
516            mask |= InterruptMask::RX_AVAILABLE;
517        } else if interrupt_id == InterruptIdentificationFlags::TRANSMITTER_HOLDING_EMPTY {
518            // 发送保持寄存器空中断
519            mask |= InterruptMask::TX_EMPTY;
520        } else if interrupt_id == InterruptIdentificationFlags::MODEM_STATUS {
521            // Modem 状态中断
522        }
523
524        mask
525    }
526}
527
528impl<T: Kind> RawSender for Ns16550Sender<T> {
529    fn write_byte(&mut self, byte: u8) -> bool {
530        let lsr: LineStatusFlags = self.base.read_flags(UART_LSR);
531        if lsr.contains(LineStatusFlags::TRANSMITTER_HOLDING_EMPTY) {
532            self.base.write_reg(UART_THR, byte);
533            true
534        } else {
535            false
536        }
537    }
538}