Skip to content

Commit ba03a69

Browse files
minibar: make power button PC-like (#423)
The intention behind the power button is for it to provide a normal PC-like behavior. When power is disabled, a short press can turn power on. When power is enabled, a user must intentionally press and hold the button for a longer period (2 seconds) to get the system to disable power. fixes #422
1 parent b442d2d commit ba03a69

File tree

1 file changed

+17
-7
lines changed

1 file changed

+17
-7
lines changed

hdl/projects/minibar/MinibarMiscRegs.bsv

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)