add hid_composite_freertos example
This commit is contained in:
		
							
								
								
									
										27
									
								
								examples/device/hid_composite_freertos/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								examples/device/hid_composite_freertos/Makefile
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,27 @@ | ||||
| include ../../../tools/top.mk | ||||
| include ../../make.mk | ||||
|  | ||||
| FREERTOS_SRC = lib/FreeRTOS/FreeRTOS/Source | ||||
|  | ||||
| INC += \ | ||||
| 	src \ | ||||
| 	$(TOP)/hw \ | ||||
| 	$(TOP)/$(FREERTOS_SRC)/include \ | ||||
| 	$(TOP)/$(FREERTOS_SRC)/portable/GCC/$(FREERTOS_PORT)	 | ||||
|  | ||||
| # Example source | ||||
| EXAMPLE_SOURCE += $(wildcard src/*.c) | ||||
| SRC_C += $(addprefix $(CURRENT_PATH)/, $(EXAMPLE_SOURCE)) | ||||
|  | ||||
| # FreeRTOS source, all files in port folder | ||||
| SRC_C += \ | ||||
| 	$(FREERTOS_SRC)/list.c \ | ||||
| 	$(FREERTOS_SRC)/queue.c \ | ||||
| 	$(FREERTOS_SRC)/tasks.c \ | ||||
| 	$(FREERTOS_SRC)/timers.c \ | ||||
| 	$(subst ../../../,,$(wildcard ../../../$(FREERTOS_SRC)/portable/GCC/$(FREERTOS_PORT)/*.c)) | ||||
|  | ||||
| # FreeRTOS (lto + Os) linker issue | ||||
| LDFLAGS += -Wl,--undefined=vTaskSwitchContext | ||||
|  | ||||
| include ../../rules.mk | ||||
							
								
								
									
										233
									
								
								examples/device/hid_composite_freertos/src/FreeRTOSConfig.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										233
									
								
								examples/device/hid_composite_freertos/src/FreeRTOSConfig.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,233 @@ | ||||
| /* | ||||
|  * FreeRTOS Kernel V10.0.0 | ||||
|  * Copyright (C) 2017 Amazon.com, Inc. or its affiliates.  All Rights Reserved. | ||||
|  * | ||||
|  * 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. If you wish to use our Amazon | ||||
|  * FreeRTOS name, please do so in a fair use way that does not cause confusion. | ||||
|  * | ||||
|  * 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. | ||||
|  * | ||||
|  * http://www.FreeRTOS.org | ||||
|  * http://aws.amazon.com/freertos | ||||
|  * | ||||
|  * 1 tab == 4 spaces! | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #ifndef FREERTOS_CONFIG_H | ||||
| #define FREERTOS_CONFIG_H | ||||
|  | ||||
| /*----------------------------------------------------------- | ||||
|  * Application specific definitions. | ||||
|  * | ||||
|  * These definitions should be adjusted for your particular hardware and | ||||
|  * application requirements. | ||||
|  * | ||||
|  * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE | ||||
|  * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE. | ||||
|  * | ||||
|  * See http://www.freertos.org/a00110.html. | ||||
|  *----------------------------------------------------------*/ | ||||
|  | ||||
| // for OPT_MCU_ | ||||
| #include "tusb_option.h" | ||||
|  | ||||
| #if   CFG_TUSB_MCU == OPT_MCU_LPC11UXX   || CFG_TUSB_MCU == OPT_MCU_LPC13XX    || \ | ||||
|       CFG_TUSB_MCU == OPT_MCU_LPC15XX    || CFG_TUSB_MCU == OPT_MCU_LPC175X_6X || \ | ||||
|       CFG_TUSB_MCU == OPT_MCU_LPC177X_8X || CFG_TUSB_MCU == OPT_MCU_LPC18XX    || \ | ||||
|       CFG_TUSB_MCU == OPT_MCU_LPC40XX    || CFG_TUSB_MCU == OPT_MCU_LPC43XX | ||||
|   #include "chip.h" | ||||
|  | ||||
| #elif CFG_TUSB_MCU == OPT_MCU_LPC51UXX || CFG_TUSB_MCU == OPT_MCU_LPC54XXX || \ | ||||
|       CFG_TUSB_MCU == OPT_MCU_LPC55XX | ||||
|   #include "fsl_device_registers.h" | ||||
|  | ||||
| #elif CFG_TUSB_MCU == OPT_MCU_NRF5X | ||||
|   #include "nrf.h" | ||||
|  | ||||
| #elif CFG_TUSB_MCU == OPT_MCU_SAMD21 || CFG_TUSB_MCU == OPT_MCU_SAMD51 | ||||
|   #include "sam.h" | ||||
|  | ||||
| #elif CFG_TUSB_MCU == OPT_MCU_SAMG | ||||
|   #undef LITTLE_ENDIAN // hack to suppress "LITTLE_ENDIAN" redefined | ||||
|   #include "sam.h" | ||||
|  | ||||
| #elif CFG_TUSB_MCU == OPT_MCU_STM32F0 | ||||
|   #include "stm32f0xx.h" | ||||
|  | ||||
| #elif CFG_TUSB_MCU == OPT_MCU_STM32F1 | ||||
|   #include "stm32f1xx.h" | ||||
|  | ||||
| #elif CFG_TUSB_MCU == OPT_MCU_STM32F2 | ||||
|   #include "stm32f2xx.h" | ||||
|  | ||||
| #elif CFG_TUSB_MCU == OPT_MCU_STM32F3 | ||||
|   #include "stm32f3xx.h" | ||||
|  | ||||
| #elif CFG_TUSB_MCU == OPT_MCU_STM32F4 | ||||
|   #include "stm32f4xx.h" | ||||
|  | ||||
| #elif CFG_TUSB_MCU == OPT_MCU_STM32F7 | ||||
|   #include "stm32f7xx.h" | ||||
|  | ||||
| #elif CFG_TUSB_MCU == OPT_MCU_STM32H7 | ||||
|   #include "stm32h7xx.h" | ||||
|  | ||||
| #elif CFG_TUSB_MCU == OPT_MCU_STM32L0 | ||||
|   #include "stm32l0xx.h" | ||||
|  | ||||
| #elif CFG_TUSB_MCU == OPT_MCU_STM32L1 | ||||
|   #include "stm32l1xx.h" | ||||
|  | ||||
| #elif CFG_TUSB_MCU == OPT_MCU_STM32L4 | ||||
|   #include "stm32l4xx.h" | ||||
|  | ||||
| #elif CFG_TUSB_MCU == OPT_MCU_MIMXRT10XX | ||||
|   #include "fsl_device_registers.h" | ||||
|  | ||||
| #elif CFG_TUSB_MCU == OPT_MCU_NUC120 | ||||
|   #include "NUC100Series.h" | ||||
|  | ||||
| #elif CFG_TUSB_MCU == OPT_MCU_NUC121 || CFG_TUSB_MCU == OPT_MCU_NUC126 | ||||
|   #include "NuMicro.h" | ||||
|  | ||||
| #elif CFG_TUSB_MCU == OPT_MCU_NUC505 | ||||
|   #include "NUC505Series.h" | ||||
|  | ||||
| #else | ||||
|   #error "FreeRTOSConfig.h need to include low level mcu header for configuration" | ||||
| #endif | ||||
|  | ||||
| extern uint32_t SystemCoreClock; | ||||
|  | ||||
|  | ||||
| /* Cortex M23/M33 port configuration. */ | ||||
| #define configENABLE_MPU								        0 | ||||
| #define configENABLE_FPU								        1 | ||||
| #define configENABLE_TRUSTZONE					        0 | ||||
| #define configMINIMAL_SECURE_STACK_SIZE					( 1024 ) | ||||
|  | ||||
| #define configUSE_PREEMPTION                    1 | ||||
| #define configUSE_PORT_OPTIMISED_TASK_SELECTION 0 | ||||
| #define configCPU_CLOCK_HZ                      SystemCoreClock | ||||
| #define configTICK_RATE_HZ                      ( 1000 ) | ||||
| #define configMAX_PRIORITIES                    ( 5 ) | ||||
| #define configMINIMAL_STACK_SIZE                ( 128 ) | ||||
| #define configTOTAL_HEAP_SIZE                   ( 0*1024 ) // dynamic is not used | ||||
| #define configMAX_TASK_NAME_LEN                 16 | ||||
| #define configUSE_16_BIT_TICKS                  0 | ||||
| #define configIDLE_SHOULD_YIELD                 1 | ||||
| #define configUSE_MUTEXES                       1 | ||||
| #define configUSE_RECURSIVE_MUTEXES             1 | ||||
| #define configUSE_COUNTING_SEMAPHORES           1 | ||||
| #define configQUEUE_REGISTRY_SIZE               2 | ||||
| #define configUSE_QUEUE_SETS                    0 | ||||
| #define configUSE_TIME_SLICING                  0 | ||||
| #define configUSE_NEWLIB_REENTRANT              0 | ||||
| #define configENABLE_BACKWARD_COMPATIBILITY     1 | ||||
|  | ||||
| #define configSUPPORT_STATIC_ALLOCATION         1 | ||||
| #define configSUPPORT_DYNAMIC_ALLOCATION        0 | ||||
|  | ||||
| /* Hook function related definitions. */ | ||||
| #define configUSE_IDLE_HOOK                    0 | ||||
| #define configUSE_TICK_HOOK                    0 | ||||
| #define configUSE_MALLOC_FAILED_HOOK           0 // cause nested extern warning | ||||
| #define configCHECK_FOR_STACK_OVERFLOW         2 | ||||
|  | ||||
| /* Run time and task stats gathering related definitions. */ | ||||
| #define configGENERATE_RUN_TIME_STATS          0 | ||||
| #define configUSE_TRACE_FACILITY               1 // legacy trace | ||||
| #define configUSE_STATS_FORMATTING_FUNCTIONS   0 | ||||
|  | ||||
| /* Co-routine definitions. */ | ||||
| #define configUSE_CO_ROUTINES                  0 | ||||
| #define configMAX_CO_ROUTINE_PRIORITIES        2 | ||||
|  | ||||
| /* Software timer related definitions. */ | ||||
| #define configUSE_TIMERS                       1 | ||||
| #define configTIMER_TASK_PRIORITY              (configMAX_PRIORITIES-2) | ||||
| #define configTIMER_QUEUE_LENGTH               32 | ||||
| #define configTIMER_TASK_STACK_DEPTH           configMINIMAL_STACK_SIZE | ||||
|  | ||||
| /* Optional functions - most linkers will remove unused functions anyway. */ | ||||
| #define INCLUDE_vTaskPrioritySet               0 | ||||
| #define INCLUDE_uxTaskPriorityGet              0 | ||||
| #define INCLUDE_vTaskDelete                    0 | ||||
| #define INCLUDE_vTaskSuspend                   1 // required for queue, semaphore, mutex to be blocked indefinitely with portMAX_DELAY | ||||
| #define INCLUDE_xResumeFromISR                 0 | ||||
| #define INCLUDE_vTaskDelayUntil                1 | ||||
| #define INCLUDE_vTaskDelay                     1 | ||||
| #define INCLUDE_xTaskGetSchedulerState         0 | ||||
| #define INCLUDE_xTaskGetCurrentTaskHandle      0 | ||||
| #define INCLUDE_uxTaskGetStackHighWaterMark    0 | ||||
| #define INCLUDE_xTaskGetIdleTaskHandle         0 | ||||
| #define INCLUDE_xTimerGetTimerDaemonTaskHandle 0 | ||||
| #define INCLUDE_pcTaskGetTaskName              0 | ||||
| #define INCLUDE_eTaskGetState                  0 | ||||
| #define INCLUDE_xEventGroupSetBitFromISR       0 | ||||
| #define INCLUDE_xTimerPendFunctionCall         0 | ||||
|  | ||||
| /* Define to trap errors during development. */ | ||||
| // Halt CPU (breakpoint) when hitting error, only apply for Cortex M3, M4, M7 | ||||
| #if defined(__ARM_ARCH_7M__) || defined (__ARM_ARCH_7EM__) | ||||
|   #define configASSERT(_exp) \ | ||||
|     do {\ | ||||
|       if ( !(_exp) ) { \ | ||||
|         volatile uint32_t* ARM_CM_DHCSR =  ((volatile uint32_t*) 0xE000EDF0UL); /* Cortex M CoreDebug->DHCSR */ \ | ||||
|         if ( (*ARM_CM_DHCSR) & 1UL ) {  /* Only halt mcu if debugger is attached */ \ | ||||
|           taskDISABLE_INTERRUPTS(); \ | ||||
|            __asm("BKPT #0\n"); \ | ||||
|         }\ | ||||
|       }\ | ||||
|     } while(0) | ||||
| #else | ||||
|   #define configASSERT( x ) | ||||
| #endif | ||||
|  | ||||
| /* FreeRTOS hooks to NVIC vectors */ | ||||
| #define xPortPendSVHandler    PendSV_Handler | ||||
| #define xPortSysTickHandler   SysTick_Handler | ||||
| #define vPortSVCHandler       SVC_Handler | ||||
|  | ||||
| //--------------------------------------------------------------------+ | ||||
| // Interrupt nesting behavior configuration. | ||||
| //--------------------------------------------------------------------+ | ||||
| /* Cortex-M specific definitions. __NVIC_PRIO_BITS is defined in core_cmx.h */ | ||||
| #ifdef __NVIC_PRIO_BITS | ||||
| 	#define configPRIO_BITS       __NVIC_PRIO_BITS | ||||
| #else | ||||
|   #error "This port requires __NVIC_PRIO_BITS to be defined" | ||||
| #endif | ||||
|  | ||||
| /* The lowest interrupt priority that can be used in a call to a "set priority" function. */ | ||||
| #define configLIBRARY_LOWEST_INTERRUPT_PRIORITY			  ((1<<configPRIO_BITS) - 1) | ||||
|  | ||||
| /* The highest interrupt priority that can be used by any interrupt service | ||||
| routine that makes calls to interrupt safe FreeRTOS API functions.  DO NOT CALL | ||||
| INTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER | ||||
| PRIORITY THAN THIS! (higher priorities are lower numeric values. */ | ||||
| #define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY	2 | ||||
|  | ||||
| /* Interrupt priorities used by the kernel port layer itself.  These are generic | ||||
| to all Cortex-M ports, and do not rely on any particular library functions. */ | ||||
| #define configKERNEL_INTERRUPT_PRIORITY 		          ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) ) | ||||
|  | ||||
| /* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!! | ||||
| See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */ | ||||
| #define configMAX_SYSCALL_INTERRUPT_PRIORITY 	        ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) ) | ||||
|  | ||||
| #endif /* __FREERTOS_CONFIG__H */ | ||||
							
								
								
									
										95
									
								
								examples/device/hid_composite_freertos/src/freertos_hook.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										95
									
								
								examples/device/hid_composite_freertos/src/freertos_hook.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,95 @@ | ||||
| /* | ||||
|  * 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 | ||||
| //--------------------------------------------------------------------+ | ||||
| #include "FreeRTOS.h" | ||||
| #include "task.h" | ||||
| #include "common/tusb_common.h" | ||||
|  | ||||
|  | ||||
| void vApplicationMallocFailedHook(void) | ||||
| { | ||||
|   taskDISABLE_INTERRUPTS(); | ||||
|   TU_ASSERT(false, ); | ||||
| } | ||||
|  | ||||
| void vApplicationStackOverflowHook(xTaskHandle pxTask, signed char *pcTaskName) | ||||
| { | ||||
|   (void) pxTask; | ||||
|   (void) pcTaskName; | ||||
|  | ||||
|   taskDISABLE_INTERRUPTS(); | ||||
|   TU_ASSERT(false, ); | ||||
| } | ||||
|  | ||||
| /* configSUPPORT_STATIC_ALLOCATION is set to 1, so the application must provide an | ||||
|  * implementation of vApplicationGetIdleTaskMemory() to provide the memory that is | ||||
|  * used by the Idle task. */ | ||||
| void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize ) | ||||
| { | ||||
|   /* If the buffers to be provided to the Idle task are declared inside this | ||||
|    * function then they must be declared static - otherwise they will be allocated on | ||||
|    * the stack and so not exists after this function exits. */ | ||||
|   static StaticTask_t xIdleTaskTCB; | ||||
|   static StackType_t uxIdleTaskStack[ configMINIMAL_STACK_SIZE ]; | ||||
|  | ||||
|   /* Pass out a pointer to the StaticTask_t structure in which the Idle task's | ||||
|     state will be stored. */ | ||||
|   *ppxIdleTaskTCBBuffer = &xIdleTaskTCB; | ||||
|  | ||||
|   /* Pass out the array that will be used as the Idle task's stack. */ | ||||
|   *ppxIdleTaskStackBuffer = uxIdleTaskStack; | ||||
|  | ||||
|   /* Pass out the size of the array pointed to by *ppxIdleTaskStackBuffer. | ||||
|     Note that, as the array is necessarily of type StackType_t, | ||||
|     configMINIMAL_STACK_SIZE is specified in words, not bytes. */ | ||||
|   *pulIdleTaskStackSize = configMINIMAL_STACK_SIZE; | ||||
| } | ||||
|  | ||||
| /* configSUPPORT_STATIC_ALLOCATION and configUSE_TIMERS are both set to 1, so the | ||||
|  * application must provide an implementation of vApplicationGetTimerTaskMemory() | ||||
|  * to provide the memory that is used by the Timer service task. */ | ||||
| void vApplicationGetTimerTaskMemory( StaticTask_t **ppxTimerTaskTCBBuffer, StackType_t **ppxTimerTaskStackBuffer, uint32_t *pulTimerTaskStackSize ) | ||||
| { | ||||
|   /* If the buffers to be provided to the Timer task are declared inside this | ||||
|    * function then they must be declared static - otherwise they will be allocated on | ||||
|    * the stack and so not exists after this function exits. */ | ||||
|   static StaticTask_t xTimerTaskTCB; | ||||
|   static StackType_t uxTimerTaskStack[ configTIMER_TASK_STACK_DEPTH ]; | ||||
|  | ||||
|   /* Pass out a pointer to the StaticTask_t structure in which the Timer | ||||
|     task's state will be stored. */ | ||||
|   *ppxTimerTaskTCBBuffer = &xTimerTaskTCB; | ||||
|  | ||||
|   /* Pass out the array that will be used as the Timer task's stack. */ | ||||
|   *ppxTimerTaskStackBuffer = uxTimerTaskStack; | ||||
|  | ||||
|   /* Pass out the size of the array pointed to by *ppxTimerTaskStackBuffer. | ||||
|     Note that, as the array is necessarily of type StackType_t, | ||||
|     configTIMER_TASK_STACK_DEPTH is specified in words, not bytes. */ | ||||
|   *pulTimerTaskStackSize = configTIMER_TASK_STACK_DEPTH; | ||||
| } | ||||
							
								
								
									
										251
									
								
								examples/device/hid_composite_freertos/src/main.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										251
									
								
								examples/device/hid_composite_freertos/src/main.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,251 @@ | ||||
| /*  | ||||
|  * 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 "FreeRTOS.h" | ||||
| #include "task.h" | ||||
| #include "timers.h" | ||||
| #include "queue.h" | ||||
| #include "semphr.h" | ||||
|  | ||||
| #include "bsp/board.h" | ||||
| #include "tusb.h" | ||||
|  | ||||
| #include "usb_descriptors.h" | ||||
|  | ||||
| //--------------------------------------------------------------------+ | ||||
| // MACRO CONSTANT TYPEDEF PROTYPES | ||||
| //--------------------------------------------------------------------+ | ||||
|  | ||||
| /* Blink pattern | ||||
|  * - 250 ms  : device not mounted | ||||
|  * - 1000 ms : device mounted | ||||
|  * - 2500 ms : device is suspended | ||||
|  */ | ||||
| enum  { | ||||
|   BLINK_NOT_MOUNTED = 250, | ||||
|   BLINK_MOUNTED = 1000, | ||||
|   BLINK_SUSPENDED = 2500, | ||||
| }; | ||||
|  | ||||
| // static timer | ||||
| StaticTimer_t blinky_tmdef; | ||||
| TimerHandle_t blinky_tm; | ||||
|  | ||||
| // static task for usbd | ||||
| #define USBD_STACK_SIZE     (3*configMINIMAL_STACK_SIZE/2) | ||||
| StackType_t  usb_device_stack[USBD_STACK_SIZE]; | ||||
| StaticTask_t usb_device_taskdef; | ||||
|  | ||||
| // static task for hid | ||||
| #define HID_STACK_SZIE      configMINIMAL_STACK_SIZE | ||||
| StackType_t  hid_stack[HID_STACK_SZIE]; | ||||
| StaticTask_t hid_taskdef; | ||||
|  | ||||
|  | ||||
| void led_blinky_cb(TimerHandle_t xTimer); | ||||
| void usb_device_task(void* param); | ||||
| void hid_task(void* params); | ||||
|  | ||||
| //--------------------------------------------------------------------+ | ||||
| // Main | ||||
| //--------------------------------------------------------------------+ | ||||
|  | ||||
| int main(void) | ||||
| { | ||||
|   board_init(); | ||||
|   tusb_init(); | ||||
|  | ||||
|   // soft timer for blinky | ||||
|   blinky_tm = xTimerCreateStatic(NULL, pdMS_TO_TICKS(BLINK_NOT_MOUNTED), true, NULL, led_blinky_cb, &blinky_tmdef); | ||||
|   xTimerStart(blinky_tm, 0); | ||||
|  | ||||
|   // Create a task for tinyusb device stack | ||||
|   (void) xTaskCreateStatic( usb_device_task, "usbd", USBD_STACK_SIZE, NULL, configMAX_PRIORITIES-1, usb_device_stack, &usb_device_taskdef); | ||||
|  | ||||
|   // Create HID task | ||||
|   (void) xTaskCreateStatic( hid_task, "hid", HID_STACK_SZIE, NULL, configMAX_PRIORITIES-2, hid_stack, &hid_taskdef); | ||||
|  | ||||
|   // skip starting scheduler (and return) for ESP32-S2 | ||||
| #if CFG_TUSB_MCU != OPT_MCU_ESP32S2 | ||||
|   vTaskStartScheduler(); | ||||
|   NVIC_SystemReset(); | ||||
|   return 0; | ||||
| #endif | ||||
| } | ||||
|  | ||||
| #if CFG_TUSB_MCU == OPT_MCU_ESP32S2 | ||||
| void app_main(void) | ||||
| { | ||||
|   main(); | ||||
| } | ||||
| #endif | ||||
|  | ||||
| // USB Device Driver task | ||||
| // This top level thread process all usb events and invoke callbacks | ||||
| void usb_device_task(void* param) | ||||
| { | ||||
|   (void) param; | ||||
|  | ||||
|   // RTOS forever loop | ||||
|   while (1) | ||||
|   { | ||||
|     // tinyusb device task | ||||
|     tud_task(); | ||||
|   } | ||||
| } | ||||
|  | ||||
| //--------------------------------------------------------------------+ | ||||
| // Device callbacks | ||||
| //--------------------------------------------------------------------+ | ||||
|  | ||||
| // Invoked when device is mounted | ||||
| void tud_mount_cb(void) | ||||
| { | ||||
|   xTimerChangePeriod(blinky_tm, pdMS_TO_TICKS(BLINK_MOUNTED), 0); | ||||
| } | ||||
|  | ||||
| // Invoked when device is unmounted | ||||
| void tud_umount_cb(void) | ||||
| { | ||||
|   xTimerChangePeriod(blinky_tm, pdMS_TO_TICKS(BLINK_NOT_MOUNTED), 0); | ||||
| } | ||||
|  | ||||
| // Invoked when usb bus is suspended | ||||
| // remote_wakeup_en : if host allow us  to perform remote wakeup | ||||
| // Within 7ms, device must draw an average of current less than 2.5 mA from bus | ||||
| void tud_suspend_cb(bool remote_wakeup_en) | ||||
| { | ||||
|   (void) remote_wakeup_en; | ||||
|   xTimerChangePeriod(blinky_tm, pdMS_TO_TICKS(BLINK_SUSPENDED), 0); | ||||
| } | ||||
|  | ||||
| // Invoked when usb bus is resumed | ||||
| void tud_resume_cb(void) | ||||
| { | ||||
|   xTimerChangePeriod(blinky_tm, pdMS_TO_TICKS(BLINK_MOUNTED), 0); | ||||
| } | ||||
|  | ||||
| //--------------------------------------------------------------------+ | ||||
| // USB HID | ||||
| //--------------------------------------------------------------------+ | ||||
|  | ||||
| void hid_task(void* param) | ||||
| { | ||||
|   (void) param; | ||||
|  | ||||
|   while(1) | ||||
|   { | ||||
|     // Poll every 10ms | ||||
|     vTaskDelay(pdMS_TO_TICKS(10)); | ||||
|  | ||||
|     uint32_t const btn = board_button_read(); | ||||
|  | ||||
|     // Remote wakeup | ||||
|     if ( tud_suspended() && btn ) | ||||
|     { | ||||
|       // Wake up host if we are in suspend mode | ||||
|       // and REMOTE_WAKEUP feature is enabled by host | ||||
|       tud_remote_wakeup(); | ||||
|     } | ||||
|  | ||||
|     /*------------- Mouse -------------*/ | ||||
|     if ( tud_hid_ready() ) | ||||
|     { | ||||
|       if ( btn ) | ||||
|       { | ||||
|         int8_t const delta = 5; | ||||
|  | ||||
|         // no button, right + down, no scroll pan | ||||
|         tud_hid_mouse_report(REPORT_ID_MOUSE, 0x00, delta, delta, 0, 0); | ||||
|  | ||||
|         // delay a bit before attempt to send keyboard report | ||||
|         vTaskDelay(pdMS_TO_TICKS(10)); | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     /*------------- Keyboard -------------*/ | ||||
|     if ( tud_hid_ready() ) | ||||
|     { | ||||
|       // use to avoid send multiple consecutive zero report for keyboard | ||||
|       static bool has_key = false; | ||||
|  | ||||
|       if ( btn ) | ||||
|       { | ||||
|         uint8_t keycode[6] = { 0 }; | ||||
|         keycode[0] = HID_KEY_A; | ||||
|  | ||||
|         tud_hid_keyboard_report(REPORT_ID_KEYBOARD, 0, keycode); | ||||
|  | ||||
|         has_key = true; | ||||
|       }else | ||||
|       { | ||||
|         // send empty key report if previously has key pressed | ||||
|         if (has_key) tud_hid_keyboard_report(REPORT_ID_KEYBOARD, 0, NULL); | ||||
|         has_key = false; | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| // Invoked when received GET_REPORT control request | ||||
| // Application must fill buffer report's content and return its length. | ||||
| // Return zero will cause the stack to STALL request | ||||
| uint16_t tud_hid_get_report_cb(uint8_t report_id, hid_report_type_t report_type, uint8_t* buffer, uint16_t reqlen) | ||||
| { | ||||
|   // TODO not Implemented | ||||
|   (void) report_id; | ||||
|   (void) report_type; | ||||
|   (void) buffer; | ||||
|   (void) reqlen; | ||||
|  | ||||
|   return 0; | ||||
| } | ||||
|  | ||||
| // Invoked when received SET_REPORT control request or | ||||
| // received data on OUT endpoint ( Report ID = 0, Type = 0 ) | ||||
| void tud_hid_set_report_cb(uint8_t report_id, hid_report_type_t report_type, uint8_t const* buffer, uint16_t bufsize) | ||||
| { | ||||
|   // TODO set LED based on CAPLOCK, NUMLOCK etc... | ||||
|   (void) report_id; | ||||
|   (void) report_type; | ||||
|   (void) buffer; | ||||
|   (void) bufsize; | ||||
| } | ||||
|  | ||||
| //--------------------------------------------------------------------+ | ||||
| // BLINKING TASK | ||||
| //--------------------------------------------------------------------+ | ||||
| void led_blinky_cb(TimerHandle_t xTimer) | ||||
| { | ||||
|   (void) xTimer; | ||||
|   static bool led_state = false; | ||||
|  | ||||
|   board_led_write(led_state); | ||||
|   led_state = 1 - led_state; // toggle | ||||
| } | ||||
							
								
								
									
										90
									
								
								examples/device/hid_composite_freertos/src/tusb_config.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										90
									
								
								examples/device/hid_composite_freertos/src/tusb_config.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,90 @@ | ||||
| /* | ||||
|  * 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 | ||||
|  | ||||
| //-------------------------------------------------------------------- | ||||
| // COMMON CONFIGURATION | ||||
| //-------------------------------------------------------------------- | ||||
|  | ||||
| // defined by compiler flags for flexibility | ||||
| #ifndef CFG_TUSB_MCU | ||||
|   #error CFG_TUSB_MCU must be defined | ||||
| #endif | ||||
|  | ||||
| #if CFG_TUSB_MCU == OPT_MCU_LPC43XX || CFG_TUSB_MCU == OPT_MCU_LPC18XX || CFG_TUSB_MCU == OPT_MCU_MIMXRT10XX || CFG_TUSB_MCU == OPT_MCU_NUC505 | ||||
| #define CFG_TUSB_RHPORT0_MODE       (OPT_MODE_DEVICE | OPT_MODE_HIGH_SPEED) | ||||
| #else | ||||
| #define CFG_TUSB_RHPORT0_MODE       OPT_MODE_DEVICE | ||||
| #endif | ||||
|  | ||||
| #define CFG_TUSB_OS                 OPT_OS_FREERTOS | ||||
|  | ||||
| // CFG_TUSB_DEBUG is defined by compiler in DEBUG build | ||||
| // #define CFG_TUSB_DEBUG           0 | ||||
|  | ||||
| /* 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 | ||||
|  | ||||
| //-------------------------------------------------------------------- | ||||
| // DEVICE CONFIGURATION | ||||
| //-------------------------------------------------------------------- | ||||
|  | ||||
| #ifndef CFG_TUD_ENDPOINT0_SIZE | ||||
| #define CFG_TUD_ENDPOINT0_SIZE    64 | ||||
| #endif | ||||
|  | ||||
| //------------- CLASS -------------// | ||||
| #define CFG_TUD_HID             1 | ||||
| #define CFG_TUD_CDC             0 | ||||
| #define CFG_TUD_MSC             0 | ||||
| #define CFG_TUD_MIDI            0 | ||||
| #define CFG_TUD_VENDOR          0 | ||||
|  | ||||
| // HID buffer size Should be sufficient to hold ID (if any) + Data | ||||
| #define CFG_TUD_HID_BUFSIZE     16 | ||||
|  | ||||
| #ifdef __cplusplus | ||||
|  } | ||||
| #endif | ||||
|  | ||||
| #endif /* _TUSB_CONFIG_H_ */ | ||||
							
								
								
									
										169
									
								
								examples/device/hid_composite_freertos/src/usb_descriptors.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										169
									
								
								examples/device/hid_composite_freertos/src/usb_descriptors.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,169 @@ | ||||
| /*  | ||||
|  * 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" | ||||
| #include "usb_descriptors.h" | ||||
|  | ||||
| /* A combination of interfaces must have a unique product id, since PC will save device driver after the first plug. | ||||
|  * Same VID/PID with different interface e.g MSC (first), then CDC (later) will possibly cause system error on PC. | ||||
|  * | ||||
|  * Auto ProductID layout's Bitmap: | ||||
|  *   [MSB]         HID | MSC | CDC          [LSB] | ||||
|  */ | ||||
| #define _PID_MAP(itf, n)  ( (CFG_TUD_##itf) << (n) ) | ||||
| #define USB_PID           (0x4000 | _PID_MAP(CDC, 0) | _PID_MAP(MSC, 1) | _PID_MAP(HID, 2) | \ | ||||
|                            _PID_MAP(MIDI, 3) | _PID_MAP(VENDOR, 4) ) | ||||
|  | ||||
| //--------------------------------------------------------------------+ | ||||
| // Device Descriptors | ||||
| //--------------------------------------------------------------------+ | ||||
| tusb_desc_device_t const desc_device = | ||||
| { | ||||
|     .bLength            = sizeof(tusb_desc_device_t), | ||||
|     .bDescriptorType    = TUSB_DESC_DEVICE, | ||||
|     .bcdUSB             = 0x0200, | ||||
|     .bDeviceClass       = 0x00, | ||||
|     .bDeviceSubClass    = 0x00, | ||||
|     .bDeviceProtocol    = 0x00, | ||||
|     .bMaxPacketSize0    = CFG_TUD_ENDPOINT0_SIZE, | ||||
|  | ||||
|     .idVendor           = 0xCafe, | ||||
|     .idProduct          = USB_PID, | ||||
|     .bcdDevice          = 0x0100, | ||||
|  | ||||
|     .iManufacturer      = 0x01, | ||||
|     .iProduct           = 0x02, | ||||
|     .iSerialNumber      = 0x03, | ||||
|  | ||||
|     .bNumConfigurations = 0x01 | ||||
| }; | ||||
|  | ||||
| // Invoked when received GET DEVICE DESCRIPTOR | ||||
| // Application return pointer to descriptor | ||||
| uint8_t const * tud_descriptor_device_cb(void) | ||||
| { | ||||
|   return (uint8_t const *) &desc_device; | ||||
| } | ||||
|  | ||||
| //--------------------------------------------------------------------+ | ||||
| // HID Report Descriptor | ||||
| //--------------------------------------------------------------------+ | ||||
|  | ||||
| uint8_t const desc_hid_report[] = | ||||
| { | ||||
|   TUD_HID_REPORT_DESC_KEYBOARD( HID_REPORT_ID(REPORT_ID_KEYBOARD), ), | ||||
|   TUD_HID_REPORT_DESC_MOUSE   ( HID_REPORT_ID(REPORT_ID_MOUSE), ) | ||||
| }; | ||||
|  | ||||
| // Invoked when received GET HID REPORT DESCRIPTOR | ||||
| // Application return pointer to descriptor | ||||
| // Descriptor contents must exist long enough for transfer to complete | ||||
| uint8_t const * tud_hid_descriptor_report_cb(void) | ||||
| { | ||||
|   return desc_hid_report; | ||||
| } | ||||
|  | ||||
| //--------------------------------------------------------------------+ | ||||
| // Configuration Descriptor | ||||
| //--------------------------------------------------------------------+ | ||||
|  | ||||
| enum | ||||
| { | ||||
|   ITF_NUM_HID, | ||||
|   ITF_NUM_TOTAL | ||||
| }; | ||||
|  | ||||
| #define  CONFIG_TOTAL_LEN  (TUD_CONFIG_DESC_LEN + TUD_HID_DESC_LEN) | ||||
|  | ||||
| #define EPNUM_HID   0x81 | ||||
|  | ||||
| uint8_t const desc_configuration[] = | ||||
| { | ||||
|   // Config number, interface count, string index, total length, attribute, power in mA | ||||
|   TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_TOTAL_LEN, TUSB_DESC_CONFIG_ATT_REMOTE_WAKEUP, 100), | ||||
|  | ||||
|   // Interface number, string index, protocol, report descriptor len, EP In & Out address, size & polling interval | ||||
|   TUD_HID_DESCRIPTOR(ITF_NUM_HID, 0, HID_PROTOCOL_NONE, sizeof(desc_hid_report), EPNUM_HID, CFG_TUD_HID_BUFSIZE, 10) | ||||
| }; | ||||
|  | ||||
| // Invoked when received GET CONFIGURATION DESCRIPTOR | ||||
| // Application return pointer to descriptor | ||||
| // Descriptor contents must exist long enough for transfer to complete | ||||
| uint8_t const * tud_descriptor_configuration_cb(uint8_t index) | ||||
| { | ||||
|   (void) index; // for multiple configurations | ||||
|   return desc_configuration; | ||||
| } | ||||
|  | ||||
| //--------------------------------------------------------------------+ | ||||
| // String Descriptors | ||||
| //--------------------------------------------------------------------+ | ||||
|  | ||||
| // array of pointer to string descriptors | ||||
| char const* string_desc_arr [] = | ||||
| { | ||||
|   (const char[]) { 0x09, 0x04 }, // 0: is supported language is English (0x0409) | ||||
|   "TinyUSB",                     // 1: Manufacturer | ||||
|   "TinyUSB Device",              // 2: Product | ||||
|   "123456",                      // 3: Serials, should use chip ID | ||||
| }; | ||||
|  | ||||
| static uint16_t _desc_str[32]; | ||||
|  | ||||
| // Invoked when received GET STRING DESCRIPTOR request | ||||
| // Application return pointer to descriptor, whose contents must exist long enough for transfer to complete | ||||
| uint16_t const* tud_descriptor_string_cb(uint8_t index, uint16_t langid) | ||||
| { | ||||
|   (void) langid; | ||||
|  | ||||
|   uint8_t chr_count; | ||||
|  | ||||
|   if ( index == 0) | ||||
|   { | ||||
|     memcpy(&_desc_str[1], string_desc_arr[0], 2); | ||||
|     chr_count = 1; | ||||
|   }else | ||||
|   { | ||||
|     // Convert ASCII string into UTF-16 | ||||
|  | ||||
|     if ( !(index < sizeof(string_desc_arr)/sizeof(string_desc_arr[0])) ) return NULL; | ||||
|  | ||||
|     const char* str = string_desc_arr[index]; | ||||
|  | ||||
|     // Cap at max char | ||||
|     chr_count = strlen(str); | ||||
|     if ( chr_count > 31 ) chr_count = 31; | ||||
|  | ||||
|     for(uint8_t i=0; i<chr_count; i++) | ||||
|     { | ||||
|       _desc_str[1+i] = str[i]; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   // first byte is length (including header), second byte is string type | ||||
|   _desc_str[0] = (TUSB_DESC_STRING << 8 ) | (2*chr_count + 2); | ||||
|  | ||||
|   return _desc_str; | ||||
| } | ||||
							
								
								
									
										34
									
								
								examples/device/hid_composite_freertos/src/usb_descriptors.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								examples/device/hid_composite_freertos/src/usb_descriptors.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,34 @@ | ||||
| /*  | ||||
|  * 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 USB_DESCRIPTORS_H_ | ||||
| #define USB_DESCRIPTORS_H_ | ||||
|  | ||||
| enum | ||||
| { | ||||
|   REPORT_ID_KEYBOARD = 1, | ||||
|   REPORT_ID_MOUSE | ||||
| }; | ||||
|  | ||||
| #endif /* USB_DESCRIPTORS_H_ */ | ||||
		Reference in New Issue
	
	Block a user
	 hathach
					hathach