commit ad5c9a1189bfda3f02bf087702be75a31deef32c
parent 3be5b298f3b4b8e47bf173d192b0b00cd9d316b3
Author: Sylvia Ivory <git@sivory.net>
Date: Tue, 17 Feb 2026 22:56:38 -0800
Signal to tools a reboot occured
Diffstat:
2 files changed, 22 insertions(+), 4 deletions(-)
diff --git a/pi/root.zig b/pi/root.zig
@@ -1,6 +1,6 @@
const std = @import("std");
-pub const Scheduler = @import("scheduler.zig");
+pub const Coroutine = @import("coroutine.zig");
pub const PSR = @import("./psr.zig").PSR;
pub const interrupts = @import("./interrupts.zig");
@@ -85,6 +85,8 @@ pub fn reboot() noreturn {
// Prevent any more interrupts
_ = mem.enter_critical_section();
+ // Notify serial that we're done
+ devices.mini_uart.write_byte_sync(0);
// Flush remaining tx
devices.mini_uart.flush();
diff --git a/tools/src/main.rs b/tools/src/main.rs
@@ -1,8 +1,8 @@
use clap::Parser;
use indicatif::ProgressStyle;
-use tokio::io;
+use tokio::io::{self, AsyncReadExt, AsyncWriteExt, ReadHalf, Stdout};
use tokio_serial::{DataBits, FlowControl, Parity, SerialPortBuilderExt, SerialStream, StopBits};
-use tracing::{level_filters::LevelFilter, warn};
+use tracing::{info, level_filters::LevelFilter, warn};
use tracing_indicatif::{
IndicatifLayer,
filter::{IndicatifFilter, hide_indicatif_span_fields},
@@ -43,6 +43,22 @@ fn hex_value(s: &str) -> Result<u32, String> {
u32::from_str_radix(trimmed, 16).map_err(|e| e.to_string())
}
+async fn serial_to_stdout(
+ serial: &mut ReadHalf<SerialStream>,
+ stdout: &mut Stdout,
+) -> io::Result<()> {
+ loop {
+ let byte = serial.read_u8().await?;
+
+ if byte == 0 {
+ info!("pi exited");
+ exit(0);
+ }
+
+ stdout.write_u8(byte).await?;
+ }
+}
+
async fn default_action(port: SerialStream) -> anyhow::Result<()> {
let (mut port_read, mut port_write) = io::split(port);
let mut stdin = io::stdin();
@@ -53,7 +69,7 @@ async fn default_action(port: SerialStream) -> anyhow::Result<()> {
warn!("stdin disconnected, exiting");
exit(0);
},
- _ = io::copy(&mut port_read, &mut stdout) => {
+ _ = serial_to_stdout(&mut port_read, &mut stdout) => {
warn!("serial port disconnected, exiting");
exit(0);
},