diff --git a/06_drivers_gpio_uart/README.md b/06_drivers_gpio_uart/README.md index 1e392920..a8102c5d 100644 --- a/06_drivers_gpio_uart/README.md +++ b/06_drivers_gpio_uart/README.md @@ -275,7 +275,7 @@ diff -uNr 05_safe_globals/src/bsp/driver/bcm/bcm2xxx_gpio.rs 06_drivers_gpio_uar diff -uNr 05_safe_globals/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs 06_drivers_gpio_uart/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs --- 05_safe_globals/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs +++ 06_drivers_gpio_uart/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs -@@ -0,0 +1,307 @@ +@@ -0,0 +1,317 @@ +// SPDX-License-Identifier: MIT OR Apache-2.0 +// +// Copyright (c) 2018-2019 Andre Richter @@ -408,6 +408,7 @@ diff -uNr 05_safe_globals/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs 06_drivers_gp +pub struct PL011UartInner { + base_addr: usize, + chars_written: usize, ++ chars_read: usize, +} + +/// Deref to RegisterBlock. @@ -433,6 +434,7 @@ diff -uNr 05_safe_globals/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs 06_drivers_gp + PL011UartInner { + base_addr, + chars_written: 0, ++ chars_read: 0, + } + } + @@ -572,6 +574,9 @@ diff -uNr 05_safe_globals/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs 06_drivers_gp + ret = '\n' + } + ++ // Update statistics. ++ inner.chars_read += 1; ++ + ret + }) + } @@ -582,6 +587,11 @@ diff -uNr 05_safe_globals/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs 06_drivers_gp + let mut r = &self.inner; + r.lock(|inner| inner.chars_written) + } ++ ++ fn chars_read(&self) -> usize { ++ let mut r = &self.inner; ++ r.lock(|inner| inner.chars_read) ++ } +} diff -uNr 05_safe_globals/src/bsp/driver/bcm.rs 06_drivers_gpio_uart/src/bsp/driver/bcm.rs diff --git a/06_drivers_gpio_uart/kernel b/06_drivers_gpio_uart/kernel index c909017d..a47912c1 100755 Binary files a/06_drivers_gpio_uart/kernel and b/06_drivers_gpio_uart/kernel differ diff --git a/06_drivers_gpio_uart/kernel8.img b/06_drivers_gpio_uart/kernel8.img index 41d1e853..13c1365f 100755 Binary files a/06_drivers_gpio_uart/kernel8.img and b/06_drivers_gpio_uart/kernel8.img differ diff --git a/06_drivers_gpio_uart/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs b/06_drivers_gpio_uart/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs index fbe8b849..75cf42ca 100644 --- a/06_drivers_gpio_uart/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs +++ b/06_drivers_gpio_uart/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs @@ -130,6 +130,7 @@ register_structs! { pub struct PL011UartInner { base_addr: usize, chars_written: usize, + chars_read: usize, } /// Deref to RegisterBlock. @@ -155,6 +156,7 @@ impl PL011UartInner { PL011UartInner { base_addr, chars_written: 0, + chars_read: 0, } } @@ -294,6 +296,9 @@ impl interface::console::Read for PL011Uart { ret = '\n' } + // Update statistics. + inner.chars_read += 1; + ret }) } @@ -304,4 +309,9 @@ impl interface::console::Statistics for PL011Uart { let mut r = &self.inner; r.lock(|inner| inner.chars_written) } + + fn chars_read(&self) -> usize { + let mut r = &self.inner; + r.lock(|inner| inner.chars_read) + } } diff --git a/07_uart_chainloader/README.md b/07_uart_chainloader/README.md index b90022e4..a83811f3 100644 --- a/07_uart_chainloader/README.md +++ b/07_uart_chainloader/README.md @@ -162,7 +162,7 @@ diff -uNr 06_drivers_gpio_uart/src/arch/aarch64.rs 07_uart_chainloader/src/arch/ diff -uNr 06_drivers_gpio_uart/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs 07_uart_chainloader/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs --- 06_drivers_gpio_uart/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs +++ 07_uart_chainloader/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs -@@ -275,6 +275,16 @@ +@@ -277,6 +277,16 @@ let mut r = &self.inner; r.lock(|inner| fmt::Write::write_fmt(inner, args)) } @@ -179,27 +179,34 @@ diff -uNr 06_drivers_gpio_uart/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs 07_uart_ } impl interface::console::Read for PL011Uart { -@@ -287,14 +297,17 @@ +@@ -288,18 +298,21 @@ + arch::nop(); } - // Read one character. +- // Read one character. - let mut ret = inner.DR.get() as u8 as char; -+ inner.DR.get() as u8 as char -+ }) -+ } - +- - // Convert carrige return to newline. - if ret == '\r' { - ret = '\n' +- } +- + // Update statistics. + inner.chars_read += 1; + +- ret ++ // Read one character. ++ inner.DR.get() as u8 as char ++ }) ++ } ++ + fn clear(&self) { + let mut r = &self.inner; + r.lock(|inner| { + // Read from the RX FIFO until it is indicating empty. + while !inner.FR.matches_all(FR::RXFE::SET) { + inner.DR.get(); - } -- -- ret ++ } }) } } diff --git a/07_uart_chainloader/kernel b/07_uart_chainloader/kernel index 04602d52..f5f3302e 100755 Binary files a/07_uart_chainloader/kernel and b/07_uart_chainloader/kernel differ diff --git a/07_uart_chainloader/kernel8.img b/07_uart_chainloader/kernel8.img index 654ac5b8..7100654b 100755 Binary files a/07_uart_chainloader/kernel8.img and b/07_uart_chainloader/kernel8.img differ diff --git a/07_uart_chainloader/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs b/07_uart_chainloader/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs index c9988e47..64bfdf55 100644 --- a/07_uart_chainloader/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs +++ b/07_uart_chainloader/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs @@ -130,6 +130,7 @@ register_structs! { pub struct PL011UartInner { base_addr: usize, chars_written: usize, + chars_read: usize, } /// Deref to RegisterBlock. @@ -155,6 +156,7 @@ impl PL011UartInner { PL011UartInner { base_addr, chars_written: 0, + chars_read: 0, } } @@ -296,6 +298,9 @@ impl interface::console::Read for PL011Uart { arch::nop(); } + // Update statistics. + inner.chars_read += 1; + // Read one character. inner.DR.get() as u8 as char }) @@ -317,4 +322,9 @@ impl interface::console::Statistics for PL011Uart { let mut r = &self.inner; r.lock(|inner| inner.chars_written) } + + fn chars_read(&self) -> usize { + let mut r = &self.inner; + r.lock(|inner| inner.chars_read) + } } diff --git a/08_timestamps/README.md b/08_timestamps/README.md index 9f83e5d0..63de0ef8 100644 --- a/08_timestamps/README.md +++ b/08_timestamps/README.md @@ -235,11 +235,11 @@ diff -uNr 07_uart_chainloader/src/arch/aarch64.rs 08_timestamps/src/arch/aarch64 diff -uNr 07_uart_chainloader/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs 08_timestamps/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs --- 07_uart_chainloader/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs +++ 08_timestamps/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs -@@ -297,7 +297,14 @@ +@@ -298,11 +298,18 @@ + arch::nop(); } - // Read one character. -- inner.DR.get() as u8 as char ++ // Read one character. + let mut ret = inner.DR.get() as u8 as char; + + // Convert carrige return to newline. @@ -247,6 +247,11 @@ diff -uNr 07_uart_chainloader/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs 08_timest + ret = '\n' + } + + // Update statistics. + inner.chars_read += 1; + +- // Read one character. +- inner.DR.get() as u8 as char + ret }) } diff --git a/08_timestamps/kernel b/08_timestamps/kernel index 396f84df..607e52ee 100755 Binary files a/08_timestamps/kernel and b/08_timestamps/kernel differ diff --git a/08_timestamps/kernel8.img b/08_timestamps/kernel8.img index a30cd440..90f0a6f7 100755 Binary files a/08_timestamps/kernel8.img and b/08_timestamps/kernel8.img differ diff --git a/08_timestamps/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs b/08_timestamps/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs index 78471c3d..f55b36f4 100644 --- a/08_timestamps/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs +++ b/08_timestamps/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs @@ -130,6 +130,7 @@ register_structs! { pub struct PL011UartInner { base_addr: usize, chars_written: usize, + chars_read: usize, } /// Deref to RegisterBlock. @@ -155,6 +156,7 @@ impl PL011UartInner { PL011UartInner { base_addr, chars_written: 0, + chars_read: 0, } } @@ -304,6 +306,9 @@ impl interface::console::Read for PL011Uart { ret = '\n' } + // Update statistics. + inner.chars_read += 1; + ret }) } @@ -324,4 +329,9 @@ impl interface::console::Statistics for PL011Uart { let mut r = &self.inner; r.lock(|inner| inner.chars_written) } + + fn chars_read(&self) -> usize { + let mut r = &self.inner; + r.lock(|inner| inner.chars_read) + } } diff --git a/09_hw_debug_JTAG/kernel b/09_hw_debug_JTAG/kernel index 396f84df..607e52ee 100755 Binary files a/09_hw_debug_JTAG/kernel and b/09_hw_debug_JTAG/kernel differ diff --git a/09_hw_debug_JTAG/kernel8.img b/09_hw_debug_JTAG/kernel8.img index a30cd440..90f0a6f7 100755 Binary files a/09_hw_debug_JTAG/kernel8.img and b/09_hw_debug_JTAG/kernel8.img differ diff --git a/09_hw_debug_JTAG/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs b/09_hw_debug_JTAG/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs index 78471c3d..f55b36f4 100644 --- a/09_hw_debug_JTAG/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs +++ b/09_hw_debug_JTAG/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs @@ -130,6 +130,7 @@ register_structs! { pub struct PL011UartInner { base_addr: usize, chars_written: usize, + chars_read: usize, } /// Deref to RegisterBlock. @@ -155,6 +156,7 @@ impl PL011UartInner { PL011UartInner { base_addr, chars_written: 0, + chars_read: 0, } } @@ -304,6 +306,9 @@ impl interface::console::Read for PL011Uart { ret = '\n' } + // Update statistics. + inner.chars_read += 1; + ret }) } @@ -324,4 +329,9 @@ impl interface::console::Statistics for PL011Uart { let mut r = &self.inner; r.lock(|inner| inner.chars_written) } + + fn chars_read(&self) -> usize { + let mut r = &self.inner; + r.lock(|inner| inner.chars_read) + } } diff --git a/10_privilege_level/kernel b/10_privilege_level/kernel index e7d4ff70..724b7996 100755 Binary files a/10_privilege_level/kernel and b/10_privilege_level/kernel differ diff --git a/10_privilege_level/kernel8.img b/10_privilege_level/kernel8.img index c6083a21..4170533b 100755 Binary files a/10_privilege_level/kernel8.img and b/10_privilege_level/kernel8.img differ diff --git a/10_privilege_level/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs b/10_privilege_level/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs index 78471c3d..f55b36f4 100644 --- a/10_privilege_level/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs +++ b/10_privilege_level/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs @@ -130,6 +130,7 @@ register_structs! { pub struct PL011UartInner { base_addr: usize, chars_written: usize, + chars_read: usize, } /// Deref to RegisterBlock. @@ -155,6 +156,7 @@ impl PL011UartInner { PL011UartInner { base_addr, chars_written: 0, + chars_read: 0, } } @@ -304,6 +306,9 @@ impl interface::console::Read for PL011Uart { ret = '\n' } + // Update statistics. + inner.chars_read += 1; + ret }) } @@ -324,4 +329,9 @@ impl interface::console::Statistics for PL011Uart { let mut r = &self.inner; r.lock(|inner| inner.chars_written) } + + fn chars_read(&self) -> usize { + let mut r = &self.inner; + r.lock(|inner| inner.chars_read) + } } diff --git a/11_virtual_memory/kernel b/11_virtual_memory/kernel index c3beb798..f985a39f 100755 Binary files a/11_virtual_memory/kernel and b/11_virtual_memory/kernel differ diff --git a/11_virtual_memory/kernel8.img b/11_virtual_memory/kernel8.img index e43670e0..c580450e 100755 Binary files a/11_virtual_memory/kernel8.img and b/11_virtual_memory/kernel8.img differ diff --git a/11_virtual_memory/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs b/11_virtual_memory/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs index 78471c3d..f55b36f4 100644 --- a/11_virtual_memory/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs +++ b/11_virtual_memory/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs @@ -130,6 +130,7 @@ register_structs! { pub struct PL011UartInner { base_addr: usize, chars_written: usize, + chars_read: usize, } /// Deref to RegisterBlock. @@ -155,6 +156,7 @@ impl PL011UartInner { PL011UartInner { base_addr, chars_written: 0, + chars_read: 0, } } @@ -304,6 +306,9 @@ impl interface::console::Read for PL011Uart { ret = '\n' } + // Update statistics. + inner.chars_read += 1; + ret }) } @@ -324,4 +329,9 @@ impl interface::console::Statistics for PL011Uart { let mut r = &self.inner; r.lock(|inner| inner.chars_written) } + + fn chars_read(&self) -> usize { + let mut r = &self.inner; + r.lock(|inner| inner.chars_read) + } } diff --git a/12_cpu_exceptions_part1/kernel b/12_cpu_exceptions_part1/kernel index c76e4826..4eb5b9d8 100755 Binary files a/12_cpu_exceptions_part1/kernel and b/12_cpu_exceptions_part1/kernel differ diff --git a/12_cpu_exceptions_part1/kernel8.img b/12_cpu_exceptions_part1/kernel8.img index 15eda3f2..8cbf744e 100755 Binary files a/12_cpu_exceptions_part1/kernel8.img and b/12_cpu_exceptions_part1/kernel8.img differ diff --git a/12_cpu_exceptions_part1/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs b/12_cpu_exceptions_part1/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs index 78471c3d..f55b36f4 100644 --- a/12_cpu_exceptions_part1/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs +++ b/12_cpu_exceptions_part1/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs @@ -130,6 +130,7 @@ register_structs! { pub struct PL011UartInner { base_addr: usize, chars_written: usize, + chars_read: usize, } /// Deref to RegisterBlock. @@ -155,6 +156,7 @@ impl PL011UartInner { PL011UartInner { base_addr, chars_written: 0, + chars_read: 0, } } @@ -304,6 +306,9 @@ impl interface::console::Read for PL011Uart { ret = '\n' } + // Update statistics. + inner.chars_read += 1; + ret }) } @@ -324,4 +329,9 @@ impl interface::console::Statistics for PL011Uart { let mut r = &self.inner; r.lock(|inner| inner.chars_written) } + + fn chars_read(&self) -> usize { + let mut r = &self.inner; + r.lock(|inner| inner.chars_read) + } } diff --git a/X1_JTAG_boot/jtag_boot_rpi3.img b/X1_JTAG_boot/jtag_boot_rpi3.img index 68143d6f..22167eed 100755 Binary files a/X1_JTAG_boot/jtag_boot_rpi3.img and b/X1_JTAG_boot/jtag_boot_rpi3.img differ diff --git a/X1_JTAG_boot/jtag_boot_rpi4.img b/X1_JTAG_boot/jtag_boot_rpi4.img index ccb1ed02..2ed1c91f 100755 Binary files a/X1_JTAG_boot/jtag_boot_rpi4.img and b/X1_JTAG_boot/jtag_boot_rpi4.img differ diff --git a/X1_JTAG_boot/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs b/X1_JTAG_boot/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs index 78471c3d..f55b36f4 100644 --- a/X1_JTAG_boot/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs +++ b/X1_JTAG_boot/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs @@ -130,6 +130,7 @@ register_structs! { pub struct PL011UartInner { base_addr: usize, chars_written: usize, + chars_read: usize, } /// Deref to RegisterBlock. @@ -155,6 +156,7 @@ impl PL011UartInner { PL011UartInner { base_addr, chars_written: 0, + chars_read: 0, } } @@ -304,6 +306,9 @@ impl interface::console::Read for PL011Uart { ret = '\n' } + // Update statistics. + inner.chars_read += 1; + ret }) } @@ -324,4 +329,9 @@ impl interface::console::Statistics for PL011Uart { let mut r = &self.inner; r.lock(|inner| inner.chars_written) } + + fn chars_read(&self) -> usize { + let mut r = &self.inner; + r.lock(|inner| inner.chars_read) + } }