usbkvm_fw2.ino 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. /*
  2. RemdesKVM USB-KVM
  3. Firmware for PCB design v4 or above
  4. Author: tobychui
  5. Upload Settings
  6. CH552G
  7. 24Mhz (Internal)
  8. */
  9. #include <Serial.h>
  10. // Simple mapping: A-Z → HID code 0x04 - 0x1D
  11. uint8_t asciiToHID(char c) {
  12. if (c >= 'A' && c <= 'Z') return (c - 'A') + 0x04;
  13. if (c >= 'a' && c <= 'z') return (c - 'a') + 0x04;
  14. return 0x00;
  15. }
  16. // Checksum = sum of all bytes except last
  17. uint8_t calcChecksum(uint8_t* data, uint8_t len) {
  18. uint8_t sum = 0;
  19. for (uint8_t i = 0; i < len; i++) sum += data[i];
  20. return sum;
  21. }
  22. //Wrapper for writing an array to serial
  23. void Serial0_writeBuf(const uint8_t* data, uint8_t len) {
  24. for (uint8_t i = 0; i < len; i++) {
  25. Serial0_write(data[i]);
  26. }
  27. }
  28. void sendKeyPress(char key) {
  29. uint8_t packet[] = {
  30. 0x57, 0xAB, 0x00, 0x02, 0x08, // Header, addr, CMD, len
  31. 0x00, 0x00, asciiToHID(key), 0x00, 0x00, 0x00, 0x00, 0x00,
  32. 0x00 // checksum placeholder
  33. };
  34. packet[13] = calcChecksum(packet, 13);
  35. Serial0_writeBuf(packet, 14);
  36. }
  37. void sendKeyRelease() {
  38. uint8_t packet[] = {
  39. 0x57, 0xAB, 0x00, 0x02, 0x08,
  40. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  41. 0x00 // checksum placeholder
  42. };
  43. packet[13] = calcChecksum(packet, 13);
  44. Serial0_writeBuf(packet, 14);
  45. }
  46. void setup() {
  47. USBSerial_println("Ready. Type a letter to send to CH9329.");
  48. Serial0_begin(9600); // CH9329 UART default baud
  49. }
  50. void loop() {
  51. if (USBSerial_available()) {
  52. char c = USBSerial_read();
  53. if (asciiToHID(c)) {
  54. USBSerial_print("Sending key: ");
  55. USBSerial_println((char)c);
  56. sendKeyPress(c);
  57. delay(50);
  58. sendKeyRelease();
  59. } else {
  60. USBSerial_print("Unsupported char: ");
  61. USBSerial_println((int)c); // show ASCII code for debugging
  62. }
  63. }
  64. // Echo UART response from CH9329 to USB
  65. while (Serial1_available()) {
  66. uint8_t b = Serial1_read();
  67. USBSerial_print("CH9329 >> 0x");
  68. if (b < 0x10) USBSerial_print("0");
  69. USBSerial_println(b, HEX);
  70. }
  71. }