fix: use upstream dongle firmware
Use the common xow_dongle.bin image from the upstream driver for the GUI session instead of selecting the older 02E6-specific image. Update the firmware download script and plan to document the same upstream flow. Keep the extended RX diagnostics used to inspect controller discovery. Co-Authored-By: openai/gpt-5.6-luna: traced firmware and pairing behavior
This commit is contained in:
+1
-1
@@ -6,7 +6,7 @@ if(NOT CMAKE_GENERATOR MATCHES "^(Ninja|Xcode)$")
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
cmake_minimum_required(VERSION 3.21)
|
cmake_minimum_required(VERSION 3.21)
|
||||||
project(xone_macos VERSION 0.1.11 LANGUAGES CXX Swift)
|
project(xone_macos VERSION 0.1.12 LANGUAGES CXX Swift)
|
||||||
|
|
||||||
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
||||||
|
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ User-space macOS app that speaks to the Xbox Wireless Dongle (MT76xx chip) and e
|
|||||||
- Phase 1 (GIP + auth): ported and unit-tested.
|
- Phase 1 (GIP + auth): ported and unit-tested.
|
||||||
- Phase 2 (USB transport): probe/open, async read pump, vendor requests,
|
- Phase 2 (USB transport): probe/open, async read pump, vendor requests,
|
||||||
bulk write. Verified on hardware.
|
bulk write. Verified on hardware.
|
||||||
- Phase 3 (MT76 chip): register/EFUSE access, firmware load (per-PID images),
|
- Phase 3 (MT76 chip): register/EFUSE access, firmware load,
|
||||||
radio init (registers, crystal, MAC/BSSID, channel eval, beacon). Verified
|
radio init (registers, crystal, MAC/BSSID, channel eval, beacon). Verified
|
||||||
end-to-end: `radio-init` completes, beacon TX enabled, FCE shows firmware
|
end-to-end: `radio-init` completes, beacon TX enabled, FCE shows firmware
|
||||||
running.
|
running.
|
||||||
@@ -283,11 +283,8 @@ on first packet, so a fresh adapter yields its single client on demand.
|
|||||||
Firmware binaries are downloaded from Microsoft Windows Update driver catalog:
|
Firmware binaries are downloaded from Microsoft Windows Update driver catalog:
|
||||||
|
|
||||||
| PID | Dongle Type | Firmware File |
|
| PID | Dongle Type | Firmware File |
|
||||||
| ---- | ---------------------- | -------------------- |
|
| ---- | ---------------------- | ------------- |
|
||||||
| 02E6 | Old dongle | xone_dongle_02e6.bin |
|
| all | Supported dongles | xow_dongle.bin |
|
||||||
| 02FE | New dongle | xone_dongle_02fe.bin |
|
|
||||||
| 02F9 | Built-in (ASUS/Lenovo) | xone_dongle_02f9.bin |
|
|
||||||
| 091E | Surface Book 2 | xone_dongle_091e.bin |
|
|
||||||
|
|
||||||
Downloaded via `scripts/download-firmware.sh` (port of `install/firmware.sh`).
|
Downloaded via `scripts/download-firmware.sh` (port of `install/firmware.sh`).
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
# Download and extract the wireless dongle firmware from Windows Update.
|
# Download and extract the wireless dongle firmware from Windows Update.
|
||||||
# Port of install/firmware.sh from medusalix/xone, extended with the
|
# Port of install/firmware.sh from medusalix/xone.
|
||||||
# per-product split from dlundqvist/xone.
|
|
||||||
#
|
#
|
||||||
# The firmware is subject to Microsoft's Terms of Use:
|
# The firmware is subject to Microsoft's Terms of Use:
|
||||||
# https://www.microsoft.com/en-us/legal/terms-of-use
|
# https://www.microsoft.com/en-us/legal/terms-of-use
|
||||||
@@ -10,10 +9,8 @@ set -eu
|
|||||||
|
|
||||||
cd "$(dirname "$0")/.."
|
cd "$(dirname "$0")/.."
|
||||||
|
|
||||||
firmware_url_02e6='http://catalog.s.download.windowsupdate.com/d/msdownload/update/driver/drvs/2017/03/2ea9591b-f751-442c-80ce-8f4692cdc67b_6b555a3a288153cf04aec6e03cba360afe2fce34.cab'
|
firmware_url='http://download.windowsupdate.com/c/msdownload/update/driver/drvs/2017/07/1cd6a87c-623f-4407-a52d-c31be49e925c_e19f60808bdcbfbd3c3df6be3e71ffc52e43261e.cab'
|
||||||
firmware_hash_02e6='080ce4091e53a4ef3e5fe29939f51fd91f46d6a88be6d67eb6e99a5723b3a223'
|
firmware_hash='48084d9fa53b9bb04358f3bb127b7495dc8f7bb0b3ca1437bd24ef2b6eabdf66'
|
||||||
firmware_url_02fe='http://download.windowsupdate.com/c/msdownload/update/driver/drvs/2017/07/1cd6a87c-623f-4407-a52d-c31be49e925c_e19f60808bdcbfbd3c3df6be3e71ffc52e43261e.cab'
|
|
||||||
firmware_hash_02fe='48084d9fa53b9bb04358f3bb127b7495dc8f7bb0b3ca1437bd24ef2b6eabdf66'
|
|
||||||
|
|
||||||
echo "The firmware for the wireless dongle is subject to Microsoft's Terms of Use:"
|
echo "The firmware for the wireless dongle is subject to Microsoft's Terms of Use:"
|
||||||
echo 'https://www.microsoft.com/en-us/legal/terms-of-use'
|
echo 'https://www.microsoft.com/en-us/legal/terms-of-use'
|
||||||
@@ -57,5 +54,4 @@ fetch_firmware() {
|
|||||||
echo "Firmware written to firmware/$outname"
|
echo "Firmware written to firmware/$outname"
|
||||||
}
|
}
|
||||||
|
|
||||||
fetch_firmware "$firmware_url_02e6" "$firmware_hash_02e6" xone_dongle_02e6.bin
|
fetch_firmware "$firmware_url" "$firmware_hash" xow_dongle.bin
|
||||||
fetch_firmware "$firmware_url_02fe" "$firmware_hash_02fe" xone_dongle_02fe.bin
|
|
||||||
|
|||||||
+5
-7
@@ -85,12 +85,10 @@ std::mutex session_mutex; // guards current_session
|
|||||||
// 802.11 management frame header length (three addresses, no extensions).
|
// 802.11 management frame header length (three addresses, no extensions).
|
||||||
constexpr std::size_t k_mgmt_hdr_len = 24;
|
constexpr std::size_t k_mgmt_hdr_len = 24;
|
||||||
|
|
||||||
// Select the firmware image for a product ID: firmware/xone_dongle_<pid>.bin.
|
// Upstream xone loads one common firmware image for every dongle PID.
|
||||||
auto firmware_path_for(std::uint16_t pid) -> std::string
|
auto firmware_path_for(std::uint16_t) -> std::string
|
||||||
{
|
{
|
||||||
char path[64];
|
return "firmware/xow_dongle.bin";
|
||||||
std::snprintf(path, sizeof(path), "firmware/xone_dongle_%04x.bin", pid);
|
|
||||||
return path;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
@@ -117,9 +115,9 @@ auto xone_dongle::process_message(void const *data, std::size_t len) -> void
|
|||||||
// Strip the header + trailer.
|
// Strip the header + trailer.
|
||||||
buf = buf.subspan(cmd_hdr_len, len - 2 * cmd_hdr_len);
|
buf = buf.subspan(cmd_hdr_len, len - 2 * cmd_hdr_len);
|
||||||
|
|
||||||
char hex[64] = "";
|
char hex[192] = "";
|
||||||
int off = 0;
|
int off = 0;
|
||||||
for (std::size_t i = 0; i < buf.size() && i < 16 && off < 48; ++i)
|
for (std::size_t i = 0; i < buf.size() && i < 48 && off < 144; ++i)
|
||||||
off += std::snprintf(hex + off, sizeof(hex) - off, "%02x ", buf[i]);
|
off += std::snprintf(hex + off, sizeof(hex) - off, "%02x ", buf[i]);
|
||||||
xone::log_msg(xone::log_level::debug,
|
xone::log_msg(xone::log_level::debug,
|
||||||
"api: rx info=0x%08x port=%d len=%zu %s",
|
"api: rx info=0x%08x port=%d len=%zu %s",
|
||||||
|
|||||||
+2
-2
@@ -140,9 +140,9 @@ auto main(int argc, char **argv) -> int
|
|||||||
auto on_frame = [](std::uint8_t ep, void const *data, std::size_t len) {
|
auto on_frame = [](std::uint8_t ep, void const *data, std::size_t len) {
|
||||||
auto const *p = static_cast<std::uint8_t const *>(data);
|
auto const *p = static_cast<std::uint8_t const *>(data);
|
||||||
std::fprintf(stderr, "[in] ep=0x%02x len=%zu: ", ep, len);
|
std::fprintf(stderr, "[in] ep=0x%02x len=%zu: ", ep, len);
|
||||||
for (std::size_t i = 0; i < len && i < 32; i++)
|
for (std::size_t i = 0; i < len && i < 512; i++)
|
||||||
std::fprintf(stderr, "%02x", p[i]);
|
std::fprintf(stderr, "%02x", p[i]);
|
||||||
if (len > 32)
|
if (len > 512)
|
||||||
std::fprintf(stderr, "...");
|
std::fprintf(stderr, "...");
|
||||||
std::fprintf(stderr, "\n");
|
std::fprintf(stderr, "\n");
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user