diff --git a/src/board/system76/darp5/acpi.c b/src/board/system76/darp5/acpi.c index a67a144..b92aa27 100644 --- a/src/board/system76/darp5/acpi.c +++ b/src/board/system76/darp5/acpi.c @@ -1,11 +1,10 @@ #include #include #include +#include #include #include -extern bool lid_wake; - extern uint8_t sci_extra; uint8_t fcmd = 0; diff --git a/src/board/system76/darp5/include/board/lid.h b/src/board/system76/darp5/include/board/lid.h new file mode 100644 index 0000000..90ad66a --- /dev/null +++ b/src/board/system76/darp5/include/board/lid.h @@ -0,0 +1,11 @@ +#ifndef _BOARD_LID_H +#define _BOARD_LID_H + +#include + +extern bool lid_state; +extern bool lid_wake; + +void lid_event(void); + +#endif // _BOARD_LID_H diff --git a/src/board/system76/darp5/lid.c b/src/board/system76/darp5/lid.c new file mode 100644 index 0000000..4c11ae4 --- /dev/null +++ b/src/board/system76/darp5/lid.c @@ -0,0 +1,45 @@ +#include +#include +#include +#include +#include + +bool lid_state = true; +bool lid_wake = false; + +void lid_event(void) { + static bool send_sci = true; + + // Check if the lid switch has changed + bool new = gpio_get(&LID_SW_N); + if (new != lid_state) { + DEBUG("Lid "); + if (new) { + DEBUG("open\n"); + + if (lid_wake) { + gpio_set(&SWI_N, false); + + //TODO: find correct delay + delay_ticks(10); + + gpio_set(&SWI_N, true); + + lid_wake = false; + } + } else { + DEBUG("closed\n"); + } + + // Send SCI + send_sci = true; + } + lid_state = new; + + if (send_sci) { + // Send SCI 0x1B for lid event + if (pmc_sci(&PMC_1, 0x1B)) { + send_sci = false; + } + } +} diff --git a/src/board/system76/darp5/main.c b/src/board/system76/darp5/main.c index 623ef8f..3b3a8df 100644 --- a/src/board/system76/darp5/main.c +++ b/src/board/system76/darp5/main.c @@ -1,6 +1,4 @@ #include <8051.h> -#include -#include #include #include @@ -12,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -66,47 +65,6 @@ void touchpad_event(struct Ps2 * ps2) { } } -bool lid_wake = false; -void lid_event(void) { - static bool send_sci = true; - static bool last = true; - - // Check if the adapter line goes low - bool new = gpio_get(&LID_SW_N); - // If there has been a change, print - if (new != last) { - DEBUG("Lid "); - if (new) { - DEBUG("open\n"); - - if (lid_wake) { - gpio_set(&SWI_N, false); - - //TODO: find correct delay - delay_ticks(10); - - gpio_set(&SWI_N, true); - - lid_wake = false; - } - } else { - DEBUG("closed\n"); - } - - // Send SCI - send_sci = true; - } - - if (send_sci) { - // Send SCI 0x1B for lid event - if (pmc_sci(&PMC_1, 0x1B)) { - send_sci = false; - } - } - - last = new; -} - void main(void) { init(); diff --git a/src/board/system76/darp5/power.c b/src/board/system76/darp5/power.c index 38f1e06..daeb04b 100644 --- a/src/board/system76/darp5/power.c +++ b/src/board/system76/darp5/power.c @@ -2,6 +2,7 @@ #include #include #include +#include #include #include #include @@ -207,6 +208,10 @@ void power_event(void) { // Read power switch state static bool ps_last = true; bool ps_new = gpio_get(&PWR_SW_N); + // Disable power button if lid is closed and AC is disconnected + if (!lid_state && ac_last) { + ps_new = true; + } if (!ps_new && ps_last) { // Ensure press is not spurious delay_ms(10); diff --git a/src/board/system76/galp3-c/acpi.c b/src/board/system76/galp3-c/acpi.c index 62b9799..a5de1d4 100644 --- a/src/board/system76/galp3-c/acpi.c +++ b/src/board/system76/galp3-c/acpi.c @@ -2,11 +2,10 @@ #include #include #include +#include #include #include -extern bool lid_wake; - extern uint8_t sci_extra; static uint8_t fcmd = 0; diff --git a/src/board/system76/galp3-c/lid.c b/src/board/system76/galp3-c/lid.c new file mode 100644 index 0000000..4c11ae4 --- /dev/null +++ b/src/board/system76/galp3-c/lid.c @@ -0,0 +1,45 @@ +#include +#include +#include +#include +#include + +bool lid_state = true; +bool lid_wake = false; + +void lid_event(void) { + static bool send_sci = true; + + // Check if the lid switch has changed + bool new = gpio_get(&LID_SW_N); + if (new != lid_state) { + DEBUG("Lid "); + if (new) { + DEBUG("open\n"); + + if (lid_wake) { + gpio_set(&SWI_N, false); + + //TODO: find correct delay + delay_ticks(10); + + gpio_set(&SWI_N, true); + + lid_wake = false; + } + } else { + DEBUG("closed\n"); + } + + // Send SCI + send_sci = true; + } + lid_state = new; + + if (send_sci) { + // Send SCI 0x1B for lid event + if (pmc_sci(&PMC_1, 0x1B)) { + send_sci = false; + } + } +} diff --git a/src/board/system76/galp3-c/main.c b/src/board/system76/galp3-c/main.c index a8f4ede..81418d6 100644 --- a/src/board/system76/galp3-c/main.c +++ b/src/board/system76/galp3-c/main.c @@ -1,6 +1,4 @@ #include <8051.h> -#include -#include #include #include @@ -13,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -68,47 +67,6 @@ void touchpad_event(struct Ps2 * ps2) { } } -bool lid_wake = false; -void lid_event(void) { - static bool send_sci = true; - static bool last = true; - - // Check if the adapter line goes low - bool new = gpio_get(&LID_SW_N); - // If there has been a change, print - if (new != last) { - DEBUG("Lid "); - if (new) { - DEBUG("open\n"); - - if (lid_wake) { - gpio_set(&SWI_N, false); - - //TODO: find correct delay - delay_ticks(10); - - gpio_set(&SWI_N, true); - - lid_wake = false; - } - } else { - DEBUG("closed\n"); - } - - // Send SCI - send_sci = true; - } - - if (send_sci) { - // Send SCI 0x1B for lid event - if (pmc_sci(&PMC_1, 0x1B)) { - send_sci = false; - } - } - - last = new; -} - void main(void) { init(); diff --git a/src/board/system76/galp3-c/power.c b/src/board/system76/galp3-c/power.c index 38f1e06..daeb04b 100644 --- a/src/board/system76/galp3-c/power.c +++ b/src/board/system76/galp3-c/power.c @@ -2,6 +2,7 @@ #include #include #include +#include #include #include #include @@ -207,6 +208,10 @@ void power_event(void) { // Read power switch state static bool ps_last = true; bool ps_new = gpio_get(&PWR_SW_N); + // Disable power button if lid is closed and AC is disconnected + if (!lid_state && ac_last) { + ps_new = true; + } if (!ps_new && ps_last) { // Ensure press is not spurious delay_ms(10); diff --git a/src/board/system76/lemp9/acpi.c b/src/board/system76/lemp9/acpi.c index c78dcd7..af20aad 100644 --- a/src/board/system76/lemp9/acpi.c +++ b/src/board/system76/lemp9/acpi.c @@ -2,11 +2,10 @@ #include #include #include +#include #include #include -extern bool lid_wake; - extern uint8_t sci_extra; static uint8_t fcmd = 0; diff --git a/src/board/system76/lemp9/include/board/lid.h b/src/board/system76/lemp9/include/board/lid.h new file mode 100644 index 0000000..90ad66a --- /dev/null +++ b/src/board/system76/lemp9/include/board/lid.h @@ -0,0 +1,11 @@ +#ifndef _BOARD_LID_H +#define _BOARD_LID_H + +#include + +extern bool lid_state; +extern bool lid_wake; + +void lid_event(void); + +#endif // _BOARD_LID_H diff --git a/src/board/system76/lemp9/lid.c b/src/board/system76/lemp9/lid.c new file mode 100644 index 0000000..4c11ae4 --- /dev/null +++ b/src/board/system76/lemp9/lid.c @@ -0,0 +1,45 @@ +#include +#include +#include +#include +#include + +bool lid_state = true; +bool lid_wake = false; + +void lid_event(void) { + static bool send_sci = true; + + // Check if the lid switch has changed + bool new = gpio_get(&LID_SW_N); + if (new != lid_state) { + DEBUG("Lid "); + if (new) { + DEBUG("open\n"); + + if (lid_wake) { + gpio_set(&SWI_N, false); + + //TODO: find correct delay + delay_ticks(10); + + gpio_set(&SWI_N, true); + + lid_wake = false; + } + } else { + DEBUG("closed\n"); + } + + // Send SCI + send_sci = true; + } + lid_state = new; + + if (send_sci) { + // Send SCI 0x1B for lid event + if (pmc_sci(&PMC_1, 0x1B)) { + send_sci = false; + } + } +} diff --git a/src/board/system76/lemp9/main.c b/src/board/system76/lemp9/main.c index a8f4ede..81418d6 100644 --- a/src/board/system76/lemp9/main.c +++ b/src/board/system76/lemp9/main.c @@ -1,6 +1,4 @@ #include <8051.h> -#include -#include #include #include @@ -13,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -68,47 +67,6 @@ void touchpad_event(struct Ps2 * ps2) { } } -bool lid_wake = false; -void lid_event(void) { - static bool send_sci = true; - static bool last = true; - - // Check if the adapter line goes low - bool new = gpio_get(&LID_SW_N); - // If there has been a change, print - if (new != last) { - DEBUG("Lid "); - if (new) { - DEBUG("open\n"); - - if (lid_wake) { - gpio_set(&SWI_N, false); - - //TODO: find correct delay - delay_ticks(10); - - gpio_set(&SWI_N, true); - - lid_wake = false; - } - } else { - DEBUG("closed\n"); - } - - // Send SCI - send_sci = true; - } - - if (send_sci) { - // Send SCI 0x1B for lid event - if (pmc_sci(&PMC_1, 0x1B)) { - send_sci = false; - } - } - - last = new; -} - void main(void) { init(); diff --git a/src/board/system76/lemp9/power.c b/src/board/system76/lemp9/power.c index 38f1e06..daeb04b 100644 --- a/src/board/system76/lemp9/power.c +++ b/src/board/system76/lemp9/power.c @@ -2,6 +2,7 @@ #include #include #include +#include #include #include #include @@ -207,6 +208,10 @@ void power_event(void) { // Read power switch state static bool ps_last = true; bool ps_new = gpio_get(&PWR_SW_N); + // Disable power button if lid is closed and AC is disconnected + if (!lid_state && ac_last) { + ps_new = true; + } if (!ps_new && ps_last) { // Ensure press is not spurious delay_ms(10);