From 42ff6b7a56f9854e02f311cfeaf6e518d857380d Mon Sep 17 00:00:00 2001 From: Vojta Date: Sun, 3 Dec 2023 12:11:37 +0100 Subject: [PATCH] Fix for composite report HIDs (better mouse compatibility). --- CMakeLists.txt | 12 +++++ example_auto_set_url.cmake | 5 ++ pico_extras_import_optional.cmake | 59 +++++++++++++++++++++++ usb/CMakeLists.txt | 2 +- usb/host/CMakeLists.txt | 2 + usb/host/usb_to_ps1_mouse/CMakeLists.txt | 6 +++ usb/host/usb_to_ps1_mouse/hid_app.c | 28 ++++++++--- usb_to_ps1_mouse.uf2 | Bin 73216 -> 0 bytes 8 files changed, 107 insertions(+), 7 deletions(-) create mode 100644 example_auto_set_url.cmake create mode 100644 pico_extras_import_optional.cmake delete mode 100644 usb_to_ps1_mouse.uf2 diff --git a/CMakeLists.txt b/CMakeLists.txt index 3623896..1a0e69b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,6 +3,8 @@ cmake_minimum_required(VERSION 3.12) # Pull in SDK (must be before project) include(pico_sdk_import.cmake) +include(pico_extras_import_optional.cmake) + project(pico_examples C CXX ASM) set(CMAKE_C_STANDARD 11) set(CMAKE_CXX_STANDARD 17) @@ -16,5 +18,15 @@ set(PICO_EXAMPLES_PATH ${PROJECT_SOURCE_DIR}) # Initialize the SDK pico_sdk_init() +include(example_auto_set_url.cmake) + +add_compile_options(-Wall + -Wno-format # int != int32_t as far as the compiler is concerned because gcc has int32_t as long int + -Wno-unused-function # we have some for the docs that aren't called + ) +if (CMAKE_C_COMPILER_ID STREQUAL "GNU") + add_compile_options(-Wno-maybe-uninitialized) +endif() + # Hardware-specific examples in subdirectories: add_subdirectory(usb) diff --git a/example_auto_set_url.cmake b/example_auto_set_url.cmake new file mode 100644 index 0000000..59e6c71 --- /dev/null +++ b/example_auto_set_url.cmake @@ -0,0 +1,5 @@ +set(PICO_EXAMPLE_URL_BASE "https://github.com/raspberrypi/pico-examples/tree/HEAD") +macro(example_auto_set_url TARGET) + file(RELATIVE_PATH URL_REL_PATH "${PICO_EXAMPLES_PATH}" "${CMAKE_CURRENT_LIST_DIR}") + pico_set_program_url(${TARGET} "${PICO_EXAMPLE_URL_BASE}/${URL_REL_PATH}") +endmacro() \ No newline at end of file diff --git a/pico_extras_import_optional.cmake b/pico_extras_import_optional.cmake new file mode 100644 index 0000000..692e14a --- /dev/null +++ b/pico_extras_import_optional.cmake @@ -0,0 +1,59 @@ +# This is a copy of /external/pico_extras_import.cmake + +# This can be dropped into an external project to help locate pico-extras +# It should be include()ed prior to project() + +if (DEFINED ENV{PICO_EXTRAS_PATH} AND (NOT PICO_EXTRAS_PATH)) + set(PICO_EXTRAS_PATH $ENV{PICO_EXTRAS_PATH}) + message("Using PICO_EXTRAS_PATH from environment ('${PICO_EXTRAS_PATH}')") +endif () + +if (DEFINED ENV{PICO_EXTRAS_FETCH_FROM_GIT} AND (NOT PICO_EXTRAS_FETCH_FROM_GIT)) + set(PICO_EXTRAS_FETCH_FROM_GIT $ENV{PICO_EXTRAS_FETCH_FROM_GIT}) + message("Using PICO_EXTRAS_FETCH_FROM_GIT from environment ('${PICO_EXTRAS_FETCH_FROM_GIT}')") +endif () + +if (DEFINED ENV{PICO_EXTRAS_FETCH_FROM_GIT_PATH} AND (NOT PICO_EXTRAS_FETCH_FROM_GIT_PATH)) + set(PICO_EXTRAS_FETCH_FROM_GIT_PATH $ENV{PICO_EXTRAS_FETCH_FROM_GIT_PATH}) + message("Using PICO_EXTRAS_FETCH_FROM_GIT_PATH from environment ('${PICO_EXTRAS_FETCH_FROM_GIT_PATH}')") +endif () + +if (NOT PICO_EXTRAS_PATH) + if (PICO_EXTRAS_FETCH_FROM_GIT) + include(FetchContent) + set(FETCHCONTENT_BASE_DIR_SAVE ${FETCHCONTENT_BASE_DIR}) + if (PICO_EXTRAS_FETCH_FROM_GIT_PATH) + get_filename_component(FETCHCONTENT_BASE_DIR "${PICO_EXTRAS_FETCH_FROM_GIT_PATH}" REALPATH BASE_DIR "${CMAKE_SOURCE_DIR}") + endif () + FetchContent_Declare( + pico_extras + GIT_REPOSITORY https://github.com/raspberrypi/pico-extras + GIT_TAG master + ) + if (NOT pico_extras) + message("Downloading Raspberry Pi Pico Extras") + FetchContent_Populate(pico_extras) + set(PICO_EXTRAS_PATH ${pico_extras_SOURCE_DIR}) + endif () + set(FETCHCONTENT_BASE_DIR ${FETCHCONTENT_BASE_DIR_SAVE}) + else () + if (PICO_SDK_PATH AND EXISTS "${PICO_SDK_PATH}/../pico-extras") + set(PICO_EXTRAS_PATH ${PICO_SDK_PATH}/../pico-extras) + message("Defaulting PICO_EXTRAS_PATH as sibling of PICO_SDK_PATH: ${PICO_EXTRAS_PATH}") + endif() + endif () +endif () + +if (PICO_EXTRAS_PATH) + set(PICO_EXTRAS_PATH "${PICO_EXTRAS_PATH}" CACHE PATH "Path to the PICO EXTRAS") + set(PICO_EXTRAS_FETCH_FROM_GIT "${PICO_EXTRAS_FETCH_FROM_GIT}" CACHE BOOL "Set to ON to fetch copy of PICO EXTRAS from git if not otherwise locatable") + set(PICO_EXTRAS_FETCH_FROM_GIT_PATH "${PICO_EXTRAS_FETCH_FROM_GIT_PATH}" CACHE FILEPATH "location to download EXTRAS") + + get_filename_component(PICO_EXTRAS_PATH "${PICO_EXTRAS_PATH}" REALPATH BASE_DIR "${CMAKE_BINARY_DIR}") + if (NOT EXISTS ${PICO_EXTRAS_PATH}) + message(FATAL_ERROR "Directory '${PICO_EXTRAS_PATH}' not found") + endif () + + set(PICO_EXTRAS_PATH ${PICO_EXTRAS_PATH} CACHE PATH "Path to the PICO EXTRAS" FORCE) + add_subdirectory(${PICO_EXTRAS_PATH} pico_extras) +endif() \ No newline at end of file diff --git a/usb/CMakeLists.txt b/usb/CMakeLists.txt index 3129bfa..65382c6 100644 --- a/usb/CMakeLists.txt +++ b/usb/CMakeLists.txt @@ -1,5 +1,5 @@ if (TARGET tinyusb_host) add_subdirectory(host) else () - message("Cannot build, TinyUSB unavailable") + message("Skipping TinyUSB host examples as TinyUSB is unavailable") endif () diff --git a/usb/host/CMakeLists.txt b/usb/host/CMakeLists.txt index e279696..4646695 100644 --- a/usb/host/CMakeLists.txt +++ b/usb/host/CMakeLists.txt @@ -1,6 +1,8 @@ set(FAMILY rp2040) set(BOARD pico_sdk) set(TINYUSB_FAMILY_PROJECT_NAME_PREFIX "tinyusb_host_") +# Hack as some host examples use $TOP in their path +set(TOP ${PICO_TINYUSB_PATH}) add_subdirectory(${PICO_TINYUSB_PATH}/examples/host tinyusb_host_examples) add_subdirectory(usb_to_ps1_mouse) diff --git a/usb/host/usb_to_ps1_mouse/CMakeLists.txt b/usb/host/usb_to_ps1_mouse/CMakeLists.txt index a511c2e..e283ac1 100644 --- a/usb/host/usb_to_ps1_mouse/CMakeLists.txt +++ b/usb/host/usb_to_ps1_mouse/CMakeLists.txt @@ -17,3 +17,9 @@ target_include_directories(usb_to_ps1_mouse PUBLIC target_link_libraries(usb_to_ps1_mouse PUBLIC pico_stdlib tinyusb_host tinyusb_board pico_multicore) pico_add_extra_outputs(usb_to_ps1_mouse) + +pico_enable_stdio_usb(usb_to_ps1_mouse 0) +pico_enable_stdio_uart(usb_to_ps1_mouse 1) + +# add url via pico_set_program_url +example_auto_set_url(usb_to_ps1_mouse) diff --git a/usb/host/usb_to_ps1_mouse/hid_app.c b/usb/host/usb_to_ps1_mouse/hid_app.c index f410f17..8e8e8b9 100644 --- a/usb/host/usb_to_ps1_mouse/hid_app.c +++ b/usb/host/usb_to_ps1_mouse/hid_app.c @@ -28,7 +28,7 @@ static struct }hid_info[CFG_TUH_HID]; static void process_kbd_report(hid_keyboard_report_t const *report); -static void process_mouse_report(hid_mouse_report_t const * report); +static void process_mouse_report(uint8_t const* report, uint16_t len); static void process_generic_report(uint8_t dev_addr, uint8_t instance, uint8_t const* report, uint16_t len); void hid_app_task(void) @@ -81,17 +81,28 @@ void tuh_hid_umount_cb(uint8_t dev_addr, uint8_t instance) void tuh_hid_report_received_cb(uint8_t dev_addr, uint8_t instance, uint8_t const* report, uint16_t len) { uint8_t const itf_protocol = tuh_hid_interface_protocol(dev_addr, instance); + uint8_t const rpt_count = tuh_hid_instance_count(dev_addr); + + uint8_t const* reportAdj = report; + uint16_t lenAdj = len; + + if ( rpt_count != 1 ) + { + // Composite report, 1st byte is report ID, data starts from 2nd byte + reportAdj++; + lenAdj--; + } switch (itf_protocol) { case HID_ITF_PROTOCOL_KEYBOARD: TU_LOG2("HID receive boot keyboard report\r\n"); - process_kbd_report( (hid_keyboard_report_t const*) report ); + process_kbd_report( (hid_keyboard_report_t const*) reportAdj ); break; case HID_ITF_PROTOCOL_MOUSE: TU_LOG2("HID receive boot mouse report\r\n"); - process_mouse_report( (hid_mouse_report_t const*) report ); + process_mouse_report(reportAdj, lenAdj); break; default: @@ -155,9 +166,14 @@ static void process_kbd_report(hid_keyboard_report_t const *report) // Mouse //--------------------------------------------------------------------+ -static void process_mouse_report(hid_mouse_report_t const * report) +static void process_mouse_report(uint8_t const* report, uint16_t len) { - int8_t arr[4] = {report->buttons, report->x, report->y, report->wheel}; + int8_t arr[4] = {0}; + for (uint16_t i = 0; i != len; ++i) + { + arr[i] = report[i]; + } + //printf("%d %d %d %d\r\n", (int)report[0], (int)report[1], (int)report[2], (int)report[3]); fflush(stdout); uint32_t mouseData = 0; memcpy(&mouseData, arr, 4); multicore_fifo_push_blocking(mouseData); @@ -223,7 +239,7 @@ static void process_generic_report(uint8_t dev_addr, uint8_t instance, uint8_t c case HID_USAGE_DESKTOP_MOUSE: TU_LOG1("HID receive mouse report\r\n"); // Assume mouse follow boot report layout - process_mouse_report( (hid_mouse_report_t const*) report ); + process_mouse_report(report, len); break; default: break; diff --git a/usb_to_ps1_mouse.uf2 b/usb_to_ps1_mouse.uf2 deleted file mode 100644 index 765b0bdb8afd82000dd14fb1e32abadf20f21026..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 73216 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