diff --git a/src/board/system76/lemp9/acpi.c b/src/board/system76/lemp9/acpi.c index a8968cd..c78dcd7 100644 --- a/src/board/system76/lemp9/acpi.c +++ b/src/board/system76/lemp9/acpi.c @@ -1,7 +1,7 @@ #include #include -#include #include +#include #include #include @@ -9,9 +9,9 @@ extern bool lid_wake; extern uint8_t sci_extra; -uint8_t fcmd = 0; -uint8_t fdat = 0; -uint8_t fbuf[4] = { 0, 0, 0, 0 }; +static uint8_t fcmd = 0; +static uint8_t fdat = 0; +static uint8_t fbuf[4] = { 0, 0, 0, 0 }; void fcommand(void) { switch (fcmd) { @@ -20,11 +20,11 @@ void fcommand(void) { switch (fdat) { // Set white LED brightness case 0x00: - DACDAT2 = fbuf[0]; + kbled_set(fbuf[0]); break; // Get white LED brightness case 0x01: - fbuf[0] = DACDAT2; + fbuf[0] = kbled_get(); break; } break; diff --git a/src/board/system76/lemp9/include/board/kbled.h b/src/board/system76/lemp9/include/board/kbled.h new file mode 100644 index 0000000..84db299 --- /dev/null +++ b/src/board/system76/lemp9/include/board/kbled.h @@ -0,0 +1,9 @@ +#ifndef _BOARD_KBLED_H +#define _BOARD_KBLED_H + +#include + +uint8_t kbled_get(void); +void kbled_set(uint8_t level); + +#endif // _BOARD_KBLED_H diff --git a/src/board/system76/lemp9/kbled.c b/src/board/system76/lemp9/kbled.c new file mode 100644 index 0000000..b96a635 --- /dev/null +++ b/src/board/system76/lemp9/kbled.c @@ -0,0 +1,31 @@ +#include +#include +#include + +static uint8_t __code levels[] = { + 0, + 48, + 72, + 96, + 192, + 255 +}; + +uint8_t kbled_get(void) { + uint8_t level; + uint8_t raw = DACDAT2; + for (level = 0; level < ARRAY_SIZE(levels); level++) { + if (raw <= levels[level]) { + return level; + } + } + return 0; +} + +void kbled_set(uint8_t level) { + if (level < ARRAY_SIZE(levels)) { + DACDAT2 = levels[level]; + } else { + DACDAT2 = 0; + } +} diff --git a/src/board/system76/lemp9/kbscan.c b/src/board/system76/lemp9/kbscan.c index 6df78d4..c67a806 100644 --- a/src/board/system76/lemp9/kbscan.c +++ b/src/board/system76/lemp9/kbscan.c @@ -3,6 +3,7 @@ #include #include #include +#include #include #include #include @@ -104,6 +105,14 @@ void kbscan_event(void) { if (new_b) { uint8_t sci = SCI_EXTRA; sci_extra = (uint8_t)(key & 0xFF); + + // HACK FOR HARDWARE HOTKEYS + switch (sci_extra) { + case SCI_EXTRA_KBD_BKL: + kbled_set(kbled_get() + 1); + break; + } + if (!pmc_sci(&PMC_1, sci)) { // In the case of ignored SCI, reset bit new &= ~(1 << j);