@@ -70,8 +70,15 @@ module mkMinibarMiscRegs #(Integer pg_timeout_ms) (MinibarMiscRegs);
7070 Reg # ( PowerCtrl) power_control < - mkReg( defaultValue) ;
7171 Reg # ( SwitchResetCtrl) switch_reset_ctrl < - mkReg( defaultValue) ;
7272
73- // Apply a 100ms debouncer to the button presses
74- Debouncer# ( 100 , 100 , Bit # ( 1 )) power_button < - mkDebouncer( 0 ) ;
73+ // The intention behind the power button is for it to provide a normal PC-like behavior. When
74+ // power is disabled, a short press can turn power on. We define this as 100ms just to get some
75+ // debouncing applied. When power is enabled, a user must intentionally press and hold the
76+ // button for a longer period (2000ms) to get the system to disable power.
77+ Wire # ( Bit # ( 1 )) power_button_raw < - mkDWire( 0 ) ;
78+ Debouncer# ( 100 , 100 , Bit # ( 1 )) power_button_short < - mkDebouncer( 0 ) ;
79+ Debouncer# ( 2000 , 2000 , Bit # ( 1 )) power_button_long < - mkDebouncer( 0 ) ;
80+ mkConnection( power_button_short._write, power_button_raw._read) ;
81+ mkConnection( power_button_long._write, power_button_raw._read) ;
7582
7683 // VBUS rail under FPGA control
7784 PowerRail# ( 10 ) vbus_rail < - mkPowerRailDisableOnAbort( pg_timeout_ms) ;
@@ -82,16 +89,19 @@ module mkMinibarMiscRegs #(Integer pg_timeout_ms) (MinibarMiscRegs);
8289 (* fire_when_enabled *)
8390 rule do_tick ( tick) ;
8491 vbus_rail.send() ;
85- power_button.send() ;
92+ power_button_short.send() ;
93+ power_button_long.send() ;
8694 endrule
8795
8896 (* fire_when_enabled *)
8997 rule do_power_control;
90- let toggle_power = power_button.rising_edge() ;
9198 let sw_enable = new_sw_vbus_en && power_control.vbus_sled_en == 1 ;
9299 let sw_disable = new_sw_vbus_en && power_control.vbus_sled_en == 0 ;
93- let disable_power = sw_disable || vbus_rail.timed_out() || vbus_rail.aborted() || ( toggle_power && vbus_en_r) ;
94- let enable_power = ! vbus_en_r && ( sw_enable || toggle_power) ;
100+ let disable_power = sw_disable ||
101+ vbus_rail.timed_out() ||
102+ vbus_rail.aborted() ||
103+ ( power_button_long.rising_edge() && vbus_en_r) ;
104+ let enable_power = ! vbus_en_r && ( sw_enable || power_button_short.rising_edge()) ;
95105
96106 if ( enable_power) begin
97107 vbus_rail.set_enable( True ) ;
@@ -115,7 +125,7 @@ module mkMinibarMiscRegs #(Integer pg_timeout_ms) (MinibarMiscRegs);
115125 interface Pins pins;
116126 method vbus_sys_fault = vbus_sys_fault_r._write;
117127 method hcv_code = hcv_code_r._write;
118- method power_button = power_button ._write;
128+ method power_button = power_button_raw ._write;
119129 method pcie_con_present = pcie_con_present._write;
120130 method rsw0_con_present = rsw0_con_present._write;
121131 method rsw1_con_present = rsw1_con_present._write;
0 commit comments