#pragma once // ============================================================================== // MT76 chip protocol (MediaTek MT76xx radio in the dongle) // ============================================================================== // Port target: medusalix/xone transport/mt76.c + mt76.h + mt76_defs.h. // Firmware load (0x3800-byte chunks), EFUSE read, radio init (~80 register // writes), channel evaluation, beacon transmission, pairing mode, client // association and WCID/AES-CCMP key setup (encryption runs on-chip). // ============================================================================== #include #include #include namespace xone::usb { class transport; } namespace xone::mt76 { // Owns the MT76 chip protocol on top of an open USB transport. Port of // struct xone_mt76 plus the register/EFUSE layer of transport/mt76.c. class chip { public: explicit chip(usb::transport &transport); // 32-bit register read/write (addr may include mt_vend_type_cfg). auto read_register(std::uint32_t addr) -> std::uint32_t; auto write_register(std::uint32_t addr, std::uint32_t val) -> void; // Poll until (read_register(offset) & mask) == val. False on timeout. auto poll(std::uint32_t offset, std::uint32_t mask, std::uint32_t val) -> bool; // Read EFUSE bytes at the 16-bit block address. Returns 0 or -errno. auto read_efuse(std::uint16_t addr, void *data, std::size_t len) -> int; // Chip ID from EFUSE (e.g. MT7612). 0 on failure. auto chip_id() -> std::uint16_t; // MAC address from EFUSE with the 62:45:bd fallback applied. auto mac_address() -> std::array; private: usb::transport &transport_; }; } // namespace xone::mt76