@@ -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