From d6634a54fceb626c39995fbedc0b7c922d5b2966 Mon Sep 17 00:00:00 2001 From: Elizabeth Cray Date: Fri, 25 Jul 2025 01:18:33 -0400 Subject: [PATCH] EndOfNight: Keyboard Protocol Porting WIP --- .gitignore | 3 +- src/CMakeLists.txt | 19 ++++---- src/config.h | 18 ++++++- src/hirsute.c | 117 ++++++++++++++++++++++++++++++++++++++++----- 4 files changed, 134 insertions(+), 23 deletions(-) diff --git a/.gitignore b/.gitignore index 6a8bc10..e9e8483 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ .vscode -build \ No newline at end of file +build +src/build diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 5e55cfe..f745376 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -6,8 +6,8 @@ set(CMAKE_CXX_STANDARD 17) set(PICO_SDK_PATH "${CMAKE_CURRENT_LIST_DIR}/../libs/pico-sdk") include("${PICO_SDK_PATH}/external/pico_sdk_import.cmake") -set(PICO_PIO_USB_DIR "${CMAKE_CURRENT_LIST_DIR}/../libs/pico-pio-hirsute") -add_subdirectory(${PICO_PIO_USB_DIR} pico_pio_usb) +# set(PICO_PIO_USB_DIR "${CMAKE_CURRENT_LIST_DIR}/../libs/pico-pio-hirsute") +# add_subdirectory(${PICO_PIO_USB_DIR} pico_pio_usb) set(target_name hirsute) @@ -19,22 +19,23 @@ add_executable(${target_name} target_sources(${target_name} PRIVATE hirsute.c - ${PICO_SDK_PATH}/lib/tinyusb/src/portable/raspberrypi/pio_usb/dcd_pio_usb.c - ${PICO_SDK_PATH}/lib/tinyusb/src/portable/raspberrypi/pio_usb/hcd_pio_usb.c + # ${PICO_SDK_PATH}/lib/tinyusb/src/portable/raspberrypi/pio_usb/dcd_pio_usb.c + # ${PICO_SDK_PATH}/lib/tinyusb/src/portable/raspberrypi/pio_usb/hcd_pio_usb.c ) pico_sdk_init() -pico_enable_stdio_usb(${target_name} 0) -pico_enable_stdio_uart(${target_name} 1) +pico_enable_stdio_usb(${target_name} 1) +pico_enable_stdio_uart(${target_name} 0) target_link_options(${target_name} PRIVATE -Xlinker --print-memory-usage) target_compile_options(${target_name} PRIVATE -Wall -Wextra) -target_compile_definitions(${target_name} PRIVATE PIO_USB_USE_TINYUSB) -target_include_directories(${target_name} PRIVATE ${CMAKE_CURRENT_LIST_DIR}) +# target_compile_definitions(${target_name} PRIVATE PIO_USB_USE_TINYUSB) +# target_include_directories(${target_name} PRIVATE ${CMAKE_CURRENT_LIST_DIR}) -target_link_libraries(${target_name} PRIVATE pico_stdlib pico_multicore pico_pio_usb tinyusb_host tinyusb_board) +# target_link_libraries(${target_name} PRIVATE pico_stdlib pico_multicore pico_pio_usb tinyusb_host tinyusb_board) +target_link_libraries(${target_name} PRIVATE pico_stdlib pico_multicore) # Generate hex file pico_add_extra_outputs(${target_name}) diff --git a/src/config.h b/src/config.h index b3bea41..f15fdb6 100644 --- a/src/config.h +++ b/src/config.h @@ -1,6 +1,22 @@ #ifndef CONFIG_H #define CONFIG_H -#define BAUD_RATE 115200 +#define EN_USB 0 // Enable USB Host + +#define USB_DP 16 // USB D+ pin on GP16 + +#define MAC_MOUSE_X2 +#define MAC_MOUSE_X1 +#define MAC_MOUSE_Y2 +#define MAC_MOUSE_Y1 +#define MAC_MOUSE_SW +#define MAC_MOUSE_5V + +#define MAC_KB_CLOCK 3 +#define MAC_KB_DATA 2 +#define MAC_KB_5V + +#define NULL_TRANSITION 0x7b +#define CAPS_LOCK 0x73 #endif // CONFIG_H diff --git a/src/hirsute.c b/src/hirsute.c index 71ab81f..f2722e1 100644 --- a/src/hirsute.c +++ b/src/hirsute.c @@ -16,44 +16,137 @@ #include #include +#include "config.h" #include "pico/stdlib.h" +#include "pico/util/queue.h" #include "pico/multicore.h" #include "pico/bootrom.h" +#if EN_USB #include "pio_usb.h" #include "tusb.h" #include "bsp/board.h" +#endif #include "hardware/uart.h" #include "hardware/clocks.h" -#include "config.h" +void setPullup(uint PIN); +void holdForEnable(); +uint8_t readCommand(); +void sendByte(uint8_t payload); +void sendNextKey(); +queue_t key_queue; +#if EN_USB void core_one() { sleep_ms(10); pio_usb_configuration_t pio_config = PIO_USB_DEFAULT_CONFIG; - pio_config.pin_dp = 16; // USB D+ pin on GP16 + pio_config.pin_dp = USB_DP; tuh_configure(1, TUH_CFGID_RPI_PIO_USB_CONFIGURATION, &pio_config); tuh_init(1); while (true) { tuh_task(); } } +#endif int main() { - board_init(); + #if EN_USB + board_init(); + #endif + stdio_init_all(); set_sys_clock_khz(120000, true); - uart_init(UART_ID, BAUD_RATE); - gpio_set_function(UART_TX_PIN, GPIO_FUNC_UART); - gpio_set_function(UART_RX_PIN, GPIO_FUNC_UART); sleep_ms(10); + queue_init(&key_queue, sizeof(uint8_t), 1024); multicore_reset_core1(); - multicore_launch_core1(core_one); - board_led_write(true); + #if EN_USB + multicore_launch_core1(core_one); + #endif + // Init Pins for Keyboard + gpio_init(MAC_KB_CLOCK); + gpio_set_dir(MAC_KB_CLOCK, GPIO_OUT); + gpio_init(MAC_KB_DATA); + setPullup(MAC_KB_DATA); + while (true){ + switch(readCommand()) { + case 0x10: + // Key Requested - while (true) { - stdio_flush(); - sleep_us(10); + break; + case 0x14: + // Send Key + break; + case 0x16: + // Requests Model Number + sendByte(0x0b); + break; + case 0x36: + // Test? + sendByte(0x7d); + break; + } } - return 0; } + +void setPullup(uint PIN){ + gpio_set_dir(PIN, GPIO_IN); + gpio_pull_up(PIN); +} + +void holdForEnable() { + printf("Waiting for keyboard enable...\n"); + while (gpio_get(MAC_KB_DATA)) { + printf("."); + sleep_ms(10); + } + printf("\nKeyboard enabled.\n"); + sleep_us(180); +} + +uint8_t readCommand() { + setPullup(MAC_KB_DATA); + sleep_us(20); + while (gpio_get(MAC_KB_DATA)); + sleep_us(400); + //readByte + uint8_t command = 0; + for (uint8_t i = 0; i < 8; i++) { + gpio_put(MAC_KB_CLOCK, 0); + sleep_us(180); + gpio_put(MAC_KB_CLOCK, 1); + sleep_us(80); + command = (command << 1) | gpio_get(MAC_KB_DATA); + sleep_us(140); + } + while (!gpio_get(MAC_KB_DATA)); + gpio_set_dir(MAC_KB_DATA, GPIO_OUT); + sleep_us(20); + return command; +} + +void sendByte(uint8_t payload) { + for (uint8_t i = 0; i < 8; i++) { + gpio_put(MAC_KB_DATA, (payload & i)); + sleep_us(40); + gpio_put(MAC_KB_CLOCK, 0); + sleep_us(120); + gpio_put(MAC_KB_CLOCK, 1); + sleep_us(170); + } + gpio_put(MAC_KB_DATA, 1); +} + +void sendNextKey() { + // Send the next key from the cache (To be filled by a USB HID device) + uint64_t startTime = time_us_64(); + while (time_us_64() - startTime < 250000) { // 250ms timeout + uint8_t key; + if (queue_try_remove(&key_queue, &key)) { + sendByte(key); // TODO: Replace with mac-plus-ps2's sendKey() + return; + } + sleep_us(2); + } + sendByte(NULL_TRANSITION); // Send null transition if no key is available +}