diff --git a/.vscode/README.md b/.vscode/README.md new file mode 100644 index 0000000..62e3e75 --- /dev/null +++ b/.vscode/README.md @@ -0,0 +1,9 @@ +need permissions + +do make udev rule + + SUBSYSTEM=="usb", ATTR{idVendor}=="258a", ATTR{idProduct}=="002e|002f", MODE="0666" + + +write a nixos module that also sets udev rules + diff --git a/.vscode/settings.json b/.vscode/settings.json index db47d85..4752a7a 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -66,6 +66,7 @@ "streambuf": "cpp", "thread": "cpp", "typeinfo": "cpp", - "variant": "cpp" + "variant": "cpp", + "cinttypes": "cpp" } } \ No newline at end of file diff --git a/flake.nix b/flake.nix index 89ec901..7bbb965 100644 --- a/flake.nix +++ b/flake.nix @@ -26,12 +26,14 @@ kdePackages.qtbase.dev kdePackages.qtdeclarative kdePackages.qttools.dev + kdePakcages.qtserialport.dev makeWrapper pkg-config qt6.wrapQtAppsHook qtcreator qt6.full libusb1 + hidapi ]; }; }; diff --git a/hexdump_analysis/hexdump_analysis.txt b/hexdump_analysis/hexdump_analysis.txt index b8e6ca5..3229ef1 100644 --- a/hexdump_analysis/hexdump_analysis.txt +++ b/hexdump_analysis/hexdump_analysis.txt @@ -34,18 +34,22 @@ First Part 01f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0200 00 00 00 00 00 00 00 00 +0x98 ist ende von data ??? + +0x03 maybe if 0x92 -> set report 0x00 -> get report + 0x08-0x09 0x63 0x17 Profil 1, 0x63 0x01 Profil 2 ????? 2 Hex Dumps for 1 Profile FUCK ICH GLAUB ICH HABE HEX FALSCH GEZÄHLT HAB MANCHMAL VON 1 ANGEFANGEN LOL 0x0a USB Polling Rate [0x01-0x04]->[125,250,500,1000] -0x0c 0x11-0x15 wert für häckchen bei dpi, erstes 0x11 zweites 0x12 usw.. +0x0b9 0x11-0x15 wert für häckchen bei dpi, erstes 0x11 zweites 0x12 usw.. 0x0d-0x16 jeweils 2 byte most significant byte last, * 50 -> annäherung an dpi -50 0x45 -> Lighting Mode, 02 Steady, 01 Colorful Streaming, 03 Breathing -0x47 -> 0-4 Brightness und 0-4 Speed bei colorful 0x(br)(sp) -0x48 -> Brightness bei Steady 00-40 +0x47 -> 0-4 Brightness und 0-4 Speed bei breathing 0x(br)(sp) +0x48 -> Brightness bei colorful 00-40 0x4c -> 0-4 Brightness und 0-4 Speed bei steady 0x(br)(sp) 0x4e-0x63 -> Bei Breathing RGB * 7 0x67-0x7a -> Bei Steady RGB * 7 @@ -94,6 +98,8 @@ Part two 01f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0200 00 00 00 00 00 00 00 00 +0x58 0xa5 ist ende von data? + --was machen die ersten 8 bytes?-- 0x08-0x0b 4 Byte für linke Maustaste 0x0c-0x0f 4 Byte für rechte Maustaste @@ -209,3 +215,39 @@ Macros wenn macro wird ein extra dingens an data geschrieben mit 0x08 0x30 am anfang für jedes Macro wird ein extra data geschrieben + +So schaut ein get config von maus aus (GET_REPORT response) +für teil eins mit licht und so und nicht tasten + +0000 80 04 16 03 e8 92 ff ff 43 02 80 0a 03 00 2d 00 +0010 f1 9a cc 66 00 00 00 00 28 be 0e 00 00 00 00 00 +0020 9a 00 00 00 9a 00 00 00 00 00 00 00 00 00 00 00 +0030 00 00 00 00 00 00 00 00 00 02 00 00 00 00 00 00 +0040 08 11 00 00 00 00 00 00 64 17 04 45 00 0c 00 0f +0050 00 13 00 17 00 1b 00 00 00 00 00 00 00 00 00 00 +0060 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +0070 00 00 ff 00 ff ff ff 00 ff ff 9b 00 00 ff 00 ff +0080 ff ff ff 46 00 02 43 00 36 ff 00 00 32 07 ff ff +0090 ff 00 00 00 ff ff ff 00 00 00 ff ff ff 00 00 00 +00a0 ff ff ff 02 02 00 ff 00 00 00 ff 00 00 00 ff 00 +00b0 00 00 00 ff ff ff 46 00 ff 00 ff ff ff ff ff 00 +00c0 00 ff 00 00 01 02 03 04 05 06 07 42 42 02 ff 00 +00d0 00 27 40 01 02 ff 00 00 a5 00 + +ab 0x40 fängt erst die config an was davor das zeug ist keine ahnung + +SET_REPORT request for getting the number 1 config + +0000 80 64 3c 75 e9 92 ff ff 53 02 00 0b 03 00 00 00 +0010 18 aa cc 66 00 00 00 00 d5 89 0a 00 8d ff ff ff +0020 08 00 00 00 08 00 00 00 21 09 05 03 01 00 08 00 +0030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +->0040 05 11 00 00 00 00 00 00 + +SET_REPORT request for getting the number 2 config + +0000 00 7e 3c 75 e9 92 ff ff 53 02 00 0b 03 00 00 00 +0010 18 aa cc 66 00 00 00 00 87 dc 07 00 8d ff ff ff +0020 08 00 00 00 08 00 00 00 21 09 05 03 01 00 08 00 +0030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +->0040 05 12 00 00 00 00 00 00 diff --git a/src/main.cpp b/src/main.cpp index 5299fcc..1848f83 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -36,9 +36,11 @@ int main(int argc, char *argv[]) { return -1; } + libusb_context *ctx; int r = libusb_init(&ctx); - if(r<0) { + if (r < 0) + { std::cout << libusb_error_name(r) << std::endl; exit(1); } @@ -58,27 +60,98 @@ int main(int argc, char *argv[]) libusb_device_descriptor desc; libusb_get_device_descriptor(found, &desc); std::cout << "Bus " << unsigned(bus) << " Device " << unsigned(addr) << ": ID " << std::hex << desc.idVendor << ":" << desc.idProduct << std::dec << std::endl; - if(desc.idProduct == 0x2e && desc.idVendor == 0x258a){ + if (desc.idProduct == 0x2f && desc.idVendor == 0x258a) + { + std::cout << "test" << std::endl; + std::cout << std::hex << (int)(desc.bNumConfigurations) << std::endl; break; } } libusb_device_handle *handle; - if(!libusb_open(found, &handle)) - std::cout << "drrsdfsdf" << std::endl; + if ((r = libusb_open(found, &handle)) < 0) + std::cout << "libusb_open: " << libusb_error_name(r) << std::endl; unsigned char data[520]; - std::string asd = "082100920000000064170445000c000f00130017001b00000000000000000000000000000000000000000000000000000000ff00ffffff00ffff9b0000ff00ffffffff460003020042ff00000207ff000000ff000000ffffff0000ffffff4600ff00ff020200ff000000ff000000ffffff0000ffffff4600ff00ffffffffff0000ff000001020304050607424202ff000027400102ff0000a500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; - for(int i = 0; i < 1040; i+=2){ - data[i/2] = std::stoi(asd.substr(i, 2), (std::size_t *)0, 16); - //std::cout << std::hex << std::to_string(data[i/2]) << std::endl; + unsigned char data2[520]; + unsigned char deviceData[520]; + memset(deviceData, 0, 520 * sizeof(unsigned char)); + std::string data01 = "081100920000000064170445000c000f00130017001b00000000000000000000000000000000000000000000000000000000ff00ffffff00ffff9b0000ff00ffffffff460002430036ff00003207ffffff000000ffffff000000ffffff000000ffffff020200ff000000ff000000ff00000000ffffff4600ff00ffffffffff0000ff000001020304050607424202ff000027400102ff0000a500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + std::string data02 = "081200500000000011010000110200001104000011080000111000002100610041000000500600001102000021005a0021005b0021005c0021005d0021005e0021005f002100600050010000500100005001000050010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + for (int i = 0; i < 1040; i += 2) + { + data[i / 2] = std::stoi(data01.substr(i, 2), (std::size_t *)0, 16); + data2[i / 2] = std::stoi(data02.substr(i, 2), (std::size_t *)0, 16); } - libusb_detach_kernel_driver(handle, 0); + /* + self.set_report(0x0305, [5, 0x80, 0, 0, 0, 0, 0, 0]) + self.get_report(0x0305, 8) + self.set_report(0x0305, [5, 0x21, 0, 0, 0, 0, 0, 0]) + odata = self.get_report(0x0308, 520) - libusb_claim_interface(handle, 0); + self.set_report(0x0308, data) + self.set_report(0x0308, data2) + */ - libusb_control_transfer(handle, 0x21, 0x09, 0x0308, 1, data, 520, 0); - libusb_release_interface(handle, 0); + if ((r = libusb_detach_kernel_driver(handle, 1)) < 0) + std::cout << "libusb_detach_kernel_driver: " << libusb_error_name(r) << std::endl; + if ((r = libusb_claim_interface(handle, 1)) < 0) + std::cout << "libusb_claim_interface: " << libusb_error_name(r) << std::endl; + + unsigned char send_data0[8]; + memset(send_data0, 0, 8 * sizeof(unsigned char)); + send_data0[0] = 0x05; + send_data0[1] = 0x21; + if ((r = libusb_control_transfer(handle, 0x21, 0x09, 0x0305, 1, send_data0, 8, 5000)) < 0) + std::cout << "libusb_control_transfer1: " << libusb_error_name(r) << std::endl; + /*if ((r = libusb_control_transfer(handle, 0xa1, 0x01, 0x0305, 1, send_data0, 8, 5000)) < 0) + std::cout << "libusb_control_transfer2: " << libusb_error_name(r) << std::endl; + for(int i = 0; i < 8; ++i) + std::cout << std::hex << (int)send_data0[i] << ", "; + std::cout << std::endl; + memset(send_data0, 0, 8 * sizeof(unsigned char)); + send_data0[0] = 0x05; + send_data0[1] = 0x21; + if ((r = libusb_control_transfer(handle, 0x21, 0x09, 0x0305, 1, send_data0, 8, 5000)) < 0) + std::cout << "libusb_control_transfer3: " << libusb_error_name(r) << std::endl; + */ + if ((r = libusb_control_transfer(handle, 0xa1, 0x01, 0x0308, 1, deviceData, 520, 5000)) < 0) + std::cout << "libusb_control_transfer2: " << libusb_error_name(r) << std::endl; + for (int i = 0; i < 520; ++i) + { + std::cout << std::hex << (int)deviceData[i] << "|" << (int)data[i] << "\t"; + + } + std::cout << std::endl; + std::cout << std::endl; + + memset(send_data0, 0, 8 * sizeof(unsigned char)); + send_data0[0] = 0x05; + send_data0[1] = 0x22; + memset(deviceData, 0, 520 * sizeof(unsigned char)); + + if ((r = libusb_control_transfer(handle, 0x21, 0x09, 0x0305, 1, send_data0, 8, 5000)) < 0) + std::cout << "libusb_control_transfer3: " << libusb_error_name(r) << std::endl; + if ((r = libusb_control_transfer(handle, 0xa1, 0x01, 0x0308, 1, deviceData, 520, 5000)) < 0) + std::cout << "libusb_control_transfer4: " << libusb_error_name(r) << std::endl; + for (int i = 0; i < 520; ++i) + { + std::cout << std::hex << (int)deviceData[i] << "|" << (int)data2[i] << "\t"; + + } + + std::cout << std::endl; + std::cout << std::endl; + + if ((r = libusb_control_transfer(handle, 0x21, 0x09, 0x0308, 1, data, 520, 5000)) < 0) + std::cout << "libusb_control_transfer5: " << libusb_error_name(r) << std::endl; + if ((r = libusb_control_transfer(handle, 0x21, 0x09, 0x0308, 1, data2, 520, 5000)) < 0) + std::cout << "libusb_control_transfer6: " << libusb_error_name(r) << std::endl; + + if ((r = libusb_release_interface(handle, 1)) < 0) + std::cout << "libusb_release_interface: " << libusb_error_name(r) << std::endl; + if ((r = libusb_attach_kernel_driver(handle, 1)) < 0) + std::cout << "libusb_attach_kernel_driver: " << libusb_error_name(r) << std::endl; libusb_close(handle); libusb_free_device_list(list, 1); diff --git a/vgcore.77665 b/vgcore.77665 new file mode 100644 index 0000000..d616ccf Binary files /dev/null and b/vgcore.77665 differ