Créaation du dépôt en copiant l'exemple
This commit is contained in:
		
						commit
						fbad598eb2
					
				
							
								
								
									
										24
									
								
								CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,24 @@ | |||||||
|  | cmake_minimum_required(VERSION 3.13) | ||||||
|  | 
 | ||||||
|  | add_executable(host_cdc_msc_hid) | ||||||
|  | 
 | ||||||
|  | # Example source | ||||||
|  | target_sources(host_cdc_msc_hid PUBLIC | ||||||
|  |         ${CMAKE_CURRENT_LIST_DIR}/hid_app.c | ||||||
|  |         ${CMAKE_CURRENT_LIST_DIR}/main.c | ||||||
|  |         ${CMAKE_CURRENT_LIST_DIR}/msc_app.c | ||||||
|  |         ${CMAKE_CURRENT_LIST_DIR}/cdc_app.c | ||||||
|  |         ) | ||||||
|  | 
 | ||||||
|  | # Make sure TinyUSB can find tusb_config.h | ||||||
|  | target_include_directories(host_cdc_msc_hid PUBLIC | ||||||
|  |         ${CMAKE_CURRENT_LIST_DIR}) | ||||||
|  | 
 | ||||||
|  | # In addition to pico_stdlib required for common PicoSDK functionality, add dependency on tinyusb_host | ||||||
|  | # for TinyUSB device support and tinyusb_board for the additional board support library used by the example | ||||||
|  | target_link_libraries(host_cdc_msc_hid PUBLIC pico_stdlib tinyusb_host tinyusb_board) | ||||||
|  | 
 | ||||||
|  | pico_add_extra_outputs(host_cdc_msc_hid) | ||||||
|  | 
 | ||||||
|  | # add url via pico_set_program_url | ||||||
|  | example_auto_set_url(host_cdc_msc_hid) | ||||||
							
								
								
									
										21
									
								
								LICENSE.TXT
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								LICENSE.TXT
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,21 @@ | |||||||
|  | The MIT License (MIT) | ||||||
|  | 
 | ||||||
|  | Copyright (c) 2018, hathach (tinyusb.org) | ||||||
|  | 
 | ||||||
|  | Permission is hereby granted, free of charge, to any person obtaining a copy | ||||||
|  | of this software and associated documentation files (the "Software"), to deal | ||||||
|  | in the Software without restriction, including without limitation the rights | ||||||
|  | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||||
|  | copies of the Software, and to permit persons to whom the Software is | ||||||
|  | furnished to do so, subject to the following conditions: | ||||||
|  | 
 | ||||||
|  | The above copyright notice and this permission notice shall be included in | ||||||
|  | all copies or substantial portions of the Software. | ||||||
|  | 
 | ||||||
|  | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||||
|  | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||||
|  | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||||
|  | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||||
|  | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||||
|  | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||||
|  | THE SOFTWARE. | ||||||
							
								
								
									
										113
									
								
								cdc_app.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										113
									
								
								cdc_app.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,113 @@ | |||||||
|  | /*
 | ||||||
|  |  * The MIT License (MIT) | ||||||
|  |  * | ||||||
|  |  * Copyright (c) 2022, Ha Thach (tinyusb.org) | ||||||
|  |  * | ||||||
|  |  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||||
|  |  * of this software and associated documentation files (the "Software"), to deal | ||||||
|  |  * in the Software without restriction, including without limitation the rights | ||||||
|  |  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||||
|  |  * copies of the Software, and to permit persons to whom the Software is | ||||||
|  |  * furnished to do so, subject to the following conditions: | ||||||
|  |  * | ||||||
|  |  * The above copyright notice and this permission notice shall be included in | ||||||
|  |  * all copies or substantial portions of the Software. | ||||||
|  |  * | ||||||
|  |  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||||
|  |  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||||
|  |  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||||
|  |  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||||
|  |  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||||
|  |  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||||
|  |  * THE SOFTWARE. | ||||||
|  |  * | ||||||
|  |  * This file is part of the TinyUSB stack. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include "tusb.h" | ||||||
|  | #include "bsp/board.h" | ||||||
|  | 
 | ||||||
|  | //--------------------------------------------------------------------+
 | ||||||
|  | // MACRO TYPEDEF CONSTANT ENUM DECLARATION
 | ||||||
|  | //--------------------------------------------------------------------+
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | //------------- IMPLEMENTATION -------------//
 | ||||||
|  | 
 | ||||||
|  | size_t get_console_inputs(uint8_t* buf, size_t bufsize) | ||||||
|  | { | ||||||
|  |   size_t count = 0; | ||||||
|  |   while (count < bufsize) | ||||||
|  |   { | ||||||
|  |     int ch = board_getchar(); | ||||||
|  |     if ( ch <= 0 ) break; | ||||||
|  | 
 | ||||||
|  |     buf[count] = (uint8_t) ch; | ||||||
|  |     count++; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   return count; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void cdc_app_task(void) | ||||||
|  | { | ||||||
|  |   uint8_t buf[64+1]; // +1 for extra null character
 | ||||||
|  |   uint32_t const bufsize = sizeof(buf)-1; | ||||||
|  | 
 | ||||||
|  |   uint32_t count = get_console_inputs(buf, bufsize); | ||||||
|  |   buf[count] = 0; | ||||||
|  | 
 | ||||||
|  |   // loop over all mounted interfaces
 | ||||||
|  |   for(uint8_t idx=0; idx<CFG_TUH_CDC; idx++) | ||||||
|  |   { | ||||||
|  |     if ( tuh_cdc_mounted(idx) ) | ||||||
|  |     { | ||||||
|  |       // console --> cdc interfaces
 | ||||||
|  |       if (count) | ||||||
|  |       { | ||||||
|  |         tuh_cdc_write(idx, buf, count); | ||||||
|  |         tuh_cdc_write_flush(idx); | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Invoked when received new data
 | ||||||
|  | void tuh_cdc_rx_cb(uint8_t idx) | ||||||
|  | { | ||||||
|  |   uint8_t buf[64+1]; // +1 for extra null character
 | ||||||
|  |   uint32_t const bufsize = sizeof(buf)-1; | ||||||
|  | 
 | ||||||
|  |   // forward cdc interfaces -> console
 | ||||||
|  |   uint32_t count = tuh_cdc_read(idx, buf, bufsize); | ||||||
|  |   buf[count] = 0; | ||||||
|  | 
 | ||||||
|  |   printf((char*) buf); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void tuh_cdc_mount_cb(uint8_t idx) | ||||||
|  | { | ||||||
|  |   tuh_cdc_itf_info_t itf_info = { 0 }; | ||||||
|  |   tuh_cdc_itf_get_info(idx, &itf_info); | ||||||
|  | 
 | ||||||
|  |   printf("CDC Interface is mounted: address = %u, itf_num = %u\r\n", itf_info.daddr, itf_info.bInterfaceNumber); | ||||||
|  | 
 | ||||||
|  | #ifdef CFG_TUH_CDC_LINE_CODING_ON_ENUM | ||||||
|  |   // CFG_TUH_CDC_LINE_CODING_ON_ENUM must be defined for line coding is set by tinyusb in enumeration
 | ||||||
|  |   // otherwise you need to call tuh_cdc_set_line_coding() first
 | ||||||
|  |   cdc_line_coding_t line_coding = { 0 }; | ||||||
|  |   if ( tuh_cdc_get_local_line_coding(idx, &line_coding) ) | ||||||
|  |   { | ||||||
|  |     printf("  Baudrate: %lu, Stop Bits : %u\r\n", line_coding.bit_rate, line_coding.stop_bits); | ||||||
|  |     printf("  Parity  : %u, Data Width: %u\r\n", line_coding.parity  , line_coding.data_bits); | ||||||
|  |   } | ||||||
|  | #endif | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void tuh_cdc_umount_cb(uint8_t idx) | ||||||
|  | { | ||||||
|  |   tuh_cdc_itf_info_t itf_info = { 0 }; | ||||||
|  |   tuh_cdc_itf_get_info(idx, &itf_info); | ||||||
|  | 
 | ||||||
|  |   printf("CDC Interface is unmounted: address = %u, itf_num = %u\r\n", itf_info.daddr, itf_info.bInterfaceNumber); | ||||||
|  | } | ||||||
							
								
								
									
										296
									
								
								hid_app.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										296
									
								
								hid_app.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,296 @@ | |||||||
|  | /*
 | ||||||
|  |  * The MIT License (MIT) | ||||||
|  |  * | ||||||
|  |  * Copyright (c) 2021, Ha Thach (tinyusb.org) | ||||||
|  |  * | ||||||
|  |  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||||
|  |  * of this software and associated documentation files (the "Software"), to deal | ||||||
|  |  * in the Software without restriction, including without limitation the rights | ||||||
|  |  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||||
|  |  * copies of the Software, and to permit persons to whom the Software is | ||||||
|  |  * furnished to do so, subject to the following conditions: | ||||||
|  |  * | ||||||
|  |  * The above copyright notice and this permission notice shall be included in | ||||||
|  |  * all copies or substantial portions of the Software. | ||||||
|  |  * | ||||||
|  |  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||||
|  |  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||||
|  |  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||||
|  |  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||||
|  |  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||||
|  |  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||||
|  |  * THE SOFTWARE. | ||||||
|  |  * | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include "bsp/board.h" | ||||||
|  | #include "tusb.h" | ||||||
|  | 
 | ||||||
|  | //--------------------------------------------------------------------+
 | ||||||
|  | // MACRO TYPEDEF CONSTANT ENUM DECLARATION
 | ||||||
|  | //--------------------------------------------------------------------+
 | ||||||
|  | 
 | ||||||
|  | // If your host terminal support ansi escape code such as TeraTerm
 | ||||||
|  | // it can be use to simulate mouse cursor movement within terminal
 | ||||||
|  | #define USE_ANSI_ESCAPE   0 | ||||||
|  | 
 | ||||||
|  | #define MAX_REPORT  4 | ||||||
|  | 
 | ||||||
|  | static uint8_t const keycode2ascii[128][2] =  { HID_KEYCODE_TO_ASCII }; | ||||||
|  | 
 | ||||||
|  | // Each HID instance can has multiple reports
 | ||||||
|  | static struct | ||||||
|  | { | ||||||
|  |   uint8_t report_count; | ||||||
|  |   tuh_hid_report_info_t report_info[MAX_REPORT]; | ||||||
|  | }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_generic_report(uint8_t dev_addr, uint8_t instance, uint8_t const* report, uint16_t len); | ||||||
|  | 
 | ||||||
|  | void hid_app_task(void) | ||||||
|  | { | ||||||
|  |   // nothing to do
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | //--------------------------------------------------------------------+
 | ||||||
|  | // TinyUSB Callbacks
 | ||||||
|  | //--------------------------------------------------------------------+
 | ||||||
|  | 
 | ||||||
|  | // Invoked when device with hid interface is mounted
 | ||||||
|  | // Report descriptor is also available for use. tuh_hid_parse_report_descriptor()
 | ||||||
|  | // can be used to parse common/simple enough descriptor.
 | ||||||
|  | // Note: if report descriptor length > CFG_TUH_ENUMERATION_BUFSIZE, it will be skipped
 | ||||||
|  | // therefore report_desc = NULL, desc_len = 0
 | ||||||
|  | void tuh_hid_mount_cb(uint8_t dev_addr, uint8_t instance, uint8_t const* desc_report, uint16_t desc_len) | ||||||
|  | { | ||||||
|  |   printf("HID device address = %d, instance = %d is mounted\r\n", dev_addr, instance); | ||||||
|  | 
 | ||||||
|  |   // Interface protocol (hid_interface_protocol_enum_t)
 | ||||||
|  |   const char* protocol_str[] = { "None", "Keyboard", "Mouse" }; | ||||||
|  |   uint8_t const itf_protocol = tuh_hid_interface_protocol(dev_addr, instance); | ||||||
|  | 
 | ||||||
|  |   printf("HID Interface Protocol = %s\r\n", protocol_str[itf_protocol]); | ||||||
|  | 
 | ||||||
|  |   // By default host stack will use activate boot protocol on supported interface.
 | ||||||
|  |   // Therefore for this simple example, we only need to parse generic report descriptor (with built-in parser)
 | ||||||
|  |   if ( itf_protocol == HID_ITF_PROTOCOL_NONE ) | ||||||
|  |   { | ||||||
|  |     hid_info[instance].report_count = tuh_hid_parse_report_descriptor(hid_info[instance].report_info, MAX_REPORT, desc_report, desc_len); | ||||||
|  |     printf("HID has %u reports \r\n", hid_info[instance].report_count); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   // request to receive report
 | ||||||
|  |   // tuh_hid_report_received_cb() will be invoked when report is available
 | ||||||
|  |   if ( !tuh_hid_receive_report(dev_addr, instance) ) | ||||||
|  |   { | ||||||
|  |     printf("Error: cannot request to receive report\r\n"); | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Invoked when device with hid interface is un-mounted
 | ||||||
|  | void tuh_hid_umount_cb(uint8_t dev_addr, uint8_t instance) | ||||||
|  | { | ||||||
|  |   printf("HID device address = %d, instance = %d is unmounted\r\n", dev_addr, instance); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Invoked when received report from device via interrupt endpoint
 | ||||||
|  | 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); | ||||||
|  | 
 | ||||||
|  |   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 ); | ||||||
|  |     break; | ||||||
|  | 
 | ||||||
|  |     case HID_ITF_PROTOCOL_MOUSE: | ||||||
|  |       TU_LOG2("HID receive boot mouse report\r\n"); | ||||||
|  |       process_mouse_report( (hid_mouse_report_t const*) report ); | ||||||
|  |     break; | ||||||
|  | 
 | ||||||
|  |     default: | ||||||
|  |       // Generic report requires matching ReportID and contents with previous parsed report info
 | ||||||
|  |       process_generic_report(dev_addr, instance, report, len); | ||||||
|  |     break; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   // continue to request to receive report
 | ||||||
|  |   if ( !tuh_hid_receive_report(dev_addr, instance) ) | ||||||
|  |   { | ||||||
|  |     printf("Error: cannot request to receive report\r\n"); | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | //--------------------------------------------------------------------+
 | ||||||
|  | // Keyboard
 | ||||||
|  | //--------------------------------------------------------------------+
 | ||||||
|  | 
 | ||||||
|  | // look up new key in previous keys
 | ||||||
|  | static inline bool find_key_in_report(hid_keyboard_report_t const *report, uint8_t keycode) | ||||||
|  | { | ||||||
|  |   for(uint8_t i=0; i<6; i++) | ||||||
|  |   { | ||||||
|  |     if (report->keycode[i] == keycode)  return true; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   return false; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void process_kbd_report(hid_keyboard_report_t const *report) | ||||||
|  | { | ||||||
|  |   static hid_keyboard_report_t prev_report = { 0, 0, {0} }; // previous report to check key released
 | ||||||
|  | 
 | ||||||
|  |   //------------- example code ignore control (non-printable) key affects -------------//
 | ||||||
|  |   for(uint8_t i=0; i<6; i++) | ||||||
|  |   { | ||||||
|  |     if ( report->keycode[i] ) | ||||||
|  |     { | ||||||
|  |       if ( find_key_in_report(&prev_report, report->keycode[i]) ) | ||||||
|  |       { | ||||||
|  |         // exist in previous report means the current key is holding
 | ||||||
|  |       }else | ||||||
|  |       { | ||||||
|  |         // not existed in previous report means the current key is pressed
 | ||||||
|  |         bool const is_shift = report->modifier & (KEYBOARD_MODIFIER_LEFTSHIFT | KEYBOARD_MODIFIER_RIGHTSHIFT); | ||||||
|  |         uint8_t ch = keycode2ascii[report->keycode[i]][is_shift ? 1 : 0]; | ||||||
|  |         putchar(ch); | ||||||
|  |         if ( ch == '\r' ) putchar('\n'); // added new line for enter key
 | ||||||
|  | 
 | ||||||
|  |         fflush(stdout); // flush right away, else nanolib will wait for newline
 | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |     // TODO example skips key released
 | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   prev_report = *report; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | //--------------------------------------------------------------------+
 | ||||||
|  | // Mouse
 | ||||||
|  | //--------------------------------------------------------------------+
 | ||||||
|  | 
 | ||||||
|  | void cursor_movement(int8_t x, int8_t y, int8_t wheel) | ||||||
|  | { | ||||||
|  | #if USE_ANSI_ESCAPE | ||||||
|  |   // Move X using ansi escape
 | ||||||
|  |   if ( x < 0) | ||||||
|  |   { | ||||||
|  |     printf(ANSI_CURSOR_BACKWARD(%d), (-x)); // move left
 | ||||||
|  |   }else if ( x > 0) | ||||||
|  |   { | ||||||
|  |     printf(ANSI_CURSOR_FORWARD(%d), x); // move right
 | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   // Move Y using ansi escape
 | ||||||
|  |   if ( y < 0) | ||||||
|  |   { | ||||||
|  |     printf(ANSI_CURSOR_UP(%d), (-y)); // move up
 | ||||||
|  |   }else if ( y > 0) | ||||||
|  |   { | ||||||
|  |     printf(ANSI_CURSOR_DOWN(%d), y); // move down
 | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   // Scroll using ansi escape
 | ||||||
|  |   if (wheel < 0) | ||||||
|  |   { | ||||||
|  |     printf(ANSI_SCROLL_UP(%d), (-wheel)); // scroll up
 | ||||||
|  |   }else if (wheel > 0) | ||||||
|  |   { | ||||||
|  |     printf(ANSI_SCROLL_DOWN(%d), wheel); // scroll down
 | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   printf("\r\n"); | ||||||
|  | #else | ||||||
|  |   printf("(%d %d %d)\r\n", x, y, wheel); | ||||||
|  | #endif | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void process_mouse_report(hid_mouse_report_t const * report) | ||||||
|  | { | ||||||
|  |   static hid_mouse_report_t prev_report = { 0 }; | ||||||
|  | 
 | ||||||
|  |   //------------- button state  -------------//
 | ||||||
|  |   uint8_t button_changed_mask = report->buttons ^ prev_report.buttons; | ||||||
|  |   if ( button_changed_mask & report->buttons) | ||||||
|  |   { | ||||||
|  |     printf(" %c%c%c ", | ||||||
|  |        report->buttons & MOUSE_BUTTON_LEFT   ? 'L' : '-', | ||||||
|  |        report->buttons & MOUSE_BUTTON_MIDDLE ? 'M' : '-', | ||||||
|  |        report->buttons & MOUSE_BUTTON_RIGHT  ? 'R' : '-'); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   //------------- cursor movement -------------//
 | ||||||
|  |   cursor_movement(report->x, report->y, report->wheel); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | //--------------------------------------------------------------------+
 | ||||||
|  | // Generic Report
 | ||||||
|  | //--------------------------------------------------------------------+
 | ||||||
|  | static void process_generic_report(uint8_t dev_addr, uint8_t instance, uint8_t const* report, uint16_t len) | ||||||
|  | { | ||||||
|  |   (void) dev_addr; | ||||||
|  | 
 | ||||||
|  |   uint8_t const rpt_count = hid_info[instance].report_count; | ||||||
|  |   tuh_hid_report_info_t* rpt_info_arr = hid_info[instance].report_info; | ||||||
|  |   tuh_hid_report_info_t* rpt_info = NULL; | ||||||
|  | 
 | ||||||
|  |   if ( rpt_count == 1 && rpt_info_arr[0].report_id == 0) | ||||||
|  |   { | ||||||
|  |     // Simple report without report ID as 1st byte
 | ||||||
|  |     rpt_info = &rpt_info_arr[0]; | ||||||
|  |   }else | ||||||
|  |   { | ||||||
|  |     // Composite report, 1st byte is report ID, data starts from 2nd byte
 | ||||||
|  |     uint8_t const rpt_id = report[0]; | ||||||
|  | 
 | ||||||
|  |     // Find report id in the array
 | ||||||
|  |     for(uint8_t i=0; i<rpt_count; i++) | ||||||
|  |     { | ||||||
|  |       if (rpt_id == rpt_info_arr[i].report_id ) | ||||||
|  |       { | ||||||
|  |         rpt_info = &rpt_info_arr[i]; | ||||||
|  |         break; | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     report++; | ||||||
|  |     len--; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   if (!rpt_info) | ||||||
|  |   { | ||||||
|  |     printf("Couldn't find the report info for this report !\r\n"); | ||||||
|  |     return; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   // For complete list of Usage Page & Usage checkout src/class/hid/hid.h. For examples:
 | ||||||
|  |   // - Keyboard                     : Desktop, Keyboard
 | ||||||
|  |   // - Mouse                        : Desktop, Mouse
 | ||||||
|  |   // - Gamepad                      : Desktop, Gamepad
 | ||||||
|  |   // - Consumer Control (Media Key) : Consumer, Consumer Control
 | ||||||
|  |   // - System Control (Power key)   : Desktop, System Control
 | ||||||
|  |   // - Generic (vendor)             : 0xFFxx, xx
 | ||||||
|  |   if ( rpt_info->usage_page == HID_USAGE_PAGE_DESKTOP ) | ||||||
|  |   { | ||||||
|  |     switch (rpt_info->usage) | ||||||
|  |     { | ||||||
|  |       case HID_USAGE_DESKTOP_KEYBOARD: | ||||||
|  |         TU_LOG1("HID receive keyboard report\r\n"); | ||||||
|  |         // Assume keyboard follow boot report layout
 | ||||||
|  |         process_kbd_report( (hid_keyboard_report_t const*) report ); | ||||||
|  |       break; | ||||||
|  | 
 | ||||||
|  |       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 ); | ||||||
|  |       break; | ||||||
|  | 
 | ||||||
|  |       default: break; | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										97
									
								
								main.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										97
									
								
								main.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,97 @@ | |||||||
|  | /* 
 | ||||||
|  |  * The MIT License (MIT) | ||||||
|  |  * | ||||||
|  |  * Copyright (c) 2019 Ha Thach (tinyusb.org) | ||||||
|  |  * | ||||||
|  |  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||||
|  |  * of this software and associated documentation files (the "Software"), to deal | ||||||
|  |  * in the Software without restriction, including without limitation the rights | ||||||
|  |  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||||
|  |  * copies of the Software, and to permit persons to whom the Software is | ||||||
|  |  * furnished to do so, subject to the following conditions: | ||||||
|  |  * | ||||||
|  |  * The above copyright notice and this permission notice shall be included in | ||||||
|  |  * all copies or substantial portions of the Software. | ||||||
|  |  * | ||||||
|  |  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||||
|  |  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||||
|  |  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||||
|  |  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||||
|  |  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||||
|  |  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||||
|  |  * THE SOFTWARE. | ||||||
|  |  * | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include <stdlib.h> | ||||||
|  | #include <stdio.h> | ||||||
|  | #include <string.h> | ||||||
|  | 
 | ||||||
|  | #include "bsp/board.h" | ||||||
|  | #include "tusb.h" | ||||||
|  | 
 | ||||||
|  | //--------------------------------------------------------------------+
 | ||||||
|  | // MACRO CONSTANT TYPEDEF PROTYPES
 | ||||||
|  | //--------------------------------------------------------------------+
 | ||||||
|  | void led_blinking_task(void); | ||||||
|  | 
 | ||||||
|  | extern void cdc_app_task(void); | ||||||
|  | extern void hid_app_task(void); | ||||||
|  | 
 | ||||||
|  | /*------------- MAIN -------------*/ | ||||||
|  | int main(void) | ||||||
|  | { | ||||||
|  |   board_init(); | ||||||
|  | 
 | ||||||
|  |   printf("TinyUSB Host CDC MSC HID Example\r\n"); | ||||||
|  | 
 | ||||||
|  |   // init host stack on configured roothub port
 | ||||||
|  |   tuh_init(BOARD_TUH_RHPORT); | ||||||
|  | 
 | ||||||
|  |   while (1) | ||||||
|  |   { | ||||||
|  |     // tinyusb host task
 | ||||||
|  |     tuh_task(); | ||||||
|  | 
 | ||||||
|  |     led_blinking_task(); | ||||||
|  |     cdc_app_task(); | ||||||
|  |     hid_app_task(); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   return 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | //--------------------------------------------------------------------+
 | ||||||
|  | // TinyUSB Callbacks
 | ||||||
|  | //--------------------------------------------------------------------+
 | ||||||
|  | 
 | ||||||
|  | void tuh_mount_cb(uint8_t dev_addr) | ||||||
|  | { | ||||||
|  |   // application set-up
 | ||||||
|  |   printf("A device with address %d is mounted\r\n", dev_addr); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void tuh_umount_cb(uint8_t dev_addr) | ||||||
|  | { | ||||||
|  |   // application tear-down
 | ||||||
|  |   printf("A device with address %d is unmounted \r\n", dev_addr); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | //--------------------------------------------------------------------+
 | ||||||
|  | // Blinking Task
 | ||||||
|  | //--------------------------------------------------------------------+
 | ||||||
|  | void led_blinking_task(void) | ||||||
|  | { | ||||||
|  |   const uint32_t interval_ms = 1000; | ||||||
|  |   static uint32_t start_ms = 0; | ||||||
|  | 
 | ||||||
|  |   static bool led_state = false; | ||||||
|  | 
 | ||||||
|  |   // Blink every interval ms
 | ||||||
|  |   if ( board_millis() - start_ms < interval_ms) return; // not enough time
 | ||||||
|  |   start_ms += interval_ms; | ||||||
|  | 
 | ||||||
|  |   board_led_write(led_state); | ||||||
|  |   led_state = 1 - led_state; // toggle
 | ||||||
|  | } | ||||||
							
								
								
									
										71
									
								
								msc_app.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										71
									
								
								msc_app.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,71 @@ | |||||||
|  | /* 
 | ||||||
|  |  * The MIT License (MIT) | ||||||
|  |  * | ||||||
|  |  * Copyright (c) 2019 Ha Thach (tinyusb.org) | ||||||
|  |  * | ||||||
|  |  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||||
|  |  * of this software and associated documentation files (the "Software"), to deal | ||||||
|  |  * in the Software without restriction, including without limitation the rights | ||||||
|  |  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||||
|  |  * copies of the Software, and to permit persons to whom the Software is | ||||||
|  |  * furnished to do so, subject to the following conditions: | ||||||
|  |  * | ||||||
|  |  * The above copyright notice and this permission notice shall be included in | ||||||
|  |  * all copies or substantial portions of the Software. | ||||||
|  |  * | ||||||
|  |  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||||
|  |  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||||
|  |  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||||
|  |  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||||
|  |  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||||
|  |  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||||
|  |  * THE SOFTWARE. | ||||||
|  |  * | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include "tusb.h" | ||||||
|  | 
 | ||||||
|  | //--------------------------------------------------------------------+
 | ||||||
|  | // MACRO TYPEDEF CONSTANT ENUM DECLARATION
 | ||||||
|  | //--------------------------------------------------------------------+
 | ||||||
|  | static scsi_inquiry_resp_t inquiry_resp; | ||||||
|  | 
 | ||||||
|  | bool inquiry_complete_cb(uint8_t dev_addr, tuh_msc_complete_data_t const * cb_data) | ||||||
|  | { | ||||||
|  |   msc_cbw_t const* cbw = cb_data->cbw; | ||||||
|  |   msc_csw_t const* csw = cb_data->csw; | ||||||
|  | 
 | ||||||
|  |   if (csw->status != 0) | ||||||
|  |   { | ||||||
|  |     printf("Inquiry failed\r\n"); | ||||||
|  |     return false; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   // Print out Vendor ID, Product ID and Rev
 | ||||||
|  |   printf("%.8s %.16s rev %.4s\r\n", inquiry_resp.vendor_id, inquiry_resp.product_id, inquiry_resp.product_rev); | ||||||
|  | 
 | ||||||
|  |   // Get capacity of device
 | ||||||
|  |   uint32_t const block_count = tuh_msc_get_block_count(dev_addr, cbw->lun); | ||||||
|  |   uint32_t const block_size = tuh_msc_get_block_size(dev_addr, cbw->lun); | ||||||
|  | 
 | ||||||
|  |   printf("Disk Size: %lu MB\r\n", block_count / ((1024*1024)/block_size)); | ||||||
|  |   printf("Block Count = %lu, Block Size: %lu\r\n", block_count, block_size); | ||||||
|  | 
 | ||||||
|  |   return true; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | //------------- IMPLEMENTATION -------------//
 | ||||||
|  | void tuh_msc_mount_cb(uint8_t dev_addr) | ||||||
|  | { | ||||||
|  |   printf("A MassStorage device is mounted\r\n"); | ||||||
|  | 
 | ||||||
|  |   uint8_t const lun = 0; | ||||||
|  |   tuh_msc_inquiry(dev_addr, lun, &inquiry_resp, inquiry_complete_cb, 0); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void tuh_msc_umount_cb(uint8_t dev_addr) | ||||||
|  | { | ||||||
|  |   (void) dev_addr; | ||||||
|  |   printf("A MassStorage device is unmounted\r\n"); | ||||||
|  | } | ||||||
|  | 
 | ||||||
							
								
								
									
										126
									
								
								tusb_config.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										126
									
								
								tusb_config.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,126 @@ | |||||||
|  | /* 
 | ||||||
|  |  * The MIT License (MIT) | ||||||
|  |  * | ||||||
|  |  * Copyright (c) 2019 Ha Thach (tinyusb.org) | ||||||
|  |  * | ||||||
|  |  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||||
|  |  * of this software and associated documentation files (the "Software"), to deal | ||||||
|  |  * in the Software without restriction, including without limitation the rights | ||||||
|  |  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||||
|  |  * copies of the Software, and to permit persons to whom the Software is | ||||||
|  |  * furnished to do so, subject to the following conditions: | ||||||
|  |  * | ||||||
|  |  * The above copyright notice and this permission notice shall be included in | ||||||
|  |  * all copies or substantial portions of the Software. | ||||||
|  |  * | ||||||
|  |  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||||
|  |  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||||
|  |  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||||
|  |  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||||
|  |  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||||
|  |  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||||
|  |  * THE SOFTWARE. | ||||||
|  |  * | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #ifndef _TUSB_CONFIG_H_ | ||||||
|  | #define _TUSB_CONFIG_H_ | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  |  extern "C" { | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | //--------------------------------------------------------------------+
 | ||||||
|  | // Board Specific Configuration
 | ||||||
|  | //--------------------------------------------------------------------+
 | ||||||
|  | 
 | ||||||
|  | #if CFG_TUSB_MCU == OPT_MCU_RP2040 | ||||||
|  | // change to 1 if using pico-pio-usb as host controller for raspberry rp2040
 | ||||||
|  | #define CFG_TUH_RPI_PIO_USB   0 | ||||||
|  | #define BOARD_TUH_RHPORT      CFG_TUH_RPI_PIO_USB | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | // RHPort number used for host can be defined by board.mk, default to port 0
 | ||||||
|  | #ifndef BOARD_TUH_RHPORT | ||||||
|  | #define BOARD_TUH_RHPORT      0 | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | // RHPort max operational speed can defined by board.mk
 | ||||||
|  | #ifndef BOARD_TUH_MAX_SPEED | ||||||
|  | #define BOARD_TUH_MAX_SPEED   OPT_MODE_DEFAULT_SPEED | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | //--------------------------------------------------------------------
 | ||||||
|  | // COMMON CONFIGURATION
 | ||||||
|  | //--------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  | // defined by compiler flags for flexibility
 | ||||||
|  | #ifndef CFG_TUSB_MCU | ||||||
|  | #error CFG_TUSB_MCU must be defined | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #ifndef CFG_TUSB_OS | ||||||
|  | #define CFG_TUSB_OS           OPT_OS_NONE | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #ifndef CFG_TUSB_DEBUG | ||||||
|  | #define CFG_TUSB_DEBUG        0 | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | // Enable Host stack
 | ||||||
|  | #define CFG_TUH_ENABLED       1 | ||||||
|  | 
 | ||||||
|  | // Default is max speed that hardware controller could support with on-chip PHY
 | ||||||
|  | #define CFG_TUH_MAX_SPEED     BOARD_TUH_MAX_SPEED | ||||||
|  | 
 | ||||||
|  | /* USB DMA on some MCUs can only access a specific SRAM region with restriction on alignment.
 | ||||||
|  |  * Tinyusb use follows macros to declare transferring memory so that they can be put | ||||||
|  |  * into those specific section. | ||||||
|  |  * e.g | ||||||
|  |  * - CFG_TUSB_MEM SECTION : __attribute__ (( section(".usb_ram") )) | ||||||
|  |  * - CFG_TUSB_MEM_ALIGN   : __attribute__ ((aligned(4))) | ||||||
|  |  */ | ||||||
|  | #ifndef CFG_TUSB_MEM_SECTION | ||||||
|  | #define CFG_TUSB_MEM_SECTION | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #ifndef CFG_TUSB_MEM_ALIGN | ||||||
|  | #define CFG_TUSB_MEM_ALIGN          __attribute__ ((aligned(4))) | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | //--------------------------------------------------------------------
 | ||||||
|  | // CONFIGURATION
 | ||||||
|  | //--------------------------------------------------------------------
 | ||||||
|  | 
 | ||||||
|  | // Size of buffer to hold descriptors and other data used for enumeration
 | ||||||
|  | #define CFG_TUH_ENUMERATION_BUFSIZE 256 | ||||||
|  | 
 | ||||||
|  | #define CFG_TUH_HUB                 1 // number of supported hubs
 | ||||||
|  | #define CFG_TUH_CDC                 1 | ||||||
|  | #define CFG_TUH_HID                 4 // typical keyboard + mouse device can have 3-4 HID interfaces
 | ||||||
|  | #define CFG_TUH_MSC                 1 | ||||||
|  | #define CFG_TUH_VENDOR              0 | ||||||
|  | 
 | ||||||
|  | // max device support (excluding hub device)
 | ||||||
|  | #define CFG_TUH_DEVICE_MAX          (CFG_TUH_HUB ? 4 : 1) // hub typically has 4 ports
 | ||||||
|  | 
 | ||||||
|  | //------------- HID -------------//
 | ||||||
|  | #define CFG_TUH_HID_EPIN_BUFSIZE    64 | ||||||
|  | #define CFG_TUH_HID_EPOUT_BUFSIZE   64 | ||||||
|  | 
 | ||||||
|  | //------------- CDC -------------//
 | ||||||
|  | 
 | ||||||
|  | // Set Line Control state on enumeration/mounted:
 | ||||||
|  | // DTR ( bit 0), RTS (bit 1)
 | ||||||
|  | #define CFG_TUH_CDC_LINE_CONTROL_ON_ENUM    0x03 | ||||||
|  | 
 | ||||||
|  | // Set Line Coding on enumeration/mounted, value for cdc_line_coding_t
 | ||||||
|  | // bit rate = 115200, 1 stop bit, no parity, 8 bit data width
 | ||||||
|  | #define CFG_TUH_CDC_LINE_CODING_ON_ENUM   { 115200, CDC_LINE_CONDING_STOP_BITS_1, CDC_LINE_CODING_PARITY_NONE, 8 } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  |  } | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #endif /* _TUSB_CONFIG_H_ */ | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user