Skip to content

Commit 67d4f8c

Browse files
Debug LEDs reflect IRQ count.
1 parent bdf6eec commit 67d4f8c

File tree

1 file changed

+14
-8
lines changed

1 file changed

+14
-8
lines changed

src/main.rs

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -101,8 +101,8 @@ struct Hardware {
101101
spi_bus: hal::Spi<hal::spi::Enabled, pac::SPI0, 8>,
102102
/// Something to perform small delays with. Uses SysTICK.
103103
delay: cortex_m::delay::Delay,
104-
/// Current 5-bit value shown on the debug LEDs
105-
debug_leds: u8,
104+
/// Current 5-bit value shown on the LEDs (including the HDD in bit 0).
105+
led_state: u8,
106106
/// The last CS pin we selected
107107
last_cs: u8,
108108
/// Our keyboard decoder
@@ -114,6 +114,8 @@ struct Hardware {
114114
/// Our last interrupt read from the IO chip. It's inverted, so a bit set
115115
/// means an interrupt is pending on that slot.
116116
interrupts_pending: u8,
117+
/// The number of IRQs we've had
118+
irq_count: u32,
117119
}
118120

119121
/// Flips between true and false so we always send a unique read request
@@ -613,12 +615,13 @@ impl Hardware {
613615
&embedded_hal::spi::MODE_0,
614616
),
615617
delay,
616-
debug_leds: 0,
618+
led_state: 0,
617619
last_cs: 0,
618620
keyboard: pc_keyboard::Keyboard::new(pc_keyboard::HandleControl::Ignore),
619621
event_queue: heapless::Deque::new(),
620622
bmc_buffer: [0u8; 64],
621623
interrupts_pending: 0,
624+
irq_count: 0,
622625
},
623626
hal_pins.gpio20.into_pull_up_input(),
624627
)
@@ -697,17 +700,17 @@ impl Hardware {
697700
fn set_debug_leds(&mut self, leds: u8) {
698701
// LEDs are active-low.
699702
let leds = (leds ^ 0xFF) & 0xF;
700-
self.debug_leds = leds << 1 | (self.debug_leds & 1);
701-
self.io_chip_write(0x12, self.debug_leds << 3 | self.last_cs);
703+
self.led_state = leds << 1 | (self.led_state & 1);
704+
self.io_chip_write(0x12, self.led_state << 3 | self.last_cs);
702705
}
703706

704707
/// Set the HDD LED on the PCB.
705708
///
706709
/// These are connected to the bit 4 of GPIOA on the MCP23S17.
707710
fn set_hdd_led(&mut self, enabled: bool) {
708711
// LEDs are active-low.
709-
self.debug_leds = (self.debug_leds & 0x1e) | if enabled { 0 } else { 1 };
710-
self.io_chip_write(0x12, self.debug_leds << 3 | self.last_cs);
712+
self.led_state = (self.led_state & 0x1e) | if enabled { 0 } else { 1 };
713+
self.io_chip_write(0x12, self.led_state << 3 | self.last_cs);
711714
}
712715

713716
/// Perform some SPI transaction with a specific bus chip-select pin active.
@@ -723,7 +726,7 @@ impl Hardware {
723726

724727
if cs != self.last_cs {
725728
// Set CS Outputs into decoder/buffer
726-
self.io_chip_write(0x12, self.debug_leds << 3 | cs);
729+
self.io_chip_write(0x12, self.led_state << 3 | cs);
727730
self.last_cs = cs;
728731
}
729732

@@ -806,6 +809,9 @@ impl Hardware {
806809
// The IO chip reports 0 for pending, 1 for not pending.
807810
self.interrupts_pending = self.io_read_interrupts() ^ 0xFF;
808811
defmt::info!("Interrupts: 0b{:08b}", self.interrupts_pending);
812+
// Change the debug LEDs so we can see the interrupts
813+
self.irq_count = self.irq_count.wrapping_add(1);
814+
self.set_debug_leds((self.irq_count & 0x0F) as u8);
809815
}
810816
}
811817

0 commit comments

Comments
 (0)