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