Skip to content

Commit 7b52928

Browse files
committed
feat: 重构串口驱动接口,整合 Sender 和 Reciever 特性,优化数据传输逻辑
1 parent 1f16c0c commit 7b52928

File tree

9 files changed

+209
-126
lines changed

9 files changed

+209
-126
lines changed

.cargo/config.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
[target.'cfg(all(target_os = "none"))']
2-
runner = "ostool cargo-test"
2+
# runner = "ostool cargo-test"
3+
runner = "cargo osrun"
34

45
[build]
56
target = "aarch64-unknown-none-softfloat"

.gitignore

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,6 @@
22
/.bare-test.toml
33
/.spec-workflow
44
/CLAUDE.md
5-
/.claude
5+
/.claude
6+
.serena
7+
.qemu*

Cargo.lock

Lines changed: 8 additions & 17 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ heapless = "0.9"
1818
log = "0.4"
1919
mbarrier = "0.1"
2020
# rdif-base = {version = "0.7"}
21-
# rdif-serial = {version = "0.6.0"}
22-
rdif-serial = {path = "C:\\Users\\zhoudongsheng\\Documents\\opensource\\rdrive\\interface\\rdif-serial"}
21+
rdif-serial = {version = "0.6"}
22+
# rdif-serial = {path = "C:\\Users\\zhoudongsheng\\Documents\\opensource\\rdrive\\interface\\rdif-serial"}
2323

2424
thiserror = {version = "2.0", default-features = false}
2525
tock-registers = "0.10"

src/lib.rs

Lines changed: 59 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -60,42 +60,83 @@
6060
pub mod ns16550;
6161
pub mod pl011;
6262

63+
use enum_dispatch::enum_dispatch;
6364
// 重新导出 rdif-serial 的所有类型
6465
pub use rdif_serial::*;
6566

67+
#[enum_dispatch]
6668
pub enum Sender {
6769
#[cfg(target_arch = "x86_64")]
6870
Ns16550Sender(ns16550::Ns16550Sender<ns16550::Port>),
6971
Ns16550MmioSender(ns16550::Ns16550Sender<ns16550::Mmio>),
7072
Pl011Sender(pl011::Pl011Sender),
7173
}
7274

73-
impl Sender {
74-
pub fn write_byte(&mut self, byte: u8) -> bool {
75-
match self {
76-
#[cfg(target_arch = "x86_64")]
77-
Sender::Ns16550Sender(s) => s.write_byte(byte),
78-
Sender::Ns16550MmioSender(s) => s.write_byte(byte),
79-
Sender::Pl011Sender(s) => s.write_byte(byte),
80-
}
81-
}
82-
83-
pub fn write_bytes(&mut self, buffer: &[u8]) -> usize {
84-
match self {
85-
#[cfg(target_arch = "x86_64")]
86-
Sender::Ns16550Sender(s) => s.write_bytes(buffer),
87-
Sender::Ns16550MmioSender(s) => s.write_bytes(buffer),
88-
Sender::Pl011Sender(s) => s.write_bytes(buffer),
75+
#[enum_dispatch(Sender)]
76+
trait RawSender {
77+
fn write_byte(&mut self, byte: u8) -> bool;
78+
fn write_bytes(&mut self, buffer: &[u8]) -> usize {
79+
let mut written = 0;
80+
for &byte in buffer.iter() {
81+
if !self.write_byte(byte) {
82+
break;
83+
}
84+
written += 1;
8985
}
86+
written
9087
}
9188
}
9289

9390
impl TSender for Sender {
9491
fn write_byte(&mut self, byte: u8) -> bool {
95-
self.write_byte(byte)
92+
RawSender::write_byte(self, byte)
9693
}
9794

9895
fn write_bytes(&mut self, buffer: &[u8]) -> usize {
99-
self.write_bytes(buffer)
96+
RawSender::write_bytes(self, buffer)
97+
}
98+
}
99+
100+
#[enum_dispatch]
101+
pub enum Reciever {
102+
#[cfg(target_arch = "x86_64")]
103+
Ns16550Reciever(ns16550::Ns16550Reciever<ns16550::Port>),
104+
Ns16550MmioReciever(ns16550::Ns16550Reciever<ns16550::Mmio>),
105+
Pl011Reciever(pl011::Pl011Reciever),
106+
}
107+
108+
impl TReciever for Reciever {
109+
fn read_byte(&mut self) -> Option<Result<u8, TransferError>> {
110+
RawReciever::read_byte(self)
111+
}
112+
113+
fn read_bytes(&mut self, bytes: &mut [u8]) -> Result<usize, TransBytesError> {
114+
RawReciever::read_bytes(self, bytes)
115+
}
116+
}
117+
118+
#[enum_dispatch(Reciever)]
119+
trait RawReciever {
120+
fn read_byte(&mut self) -> Option<Result<u8, TransferError>>;
121+
122+
fn read_bytes(&mut self, bytes: &mut [u8]) -> Result<usize, TransBytesError> {
123+
let mut read_count = 0;
124+
for byte in bytes.iter_mut() {
125+
match self.read_byte() {
126+
Some(Ok(b)) => {
127+
*byte = b;
128+
}
129+
Some(Err(e)) => {
130+
return Err(TransBytesError {
131+
bytes_transferred: read_count,
132+
kind: e,
133+
});
134+
}
135+
None => break,
136+
}
137+
138+
read_count += 1;
139+
}
140+
Ok(read_count)
100141
}
101142
}

src/ns16550/mmio.rs

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22
//!
33
//! 适用于嵌入式平台的内存映射 IO 版本
44
5-
use rdif_serial::{BSerial, InterfaceRaw, SerialDyn};
5+
use rdif_serial::{BSerial, SerialDyn};
6+
7+
use crate::ns16550::{Ns16550IrqHandler, Ns16550Reciever, Ns16550Sender};
68

79
use super::{Kind, Ns16550};
810
use core::ptr::NonNull;
@@ -35,20 +37,25 @@ impl Kind for Mmio {
3537

3638
impl Ns16550<Mmio> {
3739
pub fn new_mmio(base: NonNull<u8>, clock_freq: u32, reg_width: usize) -> Ns16550<Mmio> {
38-
Ns16550::new(
39-
Mmio {
40-
base: base.as_ptr() as usize,
41-
width: reg_width,
42-
},
40+
let base = Mmio {
41+
base: base.as_ptr() as usize,
42+
width: reg_width,
43+
};
44+
45+
Ns16550 {
46+
base: base.clone(),
4347
clock_freq,
44-
)
48+
irq: Some(Ns16550IrqHandler { base: base.clone() }),
49+
tx: Some(crate::Sender::Ns16550MmioSender(Ns16550Sender {
50+
base: base.clone(),
51+
})),
52+
rx: Some(crate::Reciever::Ns16550MmioReciever(Ns16550Reciever {
53+
base,
54+
})),
55+
}
4556
}
4657

4758
pub fn new_mmio_boxed(base: NonNull<u8>, clock_freq: u32, reg_width: usize) -> BSerial {
4859
SerialDyn::new_boxed(Ns16550::new_mmio(base, clock_freq, reg_width))
4960
}
50-
51-
pub fn take_tx(&mut self) -> Option<crate::Sender> {
52-
self.tx.take().map(crate::Sender::Ns16550MmioSender)
53-
}
5461
}

0 commit comments

Comments
 (0)