Skip to main content

some_serial/
pl011.rs

1use core::{num::NonZeroU32, ptr::NonNull};
2
3use rdif_serial::{
4    BSerial, InterfaceRaw, SerialDyn, SetBackError, TIrqHandler, TSender, TransBytesError,
5    TransferError,
6};
7use tock_registers::{interfaces::*, register_bitfields, register_structs, registers::*};
8
9use crate::{
10    Config, ConfigError, DataBits, InterruptMask, Parity, RawReciever, RawSender, StopBits,
11};
12
13register_bitfields! [
14    u32,
15
16    /// Data Register
17    UARTDR [
18        DATA OFFSET(0) NUMBITS(8) [],
19        FE OFFSET(8) NUMBITS(1) [],
20        PE OFFSET(9) NUMBITS(1) [],
21        BE OFFSET(10) NUMBITS(1) [],
22        OE OFFSET(11) NUMBITS(1) []
23    ],
24
25    /// Receive Status Register / Error Clear Register
26    UARTRSR_ECR [
27        FE OFFSET(0) NUMBITS(1) [],
28        PE OFFSET(1) NUMBITS(1) [],
29        BE OFFSET(2) NUMBITS(1) [],
30        OE OFFSET(3) NUMBITS(1) []
31    ],
32
33    /// Flag Register
34    UARTFR [
35        CTS OFFSET(0) NUMBITS(1) [],
36        DSR OFFSET(1) NUMBITS(1) [],
37        DCD OFFSET(2) NUMBITS(1) [],
38        BUSY OFFSET(3) NUMBITS(1) [],
39        RXFE OFFSET(4) NUMBITS(1) [],
40        TXFF OFFSET(5) NUMBITS(1) [],
41        RXFF OFFSET(6) NUMBITS(1) [],
42        TXFE OFFSET(7) NUMBITS(1) [],
43        RI OFFSET(8) NUMBITS(1) []
44    ],
45
46    /// Integer Baud Rate Register
47    UARTIBRD [
48        BAUD_DIVINT OFFSET(0) NUMBITS(16) []
49    ],
50
51    /// Fractional Baud Rate Register
52    UARTFBRD [
53        BAUD_DIVFRAC OFFSET(0) NUMBITS(6) []
54    ],
55
56    /// Line Control Register
57    UARTLCR_H [
58        BRK OFFSET(0) NUMBITS(1) [],
59        PEN OFFSET(1) NUMBITS(1) [],
60        EPS OFFSET(2) NUMBITS(1) [],
61        STP2 OFFSET(3) NUMBITS(1) [],
62        FEN OFFSET(4) NUMBITS(1) [],
63        WLEN OFFSET(5) NUMBITS(2) [
64            FiveBit = 0,
65            SixBit = 1,
66            SevenBit = 2,
67            EightBit = 3
68        ],
69        SPS OFFSET(7) NUMBITS(1) []
70    ],
71
72    /// Control Register
73    UARTCR [
74        UARTEN OFFSET(0) NUMBITS(1) [],
75        SIREN OFFSET(1) NUMBITS(1) [],
76        SIRLP OFFSET(2) NUMBITS(1) [],
77        LBE OFFSET(7) NUMBITS(1) [],
78        TXE OFFSET(8) NUMBITS(1) [],
79        RXE OFFSET(9) NUMBITS(1) [],
80        DTR OFFSET(10) NUMBITS(1) [],
81        RTS OFFSET(11) NUMBITS(1) [],
82        OUT1 OFFSET(12) NUMBITS(1) [],
83        OUT2 OFFSET(13) NUMBITS(1) [],
84        RTSEN OFFSET(14) NUMBITS(1) [],
85        CTSEN OFFSET(15) NUMBITS(1) []
86    ],
87
88    /// Interrupt FIFO Level Select Register
89    UARTIFLS [
90        TXIFLSEL OFFSET(0) NUMBITS(3) [],
91        RXIFLSEL OFFSET(3) NUMBITS(3) []
92    ],
93
94    /// Interrupt Mask Set/Clear Register
95    UARTIS [
96        RIM OFFSET(0) NUMBITS(1) [],
97        CTSM OFFSET(1) NUMBITS(1) [],
98        DCDM OFFSET(2) NUMBITS(1) [],
99        DSRM OFFSET(3) NUMBITS(1) [],
100        RX OFFSET(4) NUMBITS(1) [],
101        TX OFFSET(5) NUMBITS(1) [],
102        RT OFFSET(6) NUMBITS(1) [],
103        FE OFFSET(7) NUMBITS(1) [],
104        PE OFFSET(8) NUMBITS(1) [],
105        BE OFFSET(9) NUMBITS(1) [],
106        OE OFFSET(10) NUMBITS(1) []
107    ],
108
109    /// DMA Control Register
110    UARTDMACR [
111        RXDMAE OFFSET(0) NUMBITS(1) [],
112        TXDMAE OFFSET(1) NUMBITS(1) [],
113        DMAONERR OFFSET(2) NUMBITS(1) []
114    ]
115];
116
117register_structs! {
118    pub Pl011Registers {
119        (0x000 => uartdr: ReadWrite<u32, UARTDR::Register>),        // 数据寄存器(收发数据/错误标志)
120        (0x004 => uartrsr_ecr: ReadWrite<u32, UARTRSR_ECR::Register>), // 接收状态/错误清除寄存器
121        (0x008 => _reserved1),                                      // 保留
122        (0x018 => uartfr: ReadOnly<u32, UARTFR::Register>),         // 标志寄存器(状态标志,如忙/空/满等)
123        (0x01c => _reserved2),                                      // 保留
124        (0x020 => uartilpr: ReadWrite<u32>),                        // 红外低功耗波特率寄存器(很少用)
125        (0x024 => uartibrd: ReadWrite<u32, UARTIBRD::Register>),    // 整数波特率分频寄存器
126        (0x028 => uartfbrd: ReadWrite<u32, UARTFBRD::Register>),    // 小数波特率分频寄存器
127        (0x02c => uartlcr_h: ReadWrite<u32, UARTLCR_H::Register>),  // 线路控制寄存器(数据位、停止位、校验等)
128        (0x030 => uartcr: ReadWrite<u32, UARTCR::Register>),        // 控制寄存器(UART使能、收发使能等)
129        (0x034 => uartifls: ReadWrite<u32, UARTIFLS::Register>),    // FIFO中断触发级别选择寄存器
130        (0x038 => uartimsc: ReadWrite<u32, UARTIS::Register>),      // 中断屏蔽设置/清除寄存器
131        (0x03c => uartris: ReadOnly<u32, UARTIS::Register>),        // 原始中断状态寄存器
132        (0x040 => uartmis: ReadOnly<u32, UARTIS::Register>),        // 屏蔽后的中断状态寄存器
133        (0x044 => uarticr: WriteOnly<u32, UARTIS::Register>),       // 中断清除寄存器
134        (0x048 => uartdmacr: ReadWrite<u32, UARTDMACR::Register>),  // DMA控制寄存器
135        (0x04c => _reserved3),                                      // 保留
136        (0x1000 => @END),
137    }
138}
139
140// SAFETY: PL011 寄存器访问是原子的,硬件保证了内存映射寄存器的线程安全
141unsafe impl Sync for Pl011Registers {}
142
143/// PL011 UART 驱动结构体
144pub struct Pl011 {
145    base: Reg,
146    clock_freq: u32,
147    tx: Option<Pl011Sender>,
148    rx: Option<Pl011Reciever>,
149    irq: Option<Pl011IrqHandler>,
150}
151
152impl Pl011 {
153    /// 创建新的 PL011 实例(仅基地址,使用默认配置)
154    ///
155    /// # Arguments
156    /// * `base` - UART 寄存器基地址
157    pub fn new_no_clock(base: NonNull<u8>) -> Self {
158        // 自动检测时钟频率或使用合理的默认值
159        let clock_freq = Self::detect_clock_frequency(base.as_ptr() as usize);
160        Self::new(base, clock_freq)
161    }
162
163    pub fn new(base: NonNull<u8>, clock_freq: u32) -> Self {
164        let base = Reg(base.cast());
165
166        Self {
167            base,
168            clock_freq,
169            tx: Some(Pl011Sender { base }),
170            rx: Some(Pl011Reciever { base }),
171            irq: Some(Pl011IrqHandler { base }),
172        }
173    }
174
175    pub fn new_boxed(base: NonNull<u8>, clock_freq: u32) -> BSerial {
176        let mut serial = Self::new(base, clock_freq);
177        serial.open();
178        SerialDyn::new_boxed(serial)
179    }
180
181    fn registers(&self) -> &Pl011Registers {
182        unsafe { &*self.base.0.as_ptr() }
183    }
184
185    /// 自动检测或确定合理的时钟频率
186    fn detect_clock_frequency(base: usize) -> u32 {
187        // 尝试读取当前波特率设置来反向推算时钟频率
188        let registers = unsafe { &*(base as *const Pl011Registers) };
189
190        use tock_registers::interfaces::Readable;
191        let ibrd = registers.uartibrd.read(UARTIBRD::BAUD_DIVINT);
192
193        // 如果有设置值,假设波特率为 115200 来估算时钟频率
194        if ibrd > 0 && ibrd <= 0xFFFF {
195            // 假设波特率为 115200,计算时钟频率
196            // FUARTCLK = 16 * BAUDDIV * Baud rate
197            let estimated_clock = 16 * ibrd * 115200;
198
199            // 合理的时钟频率范围:1MHz - 100MHz
200            if (1_000_000..=100_000_000).contains(&estimated_clock) {
201                return estimated_clock;
202            }
203        }
204
205        // 默认使用 24MHz(最常见)
206        24_000_000
207    }
208
209    // 内部私有方法,用于配置
210    fn set_baudrate_internal(&self, baudrate: u32) -> Result<(), ConfigError> {
211        // PL011 波特率计算公式:
212        // BAUDDIV = (FUARTCLK / (16 * Baud rate))
213        // IBRD = integer(BAUDDIV)
214        // FBRD = integer((BAUDDIV - IBRD) * 64 + 0.5)
215
216        let bauddiv = self.clock_freq / (16 * baudrate);
217        let remainder = self.clock_freq % (16 * baudrate);
218        let fbrd = (remainder * 64 + (16 * baudrate / 2)) / (16 * baudrate);
219
220        if bauddiv == 0 || bauddiv > 0xFFFF {
221            return Err(ConfigError::InvalidBaudrate);
222        }
223
224        self.registers()
225            .uartibrd
226            .write(UARTIBRD::BAUD_DIVINT.val(bauddiv));
227        self.registers()
228            .uartfbrd
229            .write(UARTFBRD::BAUD_DIVFRAC.val(fbrd));
230
231        Ok(())
232    }
233
234    fn set_data_bits_internal(&self, bits: DataBits) -> Result<(), ConfigError> {
235        let wlen = match bits {
236            DataBits::Five => UARTLCR_H::WLEN::FiveBit,
237            DataBits::Six => UARTLCR_H::WLEN::SixBit,
238            DataBits::Seven => UARTLCR_H::WLEN::SevenBit,
239            DataBits::Eight => UARTLCR_H::WLEN::EightBit,
240        };
241
242        self.registers().uartlcr_h.modify(wlen);
243        Ok(())
244    }
245
246    fn set_stop_bits_internal(&self, bits: StopBits) -> Result<(), ConfigError> {
247        match bits {
248            StopBits::One => self.registers().uartlcr_h.modify(UARTLCR_H::STP2::CLEAR),
249            StopBits::Two => self.registers().uartlcr_h.modify(UARTLCR_H::STP2::SET),
250        }
251
252        Ok(())
253    }
254
255    fn set_parity_internal(&self, parity: Parity) -> Result<(), ConfigError> {
256        match parity {
257            Parity::None => {
258                // PEN = 0, 无奇偶校验
259                self.registers().uartlcr_h.modify(UARTLCR_H::PEN::CLEAR);
260            }
261            Parity::Odd => {
262                // PEN = 1, EPS = 0 (奇校验), SPS = 0
263                self.registers()
264                    .uartlcr_h
265                    .modify(UARTLCR_H::PEN::SET + UARTLCR_H::EPS::CLEAR + UARTLCR_H::SPS::CLEAR);
266            }
267            Parity::Even => {
268                // PEN = 1, EPS = 1 (偶校验), SPS = 0
269                self.registers()
270                    .uartlcr_h
271                    .modify(UARTLCR_H::PEN::SET + UARTLCR_H::EPS::SET + UARTLCR_H::SPS::CLEAR);
272            }
273            Parity::Mark => {
274                // PEN = 1, SPS = 1, EPS = 0 (奇校验)
275                self.registers()
276                    .uartlcr_h
277                    .modify(UARTLCR_H::PEN::SET + UARTLCR_H::EPS::CLEAR + UARTLCR_H::SPS::SET);
278            }
279            Parity::Space => {
280                // PEN = 1, EPS = 1 (偶校验), SPS = 1
281                self.registers()
282                    .uartlcr_h
283                    .modify(UARTLCR_H::PEN::SET + UARTLCR_H::EPS::SET + UARTLCR_H::SPS::SET);
284            }
285        }
286
287        Ok(())
288    }
289
290    /// 初始化 PL011 UART
291    fn init(&self) {
292        // 禁用 UART
293        self.registers().uartcr.modify(UARTCR::UARTEN::CLEAR);
294
295        // 等待当前传输完成
296        while self.registers().uartfr.is_set(UARTFR::BUSY) {
297            core::hint::spin_loop();
298        }
299
300        // 清除发送 FIFO
301        self.registers().uartlcr_h.modify(UARTLCR_H::FEN::CLEAR);
302
303        // 启用 FIFO
304        self.registers().uartlcr_h.modify(UARTLCR_H::FEN::SET);
305
306        // 调试信息:输出 FIFO 配置
307        #[cfg(debug_assertions)]
308        {
309            let ifls = self.registers().uartifls.get();
310            let lcr_h = self.registers().uartlcr_h.get();
311            log::debug!("UART IFLS: 0x{:02x}, LCR_H: 0x{:02x}", ifls, lcr_h);
312            log::debug!("  FIFO enabled: {}", lcr_h & (1 << 4) != 0);
313            log::debug!("  RX trigger level: 1/8");
314            log::debug!("  TX trigger level: 1/2");
315        }
316        self.registers().uartimsc.set(0); // 禁用所有中断
317        // 启用 UART
318        self.registers()
319            .uartcr
320            .modify(UARTCR::UARTEN::SET + UARTCR::TXE::SET + UARTCR::RXE::SET);
321    }
322
323    pub fn task_tx(&mut self) -> Option<crate::Sender> {
324        self.tx.take().map(crate::Sender::Pl011Sender)
325    }
326
327    pub fn task_rx(&mut self) -> Option<crate::Reciever> {
328        self.rx.take().map(crate::Reciever::Pl011Reciever)
329    }
330}
331
332#[derive(Clone, Copy, PartialEq, Eq)]
333struct Reg(NonNull<Pl011Registers>);
334
335unsafe impl Send for Reg {}
336
337impl Reg {
338    fn registers(&self) -> &Pl011Registers {
339        unsafe { self.0.as_ref() }
340    }
341}
342
343pub struct Pl011Sender {
344    base: Reg,
345}
346
347impl TSender for Pl011Sender {
348    fn write_byte(&mut self, byte: u8) -> bool {
349        RawSender::write_byte(self, byte)
350    }
351}
352
353impl RawSender for Pl011Sender {
354    fn write_byte(&mut self, byte: u8) -> bool {
355        if self.base.registers().uartfr.is_set(UARTFR::TXFF) {
356            return false;
357        }
358
359        self.base.registers().uartdr.set(byte as _);
360
361        true
362    }
363}
364
365pub struct Pl011Reciever {
366    base: Reg,
367}
368
369impl RawReciever for Pl011Reciever {
370    fn read_byte(&mut self) -> Option<Result<u8, TransferError>> {
371        if self.base.registers().uartfr.is_set(UARTFR::RXFE) {
372            return None;
373        }
374
375        let dr = self.base.registers().uartdr.extract();
376        let data = dr.read(UARTDR::DATA) as u8;
377
378        if dr.is_set(UARTDR::FE) {
379            return Some(Err(TransferError::Framing));
380        }
381
382        if dr.is_set(UARTDR::PE) {
383            return Some(Err(TransferError::Parity));
384        }
385
386        if dr.is_set(UARTDR::OE) {
387            return Some(Err(TransferError::Overrun(data)));
388        }
389
390        if dr.is_set(UARTDR::BE) {
391            return Some(Err(TransferError::Break));
392        }
393
394        Some(Ok(data))
395    }
396
397    fn read_bytes(&mut self, bytes: &mut [u8]) -> Result<usize, TransBytesError> {
398        let mut count = 0;
399        let mut overrun_data = None;
400        for byte in bytes.iter_mut() {
401            match self.read_byte() {
402                Some(Ok(b)) => {
403                    *byte = b;
404                }
405                Some(Err(TransferError::Overrun(b))) => {
406                    overrun_data = Some(b);
407                    *byte = b;
408                }
409                Some(Err(e)) => {
410                    return Err(TransBytesError {
411                        bytes_transferred: count,
412                        kind: e,
413                    });
414                }
415                None => {
416                    if let Some(data) = overrun_data {
417                        count = count.saturating_sub(1);
418
419                        return Err(TransBytesError {
420                            bytes_transferred: count,
421                            kind: TransferError::Overrun(data),
422                        });
423                    }
424                    break;
425                }
426            }
427            count += 1;
428        }
429        Ok(count)
430    }
431}
432
433pub struct Pl011IrqHandler {
434    base: Reg,
435}
436
437unsafe impl Sync for Pl011IrqHandler {}
438
439impl TIrqHandler for Pl011IrqHandler {
440    fn clean_interrupt_status(&self) -> InterruptMask {
441        let mis = self.base.registers().uartmis.extract();
442        let mut mask = InterruptMask::empty();
443
444        if mis.is_set(UARTIS::RX) {
445            mask |= InterruptMask::RX_AVAILABLE;
446        }
447        if mis.is_set(UARTIS::TX) {
448            mask |= InterruptMask::TX_EMPTY;
449        }
450
451        self.base.registers().uarticr.set(mis.get());
452
453        mask
454    }
455}
456
457impl InterfaceRaw for Pl011 {
458    type IrqHandler = Pl011IrqHandler;
459
460    type Sender = crate::Sender;
461
462    type Reciever = crate::Reciever;
463
464    fn name(&self) -> &str {
465        "PL011 UART"
466    }
467
468    fn set_config(&mut self, config: &Config) -> Result<(), ConfigError> {
469        use tock_registers::interfaces::Readable;
470
471        // 根据ARM文档的建议配置流程:
472        // 1. 禁用UART
473        let original_enable = self.registers().uartcr.is_set(UARTCR::UARTEN); // 保存原始使能状态
474        self.registers().uartcr.modify(UARTCR::UARTEN::CLEAR); // 禁用UART
475
476        // 2. 等待当前字符传输完成
477        while self.registers().uartfr.is_set(UARTFR::BUSY) {
478            core::hint::spin_loop();
479        }
480
481        // 3. 刷新发送FIFO(通过设置FEN=0)
482        self.registers().uartlcr_h.modify(UARTLCR_H::FEN::CLEAR);
483
484        // 4. 配置各项参数
485        if let Some(baudrate) = config.baudrate {
486            self.set_baudrate_internal(baudrate)?;
487        }
488        if let Some(data_bits) = config.data_bits {
489            self.set_data_bits_internal(data_bits)?;
490        }
491        if let Some(stop_bits) = config.stop_bits {
492            self.set_stop_bits_internal(stop_bits)?;
493        }
494        if let Some(parity) = config.parity {
495            self.set_parity_internal(parity)?;
496        }
497
498        // 5. 重新启用FIFO
499        self.registers().uartlcr_h.modify(UARTLCR_H::FEN::SET);
500
501        // 6. 恢复UART使能状态
502        if original_enable {
503            self.registers().uartcr.modify(UARTCR::UARTEN::SET); // 重新启用UART
504        }
505
506        Ok(())
507    }
508
509    fn baudrate(&self) -> u32 {
510        let ibrd = self.registers().uartibrd.read(UARTIBRD::BAUD_DIVINT);
511        let fbrd = self.registers().uartfbrd.read(UARTFBRD::BAUD_DIVFRAC);
512
513        // 反向计算波特率
514        // Baud rate = FUARTCLK / (16 * (IBRD + FBRD/64))
515        let divisor = ibrd * 64 + fbrd;
516        if divisor == 0 {
517            return 0;
518        }
519
520        self.clock_freq * 64 / (16 * divisor)
521    }
522
523    fn data_bits(&self) -> DataBits {
524        let wlen = self.registers().uartlcr_h.read(UARTLCR_H::WLEN);
525
526        match wlen {
527            0 => DataBits::Five,
528            1 => DataBits::Six,
529            2 => DataBits::Seven,
530            3 => DataBits::Eight,
531            _ => DataBits::Eight, // 默认值
532        }
533    }
534
535    fn stop_bits(&self) -> StopBits {
536        if self.registers().uartlcr_h.is_set(UARTLCR_H::STP2) {
537            StopBits::Two
538        } else {
539            StopBits::One
540        }
541    }
542
543    fn parity(&self) -> Parity {
544        if !self.registers().uartlcr_h.is_set(UARTLCR_H::PEN) {
545            Parity::None
546        } else if self.registers().uartlcr_h.is_set(UARTLCR_H::SPS) {
547            // Stick parity
548            if self.registers().uartlcr_h.is_set(UARTLCR_H::EPS) {
549                Parity::Space
550            } else {
551                Parity::Mark
552            }
553        } else {
554            // Normal parity
555            if self.registers().uartlcr_h.is_set(UARTLCR_H::EPS) {
556                Parity::Even
557            } else {
558                Parity::Odd
559            }
560        }
561    }
562
563    fn open(&mut self) {
564        self.init()
565    }
566
567    fn close(&mut self) {
568        // 禁用 UART
569        self.registers().uartcr.modify(UARTCR::UARTEN::CLEAR);
570    }
571
572    fn clock_freq(&self) -> Option<NonZeroU32> {
573        self.clock_freq.try_into().ok()
574    }
575
576    fn enable_loopback(&mut self) {
577        self.registers().uartcr.modify(UARTCR::LBE::SET);
578    }
579
580    fn disable_loopback(&mut self) {
581        self.registers().uartcr.modify(UARTCR::LBE::CLEAR);
582    }
583
584    fn is_loopback_enabled(&self) -> bool {
585        self.registers().uartcr.is_set(UARTCR::LBE)
586    }
587
588    fn set_irq_mask(&mut self, mask: InterruptMask) {
589        let mut imsc = 0;
590        if mask.contains(InterruptMask::RX_AVAILABLE) {
591            imsc += UARTIS::RX::SET.value;
592        }
593        if mask.contains(InterruptMask::TX_EMPTY) {
594            imsc += UARTIS::TX::SET.value;
595        }
596
597        self.registers().uartimsc.set(imsc);
598    }
599
600    fn get_irq_mask(&self) -> InterruptMask {
601        let imsc = self.registers().uartimsc.extract();
602        let mut mask = InterruptMask::empty();
603
604        if imsc.is_set(UARTIS::RX) {
605            mask |= InterruptMask::RX_AVAILABLE;
606        }
607        if imsc.is_set(UARTIS::TX) {
608            mask |= InterruptMask::TX_EMPTY;
609        }
610
611        mask
612    }
613
614    fn base_addr(&self) -> usize {
615        self.base.0.as_ptr() as usize
616    }
617
618    fn irq_handler(&mut self) -> Option<Self::IrqHandler> {
619        self.irq.take()
620    }
621
622    fn take_tx(&mut self) -> Option<Self::Sender> {
623        self.task_tx()
624    }
625
626    fn take_rx(&mut self) -> Option<Self::Reciever> {
627        self.task_rx()
628    }
629
630    fn set_tx(&mut self, tx: Self::Sender) -> Result<(), SetBackError> {
631        let tx = match tx {
632            crate::Sender::Pl011Sender(s) => s,
633            _ => {
634                return Err(SetBackError::new(
635                    self.base.0.as_ptr() as _,
636                    0, // 不匹配的发送器类型
637                ));
638            }
639        };
640
641        if self.base != tx.base {
642            return Err(SetBackError::new(
643                self.base.0.as_ptr() as _,
644                tx.base.0.as_ptr() as _,
645            ));
646        }
647
648        self.tx = Some(tx);
649        Ok(())
650    }
651
652    fn set_rx(&mut self, rx: Self::Reciever) -> Result<(), SetBackError> {
653        let rx = match rx {
654            crate::Reciever::Pl011Reciever(r) => r,
655            _ => {
656                return Err(SetBackError::new(
657                    self.base.0.as_ptr() as _,
658                    0, // 不匹配的接收器类型
659                ));
660            }
661        };
662        if self.base != rx.base {
663            return Err(SetBackError::new(
664                self.base.0.as_ptr() as _,
665                rx.base.0.as_ptr() as _,
666            ));
667        }
668        self.rx = Some(rx);
669        Ok(())
670    }
671}
672
673// 额外的便利方法,用于 FIFO 和流控制
674impl Pl011 {
675    /// 启用或禁用 FIFO
676    pub fn enable_fifo(&self, enable: bool) {
677        if enable {
678            self.registers().uartlcr_h.modify(UARTLCR_H::FEN::SET);
679        } else {
680            self.registers().uartlcr_h.modify(UARTLCR_H::FEN::CLEAR);
681        }
682    }
683
684    /// 设置 FIFO 触发级别
685    pub fn set_fifo_trigger_level(&self, rx_level: u8, tx_level: u8) {
686        // PL011 FIFO 触发级别:
687        // 0b000: 1/8 full
688        // 0b001: 1/4 full
689        // 0b010: 1/2 full
690        // 0b011: 3/4 full
691        // 0b100: 7/8 full
692
693        let rx_iflsel = match rx_level {
694            0..=2 => 0b000,  // 1/8
695            3..=4 => 0b001,  // 1/4
696            5..=8 => 0b010,  // 1/2
697            9..=12 => 0b011, // 3/4
698            _ => 0b100,      // 7/8
699        };
700
701        let tx_iflsel = match tx_level {
702            0..=2 => 0b000,  // 1/8
703            3..=4 => 0b001,  // 1/4
704            5..=8 => 0b010,  // 1/2
705            9..=12 => 0b011, // 3/4
706            _ => 0b100,      // 7/8
707        };
708
709        self.registers()
710            .uartifls
711            .write(UARTIFLS::RXIFLSEL.val(rx_iflsel) + UARTIFLS::TXIFLSEL.val(tx_iflsel));
712    }
713}
714
715// ModemStatus 现在在 lib.rs 中定义,这里只是导出