/* RemdesKVM USB-KVM Firmware for PCB design v4 or above Author: tobychui Upload Settings CH552G 24Mhz (Internal) */ #include // Simple mapping: A-Z → HID code 0x04 - 0x1D uint8_t asciiToHID(char c) { if (c >= 'A' && c <= 'Z') return (c - 'A') + 0x04; if (c >= 'a' && c <= 'z') return (c - 'a') + 0x04; return 0x00; } // Checksum = sum of all bytes except last uint8_t calcChecksum(uint8_t* data, uint8_t len) { uint8_t sum = 0; for (uint8_t i = 0; i < len; i++) sum += data[i]; return sum; } //Wrapper for writing an array to serial void Serial0_writeBuf(const uint8_t* data, uint8_t len) { for (uint8_t i = 0; i < len; i++) { Serial0_write(data[i]); } } void sendKeyPress(char key) { uint8_t packet[] = { 0x57, 0xAB, 0x00, 0x02, 0x08, // Header, addr, CMD, len 0x00, 0x00, asciiToHID(key), 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // checksum placeholder }; packet[13] = calcChecksum(packet, 13); Serial0_writeBuf(packet, 14); } void sendKeyRelease() { uint8_t packet[] = { 0x57, 0xAB, 0x00, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // checksum placeholder }; packet[13] = calcChecksum(packet, 13); Serial0_writeBuf(packet, 14); } void setup() { USBSerial_println("Ready. Type a letter to send to CH9329."); Serial0_begin(9600); // CH9329 UART default baud } void loop() { if (USBSerial_available()) { char c = USBSerial_read(); if (asciiToHID(c)) { USBSerial_print("Sending key: "); USBSerial_println((char)c); sendKeyPress(c); delay(50); sendKeyRelease(); } else { USBSerial_print("Unsupported char: "); USBSerial_println((int)c); // show ASCII code for debugging } } // Echo UART response from CH9329 to USB while (Serial1_available()) { uint8_t b = Serial1_read(); USBSerial_print("CH9329 >> 0x"); if (b < 0x10) USBSerial_print("0"); USBSerial_println(b, HEX); } }