Skip to content

Commit 7144572

Browse files
authored
Merge pull request #1891 from hermit-os/embedded-io
refactor(io): use embedded-io traits
2 parents 65e25be + 359036c commit 7144572

File tree

19 files changed

+409
-326
lines changed

19 files changed

+409
-326
lines changed

Cargo.lock

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

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ bitflags = "2"
117117
build-time = "0.1.3"
118118
cfg-if = "1"
119119
crossbeam-utils = { version = "0.8", default-features = false }
120+
embedded-io = "0.6"
120121
enum_dispatch = "0.3"
121122
fdt = { version = "0.1", features = ["pretty-printing"] }
122123
free-list = "0.3"

src/arch/aarch64/kernel/serial.rs

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
use core::arch::asm;
2-
use core::mem::MaybeUninit;
2+
3+
use embedded_io::{ErrorType, Read, ReadReady, Write};
4+
5+
use crate::errno::Errno;
36

47
pub(crate) struct SerialDevice {
58
pub addr: u32,
@@ -15,8 +18,27 @@ impl SerialDevice {
1518

1619
Self { addr: base as u32 }
1720
}
21+
}
22+
23+
impl ErrorType for SerialDevice {
24+
type Error = Errno;
25+
}
26+
27+
impl Read for SerialDevice {
28+
fn read(&mut self, buf: &mut [u8]) -> Result<usize, Self::Error> {
29+
let _ = buf;
30+
Ok(0)
31+
}
32+
}
1833

19-
pub fn write(&self, buf: &[u8]) {
34+
impl ReadReady for SerialDevice {
35+
fn read_ready(&mut self) -> Result<bool, Self::Error> {
36+
Ok(false)
37+
}
38+
}
39+
40+
impl Write for SerialDevice {
41+
fn write(&mut self, buf: &[u8]) -> Result<usize, Self::Error> {
2042
let port = core::ptr::with_exposed_provenance_mut::<u8>(self.addr as usize);
2143
for &byte in buf {
2244
// LF newline characters need to be extended to CRLF over a real serial port.
@@ -40,13 +62,11 @@ impl SerialDevice {
4062
);
4163
}
4264
}
43-
}
4465

45-
pub fn read(&self, _buf: &mut [MaybeUninit<u8>]) -> crate::io::Result<usize> {
46-
Ok(0)
66+
Ok(buf.len())
4767
}
4868

49-
pub fn can_read(&self) -> bool {
50-
false
69+
fn flush(&mut self) -> Result<(), Self::Error> {
70+
Ok(())
5171
}
5272
}

src/arch/riscv64/kernel/serial.rs

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,42 @@
1-
use core::mem::MaybeUninit;
1+
use embedded_io::{ErrorType, Read, ReadReady, Write};
2+
3+
use crate::errno::Errno;
24

35
pub(crate) struct SerialDevice;
46

57
impl SerialDevice {
68
pub fn new() -> Self {
79
Self {}
810
}
11+
}
12+
13+
impl ErrorType for SerialDevice {
14+
type Error = Errno;
15+
}
916

10-
pub fn write(&self, buf: &[u8]) {
17+
impl Read for SerialDevice {
18+
fn read(&mut self, buf: &mut [u8]) -> Result<usize, Self::Error> {
19+
let _ = buf;
20+
Ok(0)
21+
}
22+
}
23+
24+
impl ReadReady for SerialDevice {
25+
fn read_ready(&mut self) -> Result<bool, Self::Error> {
26+
Ok(false)
27+
}
28+
}
29+
30+
impl Write for SerialDevice {
31+
fn write(&mut self, buf: &[u8]) -> Result<usize, Self::Error> {
1132
for byte in buf {
1233
sbi_rt::console_write_byte(*byte);
1334
}
14-
}
1535

16-
pub fn read(&self, _buf: &mut [MaybeUninit<u8>]) -> crate::io::Result<usize> {
17-
Ok(0)
36+
Ok(buf.len())
1837
}
1938

20-
pub fn can_read(&self) -> bool {
21-
false
39+
fn flush(&mut self) -> Result<(), Self::Error> {
40+
Ok(())
2241
}
2342
}

src/arch/x86_64/kernel/serial.rs

Lines changed: 30 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
use alloc::collections::VecDeque;
22
use alloc::vec::Vec;
3-
use core::mem::MaybeUninit;
43

4+
use embedded_io::{ErrorType, Read, ReadReady, Write};
55
use hermit_sync::{InterruptTicketMutex, Lazy};
66

77
#[cfg(feature = "pci")]
88
use crate::arch::x86_64::kernel::interrupts;
99
#[cfg(feature = "pci")]
1010
use crate::drivers::InterruptLine;
11+
use crate::errno::Errno;
1112

1213
#[cfg(feature = "pci")]
1314
const SERIAL_IRQ: u8 = 4;
@@ -43,29 +44,46 @@ impl SerialDevice {
4344
pub fn new() -> Self {
4445
Self {}
4546
}
47+
}
4648

47-
pub fn write(&self, buf: &[u8]) {
48-
let mut guard = UART_DEVICE.lock();
49-
50-
for &data in buf {
51-
guard.uart.send(data);
52-
}
53-
}
49+
impl ErrorType for SerialDevice {
50+
type Error = Errno;
51+
}
5452

55-
pub fn read(&self, buf: &mut [MaybeUninit<u8>]) -> crate::io::Result<usize> {
53+
impl Read for SerialDevice {
54+
fn read(&mut self, buf: &mut [u8]) -> Result<usize, Self::Error> {
5655
let mut guard = UART_DEVICE.lock();
5756
if guard.buffer.is_empty() {
5857
Ok(0)
5958
} else {
6059
let min = core::cmp::min(buf.len(), guard.buffer.len());
6160
let drained = guard.buffer.drain(..min).collect::<Vec<_>>();
62-
buf[..min].write_copy_of_slice(drained.as_slice());
61+
buf[..min].copy_from_slice(drained.as_slice());
6362
Ok(min)
6463
}
6564
}
65+
}
66+
67+
impl ReadReady for SerialDevice {
68+
fn read_ready(&mut self) -> Result<bool, Self::Error> {
69+
let read_ready = !UART_DEVICE.lock().buffer.is_empty();
70+
Ok(read_ready)
71+
}
72+
}
73+
74+
impl Write for SerialDevice {
75+
fn write(&mut self, buf: &[u8]) -> Result<usize, Self::Error> {
76+
let mut guard = UART_DEVICE.lock();
77+
78+
for &data in buf {
79+
guard.uart.send(data);
80+
}
81+
82+
Ok(buf.len())
83+
}
6684

67-
pub fn can_read(&self) -> bool {
68-
!UART_DEVICE.lock().buffer.is_empty()
85+
fn flush(&mut self) -> Result<(), Self::Error> {
86+
Ok(())
6987
}
7088
}
7189

0 commit comments

Comments
 (0)