diff --git a/quantum/os_detection.c b/quantum/os_detection.c index 84bbeeed54..5ebfdeefcf 100644 --- a/quantum/os_detection.c +++ b/quantum/os_detection.c @@ -128,8 +128,10 @@ void process_wlength(const uint16_t w_length) { // now try to make a guess os_variant_t guessed = OS_UNSURE; if (setups_data.count >= 3) { - if (setups_data.cnt_ff >= 2 && setups_data.cnt_04 >= 1) { + if (setups_data.cnt_04 >= 1 && setups_data.cnt_ff >= 2) { guessed = OS_WINDOWS; + } else if (setups_data.cnt_04 >= 1 && setups_data.cnt_ff) { + guessed = OS_WINDOWS_UNSURE; } else if (setups_data.count == setups_data.cnt_ff) { // Linux has 3 packets with 0xFF. guessed = OS_LINUX; @@ -140,10 +142,10 @@ void process_wlength(const uint16_t w_length) { guessed = OS_IOS; } else if (setups_data.cnt_ff == 0 && setups_data.cnt_02 == 3 && setups_data.cnt_04 == 1) { // This is actually PS5. - guessed = OS_LINUX; + guessed = OS_PS5; } else if (setups_data.cnt_ff >= 1 && setups_data.cnt_02 == 0 && setups_data.cnt_04 == 0) { // This is actually Quest 2 or Nintendo Switch. - guessed = OS_LINUX; + guessed = OS_HANDHELD; } } diff --git a/quantum/os_detection.h b/quantum/os_detection.h index 98a8e805e4..2e5455753f 100644 --- a/quantum/os_detection.h +++ b/quantum/os_detection.h @@ -24,8 +24,11 @@ typedef enum { OS_UNSURE, OS_LINUX, OS_WINDOWS, + OS_WINDOWS_UNSURE, OS_MACOS, OS_IOS, + OS_PS5, + OS_HANDHELD, } os_variant_t; void process_wlength(const uint16_t w_length); diff --git a/quantum/os_detection/tests/os_detection.cpp b/quantum/os_detection/tests/os_detection.cpp index 21c4536243..17b941dca3 100644 --- a/quantum/os_detection/tests/os_detection.cpp +++ b/quantum/os_detection/tests/os_detection.cpp @@ -242,68 +242,68 @@ TEST_F(OsDetectionTest, TestVusbWindows10_2) { } TEST_F(OsDetectionTest, TestChibiosPs5) { - EXPECT_EQ(check_sequence({0x2, 0x4, 0x2, 0x28, 0x2, 0x24}), OS_LINUX); + EXPECT_EQ(check_sequence({0x2, 0x4, 0x2, 0x28, 0x2, 0x24}), OS_PS5); os_detection_task(); assert_not_reported(); } TEST_F(OsDetectionTest, TestLufaPs5) { - EXPECT_EQ(check_sequence({0x2, 0x4, 0x2, 0xE, 0x2, 0x10}), OS_LINUX); + EXPECT_EQ(check_sequence({0x2, 0x4, 0x2, 0xE, 0x2, 0x10}), OS_PS5); os_detection_task(); assert_not_reported(); } TEST_F(OsDetectionTest, TestVusbPs5) { - EXPECT_EQ(check_sequence({0x2, 0x4, 0x2, 0xE, 0x2}), OS_LINUX); + EXPECT_EQ(check_sequence({0x2, 0x4, 0x2, 0xE, 0x2}), OS_PS5); os_detection_task(); assert_not_reported(); } TEST_F(OsDetectionTest, TestChibiosNintendoSwitch) { - EXPECT_EQ(check_sequence({0x82, 0xFF, 0x40, 0x40, 0xFF, 0x40, 0x40, 0xFF, 0x40, 0x40, 0xFF, 0x40, 0x40, 0xFF, 0x40, 0x40}), OS_LINUX); + EXPECT_EQ(check_sequence({0x82, 0xFF, 0x40, 0x40, 0xFF, 0x40, 0x40, 0xFF, 0x40, 0x40, 0xFF, 0x40, 0x40, 0xFF, 0x40, 0x40}), OS_HANDHELD); os_detection_task(); assert_not_reported(); } TEST_F(OsDetectionTest, TestLufaNintendoSwitch) { - EXPECT_EQ(check_sequence({0x82, 0xFF, 0x40, 0x40, 0xFF, 0x40, 0x40}), OS_LINUX); + EXPECT_EQ(check_sequence({0x82, 0xFF, 0x40, 0x40, 0xFF, 0x40, 0x40}), OS_HANDHELD); os_detection_task(); assert_not_reported(); } TEST_F(OsDetectionTest, TestVusbNintendoSwitch) { - EXPECT_EQ(check_sequence({0x82, 0xFF, 0x40, 0x40}), OS_LINUX); + EXPECT_EQ(check_sequence({0x82, 0xFF, 0x40, 0x40}), OS_HANDHELD); os_detection_task(); assert_not_reported(); } TEST_F(OsDetectionTest, TestChibiosQuest2) { - EXPECT_EQ(check_sequence({0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF}), OS_LINUX); + EXPECT_EQ(check_sequence({0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF}), OS_HANDHELD); os_detection_task(); assert_not_reported(); } TEST_F(OsDetectionTest, TestVusbQuest2) { - EXPECT_EQ(check_sequence({0xFF, 0xFF, 0xFF, 0xFE}), OS_LINUX); + EXPECT_EQ(check_sequence({0xFF, 0xFF, 0xFF, 0xFE}), OS_HANDHELD); os_detection_task(); assert_not_reported(); } TEST_F(OsDetectionTest, TestDoNotReportIfUsbUnstable) { - EXPECT_EQ(check_sequence({0xFF, 0xFF, 0xFF, 0xFE}), OS_LINUX); + EXPECT_EQ(check_sequence({0xFF, 0xFF, 0xFF, 0xFE}), OS_HANDHELD); os_detection_task(); assert_not_reported(); advance_time(OS_DETECTION_DEBOUNCE); os_detection_task(); assert_not_reported(); - EXPECT_EQ(detected_host_os(), OS_LINUX); + EXPECT_EQ(detected_host_os(), OS_HANDHELD); } static struct usb_device_state usb_device_state_configured = {.configure_state = USB_DEVICE_STATE_CONFIGURED}; TEST_F(OsDetectionTest, TestReportAfterDebounce) { - EXPECT_EQ(check_sequence({0xFF, 0xFF, 0xFF, 0xFE}), OS_LINUX); + EXPECT_EQ(check_sequence({0xFF, 0xFF, 0xFF, 0xFE}), OS_HANDHELD); os_detection_notify_usb_device_state_change(usb_device_state_configured); os_detection_task(); assert_not_reported(); @@ -311,22 +311,22 @@ TEST_F(OsDetectionTest, TestReportAfterDebounce) { advance_time(1); os_detection_task(); assert_not_reported(); - EXPECT_EQ(detected_host_os(), OS_LINUX); + EXPECT_EQ(detected_host_os(), OS_HANDHELD); advance_time(OS_DETECTION_DEBOUNCE - 3); os_detection_task(); assert_not_reported(); - EXPECT_EQ(detected_host_os(), OS_LINUX); + EXPECT_EQ(detected_host_os(), OS_HANDHELD); advance_time(1); os_detection_task(); assert_not_reported(); - EXPECT_EQ(detected_host_os(), OS_LINUX); + EXPECT_EQ(detected_host_os(), OS_HANDHELD); // advancing the timer alone must not cause a report advance_time(1); assert_not_reported(); - EXPECT_EQ(detected_host_os(), OS_LINUX); + EXPECT_EQ(detected_host_os(), OS_HANDHELD); // the task will cause a report os_detection_task(); assert_reported(OS_LINUX); @@ -441,4 +441,5 @@ TEST_F(OsDetectionTest, TestDoNotGoBackToUnsure) { EXPECT_EQ(check_sequence({0xFF, 0xFF, 0xFF, 0xFE, 0x02}), OS_LINUX); os_detection_task(); assert_not_reported(); + EXPECT_EQ(check_sequence({0x2, 0x4, 0x2, 0x28, 0x2, 0x24}), OS_PS5); }