From c6ba5ad0a20ddcf6c095d36264f8239e8a06ca57 Mon Sep 17 00:00:00 2001 From: Daniel Schaefer Date: Mon, 27 Nov 2023 12:55:38 +0800 Subject: [PATCH] DEBUG: Working BIOS hotkeys Works from cold boot and from reboot in windows. Signed-off-by: Daniel Schaefer --- keyboards/framework/factory.c | 2 +- keyboards/framework/framework.c | 65 +++++++++++++++++++++++++++++- keyboards/framework/matrix.c | 20 +++++++++ keyboards/framework/rules.mk | 3 ++ quantum/keyboard.c | 31 +++++++------- quantum/os_detection.c | 25 +++++++++++- quantum/os_detection.h | 2 + tmk_core/protocol/usb_descriptor.c | 3 ++ 8 files changed, 132 insertions(+), 19 deletions(-) diff --git a/keyboards/framework/factory.c b/keyboards/framework/factory.c index b6430a8c0e..8260c32ad8 100644 --- a/keyboards/framework/factory.c +++ b/keyboards/framework/factory.c @@ -79,7 +79,7 @@ void handle_factory_command(uint8_t *data) { rgb_matrix_sethsv_noeeprom(0, 0, 0xFF); rgb_matrix_mode_noeeprom(1); #endif - bios_mode = false; + //bios_mode = false; writePin(GP24, 0); } break; diff --git a/keyboards/framework/framework.c b/keyboards/framework/framework.c index c6a4359bcd..a9691c628d 100644 --- a/keyboards/framework/framework.c +++ b/keyboards/framework/framework.c @@ -3,6 +3,7 @@ #include "quantum.h" #include "framework.h" +#include "os_detection.h" void keyboard_post_init_kb(void) { keyboard_post_init_user(); @@ -65,7 +66,7 @@ void suspend_wakeup_init_kb(void) { } // If in BIOS mode, no matter what the keys have been remapped to, always send them as the F keys -bool bios_mode = false; +bool bios_mode = true; bool handle_bios_hotkeys(uint16_t keycode, keyrecord_t *record) { // Not in bios mode, no special handling, handle as normal if (!bios_mode) @@ -174,6 +175,66 @@ bool handle_bios_hotkeys(uint16_t keycode, keyrecord_t *record) { bool process_record_kb(uint16_t keycode, keyrecord_t *record) { process_record_user(keycode, record); + os_variant_t os = detected_host_os(); +#if defined(RGB_MATRIX_ENABLE) + //rgb_matrix_mode_noeeprom(1); +#endif + bios_mode = true; + writePin(GP24, 0); +//#if defined(RGB_MATRIX_ENABLE) +// switch (os) { +// case OS_UNSURE: +// //rgb_matrix_sethsv(0, 0, 255); // White +// break; +// case OS_LINUX: +// bios_mode = false +// writePin(GP24, 0); +// // Works on laptop and android +// //rgb_matrix_sethsv(213, 255, 255); // purple +// break; +// case OS_WINDOWS: +// bios_mode = false +// writePin(GP24, 0); +// // works +// //rgb_matrix_sethsv(170, 255, 255); // blue +// break; +// case OS_MACOS: +// //rgb_matrix_sethsv(85, 255, 255); // green +// break; +// case OS_UEFI: +// case OS_IOS: +// bios_mode = true +// writePin(GP24, 1) +// // works on M1 mac +// //rgb_matrix_sethsv(43, 255, 255); // yellow +// break; +// default: +// //rgb_matrix_sethsv(125, 255, 255); // cyan +// break; +// } +//#else + switch (os) { + case OS_UNSURE: + break; + case OS_LINUX: + //bios_mode = false; + //writePin(GP24, 1); + break; + case OS_WINDOWS: + bios_mode = false; + writePin(GP24, 1); + break; + case OS_MACOS: + break; + case OS_UEFI: + case OS_IOS: + bios_mode = true; + writePin(GP24, 0); + // works on M1 mac + break; + } +//#endif + if (!handle_bios_hotkeys(keycode, record)) { return false; } @@ -233,6 +294,8 @@ bool process_record_kb(uint16_t keycode, keyrecord_t *record) { default: return true; // Process all other keycodes normally } + + return true; } bool led_update_kb(led_t led_state) { diff --git a/keyboards/framework/matrix.c b/keyboards/framework/matrix.c index 36a3032700..73db62baff 100644 --- a/keyboards/framework/matrix.c +++ b/keyboards/framework/matrix.c @@ -313,10 +313,26 @@ bool handle_idle(void) { return false; } +#ifdef RGB_MATRIX_ENABLE +static bool rgb_init = false; +static uint16_t rgb_init_timer = 0; +#endif + /** * Overriding behavior of matrix_scan from quantum/matrix.c */ bool matrix_scan_custom(matrix_row_t current_matrix[]) { +#ifdef RGB_MATRIX_ENABLE + if (!rgb_init) { + if (!bios_mode) { + //if (rgb_init_timer > 0 && TIMER_DIFF_16(timer_read(), rgb_init_timer) >= 10000) { + //if (rgb_init_timer > 0 && TIMER_DIFF_16(timer_read(), rgb_init_timer) >= 100) { + //if (!bios_mode || rgb_init_timer > 0 && TIMER_DIFF_16(timer_read(), rgb_init_timer) >= 10000) { + rgb_matrix_init(); + rgb_init = true; + } + } +#endif bool changed = false; adc10ksample_t voltages[MATRIX_ROWS][MATRIX_COLS] = {}; @@ -436,4 +452,8 @@ void matrix_init_custom(void) { // Set unused pins to input to avoid interfering. They're hooked up to rows 5 and 6 setPinInput(GP6); setPinInput(GP7); + +#ifdef RGB_MATRIX_ENABLE + rgb_init_timer = timer_read(); +#endif } diff --git a/keyboards/framework/rules.mk b/keyboards/framework/rules.mk index 46338448ea..d085d8f9cd 100644 --- a/keyboards/framework/rules.mk +++ b/keyboards/framework/rules.mk @@ -12,6 +12,9 @@ RAW_ENABLE = no BACKLIGHT_ENABLE = yes BACKLIGHT_DRIVER = pwm +OS_DETECTION_ENABLE = yes +#OS_DETECTION_DEBUG_ENABLE = yes + # Custom matrix scanning code via ADC CUSTOM_MATRIX = lite SRC += matrix.c analog.c diff --git a/quantum/keyboard.c b/quantum/keyboard.c index c2ca15d52d..3621405035 100644 --- a/quantum/keyboard.c +++ b/quantum/keyboard.c @@ -384,19 +384,20 @@ void quantum_init(void) { backlight_init_ports(); #endif #ifdef AUDIO_ENABLE - audio_init(); + audio_init() #endif #ifdef LED_MATRIX_ENABLE - led_matrix_init(); + led_matrix_init() #endif #ifdef RGB_MATRIX_ENABLE - rgb_matrix_init(); + // Here + //rgb_matrix_init(); #endif #if defined(UNICODE_COMMON_ENABLE) - unicode_input_mode_init(); + unicode_input_mode_init() #endif #ifdef HAPTIC_ENABLE - haptic_init(); + haptic_init() #endif } @@ -408,13 +409,13 @@ void keyboard_init(void) { timer_init(); sync_timer_init(); #ifdef VIA_ENABLE - via_init(); + //via_init(); #endif #ifdef SPLIT_KEYBOARD - split_pre_init(); + split_pre_init() #endif #ifdef ENCODER_ENABLE - encoder_init(); + encoder_init() #endif matrix_init(); quantum_init(); @@ -428,39 +429,39 @@ void keyboard_init(void) { st7565_init(DISPLAY_ROTATION_0); #endif #ifdef PS2_MOUSE_ENABLE - ps2_mouse_init(); + ps2_mouse_init() #endif #ifdef BACKLIGHT_ENABLE backlight_init(); #endif #ifdef RGBLIGHT_ENABLE - rgblight_init(); + rgblight_init() #endif #ifdef STENO_ENABLE_ALL - steno_init(); + steno_init() #endif #if defined(NKRO_ENABLE) && defined(FORCE_NKRO) keymap_config.nkro = 1; eeconfig_update_keymap(keymap_config.raw); #endif #ifdef DIP_SWITCH_ENABLE - dip_switch_init(); + dip_switch_init() #endif #ifdef SLEEP_LED_ENABLE - sleep_led_init(); + sleep_led_init() #endif #ifdef VIRTSER_ENABLE virtser_init(); #endif #ifdef SPLIT_KEYBOARD - split_post_init(); + split_post_init() #endif #ifdef POINTING_DEVICE_ENABLE // init after split init pointing_device_init(); #endif #ifdef BLUETOOTH_ENABLE - bluetooth_init(); + bluetooth_init() #endif #if defined(DEBUG_MATRIX_SCAN_RATE) && defined(CONSOLE_ENABLE) diff --git a/quantum/os_detection.c b/quantum/os_detection.c index e606227136..b3a6ade7a4 100644 --- a/quantum/os_detection.c +++ b/quantum/os_detection.c @@ -35,6 +35,7 @@ struct setups_data_t { uint8_t cnt_02; uint8_t cnt_04; uint8_t cnt_ff; + uint8_t cnt_zoid; uint16_t last_wlength; }; @@ -43,20 +44,30 @@ struct setups_data_t setups_data = { .cnt_02 = 0, .cnt_04 = 0, .cnt_ff = 0, + .cnt_zoid = 0, }; os_variant_t detected_os = OS_UNSURE; // Some collected sequences of wLength can be found in tests. void make_guess(void) { - if (setups_data.count < 3) { + //if (setups_data.count < 3 && setups_data.cnt_zoid != 0) { + // return; + //} + //if (setups_data.cnt_zoid == 0) { + // detected_os = OS_UEFI; + // return; + //} + if (setups_data.cnt_zoid == 0) { + detected_os = OS_UEFI; return; } if (setups_data.cnt_ff >= 2 && setups_data.cnt_04 >= 1) { detected_os = OS_WINDOWS; return; } - if (setups_data.count == setups_data.cnt_ff) { + // I changed this + if (setups_data.count > 3 && setups_data.count == setups_data.cnt_ff) { // Linux has 3 packets with 0xFF. detected_os = OS_LINUX; return; @@ -80,6 +91,15 @@ void make_guess(void) { detected_os = OS_LINUX; return; } + if (setups_data.cnt_zoid == 0) { + detected_os = OS_UEFI; + return; + } +} + +void process_zoid(const uint16_t zoid) { + setups_data.cnt_zoid = zoid; + make_guess(); } void process_wlength(const uint16_t w_length) { @@ -99,6 +119,7 @@ void process_wlength(const uint16_t w_length) { } os_variant_t detected_host_os(void) { + make_guess(); return detected_os; } diff --git a/quantum/os_detection.h b/quantum/os_detection.h index 3496ea0ed2..348d14222f 100644 --- a/quantum/os_detection.h +++ b/quantum/os_detection.h @@ -25,8 +25,10 @@ typedef enum { OS_WINDOWS, OS_MACOS, OS_IOS, + OS_UEFI, } os_variant_t; +void process_zoid(const uint16_t zoid); void process_wlength(const uint16_t w_length); os_variant_t detected_host_os(void); void erase_wlength_data(void); diff --git a/tmk_core/protocol/usb_descriptor.c b/tmk_core/protocol/usb_descriptor.c index ae7de36d80..262787b792 100644 --- a/tmk_core/protocol/usb_descriptor.c +++ b/tmk_core/protocol/usb_descriptor.c @@ -1177,6 +1177,9 @@ uint16_t get_usb_descriptor(const uint16_t wValue, const uint16_t wIndex, const if (wLength >= sizeof(USB_Descriptor_Bos_t)) { Size = sizeof(USB_Descriptor_Bos_t); } +#ifdef OS_DETECTION_ENABLE + process_zoid(31); +#endif break; case DTYPE_String: