diff options
| author | hathach <[email protected]> | 2014-03-12 14:01:38 +0700 |
|---|---|---|
| committer | hathach <[email protected]> | 2014-03-12 14:03:17 +0700 |
| commit | 8f03dea95a5d8cb4ebd72b0da74cd51365c8d936 (patch) | |
| tree | a7975df64f2a8f1e9a9c4bd71fe47941c3898556 /tinyusb | |
| parent | c92b03edfb33deadc06c81206452270f23f2cf17 (diff) | |
fix iar warning
Diffstat (limited to 'tinyusb')
| -rw-r--r-- | tinyusb/common/assertion.h | 406 | ||||
| -rw-r--r-- | tinyusb/common/compiler/compiler.h | 152 | ||||
| -rw-r--r-- | tinyusb/common/compiler/compiler_iar.h | 182 | ||||
| -rw-r--r-- | tinyusb/common/errors.h | 242 | ||||
| -rw-r--r-- | tinyusb/device/dcd.c | 88 | ||||
| -rw-r--r-- | tinyusb/device/usbd.c | 844 | ||||
| -rw-r--r-- | tinyusb/hal/hal.h | 274 | ||||
| -rw-r--r-- | tinyusb/hal/hal_lpc13uxx.h | 146 | ||||
| -rw-r--r-- | tinyusb/osal/osal_none.c | 122 | ||||
| -rw-r--r-- | tinyusb/osal/osal_none.h | 688 | ||||
| -rw-r--r-- | tinyusb/tusb.c | 182 |
11 files changed, 1663 insertions, 1663 deletions
diff --git a/tinyusb/common/assertion.h b/tinyusb/common/assertion.h index 91d10632b..2a847731a 100644 --- a/tinyusb/common/assertion.h +++ b/tinyusb/common/assertion.h @@ -1,203 +1,203 @@ -/**************************************************************************/ -/*! - @file assertion.h - @author hathach (tinyusb.org) - - @section LICENSE - - Software License Agreement (BSD License) - - Copyright (c) 2013, hathach (tinyusb.org) - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - 3. Neither the name of the copyright holders nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY - EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY - DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - INCLUDING NEGLIGENCE OR OTHERWISE ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - This file is part of the tinyusb stack. -*/ -/**************************************************************************/ - -/** \ingroup TBD - * \defgroup TBD - * \brief TBD - * - * @{ - */ - -#ifndef _TUSB_ASSERTION_H_ -#define _TUSB_ASSERTION_H_ - -#ifdef __cplusplus -extern "C" -{ -#endif - -#include "tusb_option.h" -#include "hal/hal.h" // TODO find a way to break hal dependency - -#define VOID_RETURN - -//--------------------------------------------------------------------+ -// Compile-time Assert -//--------------------------------------------------------------------+ -#ifdef __ICCARM__ - #define STATIC_ASSERT static_assert -#else - #if defined __COUNTER__ && __COUNTER__ != __COUNTER__ - #define _ASSERT_COUNTER __COUNTER__ - #else - #define _ASSERT_COUNTER __LINE__ - #endif - - #define STATIC_ASSERT(const_expr, message) enum { XSTRING_CONCAT_(static_assert_, _ASSERT_COUNTER) = 1/(!!(const_expr)) } -#endif - - //#if ( defined CFG_PRINTF_UART || defined CFG_PRINTF_USBCDC || defined CFG_PRINTF_DEBUG ) -#if TUSB_CFG_DEBUG == 3 - #define _PRINTF(...) printf(__VA_ARGS__) // PRINTF -#else - #define _PRINTF(...) -#endif - -//--------------------------------------------------------------------+ -// Assert Helper -//--------------------------------------------------------------------+ -#ifndef _TEST_ - #define ASSERT_MESSAGE(format, ...)\ - _PRINTF("Assert at %s: %s: %d: " format "\n", __BASE_FILE__, __PRETTY_FUNCTION__, __LINE__, __VA_ARGS__) -#else - #define ASSERT_MESSAGE(format, ...)\ - _PRINTF("%d:note: Assert " format "\n", __LINE__, __VA_ARGS__) -#endif - -#ifndef _TEST_ASSERT_ - #define ASSERT_ERROR_HANDLER(x, para) \ - return x -#else - #define ASSERT_ERROR_HANDLER(x, para) Throw(x) -#endif - -#define ASSERT_DEFINE_WITH_HANDLER(error_handler, handler_para, setup_statement, condition, error, format, ...) \ - do{\ - setup_statement;\ - if (!(condition)) {\ - if (hal_debugger_is_attached()){\ - hal_debugger_breakpoint();\ - }else{\ - ASSERT_MESSAGE(format, __VA_ARGS__);\ - }\ - error_handler(error, handler_para);\ - }\ - }while(0) - -#define ASSERT_DEFINE(...) ASSERT_DEFINE_WITH_HANDLER(ASSERT_ERROR_HANDLER, NULL, __VA_ARGS__) - -//--------------------------------------------------------------------+ -// tusb_error_t Status Assert TODO use ASSERT_DEFINE -//--------------------------------------------------------------------+ -#define ASSERT_STATUS_MESSAGE(sts, message) \ - ASSERT_DEFINE(tusb_error_t status = (tusb_error_t)(sts),\ - TUSB_ERROR_NONE == status, status, "%s: %s", TUSB_ErrorStr[status], message) - -#define ASSERT_STATUS(sts) \ - ASSERT_DEFINE(tusb_error_t status = (tusb_error_t)(sts),\ - TUSB_ERROR_NONE == status, status, "%s", TUSB_ErrorStr[status]) - -//--------------------------------------------------------------------+ -// Logical Assert -//--------------------------------------------------------------------+ -#define ASSERT(...) ASSERT_TRUE(__VA_ARGS__) -#define ASSERT_TRUE(condition , error) ASSERT_DEFINE( , (condition), error, "%s", "evaluated to false") -#define ASSERT_FALSE(condition , error) ASSERT_DEFINE( ,!(condition), error, "%s", "evaluated to true") - -//--------------------------------------------------------------------+ -// Pointer Assert -//--------------------------------------------------------------------+ -#define ASSERT_PTR(...) ASSERT_PTR_NOT_NULL(__VA_ARGS__) -#define ASSERT_PTR_NOT_NULL(pointer, error) ASSERT_DEFINE( , NULL != (pointer), error, "%s", "pointer is NULL") -#define ASSERT_PTR_NULL(pointer, error) ASSERT_DEFINE( , NULL == (pointer), error, "%s", "pointer is not NULL") - -//--------------------------------------------------------------------+ -// Integral Assert -//--------------------------------------------------------------------+ -#define ASSERT_XXX_EQUAL(type_format, expected, actual, error) \ - ASSERT_DEFINE(\ - uint32_t exp = (expected); uint32_t act = (actual),\ - exp==act,\ - error,\ - "expected " type_format ", actual " type_format, exp, act) - -#define ASSERT_XXX_WITHIN(type_format, lower, upper, actual, error) \ - ASSERT_DEFINE(\ - uint32_t low = (lower); uint32_t up = (upper); uint32_t act = (actual),\ - (low <= act) && (act <= up),\ - error,\ - "expected within " type_format " - " type_format ", actual " type_format, low, up, act) - -//--------------------------------------------------------------------+ -// Integer Assert -//--------------------------------------------------------------------+ -#define ASSERT_INT(...) ASSERT_INT_EQUAL(__VA_ARGS__) -#define ASSERT_INT_EQUAL(...) ASSERT_XXX_EQUAL("%d", __VA_ARGS__) -#define ASSERT_INT_WITHIN(...) ASSERT_XXX_WITHIN("%d", __VA_ARGS__) - -//--------------------------------------------------------------------+ -// Hex Assert -//--------------------------------------------------------------------+ -#define ASSERT_HEX(...) ASSERT_HEX_EQUAL(__VA_ARGS__) -#define ASSERT_HEX_EQUAL(...) ASSERT_XXX_EQUAL("0x%x", __VA_ARGS__) -#define ASSERT_HEX_WITHIN(...) ASSERT_XXX_WITHIN("0x%x", __VA_ARGS__) - -//--------------------------------------------------------------------+ -// TODO Bin Assert -//--------------------------------------------------------------------+ -#define BIN8_PRINTF_PATTERN "%d%d%d%d%d%d%d%d" -#define BIN8_PRINTF_CONVERT(byte) \ - ((byte) & 0x80 ? 1 : 0), \ - ((byte) & 0x40 ? 1 : 0), \ - ((byte) & 0x20 ? 1 : 0), \ - ((byte) & 0x10 ? 1 : 0), \ - ((byte) & 0x08 ? 1 : 0), \ - ((byte) & 0x04 ? 1 : 0), \ - ((byte) & 0x02 ? 1 : 0), \ - ((byte) & 0x01 ? 1 : 0) - -#define ASSERT_BIN8(...) ASSERT_BIN8_EQUAL(__VA_ARGS__) -#define ASSERT_BIN8_EQUAL(expected, actual, error)\ - ASSERT_DEFINE(\ - uint8_t exp = (expected); uint8_t act = (actual),\ - exp==act,\ - error,\ - "expected " BIN8_PRINTF_PATTERN ", actual " BIN8_PRINTF_PATTERN, BIN8_PRINTF_CONVERT(exp), BIN8_PRINTF_CONVERT(act) ) - -//--------------------------------------------------------------------+ -// TODO Bit Assert -//--------------------------------------------------------------------+ - - -#ifdef __cplusplus -} -#endif - -#endif /* _TUSB_ASSERTION_H_ */ - -/** @} */ +/**************************************************************************/
+/*!
+ @file assertion.h
+ @author hathach (tinyusb.org)
+
+ @section LICENSE
+
+ Software License Agreement (BSD License)
+
+ Copyright (c) 2013, hathach (tinyusb.org)
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the copyright holders nor the
+ names of its contributors may be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
+ EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ INCLUDING NEGLIGENCE OR OTHERWISE ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ This file is part of the tinyusb stack.
+*/
+/**************************************************************************/
+
+/** \ingroup TBD
+ * \defgroup TBD
+ * \brief TBD
+ *
+ * @{
+ */
+
+#ifndef _TUSB_ASSERTION_H_
+#define _TUSB_ASSERTION_H_
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include "tusb_option.h"
+#include "hal/hal.h" // TODO find a way to break hal dependency
+
+#define VOID_RETURN
+
+//--------------------------------------------------------------------+
+// Compile-time Assert
+//--------------------------------------------------------------------+
+#ifdef __ICCARM__
+ #define STATIC_ASSERT static_assert
+#else
+ #if defined __COUNTER__ && __COUNTER__ != __COUNTER__
+ #define _ASSERT_COUNTER __COUNTER__
+ #else
+ #define _ASSERT_COUNTER __LINE__
+ #endif
+
+ #define STATIC_ASSERT(const_expr, message) enum { XSTRING_CONCAT_(static_assert_, _ASSERT_COUNTER) = 1/(!!(const_expr)) }
+#endif
+
+ //#if ( defined CFG_PRINTF_UART || defined CFG_PRINTF_USBCDC || defined CFG_PRINTF_DEBUG )
+#if TUSB_CFG_DEBUG == 3
+ #define _PRINTF(...) printf(__VA_ARGS__) // PRINTF
+#else
+ #define _PRINTF(...)
+#endif
+
+//--------------------------------------------------------------------+
+// Assert Helper
+//--------------------------------------------------------------------+
+#ifndef _TEST_
+ #define ASSERT_MESSAGE(format, ...)\
+ _PRINTF("Assert at %s: %s: %d: " format "\n", __BASE_FILE__, __PRETTY_FUNCTION__, __LINE__, __VA_ARGS__)
+#else
+ #define ASSERT_MESSAGE(format, ...)\
+ _PRINTF("%d:note: Assert " format "\n", __LINE__, __VA_ARGS__)
+#endif
+
+#ifndef _TEST_ASSERT_
+ #define ASSERT_ERROR_HANDLER(x, para) \
+ return x
+#else
+ #define ASSERT_ERROR_HANDLER(x, para) Throw(x)
+#endif
+
+#define ASSERT_DEFINE_WITH_HANDLER(error_handler, handler_para, setup_statement, condition, error, format, ...) \
+ do{\
+ setup_statement;\
+ if (!(condition)) {\
+ if (hal_debugger_is_attached()){\
+ hal_debugger_breakpoint();\
+ }else{\
+ ASSERT_MESSAGE(format, __VA_ARGS__);\
+ }\
+ error_handler(error, handler_para);\
+ }\
+ }while(0)
+
+#define ASSERT_DEFINE(...) ASSERT_DEFINE_WITH_HANDLER(ASSERT_ERROR_HANDLER, NULL, __VA_ARGS__)
+
+//--------------------------------------------------------------------+
+// tusb_error_t Status Assert TODO use ASSERT_DEFINE
+//--------------------------------------------------------------------+
+#define ASSERT_STATUS_MESSAGE(sts, message) \
+ ASSERT_DEFINE(tusb_error_t status = (tusb_error_t)(sts),\
+ TUSB_ERROR_NONE == status, status, "%s: %s", TUSB_ErrorStr[status], message)
+
+#define ASSERT_STATUS(sts) \
+ ASSERT_DEFINE(tusb_error_t status = (tusb_error_t)(sts),\
+ TUSB_ERROR_NONE == status, status, "%s", TUSB_ErrorStr[status])
+
+//--------------------------------------------------------------------+
+// Logical Assert
+//--------------------------------------------------------------------+
+#define ASSERT(...) ASSERT_TRUE(__VA_ARGS__)
+#define ASSERT_TRUE(condition , error) ASSERT_DEFINE( , (condition), error, "%s", "evaluated to false")
+#define ASSERT_FALSE(condition , error) ASSERT_DEFINE( ,!(condition), error, "%s", "evaluated to true")
+
+//--------------------------------------------------------------------+
+// Pointer Assert
+//--------------------------------------------------------------------+
+#define ASSERT_PTR(...) ASSERT_PTR_NOT_NULL(__VA_ARGS__)
+#define ASSERT_PTR_NOT_NULL(pointer, error) ASSERT_DEFINE( , NULL != (pointer), error, "%s", "pointer is NULL")
+#define ASSERT_PTR_NULL(pointer, error) ASSERT_DEFINE( , NULL == (pointer), error, "%s", "pointer is not NULL")
+
+//--------------------------------------------------------------------+
+// Integral Assert
+//--------------------------------------------------------------------+
+#define ASSERT_XXX_EQUAL(type_format, expected, actual, error) \
+ ASSERT_DEFINE(\
+ uint32_t exp = (expected); uint32_t act = (actual),\
+ exp==act,\
+ error,\
+ "expected " type_format ", actual " type_format, exp, act)
+
+#define ASSERT_XXX_WITHIN(type_format, lower, upper, actual, error) \
+ ASSERT_DEFINE(\
+ uint32_t low = (lower); uint32_t up = (upper); uint32_t act = (actual),\
+ (low <= act) && (act <= up),\
+ error,\
+ "expected within " type_format " - " type_format ", actual " type_format, low, up, act)
+
+//--------------------------------------------------------------------+
+// Integer Assert
+//--------------------------------------------------------------------+
+#define ASSERT_INT(...) ASSERT_INT_EQUAL(__VA_ARGS__)
+#define ASSERT_INT_EQUAL(...) ASSERT_XXX_EQUAL("%d", __VA_ARGS__)
+#define ASSERT_INT_WITHIN(...) ASSERT_XXX_WITHIN("%d", __VA_ARGS__)
+
+//--------------------------------------------------------------------+
+// Hex Assert
+//--------------------------------------------------------------------+
+#define ASSERT_HEX(...) ASSERT_HEX_EQUAL(__VA_ARGS__)
+#define ASSERT_HEX_EQUAL(...) ASSERT_XXX_EQUAL("0x%x", __VA_ARGS__)
+#define ASSERT_HEX_WITHIN(...) ASSERT_XXX_WITHIN("0x%x", __VA_ARGS__)
+
+//--------------------------------------------------------------------+
+// TODO Bin Assert
+//--------------------------------------------------------------------+
+#define BIN8_PRINTF_PATTERN "%d%d%d%d%d%d%d%d"
+#define BIN8_PRINTF_CONVERT(byte) \
+ ((byte) & 0x80 ? 1 : 0), \
+ ((byte) & 0x40 ? 1 : 0), \
+ ((byte) & 0x20 ? 1 : 0), \
+ ((byte) & 0x10 ? 1 : 0), \
+ ((byte) & 0x08 ? 1 : 0), \
+ ((byte) & 0x04 ? 1 : 0), \
+ ((byte) & 0x02 ? 1 : 0), \
+ ((byte) & 0x01 ? 1 : 0)
+
+#define ASSERT_BIN8(...) ASSERT_BIN8_EQUAL(__VA_ARGS__)
+#define ASSERT_BIN8_EQUAL(expected, actual, error)\
+ ASSERT_DEFINE(\
+ uint8_t exp = (expected); uint8_t act = (actual),\
+ exp==act,\
+ error,\
+ "expected " BIN8_PRINTF_PATTERN ", actual " BIN8_PRINTF_PATTERN, BIN8_PRINTF_CONVERT(exp), BIN8_PRINTF_CONVERT(act) )
+
+//--------------------------------------------------------------------+
+// TODO Bit Assert
+//--------------------------------------------------------------------+
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _TUSB_ASSERTION_H_ */
+
+/** @} */
diff --git a/tinyusb/common/compiler/compiler.h b/tinyusb/common/compiler/compiler.h index 4c81047c7..98aa924ad 100644 --- a/tinyusb/common/compiler/compiler.h +++ b/tinyusb/common/compiler/compiler.h @@ -1,76 +1,76 @@ -/**************************************************************************/ -/*! - @file compiler.h - @author hathach (tinyusb.org) - - @section LICENSE - - Software License Agreement (BSD License) - - Copyright (c) 2013, hathach (tinyusb.org) - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - 3. Neither the name of the copyright holders nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY - EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY - DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - INCLUDING NEGLIGENCE OR OTHERWISE ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - This file is part of the tinyusb stack. -*/ -/**************************************************************************/ - -/** \ingroup Group_Common - * \defgroup Group_Compiler Compiler - * \brief Group_Compiler brief - * - * @{ - */ - -#ifndef _TUSB_COMPILER_H_ -#define _TUSB_COMPILER_H_ - -#ifndef _TEST_ - #define STATIC_ static - #define INLINE_ inline - #define ATTR_TEST_WEAK - - #if TUSB_CFG_DEBUG == 3 - #define ATTR_ALWAYS_INLINE // no inline for debug = 3 - #define STATIC_VAR - #else - #define STATIC_VAR static - #endif - -#else - #define ATTR_ALWAYS_INLINE - #define STATIC_ - #define STATIC_VAR - #define INLINE_ - -#endif - -#if defined(__GNUC__) - #include "compiler_gcc.h" -#elif defined __ICCARM__ // IAR compiler - #include "compiler_iar.h" -#endif - -#endif /* _TUSB_COMPILER_H_ */ -/// @} +/**************************************************************************/
+/*!
+ @file compiler.h
+ @author hathach (tinyusb.org)
+
+ @section LICENSE
+
+ Software License Agreement (BSD License)
+
+ Copyright (c) 2013, hathach (tinyusb.org)
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the copyright holders nor the
+ names of its contributors may be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
+ EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ INCLUDING NEGLIGENCE OR OTHERWISE ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ This file is part of the tinyusb stack.
+*/
+/**************************************************************************/
+
+/** \ingroup Group_Common
+ * \defgroup Group_Compiler Compiler
+ * \brief Group_Compiler brief
+ *
+ * @{
+ */
+
+#ifndef _TUSB_COMPILER_H_
+#define _TUSB_COMPILER_H_
+
+#ifndef _TEST_
+ #define STATIC_ static
+ #define INLINE_ inline
+ #define ATTR_TEST_WEAK
+
+ #if TUSB_CFG_DEBUG == 3
+ #define ATTR_ALWAYS_INLINE // no inline for debug = 3
+ #define STATIC_VAR
+ #else
+ #define STATIC_VAR static
+ #endif
+
+#else
+ #define ATTR_ALWAYS_INLINE
+ #define STATIC_
+ #define STATIC_VAR
+ #define INLINE_
+
+#endif
+
+#if defined(__GNUC__)
+ #include "compiler_gcc.h"
+#elif defined __ICCARM__ // IAR compiler
+ #include "compiler_iar.h"
+#endif
+
+#endif /* _TUSB_COMPILER_H_ */
+/// @}
diff --git a/tinyusb/common/compiler/compiler_iar.h b/tinyusb/common/compiler/compiler_iar.h index 7103ee092..1703ea45f 100644 --- a/tinyusb/common/compiler/compiler_iar.h +++ b/tinyusb/common/compiler/compiler_iar.h @@ -1,91 +1,91 @@ -/**************************************************************************/ -/*! - @file compiler_iar.h - @author hathach (tinyusb.org) - - @section LICENSE - - Software License Agreement (BSD License) - - Copyright (c) 2013, hathach (tinyusb.org) - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - 3. Neither the name of the copyright holders nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY - EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY - DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - INCLUDING NEGLIGENCE OR OTHERWISE ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - This file is part of the tinyusb stack. -*/ -/**************************************************************************/ - -/** \file - * \brief IAR Compiler - */ - -/** \ingroup Group_Compiler - * \defgroup Group_IAR IAR ARM - * @{ - */ - -#ifndef _TUSB_COMPILER_IAR_H_ -#define _TUSB_COMPILER_IAR_H_ - -#ifdef __cplusplus - extern "C" { -#endif - -#define ALIGN_OF(x) __ALIGNOF__(x) - -#define ATTR_PACKED_STRUCT(x) __packed x -#define ATTR_PREPACKED __packed -#define ATTR_PACKED -//#define ATTR_SECTION(section) _Pragma((#section)) - -#define ATTR_ALIGNED(bytes) _Pragma(XSTRING_(data_alignment=##bytes)) - -#ifndef ATTR_ALWAYS_INLINE -/// Generally, functions are not inlined unless optimization is specified. For functions declared inline, this attribute inlines the function even if no optimization level is specified -#define ATTR_ALWAYS_INLINE error -#endif - -#define ATTR_PURE // TODO IAR pure function attribute -#define ATTR_CONST // TODO IAR const function attribute -#define ATTR_WEAK __weak - -#define ATTR_WARN_UNUSED_RESULT -#define ATTR_USED -#define ATTR_UNUSED - -// built-in function to convert 32-bit Big-Endian to Little-Endian -//#if __LITTLE_ENDIAN__ -#define __be2n __REV -#define __n2be __be2n - -#define __n2be_16(u16) ((uint16_t) __REV16(u16)) -#define __be2n_16(u16) __n2be_16(u16) - -#ifdef __cplusplus - } -#endif - -#endif /* _TUSB_COMPILER_IAR_H_ */ - -/** @} */ +/**************************************************************************/
+/*!
+ @file compiler_iar.h
+ @author hathach (tinyusb.org)
+
+ @section LICENSE
+
+ Software License Agreement (BSD License)
+
+ Copyright (c) 2013, hathach (tinyusb.org)
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the copyright holders nor the
+ names of its contributors may be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
+ EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ INCLUDING NEGLIGENCE OR OTHERWISE ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ This file is part of the tinyusb stack.
+*/
+/**************************************************************************/
+
+/** \file
+ * \brief IAR Compiler
+ */
+
+/** \ingroup Group_Compiler
+ * \defgroup Group_IAR IAR ARM
+ * @{
+ */
+
+#ifndef _TUSB_COMPILER_IAR_H_
+#define _TUSB_COMPILER_IAR_H_
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+#define ALIGN_OF(x) __ALIGNOF__(x)
+
+#define ATTR_PACKED_STRUCT(x) __packed x
+#define ATTR_PREPACKED __packed
+#define ATTR_PACKED
+//#define ATTR_SECTION(section) _Pragma((#section))
+
+#define ATTR_ALIGNED(bytes) _Pragma(XSTRING_(data_alignment=##bytes))
+
+#ifndef ATTR_ALWAYS_INLINE
+/// Generally, functions are not inlined unless optimization is specified. For functions declared inline, this attribute inlines the function even if no optimization level is specified
+#define ATTR_ALWAYS_INLINE error
+#endif
+
+#define ATTR_PURE // TODO IAR pure function attribute
+#define ATTR_CONST // TODO IAR const function attribute
+#define ATTR_WEAK __weak
+
+#define ATTR_WARN_UNUSED_RESULT
+#define ATTR_USED
+#define ATTR_UNUSED
+
+// built-in function to convert 32-bit Big-Endian to Little-Endian
+//#if __LITTLE_ENDIAN__
+#define __be2n __REV
+#define __n2be __be2n
+
+#define __n2be_16(u16) ((uint16_t) __REV16(u16))
+#define __be2n_16(u16) __n2be_16(u16)
+
+#ifdef __cplusplus
+ }
+#endif
+
+#endif /* _TUSB_COMPILER_IAR_H_ */
+
+/** @} */
diff --git a/tinyusb/common/errors.h b/tinyusb/common/errors.h index 9b47fc332..c43143708 100644 --- a/tinyusb/common/errors.h +++ b/tinyusb/common/errors.h @@ -1,121 +1,121 @@ -/**************************************************************************/ -/*! - @file errors.h - @author hathach (tinyusb.org) - - @section LICENSE - - Software License Agreement (BSD License) - - Copyright (c) 2013, hathach (tinyusb.org) - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - 3. Neither the name of the copyright holders nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY - EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY - DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - This file is part of the tinyusb stack. -*/ -/**************************************************************************/ - -/** \file - * \brief Error Header - * - * \note TBD - */ - -/** \ingroup Group_Common - * \defgroup Group_Error Error Codes - * @{ - */ - -#ifndef _TUSB_ERRORS_H_ -#define _TUSB_ERRORS_H_ - -#include "tusb_option.h" - -#ifdef __cplusplus - extern "C" { -#endif - -#define ERROR_ENUM(x) x, -#define ERROR_STRING(x) #x, - -#define ERROR_TABLE(ENTRY) \ - ENTRY(TUSB_ERROR_NONE )\ - ENTRY(TUSB_ERROR_INVALID_PARA )\ - ENTRY(TUSB_ERROR_DEVICE_NOT_READY )\ - ENTRY(TUSB_ERROR_INTERFACE_IS_BUSY )\ - ENTRY(TUSB_ERROR_HCD_FAILED )\ - ENTRY(TUSB_ERROR_HCD_OPEN_PIPE_FAILED )\ - ENTRY(TUSB_ERROR_USBH_MOUNT_DEVICE_NOT_RESPOND )\ - ENTRY(TUSB_ERROR_USBH_MOUNT_CONFIG_DESC_TOO_LONG )\ - ENTRY(TUSB_ERROR_USBH_DESCRIPTOR_CORRUPTED )\ - ENTRY(TUSB_ERROR_USBH_XFER_STALLED )\ - ENTRY(TUSB_ERROR_USBH_XFER_FAILED )\ - ENTRY(TUSB_ERROR_OSAL_TIMEOUT )\ - ENTRY(TUSB_ERROR_OSAL_WAITING ) /* only used by OSAL_NONE in the subtask */ \ - ENTRY(TUSB_ERROR_OSAL_TASK_FAILED )\ - ENTRY(TUSB_ERROR_OSAL_TASK_CREATE_FAILED )\ - ENTRY(TUSB_ERROR_OSAL_QUEUE_FAILED )\ - ENTRY(TUSB_ERROR_OSAL_SEMAPHORE_FAILED )\ - ENTRY(TUSB_ERROR_OSAL_MUTEX_FAILED )\ - ENTRY(TUSB_ERROR_EHCI_NOT_ENOUGH_QTD )\ - ENTRY(TUSB_ERROR_HIDD_DESCRIPTOR_INTERFACE )\ - ENTRY(TUSB_ERROR_HIDH_NOT_SUPPORTED_PROTOCOL )\ - ENTRY(TUSB_ERROR_HIDH_NOT_SUPPORTED_SUBCLASS )\ - ENTRY(TUSB_ERROR_CDC_UNSUPPORTED_SUBCLASS )\ - ENTRY(TUSB_ERROR_CDC_UNSUPPORTED_PROTOCOL )\ - ENTRY(TUSB_ERROR_CDCH_DEVICE_NOT_MOUNTED )\ - ENTRY(TUSB_ERROR_MSC_UNSUPPORTED_PROTOCOL )\ - ENTRY(TUSB_ERROR_MSCH_UNKNOWN_SCSI_COMMAND )\ - ENTRY(TUSB_ERROR_MSCH_DEVICE_NOT_MOUNTED )\ - ENTRY(TUSB_ERROR_HUB_FEATURE_NOT_SUPPORTED )\ - ENTRY(TUSB_ERROR_DESCRIPTOR_CORRUPTED )\ - ENTRY(TUSB_ERROR_DCD_FAILED )\ - ENTRY(TUSB_ERROR_DCD_CONTROL_REQUEST_NOT_SUPPORT )\ - ENTRY(TUSB_ERROR_DCD_NOT_ENOUGH_QTD )\ - ENTRY(TUSB_ERROR_DCD_OPEN_PIPE_FAILED )\ - ENTRY(TUSB_ERROR_NOT_SUPPORTED_YET )\ - ENTRY(TUSB_ERROR_USBD_DEVICE_NOT_CONFIGURED )\ - ENTRY(TUSB_ERROR_FAILED )\ - - -/** \enum tusb_error_t - * \brief Error Code returned - */ -typedef enum { - ERROR_TABLE(ERROR_ENUM) - TUSB_ERROR_COUNT -}tusb_error_t; - -#if TUSB_CFG_DEBUG == 3 -/// Enum to String for debugging purposes. Only available if \ref TUSB_CFG_DEBUG > 0 -extern char const* const TUSB_ErrorStr[TUSB_ERROR_COUNT]; -#endif - -#ifdef __cplusplus - } -#endif - -#endif /* _TUSB_ERRORS_H_ */ - - /** @} */ +/**************************************************************************/
+/*!
+ @file errors.h
+ @author hathach (tinyusb.org)
+
+ @section LICENSE
+
+ Software License Agreement (BSD License)
+
+ Copyright (c) 2013, hathach (tinyusb.org)
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the copyright holders nor the
+ names of its contributors may be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
+ EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ This file is part of the tinyusb stack.
+*/
+/**************************************************************************/
+
+/** \file
+ * \brief Error Header
+ *
+ * \note TBD
+ */
+
+/** \ingroup Group_Common
+ * \defgroup Group_Error Error Codes
+ * @{
+ */
+
+#ifndef _TUSB_ERRORS_H_
+#define _TUSB_ERRORS_H_
+
+#include "tusb_option.h"
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+#define ERROR_ENUM(x) x,
+#define ERROR_STRING(x) #x,
+
+#define ERROR_TABLE(ENTRY) \
+ ENTRY(TUSB_ERROR_NONE )\
+ ENTRY(TUSB_ERROR_INVALID_PARA )\
+ ENTRY(TUSB_ERROR_DEVICE_NOT_READY )\
+ ENTRY(TUSB_ERROR_INTERFACE_IS_BUSY )\
+ ENTRY(TUSB_ERROR_HCD_FAILED )\
+ ENTRY(TUSB_ERROR_HCD_OPEN_PIPE_FAILED )\
+ ENTRY(TUSB_ERROR_USBH_MOUNT_DEVICE_NOT_RESPOND )\
+ ENTRY(TUSB_ERROR_USBH_MOUNT_CONFIG_DESC_TOO_LONG )\
+ ENTRY(TUSB_ERROR_USBH_DESCRIPTOR_CORRUPTED )\
+ ENTRY(TUSB_ERROR_USBH_XFER_STALLED )\
+ ENTRY(TUSB_ERROR_USBH_XFER_FAILED )\
+ ENTRY(TUSB_ERROR_OSAL_TIMEOUT )\
+ ENTRY(TUSB_ERROR_OSAL_WAITING ) /* only used by OSAL_NONE in the subtask */ \
+ ENTRY(TUSB_ERROR_OSAL_TASK_FAILED )\
+ ENTRY(TUSB_ERROR_OSAL_TASK_CREATE_FAILED )\
+ ENTRY(TUSB_ERROR_OSAL_QUEUE_FAILED )\
+ ENTRY(TUSB_ERROR_OSAL_SEMAPHORE_FAILED )\
+ ENTRY(TUSB_ERROR_OSAL_MUTEX_FAILED )\
+ ENTRY(TUSB_ERROR_EHCI_NOT_ENOUGH_QTD )\
+ ENTRY(TUSB_ERROR_HIDD_DESCRIPTOR_INTERFACE )\
+ ENTRY(TUSB_ERROR_HIDH_NOT_SUPPORTED_PROTOCOL )\
+ ENTRY(TUSB_ERROR_HIDH_NOT_SUPPORTED_SUBCLASS )\
+ ENTRY(TUSB_ERROR_CDC_UNSUPPORTED_SUBCLASS )\
+ ENTRY(TUSB_ERROR_CDC_UNSUPPORTED_PROTOCOL )\
+ ENTRY(TUSB_ERROR_CDCH_DEVICE_NOT_MOUNTED )\
+ ENTRY(TUSB_ERROR_MSC_UNSUPPORTED_PROTOCOL )\
+ ENTRY(TUSB_ERROR_MSCH_UNKNOWN_SCSI_COMMAND )\
+ ENTRY(TUSB_ERROR_MSCH_DEVICE_NOT_MOUNTED )\
+ ENTRY(TUSB_ERROR_HUB_FEATURE_NOT_SUPPORTED )\
+ ENTRY(TUSB_ERROR_DESCRIPTOR_CORRUPTED )\
+ ENTRY(TUSB_ERROR_DCD_FAILED )\
+ ENTRY(TUSB_ERROR_DCD_CONTROL_REQUEST_NOT_SUPPORT )\
+ ENTRY(TUSB_ERROR_DCD_NOT_ENOUGH_QTD )\
+ ENTRY(TUSB_ERROR_DCD_OPEN_PIPE_FAILED )\
+ ENTRY(TUSB_ERROR_NOT_SUPPORTED_YET )\
+ ENTRY(TUSB_ERROR_USBD_DEVICE_NOT_CONFIGURED )\
+ ENTRY(TUSB_ERROR_FAILED )\
+
+
+/** \enum tusb_error_t
+ * \brief Error Code returned
+ */
+typedef enum {
+ ERROR_TABLE(ERROR_ENUM)
+ TUSB_ERROR_COUNT
+}tusb_error_t;
+
+#if TUSB_CFG_DEBUG == 3
+/// Enum to String for debugging purposes. Only available if \ref TUSB_CFG_DEBUG > 0
+extern char const* const TUSB_ErrorStr[TUSB_ERROR_COUNT];
+#endif
+
+#ifdef __cplusplus
+ }
+#endif
+
+#endif /* _TUSB_ERRORS_H_ */
+
+ /** @} */
diff --git a/tinyusb/device/dcd.c b/tinyusb/device/dcd.c index 9ff5803b0..441c8970e 100644 --- a/tinyusb/device/dcd.c +++ b/tinyusb/device/dcd.c @@ -1,44 +1,44 @@ -/**************************************************************************/ -/*! - @file dcd.c - @author hathach (tinyusb.org) - - @section LICENSE - - Software License Agreement (BSD License) - - Copyright (c) 2013, hathach (tinyusb.org) - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - 3. Neither the name of the copyright holders nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY - EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY - DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - INCLUDING NEGLIGENCE OR OTHERWISE ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - This file is part of the tinyusb stack. -*/ -/**************************************************************************/ - -#include "dcd.h" - -#if MODE_DEVICE_SUPPORTED - - -#endif +/**************************************************************************/
+/*!
+ @file dcd.c
+ @author hathach (tinyusb.org)
+
+ @section LICENSE
+
+ Software License Agreement (BSD License)
+
+ Copyright (c) 2013, hathach (tinyusb.org)
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the copyright holders nor the
+ names of its contributors may be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
+ EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ INCLUDING NEGLIGENCE OR OTHERWISE ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ This file is part of the tinyusb stack.
+*/
+/**************************************************************************/
+
+#include "dcd.h"
+
+#if MODE_DEVICE_SUPPORTED
+
+
+#endif
diff --git a/tinyusb/device/usbd.c b/tinyusb/device/usbd.c index 0b9044db9..b91cf6991 100644 --- a/tinyusb/device/usbd.c +++ b/tinyusb/device/usbd.c @@ -1,422 +1,422 @@ -/**************************************************************************/ -/*! - @file usbd.c - @author hathach (tinyusb.org) - - @section LICENSE - - Software License Agreement (BSD License) - - Copyright (c) 2013, hathach (tinyusb.org) - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - 3. Neither the name of the copyright holders nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY - EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY - DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - This file is part of the tinyusb stack. -*/ -/**************************************************************************/ - -#include "tusb_option.h" - -#if MODE_DEVICE_SUPPORTED - -#define _TINY_USB_SOURCE_FILE_ - -//--------------------------------------------------------------------+ -// INCLUDE -//--------------------------------------------------------------------+ -#include "tusb.h" -#include "tusb_descriptors.h" // TODO callback include -#include "usbd_dcd.h" - -//--------------------------------------------------------------------+ -// MACRO CONSTANT TYPEDEF -//--------------------------------------------------------------------+ -usbd_device_info_t usbd_devices[CONTROLLER_DEVICE_NUMBER]; - -// TODO fix/compress number of class driver -static usbd_class_driver_t const usbd_class_drivers[TUSB_CLASS_MAPPED_INDEX_START] = -{ -#if DEVICE_CLASS_HID - [TUSB_CLASS_HID] = - { - .init = hidd_init, - .open = hidd_open, - .control_request_subtask = hidd_control_request_subtask, - .xfer_cb = hidd_xfer_cb, - .close = hidd_close - }, -#endif - -#if TUSB_CFG_DEVICE_MSC - [TUSB_CLASS_MSC] = - { - .init = mscd_init, - .open = mscd_open, - .control_request_subtask = mscd_control_request_subtask, - .xfer_cb = mscd_xfer_cb, - .close = mscd_close - }, -#endif - -#if TUSB_CFG_DEVICE_CDC - [TUSB_CLASS_CDC] = - { - .init = cdcd_init, - .open = cdcd_open, - .control_request_subtask = cdcd_control_request_subtask, - .xfer_cb = cdcd_xfer_cb, - .close = cdcd_close - }, -#endif - -}; - -//--------------------------------------------------------------------+ -// INTERNAL OBJECT & FUNCTION DECLARATION -//--------------------------------------------------------------------+ -static tusb_error_t usbd_set_configure_received(uint8_t coreid, uint8_t config_number); -static tusb_error_t get_descriptor(uint8_t coreid, tusb_control_request_t const * const p_request, uint8_t ** pp_buffer, uint16_t * p_length); - -//--------------------------------------------------------------------+ -// APPLICATION INTERFACE -//--------------------------------------------------------------------+ -bool tusbd_is_configured(uint8_t coreid) -{ - return usbd_devices[coreid].state == TUSB_DEVICE_STATE_CONFIGURED; -} - -//--------------------------------------------------------------------+ -// IMPLEMENTATION -//--------------------------------------------------------------------+ - -//------------- OSAL Task -------------// -enum { - USBD_TASK_QUEUE_DEPTH = 8 -}; - -typedef enum { - USBD_EVENTID_SETUP_RECEIVED = 1, - USBD_EVENTID_XFER_DONE -}usbd_eventid_t; - -typedef struct ATTR_ALIGNED(4) -{ - uint8_t coreid; - uint8_t event_id; - uint8_t sub_event_id; - uint8_t reserved; - - union { - tusb_control_request_t setup_received; // USBD_EVENTID_SETUP_RECEIVED - - struct { // USBD_EVENTID_XFER_DONE - endpoint_handle_t edpt_hdl; - uint32_t xferred_byte; - }xfer_done; - }; -}usbd_task_event_t; - -STATIC_ASSERT(sizeof(usbd_task_event_t) <= 12, "size is not correct"); - -OSAL_TASK_DEF(usbd_task, 150, TUSB_CFG_OS_TASK_PRIO); -OSAL_QUEUE_DEF(usbd_queue_def, USBD_TASK_QUEUE_DEPTH, usbd_task_event_t); -OSAL_SEM_DEF(usbd_control_xfer_semaphore_def); - -static osal_queue_handle_t usbd_queue_hdl; -/*static*/ osal_semaphore_handle_t usbd_control_xfer_sem_hdl; // TODO may need to change to static with wrapper function - -tusb_error_t usbd_control_request_subtask(uint8_t coreid, tusb_control_request_t const * const p_request) -{ - OSAL_SUBTASK_BEGIN - - tusb_error_t error = TUSB_ERROR_NONE; - - //------------- Standard Control such as those in enumeration -------------// - if( TUSB_REQUEST_RECIPIENT_DEVICE == p_request->bmRequestType_bit.recipient && - TUSB_REQUEST_TYPE_STANDARD == p_request->bmRequestType_bit.type ) - { - if ( TUSB_REQUEST_GET_DESCRIPTOR == p_request->bRequest ) - { - uint8_t* p_buffer = NULL; - uint16_t length = 0; - - error = get_descriptor(coreid, p_request, &p_buffer, &length); - - if ( TUSB_ERROR_NONE == error ) - { - dcd_pipe_control_xfer(coreid, p_request->bmRequestType_bit.direction, p_buffer, length, false); - } - } - else if ( TUSB_REQUEST_SET_ADDRESS == p_request->bRequest ) - { - dcd_controller_set_address(coreid, (uint8_t) p_request->wValue); - usbd_devices[coreid].state = TUSB_DEVICE_STATE_ADDRESSED; - } - else if ( TUSB_REQUEST_SET_CONFIGURATION == p_request->bRequest ) - { - usbd_set_configure_received(coreid, (uint8_t) p_request->wValue); - }else - { - error = TUSB_ERROR_DCD_CONTROL_REQUEST_NOT_SUPPORT; - } - } - - //------------- Class/Interface Specific Request -------------// - else if ( TUSB_REQUEST_RECIPIENT_INTERFACE == p_request->bmRequestType_bit.recipient) - { - OSAL_VAR tusb_std_class_code_t class_code; - - class_code = usbd_devices[coreid].interface2class[ u16_low_u8(p_request->wIndex) ]; - - if ( (TUSB_CLASS_AUDIO <= class_code) && (class_code <= TUSB_CLASS_AUDIO_VIDEO) && - usbd_class_drivers[class_code].control_request_subtask ) - { - OSAL_SUBTASK_INVOKED_AND_WAIT( usbd_class_drivers[class_code].control_request_subtask(coreid, p_request), error ); - }else - { - error = TUSB_ERROR_DCD_CONTROL_REQUEST_NOT_SUPPORT; - } - } - - //------------- Endpoint Request -------------// - else if ( TUSB_REQUEST_RECIPIENT_ENDPOINT == p_request->bmRequestType_bit.recipient && - TUSB_REQUEST_TYPE_STANDARD == p_request->bmRequestType_bit.type && - TUSB_REQUEST_CLEAR_FEATURE == p_request->bRequest ) - { - dcd_pipe_clear_stall(coreid, u16_low_u8(p_request->wIndex) ); - } else - { - error = TUSB_ERROR_DCD_CONTROL_REQUEST_NOT_SUPPORT; - } - - if(TUSB_ERROR_NONE != error) - { // Response with Protocol Stall if request is not supported - dcd_pipe_control_stall(coreid); - // ASSERT(error == TUSB_ERROR_NONE, VOID_RETURN); - }else if (p_request->wLength == 0) - { - dcd_pipe_control_xfer(coreid, p_request->bmRequestType_bit.direction, NULL, 0, false); // zero length for non-data - } - - OSAL_SUBTASK_END -} - -// To enable the TASK_ASSERT style (quick return on false condition) in a real RTOS, a task must act as a wrapper -// and is used mainly to call subtasks. Within a subtask return statement can be called freely, the task with -// forever loop cannot have any return at all. -OSAL_TASK_FUNCTION(usbd_task) (void* p_task_para) -{ - OSAL_TASK_LOOP_BEGIN - - OSAL_VAR usbd_task_event_t event; - tusb_error_t error = TUSB_ERROR_NONE; - - osal_queue_receive(usbd_queue_hdl, &event, OSAL_TIMEOUT_WAIT_FOREVER, &error); - SUBTASK_ASSERT_STATUS(error); - - if ( USBD_EVENTID_SETUP_RECEIVED == event.event_id ) - { - OSAL_SUBTASK_INVOKED_AND_WAIT( usbd_control_request_subtask(event.coreid, &event.setup_received), error ); - }else - { - uint8_t class_index; - class_index = std_class_code_to_index( event.xfer_done.edpt_hdl.class_code ); - - if (usbd_class_drivers[class_index].xfer_cb) - { - usbd_class_drivers[class_index].xfer_cb( event.xfer_done.edpt_hdl, event.sub_event_id, event.xfer_done.xferred_byte); - }else - { - hal_debugger_breakpoint(); // something wrong, no one claims the isr's source - } - } - - OSAL_TASK_LOOP_END -} - -tusb_error_t usbd_init (void) -{ - ASSERT_STATUS ( dcd_init() ); - - //------------- Task init -------------// - usbd_queue_hdl = osal_queue_create( OSAL_QUEUE_REF(usbd_queue_def) ); - ASSERT_PTR(usbd_queue_hdl, TUSB_ERROR_OSAL_QUEUE_FAILED); - - usbd_control_xfer_sem_hdl = osal_semaphore_create( OSAL_SEM_REF(usbd_control_xfer_semaphore_def) ); - ASSERT_PTR(usbd_queue_hdl, TUSB_ERROR_OSAL_SEMAPHORE_FAILED); - - ASSERT_STATUS( osal_task_create( OSAL_TASK_REF(usbd_task) )); - - //------------- class init -------------// - for (tusb_std_class_code_t class_code = TUSB_CLASS_AUDIO; class_code <= TUSB_CLASS_AUDIO_VIDEO; class_code++) - { - if ( usbd_class_drivers[class_code].init ) - { - usbd_class_drivers[class_code].init(); - } - } - - return TUSB_ERROR_NONE; -} - -//--------------------------------------------------------------------+ -// CONTROL REQUEST -//--------------------------------------------------------------------+ -// TODO Host (windows) can get HID report descriptor before set configured -// need to open interface before set configured -static tusb_error_t usbd_set_configure_received(uint8_t coreid, uint8_t config_number) -{ - dcd_controller_set_configuration(coreid); - usbd_devices[coreid].state = TUSB_DEVICE_STATE_CONFIGURED; - - //------------- parse configuration & open drivers -------------// - uint8_t* p_desc_configure = (uint8_t*) &app_tusb_desc_configuration; - uint8_t* p_desc = p_desc_configure + sizeof(tusb_descriptor_configuration_t); - - while( p_desc < p_desc_configure + ((tusb_descriptor_configuration_t*)p_desc_configure)->wTotalLength ) - { - if ( TUSB_DESC_TYPE_INTERFACE_ASSOCIATION == p_desc[DESCRIPTOR_OFFSET_TYPE]) - { - p_desc += p_desc[DESCRIPTOR_OFFSET_LENGTH]; // ignore IAD - }else - { - ASSERT( TUSB_DESC_TYPE_INTERFACE == p_desc[DESCRIPTOR_OFFSET_TYPE], TUSB_ERROR_NOT_SUPPORTED_YET ); - - uint8_t class_index; - tusb_descriptor_interface_t* p_desc_interface = (tusb_descriptor_interface_t*) p_desc; - - class_index = p_desc_interface->bInterfaceClass; - - ASSERT( class_index != 0 && usbd_class_drivers[class_index].open != NULL, TUSB_ERROR_NOT_SUPPORTED_YET ); - ASSERT( 0 == usbd_devices[coreid].interface2class[p_desc_interface->bInterfaceNumber], TUSB_ERROR_FAILED); // duplicate interface number TODO alternate setting - - usbd_devices[coreid].interface2class[p_desc_interface->bInterfaceNumber] = class_index; - - uint16_t length=0; - ASSERT_STATUS( usbd_class_drivers[class_index].open( coreid, p_desc_interface, &length ) ); - - ASSERT( length >= sizeof(tusb_descriptor_interface_t), TUSB_ERROR_FAILED ); - p_desc += length; - } - } - - return TUSB_ERROR_NONE; -} - -static tusb_error_t get_descriptor(uint8_t coreid, tusb_control_request_t const * const p_request, uint8_t ** pp_buffer, uint16_t * p_length) -{ - tusb_std_descriptor_type_t const desc_type = u16_high_u8(p_request->wValue); - uint8_t const desc_index = u16_low_u8( p_request->wValue ); - - if ( TUSB_DESC_TYPE_DEVICE == desc_type ) - { - (*pp_buffer) = (uint8_t *) &app_tusb_desc_device; - (*p_length) = sizeof(tusb_descriptor_device_t); - } - else if ( TUSB_DESC_TYPE_CONFIGURATION == desc_type ) - { - (*pp_buffer) = (uint8_t *) &app_tusb_desc_configuration; - (*p_length) = sizeof(app_tusb_desc_configuration); - } - else if ( TUSB_DESC_TYPE_STRING == desc_type ) - { - if ( ! (desc_index < TUSB_CFG_DEVICE_STRING_DESCRIPTOR_COUNT) ) return TUSB_ERROR_DCD_CONTROL_REQUEST_NOT_SUPPORT; - - (*pp_buffer) = (uint8_t *) desc_str_table[desc_index]; - (*p_length) = **pp_buffer; - }else - { - return TUSB_ERROR_DCD_CONTROL_REQUEST_NOT_SUPPORT; - } - - (*p_length) = min16_of(p_request->wLength, (*p_length) ); // cannot return more than hosts requires - - return TUSB_ERROR_NONE; -} -//--------------------------------------------------------------------+ -// USBD-CLASS API -//--------------------------------------------------------------------+ - -//--------------------------------------------------------------------+ -// USBD-DCD Callback API -//--------------------------------------------------------------------+ -void usbd_dcd_bus_event_isr(uint8_t coreid, usbd_bus_event_type_t bus_event) -{ - switch(bus_event) - { - case USBD_BUS_EVENT_RESET : - case USBD_BUS_EVENT_UNPLUGGED : - memclr_(&usbd_devices[coreid], sizeof(usbd_device_info_t)); - for (tusb_std_class_code_t class_code = TUSB_CLASS_AUDIO; class_code <= TUSB_CLASS_AUDIO_VIDEO; class_code++) - { - if ( usbd_class_drivers[class_code].close ) usbd_class_drivers[class_code].close( coreid ); - } - break; - - case USBD_BUS_EVENT_SUSPENDED: - usbd_devices[coreid].state = TUSB_DEVICE_STATE_SUSPENDED; - break; - - default: break; - } -} - -void usbd_setup_received_isr(uint8_t coreid, tusb_control_request_t * p_request) -{ - usbd_task_event_t task_event = - { - .coreid = coreid, - .event_id = USBD_EVENTID_SETUP_RECEIVED, - }; - - task_event.setup_received = (*p_request); - osal_queue_send(usbd_queue_hdl, &task_event); -} - -void usbd_xfer_isr(endpoint_handle_t edpt_hdl, tusb_event_t event, uint32_t xferred_bytes) -{ - if (edpt_hdl.class_code == 0 ) // Control Transfer - { - osal_semaphore_post( usbd_control_xfer_sem_hdl ); - }else - { - usbd_task_event_t task_event = - { - .coreid = edpt_hdl.coreid, - .event_id = USBD_EVENTID_XFER_DONE, - .sub_event_id = event - }; - - task_event.xfer_done.xferred_byte = xferred_bytes; - task_event.xfer_done.edpt_hdl = edpt_hdl; - - osal_queue_send(usbd_queue_hdl, &task_event); - } -} - -//--------------------------------------------------------------------+ -// HELPER -//--------------------------------------------------------------------+ - -#endif +/**************************************************************************/
+/*!
+ @file usbd.c
+ @author hathach (tinyusb.org)
+
+ @section LICENSE
+
+ Software License Agreement (BSD License)
+
+ Copyright (c) 2013, hathach (tinyusb.org)
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the copyright holders nor the
+ names of its contributors may be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
+ EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ This file is part of the tinyusb stack.
+*/
+/**************************************************************************/
+
+#include "tusb_option.h"
+
+#if MODE_DEVICE_SUPPORTED
+
+#define _TINY_USB_SOURCE_FILE_
+
+//--------------------------------------------------------------------+
+// INCLUDE
+//--------------------------------------------------------------------+
+#include "tusb.h"
+#include "tusb_descriptors.h" // TODO callback include
+#include "usbd_dcd.h"
+
+//--------------------------------------------------------------------+
+// MACRO CONSTANT TYPEDEF
+//--------------------------------------------------------------------+
+usbd_device_info_t usbd_devices[CONTROLLER_DEVICE_NUMBER];
+
+// TODO fix/compress number of class driver
+static usbd_class_driver_t const usbd_class_drivers[TUSB_CLASS_MAPPED_INDEX_START] =
+{
+#if DEVICE_CLASS_HID
+ [TUSB_CLASS_HID] =
+ {
+ .init = hidd_init,
+ .open = hidd_open,
+ .control_request_subtask = hidd_control_request_subtask,
+ .xfer_cb = hidd_xfer_cb,
+ .close = hidd_close
+ },
+#endif
+
+#if TUSB_CFG_DEVICE_MSC
+ [TUSB_CLASS_MSC] =
+ {
+ .init = mscd_init,
+ .open = mscd_open,
+ .control_request_subtask = mscd_control_request_subtask,
+ .xfer_cb = mscd_xfer_cb,
+ .close = mscd_close
+ },
+#endif
+
+#if TUSB_CFG_DEVICE_CDC
+ [TUSB_CLASS_CDC] =
+ {
+ .init = cdcd_init,
+ .open = cdcd_open,
+ .control_request_subtask = cdcd_control_request_subtask,
+ .xfer_cb = cdcd_xfer_cb,
+ .close = cdcd_close
+ },
+#endif
+
+};
+
+//--------------------------------------------------------------------+
+// INTERNAL OBJECT & FUNCTION DECLARATION
+//--------------------------------------------------------------------+
+static tusb_error_t usbd_set_configure_received(uint8_t coreid, uint8_t config_number);
+static tusb_error_t get_descriptor(uint8_t coreid, tusb_control_request_t const * const p_request, uint8_t ** pp_buffer, uint16_t * p_length);
+
+//--------------------------------------------------------------------+
+// APPLICATION INTERFACE
+//--------------------------------------------------------------------+
+bool tusbd_is_configured(uint8_t coreid)
+{
+ return usbd_devices[coreid].state == TUSB_DEVICE_STATE_CONFIGURED;
+}
+
+//--------------------------------------------------------------------+
+// IMPLEMENTATION
+//--------------------------------------------------------------------+
+
+//------------- OSAL Task -------------//
+enum {
+ USBD_TASK_QUEUE_DEPTH = 8
+};
+
+typedef enum {
+ USBD_EVENTID_SETUP_RECEIVED = 1,
+ USBD_EVENTID_XFER_DONE
+}usbd_eventid_t;
+
+typedef struct ATTR_ALIGNED(4)
+{
+ uint8_t coreid;
+ uint8_t event_id;
+ uint8_t sub_event_id;
+ uint8_t reserved;
+
+ union {
+ tusb_control_request_t setup_received; // USBD_EVENTID_SETUP_RECEIVED
+
+ struct { // USBD_EVENTID_XFER_DONE
+ endpoint_handle_t edpt_hdl;
+ uint32_t xferred_byte;
+ }xfer_done;
+ };
+}usbd_task_event_t;
+
+STATIC_ASSERT(sizeof(usbd_task_event_t) <= 12, "size is not correct");
+
+OSAL_TASK_DEF(usbd_task, 150, TUSB_CFG_OS_TASK_PRIO);
+OSAL_QUEUE_DEF(usbd_queue_def, USBD_TASK_QUEUE_DEPTH, usbd_task_event_t);
+OSAL_SEM_DEF(usbd_control_xfer_semaphore_def);
+
+static osal_queue_handle_t usbd_queue_hdl;
+/*static*/ osal_semaphore_handle_t usbd_control_xfer_sem_hdl; // TODO may need to change to static with wrapper function
+
+tusb_error_t usbd_control_request_subtask(uint8_t coreid, tusb_control_request_t const * const p_request)
+{
+ OSAL_SUBTASK_BEGIN
+
+ tusb_error_t error = TUSB_ERROR_NONE;
+
+ //------------- Standard Control such as those in enumeration -------------//
+ if( TUSB_REQUEST_RECIPIENT_DEVICE == p_request->bmRequestType_bit.recipient &&
+ TUSB_REQUEST_TYPE_STANDARD == p_request->bmRequestType_bit.type )
+ {
+ if ( TUSB_REQUEST_GET_DESCRIPTOR == p_request->bRequest )
+ {
+ uint8_t* p_buffer = NULL;
+ uint16_t length = 0;
+
+ error = get_descriptor(coreid, p_request, &p_buffer, &length);
+
+ if ( TUSB_ERROR_NONE == error )
+ {
+ dcd_pipe_control_xfer(coreid, p_request->bmRequestType_bit.direction, p_buffer, length, false);
+ }
+ }
+ else if ( TUSB_REQUEST_SET_ADDRESS == p_request->bRequest )
+ {
+ dcd_controller_set_address(coreid, (uint8_t) p_request->wValue);
+ usbd_devices[coreid].state = TUSB_DEVICE_STATE_ADDRESSED;
+ }
+ else if ( TUSB_REQUEST_SET_CONFIGURATION == p_request->bRequest )
+ {
+ usbd_set_configure_received(coreid, (uint8_t) p_request->wValue);
+ }else
+ {
+ error = TUSB_ERROR_DCD_CONTROL_REQUEST_NOT_SUPPORT;
+ }
+ }
+
+ //------------- Class/Interface Specific Request -------------//
+ else if ( TUSB_REQUEST_RECIPIENT_INTERFACE == p_request->bmRequestType_bit.recipient)
+ {
+ OSAL_VAR tusb_std_class_code_t class_code;
+
+ class_code = usbd_devices[coreid].interface2class[ u16_low_u8(p_request->wIndex) ];
+
+ if ( (TUSB_CLASS_AUDIO <= class_code) && (class_code <= TUSB_CLASS_AUDIO_VIDEO) &&
+ usbd_class_drivers[class_code].control_request_subtask )
+ {
+ OSAL_SUBTASK_INVOKED_AND_WAIT( usbd_class_drivers[class_code].control_request_subtask(coreid, p_request), error );
+ }else
+ {
+ error = TUSB_ERROR_DCD_CONTROL_REQUEST_NOT_SUPPORT;
+ }
+ }
+
+ //------------- Endpoint Request -------------//
+ else if ( TUSB_REQUEST_RECIPIENT_ENDPOINT == p_request->bmRequestType_bit.recipient &&
+ TUSB_REQUEST_TYPE_STANDARD == p_request->bmRequestType_bit.type &&
+ TUSB_REQUEST_CLEAR_FEATURE == p_request->bRequest )
+ {
+ dcd_pipe_clear_stall(coreid, u16_low_u8(p_request->wIndex) );
+ } else
+ {
+ error = TUSB_ERROR_DCD_CONTROL_REQUEST_NOT_SUPPORT;
+ }
+
+ if(TUSB_ERROR_NONE != error)
+ { // Response with Protocol Stall if request is not supported
+ dcd_pipe_control_stall(coreid);
+ // ASSERT(error == TUSB_ERROR_NONE, VOID_RETURN);
+ }else if (p_request->wLength == 0)
+ {
+ dcd_pipe_control_xfer(coreid, p_request->bmRequestType_bit.direction, NULL, 0, false); // zero length for non-data
+ }
+
+ OSAL_SUBTASK_END
+}
+
+// To enable the TASK_ASSERT style (quick return on false condition) in a real RTOS, a task must act as a wrapper
+// and is used mainly to call subtasks. Within a subtask return statement can be called freely, the task with
+// forever loop cannot have any return at all.
+OSAL_TASK_FUNCTION(usbd_task) (void* p_task_para)
+{
+ OSAL_TASK_LOOP_BEGIN
+
+ OSAL_VAR usbd_task_event_t event;
+ tusb_error_t error = TUSB_ERROR_NONE;
+
+ osal_queue_receive(usbd_queue_hdl, &event, OSAL_TIMEOUT_WAIT_FOREVER, &error);
+ SUBTASK_ASSERT_STATUS(error);
+
+ if ( USBD_EVENTID_SETUP_RECEIVED == event.event_id )
+ {
+ OSAL_SUBTASK_INVOKED_AND_WAIT( usbd_control_request_subtask(event.coreid, &event.setup_received), error );
+ }else
+ {
+ uint8_t class_index;
+ class_index = std_class_code_to_index( event.xfer_done.edpt_hdl.class_code );
+
+ if (usbd_class_drivers[class_index].xfer_cb)
+ {
+ usbd_class_drivers[class_index].xfer_cb( event.xfer_done.edpt_hdl, event.sub_event_id, event.xfer_done.xferred_byte);
+ }else
+ {
+ hal_debugger_breakpoint(); // something wrong, no one claims the isr's source
+ }
+ }
+
+ OSAL_TASK_LOOP_END
+}
+
+tusb_error_t usbd_init (void)
+{
+ ASSERT_STATUS ( dcd_init() );
+
+ //------------- Task init -------------//
+ usbd_queue_hdl = osal_queue_create( OSAL_QUEUE_REF(usbd_queue_def) );
+ ASSERT_PTR(usbd_queue_hdl, TUSB_ERROR_OSAL_QUEUE_FAILED);
+
+ usbd_control_xfer_sem_hdl = osal_semaphore_create( OSAL_SEM_REF(usbd_control_xfer_semaphore_def) );
+ ASSERT_PTR(usbd_queue_hdl, TUSB_ERROR_OSAL_SEMAPHORE_FAILED);
+
+ ASSERT_STATUS( osal_task_create( OSAL_TASK_REF(usbd_task) ));
+
+ //------------- class init -------------//
+ for (tusb_std_class_code_t class_code = TUSB_CLASS_AUDIO; class_code <= TUSB_CLASS_AUDIO_VIDEO; class_code++)
+ {
+ if ( usbd_class_drivers[class_code].init )
+ {
+ usbd_class_drivers[class_code].init();
+ }
+ }
+
+ return TUSB_ERROR_NONE;
+}
+
+//--------------------------------------------------------------------+
+// CONTROL REQUEST
+//--------------------------------------------------------------------+
+// TODO Host (windows) can get HID report descriptor before set configured
+// need to open interface before set configured
+static tusb_error_t usbd_set_configure_received(uint8_t coreid, uint8_t config_number)
+{
+ dcd_controller_set_configuration(coreid);
+ usbd_devices[coreid].state = TUSB_DEVICE_STATE_CONFIGURED;
+
+ //------------- parse configuration & open drivers -------------//
+ uint8_t* p_desc_configure = (uint8_t*) &app_tusb_desc_configuration;
+ uint8_t* p_desc = p_desc_configure + sizeof(tusb_descriptor_configuration_t);
+
+ while( p_desc < p_desc_configure + ((tusb_descriptor_configuration_t*)p_desc_configure)->wTotalLength )
+ {
+ if ( TUSB_DESC_TYPE_INTERFACE_ASSOCIATION == p_desc[DESCRIPTOR_OFFSET_TYPE])
+ {
+ p_desc += p_desc[DESCRIPTOR_OFFSET_LENGTH]; // ignore IAD
+ }else
+ {
+ ASSERT( TUSB_DESC_TYPE_INTERFACE == p_desc[DESCRIPTOR_OFFSET_TYPE], TUSB_ERROR_NOT_SUPPORTED_YET );
+
+ uint8_t class_index;
+ tusb_descriptor_interface_t* p_desc_interface = (tusb_descriptor_interface_t*) p_desc;
+
+ class_index = p_desc_interface->bInterfaceClass;
+
+ ASSERT( class_index != 0 && usbd_class_drivers[class_index].open != NULL, TUSB_ERROR_NOT_SUPPORTED_YET );
+ ASSERT( 0 == usbd_devices[coreid].interface2class[p_desc_interface->bInterfaceNumber], TUSB_ERROR_FAILED); // duplicate interface number TODO alternate setting
+
+ usbd_devices[coreid].interface2class[p_desc_interface->bInterfaceNumber] = class_index;
+
+ uint16_t length=0;
+ ASSERT_STATUS( usbd_class_drivers[class_index].open( coreid, p_desc_interface, &length ) );
+
+ ASSERT( length >= sizeof(tusb_descriptor_interface_t), TUSB_ERROR_FAILED );
+ p_desc += length;
+ }
+ }
+
+ return TUSB_ERROR_NONE;
+}
+
+static tusb_error_t get_descriptor(uint8_t coreid, tusb_control_request_t const * const p_request, uint8_t ** pp_buffer, uint16_t * p_length)
+{
+ tusb_std_descriptor_type_t const desc_type = u16_high_u8(p_request->wValue);
+ uint8_t const desc_index = u16_low_u8( p_request->wValue );
+
+ if ( TUSB_DESC_TYPE_DEVICE == desc_type )
+ {
+ (*pp_buffer) = (uint8_t *) &app_tusb_desc_device;
+ (*p_length) = sizeof(tusb_descriptor_device_t);
+ }
+ else if ( TUSB_DESC_TYPE_CONFIGURATION == desc_type )
+ {
+ (*pp_buffer) = (uint8_t *) &app_tusb_desc_configuration;
+ (*p_length) = sizeof(app_tusb_desc_configuration);
+ }
+ else if ( TUSB_DESC_TYPE_STRING == desc_type )
+ {
+ if ( ! (desc_index < TUSB_CFG_DEVICE_STRING_DESCRIPTOR_COUNT) ) return TUSB_ERROR_DCD_CONTROL_REQUEST_NOT_SUPPORT;
+
+ (*pp_buffer) = (uint8_t *) desc_str_table[desc_index];
+ (*p_length) = **pp_buffer;
+ }else
+ {
+ return TUSB_ERROR_DCD_CONTROL_REQUEST_NOT_SUPPORT;
+ }
+
+ (*p_length) = min16_of(p_request->wLength, (*p_length) ); // cannot return more than hosts requires
+
+ return TUSB_ERROR_NONE;
+}
+//--------------------------------------------------------------------+
+// USBD-CLASS API
+//--------------------------------------------------------------------+
+
+//--------------------------------------------------------------------+
+// USBD-DCD Callback API
+//--------------------------------------------------------------------+
+void usbd_dcd_bus_event_isr(uint8_t coreid, usbd_bus_event_type_t bus_event)
+{
+ switch(bus_event)
+ {
+ case USBD_BUS_EVENT_RESET :
+ case USBD_BUS_EVENT_UNPLUGGED :
+ memclr_(&usbd_devices[coreid], sizeof(usbd_device_info_t));
+ for (tusb_std_class_code_t class_code = TUSB_CLASS_AUDIO; class_code <= TUSB_CLASS_AUDIO_VIDEO; class_code++)
+ {
+ if ( usbd_class_drivers[class_code].close ) usbd_class_drivers[class_code].close( coreid );
+ }
+ break;
+
+ case USBD_BUS_EVENT_SUSPENDED:
+ usbd_devices[coreid].state = TUSB_DEVICE_STATE_SUSPENDED;
+ break;
+
+ default: break;
+ }
+}
+
+void usbd_setup_received_isr(uint8_t coreid, tusb_control_request_t * p_request)
+{
+ usbd_task_event_t task_event =
+ {
+ .coreid = coreid,
+ .event_id = USBD_EVENTID_SETUP_RECEIVED,
+ };
+
+ task_event.setup_received = (*p_request);
+ osal_queue_send(usbd_queue_hdl, &task_event);
+}
+
+void usbd_xfer_isr(endpoint_handle_t edpt_hdl, tusb_event_t event, uint32_t xferred_bytes)
+{
+ if (edpt_hdl.class_code == 0 ) // Control Transfer
+ {
+ osal_semaphore_post( usbd_control_xfer_sem_hdl );
+ }else
+ {
+ usbd_task_event_t task_event =
+ {
+ .coreid = edpt_hdl.coreid,
+ .event_id = USBD_EVENTID_XFER_DONE,
+ .sub_event_id = event
+ };
+
+ task_event.xfer_done.xferred_byte = xferred_bytes;
+ task_event.xfer_done.edpt_hdl = edpt_hdl;
+
+ osal_queue_send(usbd_queue_hdl, &task_event);
+ }
+}
+
+//--------------------------------------------------------------------+
+// HELPER
+//--------------------------------------------------------------------+
+
+#endif
diff --git a/tinyusb/hal/hal.h b/tinyusb/hal/hal.h index 65c3776b1..c7df7d493 100644 --- a/tinyusb/hal/hal.h +++ b/tinyusb/hal/hal.h @@ -1,137 +1,137 @@ -/**************************************************************************/ -/*! - @file hal.h - @author hathach (tinyusb.org) - - @section LICENSE - - Software License Agreement (BSD License) - - Copyright (c) 2013, hathach (tinyusb.org) - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - 3. Neither the name of the copyright holders nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY - EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY - DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - INCLUDING NEGLIGENCE OR OTHERWISE ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - This file is part of the tinyusb stack. -*/ -/**************************************************************************/ - -#ifndef _TUSB_HAL_H_ -#define _TUSB_HAL_H_ - -/** \addtogroup Port Port - * @{ - * \defgroup Port_Hal Hardware Abtract Layer (HAL) - * Hardware Abstraction Layer (HAL) is an abstraction layer, between the physical hardware and the tinyusb stack. - * Its function is to hide differences in hardware from most of MCUs, so that most of the stack code does not need to be changed to - * run on systems with a different MCU. - * HAL are sets of routines that emulate some platform-specific details, giving programs direct access to the hardware resources. - * @{ - */ - -//--------------------------------------------------------------------+ -// INCLUDES -//--------------------------------------------------------------------+ -#include "tusb_option.h" -#include "common/primitive_types.h" -#include "common/errors.h" -#include "common/compiler/compiler.h" - -//--------------------------------------------------------------------+ -// HAL API -//--------------------------------------------------------------------+ -// callback from tusb.h -extern void tusb_isr(uint8_t coreid); - -/** \brief Initialize USB controller hardware - * \returns \ref tusb_error_t type to indicate success or error condition. - * \note This function is invoked by \ref tusb_init as part of the initialization. - */ -tusb_error_t hal_init(void); - -/** \brief Enable USB Interrupt on a specific USB Controller - * \param[in] coreid is a zero-based index to identify USB controller's ID - * \note Some MCUs such as NXP LPC43xx has multiple USB controllers. It is necessary to know which USB controller for - * those MCUs. - */ -static inline void hal_interrupt_enable(uint8_t coreid) ATTR_ALWAYS_INLINE; - -/** \brief Disable USB Interrupt on a specific USB Controller - * \param[in] coreid is a zero-based index to identify USB controller's ID - * \note Some MCUs such as NXP LPC43xx has multiple USB controllers. It is necessary to know which USB controller for - * those MCUs. - */ -static inline void hal_interrupt_disable(uint8_t coreid) ATTR_ALWAYS_INLINE; - -//--------------------------------------------------------------------+ -// INCLUDE DRIVEN -//--------------------------------------------------------------------+ -#if TUSB_CFG_MCU == MCU_LPC11UXX - #include "hal_lpc11uxx.h" -#elif TUSB_CFG_MCU == MCU_LPC13UXX - #include "hal_lpc13uxx.h" -#elif TUSB_CFG_MCU == MCU_LPC43XX - #include "hal_lpc43xx.h" -#elif TUSB_CFG_MCU == MCU_LPC175X_6X - #include "hal_lpc175x_6x.h" -#else - #error MCU is not defined or supported yet -#endif - -#ifdef __cplusplus -extern "C" { -#endif - - -static inline bool hal_debugger_is_attached(void) ATTR_PURE ATTR_ALWAYS_INLINE; -static inline bool hal_debugger_is_attached(void) -{ -// TODO check core M3/M4 defined instead -#if !defined(_TEST_) && !(TUSB_CFG_MCU==MCU_LPC11UXX) - return ( (CoreDebug->DHCSR & CoreDebug_DHCSR_C_DEBUGEN_Msk) == CoreDebug_DHCSR_C_DEBUGEN_Msk ); -#elif TUSB_CFG_DEBUG == 3 - return true; // force to break into breakpoint with debug = 3 -#else - return false -#endif -} - -static inline void hal_debugger_breakpoint(void) ATTR_ALWAYS_INLINE; -static inline void hal_debugger_breakpoint(void) -{ -#ifndef _TEST_ - if (hal_debugger_is_attached()) /* if there is debugger connected */ - { - __asm("BKPT #0\n"); - } -#endif -} - -#ifdef __cplusplus - } -#endif - -#endif /* _TUSB_HAL_H_ */ - -/** @} */ -/** @} */ +/**************************************************************************/
+/*!
+ @file hal.h
+ @author hathach (tinyusb.org)
+
+ @section LICENSE
+
+ Software License Agreement (BSD License)
+
+ Copyright (c) 2013, hathach (tinyusb.org)
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the copyright holders nor the
+ names of its contributors may be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
+ EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ INCLUDING NEGLIGENCE OR OTHERWISE ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ This file is part of the tinyusb stack.
+*/
+/**************************************************************************/
+
+#ifndef _TUSB_HAL_H_
+#define _TUSB_HAL_H_
+
+/** \addtogroup Port Port
+ * @{
+ * \defgroup Port_Hal Hardware Abtract Layer (HAL)
+ * Hardware Abstraction Layer (HAL) is an abstraction layer, between the physical hardware and the tinyusb stack.
+ * Its function is to hide differences in hardware from most of MCUs, so that most of the stack code does not need to be changed to
+ * run on systems with a different MCU.
+ * HAL are sets of routines that emulate some platform-specific details, giving programs direct access to the hardware resources.
+ * @{
+ */
+
+//--------------------------------------------------------------------+
+// INCLUDES
+//--------------------------------------------------------------------+
+#include "tusb_option.h"
+#include "common/primitive_types.h"
+#include "common/errors.h"
+#include "common/compiler/compiler.h"
+
+//--------------------------------------------------------------------+
+// HAL API
+//--------------------------------------------------------------------+
+// callback from tusb.h
+extern void tusb_isr(uint8_t coreid);
+
+/** \brief Initialize USB controller hardware
+ * \returns \ref tusb_error_t type to indicate success or error condition.
+ * \note This function is invoked by \ref tusb_init as part of the initialization.
+ */
+tusb_error_t hal_init(void);
+
+/** \brief Enable USB Interrupt on a specific USB Controller
+ * \param[in] coreid is a zero-based index to identify USB controller's ID
+ * \note Some MCUs such as NXP LPC43xx has multiple USB controllers. It is necessary to know which USB controller for
+ * those MCUs.
+ */
+static inline void hal_interrupt_enable(uint8_t coreid) ATTR_ALWAYS_INLINE;
+
+/** \brief Disable USB Interrupt on a specific USB Controller
+ * \param[in] coreid is a zero-based index to identify USB controller's ID
+ * \note Some MCUs such as NXP LPC43xx has multiple USB controllers. It is necessary to know which USB controller for
+ * those MCUs.
+ */
+static inline void hal_interrupt_disable(uint8_t coreid) ATTR_ALWAYS_INLINE;
+
+//--------------------------------------------------------------------+
+// INCLUDE DRIVEN
+//--------------------------------------------------------------------+
+#if TUSB_CFG_MCU == MCU_LPC11UXX
+ #include "hal_lpc11uxx.h"
+#elif TUSB_CFG_MCU == MCU_LPC13UXX
+ #include "hal_lpc13uxx.h"
+#elif TUSB_CFG_MCU == MCU_LPC43XX
+ #include "hal_lpc43xx.h"
+#elif TUSB_CFG_MCU == MCU_LPC175X_6X
+ #include "hal_lpc175x_6x.h"
+#else
+ #error MCU is not defined or supported yet
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+static inline bool hal_debugger_is_attached(void) ATTR_PURE ATTR_ALWAYS_INLINE;
+static inline bool hal_debugger_is_attached(void)
+{
+// TODO check core M3/M4 defined instead
+#if !defined(_TEST_) && !(TUSB_CFG_MCU==MCU_LPC11UXX)
+ return ( (CoreDebug->DHCSR & CoreDebug_DHCSR_C_DEBUGEN_Msk) == CoreDebug_DHCSR_C_DEBUGEN_Msk );
+#elif TUSB_CFG_DEBUG == 3
+ return true; // force to break into breakpoint with debug = 3
+#else
+ return false
+#endif
+}
+
+static inline void hal_debugger_breakpoint(void) ATTR_ALWAYS_INLINE;
+static inline void hal_debugger_breakpoint(void)
+{
+#ifndef _TEST_
+ if (hal_debugger_is_attached()) /* if there is debugger connected */
+ {
+ __asm("BKPT #0\n");
+ }
+#endif
+}
+
+#ifdef __cplusplus
+ }
+#endif
+
+#endif /* _TUSB_HAL_H_ */
+
+/** @} */
+/** @} */
diff --git a/tinyusb/hal/hal_lpc13uxx.h b/tinyusb/hal/hal_lpc13uxx.h index 51d17ca59..1ccad5df1 100644 --- a/tinyusb/hal/hal_lpc13uxx.h +++ b/tinyusb/hal/hal_lpc13uxx.h @@ -1,73 +1,73 @@ -/**************************************************************************/ -/*! - @file hal_lpc13uxx.h - @author hathach (tinyusb.org) - - @section LICENSE - - Software License Agreement (BSD License) - - Copyright (c) 2013, hathach (tinyusb.org) - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - 3. Neither the name of the copyright holders nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY - EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY - DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - INCLUDING NEGLIGENCE OR OTHERWISE ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - This file is part of the tinyusb stack. -*/ -/**************************************************************************/ - -/** \ingroup TBD - * \defgroup TBD - * \brief TBD - * - * @{ - */ - -#ifndef _TUSB_HAL_LPC13UXX_H_ -#define _TUSB_HAL_LPC13UXX_H_ - -#include "LPC13Uxx.h" - -#ifdef __cplusplus - extern "C" { -#endif - -static inline void hal_interrupt_enable(uint8_t coreid) -{ - (void) coreid; // discard compiler's warning - NVIC_EnableIRQ(USB_IRQ_IRQn); -} - -static inline void hal_interrupt_disable(uint8_t coreid) -{ - (void) coreid; // discard compiler's warning - NVIC_DisableIRQ(USB_IRQ_IRQn); -} - -#ifdef __cplusplus - } -#endif - -#endif /* _TUSB_HAL_LPC13UXX_H_ */ - -/** @} */ +/**************************************************************************/
+/*!
+ @file hal_lpc13uxx.h
+ @author hathach (tinyusb.org)
+
+ @section LICENSE
+
+ Software License Agreement (BSD License)
+
+ Copyright (c) 2013, hathach (tinyusb.org)
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the copyright holders nor the
+ names of its contributors may be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
+ EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ INCLUDING NEGLIGENCE OR OTHERWISE ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ This file is part of the tinyusb stack.
+*/
+/**************************************************************************/
+
+/** \ingroup TBD
+ * \defgroup TBD
+ * \brief TBD
+ *
+ * @{
+ */
+
+#ifndef _TUSB_HAL_LPC13UXX_H_
+#define _TUSB_HAL_LPC13UXX_H_
+
+#include "LPC13Uxx.h"
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+static inline void hal_interrupt_enable(uint8_t coreid)
+{
+ (void) coreid; // discard compiler's warning
+ NVIC_EnableIRQ(USB_IRQ_IRQn);
+}
+
+static inline void hal_interrupt_disable(uint8_t coreid)
+{
+ (void) coreid; // discard compiler's warning
+ NVIC_DisableIRQ(USB_IRQ_IRQn);
+}
+
+#ifdef __cplusplus
+ }
+#endif
+
+#endif /* _TUSB_HAL_LPC13UXX_H_ */
+
+/** @} */
diff --git a/tinyusb/osal/osal_none.c b/tinyusb/osal/osal_none.c index 068de840b..8e1d3d098 100644 --- a/tinyusb/osal/osal_none.c +++ b/tinyusb/osal/osal_none.c @@ -1,61 +1,61 @@ -/**************************************************************************/ -/*! - @file osal_none.c - @author hathach (tinyusb.org) - - @section LICENSE - - Software License Agreement (BSD License) - - Copyright (c) 2013, hathach (tinyusb.org) - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - 3. Neither the name of the copyright holders nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY - EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY - DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - INCLUDING NEGLIGENCE OR OTHERWISE ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - This file is part of the tinyusb stack. -*/ -/**************************************************************************/ - -#include "tusb_option.h" -#include "osal.h" // TODO refractor - -#if TUSB_CFG_OS == TUSB_OS_NONE - -#define _TINY_USB_SOURCE_FILE_ - -//--------------------------------------------------------------------+ -// INCLUDE -//--------------------------------------------------------------------+ -#include "osal_none.h" - -//--------------------------------------------------------------------+ -// INTERNAL OBJECT & FUNCTION DECLARATION -//--------------------------------------------------------------------+ -volatile uint32_t osal_tick_current = 0; - -//--------------------------------------------------------------------+ -// IMPLEMENTATION -//--------------------------------------------------------------------+ - - -#endif +/**************************************************************************/
+/*!
+ @file osal_none.c
+ @author hathach (tinyusb.org)
+
+ @section LICENSE
+
+ Software License Agreement (BSD License)
+
+ Copyright (c) 2013, hathach (tinyusb.org)
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the copyright holders nor the
+ names of its contributors may be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
+ EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ INCLUDING NEGLIGENCE OR OTHERWISE ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ This file is part of the tinyusb stack.
+*/
+/**************************************************************************/
+
+#include "tusb_option.h"
+#include "osal.h" // TODO refractor
+
+#if TUSB_CFG_OS == TUSB_OS_NONE
+
+#define _TINY_USB_SOURCE_FILE_
+
+//--------------------------------------------------------------------+
+// INCLUDE
+//--------------------------------------------------------------------+
+#include "osal_none.h"
+
+//--------------------------------------------------------------------+
+// INTERNAL OBJECT & FUNCTION DECLARATION
+//--------------------------------------------------------------------+
+volatile uint32_t osal_tick_current = 0;
+
+//--------------------------------------------------------------------+
+// IMPLEMENTATION
+//--------------------------------------------------------------------+
+
+
+#endif
diff --git a/tinyusb/osal/osal_none.h b/tinyusb/osal/osal_none.h index 7816cda33..300233f42 100644 --- a/tinyusb/osal/osal_none.h +++ b/tinyusb/osal/osal_none.h @@ -1,344 +1,344 @@ -/**************************************************************************/ -/*! - @file osal_none.h - @author hathach (tinyusb.org) - - @section LICENSE - - Software License Agreement (BSD License) - - Copyright (c) 2013, hathach (tinyusb.org) - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - 3. Neither the name of the copyright holders nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY - EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY - DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - INCLUDING NEGLIGENCE OR OTHERWISE ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - This file is part of the tinyusb stack. -*/ -/**************************************************************************/ - -/** \file - * \brief TBD - * - * \note TBD - */ - -/** \ingroup TBD - * \defgroup TBD - * \brief TBD - * - * @{ - */ - -#ifndef _TUSB_OSAL_NONE_H_ -#define _TUSB_OSAL_NONE_H_ - -#include "osal_common.h" - -#ifdef __cplusplus - extern "C" { -#endif - -// variable that retains value after OSAL blocking service need to declare with OSAL_VAR -#define OSAL_VAR static - -//--------------------------------------------------------------------+ -// TICK API -//--------------------------------------------------------------------+ -extern volatile uint32_t osal_tick_current; -static inline void osal_tick_tock(void) ATTR_ALWAYS_INLINE; -static inline void osal_tick_tock(void) -{ - osal_tick_current++; -} - -static inline uint32_t osal_tick_get(void) ATTR_ALWAYS_INLINE; -static inline uint32_t osal_tick_get(void) -{ - return osal_tick_current; -} - -//--------------------------------------------------------------------+ -// TASK API -// NOTES: Each blocking OSAL_NONE services such as semaphore wait, -// queue receive embedded return statement, therefore local variable -// retain value before/after such services needed to declare as static -// OSAL_TASK_LOOP -// { -// OSAL_TASK_LOOP_BEGIN -// -// task body statements -// -// OSAL_TASK_LOOP_ENG -// } -//--------------------------------------------------------------------+ -#define OSAL_TASK_DEF(code, stack_depth, prio) -#define OSAL_TASK_REF -#define osal_task_create(x) TUSB_ERROR_NONE - -#define OSAL_TASK_FUNCTION(task_func) \ - tusb_error_t task_func - -#define TASK_RESTART \ - state = 0 - -#define OSAL_TASK_LOOP_BEGIN \ - ATTR_UNUSED static uint32_t timeout = 0;\ - static uint16_t state = 0;\ - switch(state) { \ - case 0: { \ - -#define OSAL_TASK_LOOP_END \ - default:\ - TASK_RESTART;\ - }}\ - return TUSB_ERROR_NONE; - - -#define osal_task_delay(msec) \ - do {\ - timeout = osal_tick_get();\ - state = __LINE__; case __LINE__:\ - if ( timeout + osal_tick_from_msec(msec) > osal_tick_get() ) /* time out */ \ - return TUSB_ERROR_OSAL_WAITING;\ - }while(0) - -//--------------------------------------------------------------------+ -// SUBTASK (a sub function that uses OS blocking services & called by a task -//--------------------------------------------------------------------+ -//------------- Sub Task -------------// -#define OSAL_SUBTASK_INVOKED_AND_WAIT(subtask, status) \ - do {\ - state = __LINE__; case __LINE__:\ - {\ - status = subtask; /* invoke sub task */\ - if (TUSB_ERROR_OSAL_WAITING == status) /* sub task not finished -> continue waiting */\ - return TUSB_ERROR_OSAL_WAITING;\ - }\ - }while(0) - -#define OSAL_SUBTASK_BEGIN OSAL_TASK_LOOP_BEGIN -#define OSAL_SUBTASK_END OSAL_TASK_LOOP_END - -//------------- Sub Task Assert -------------// -#define SUBTASK_EXIT(error) \ - do {\ - TASK_RESTART; return error;\ - }while(0) - -#define _SUBTASK_ASSERT_ERROR_HANDLER(error, func_call) \ - func_call; TASK_RESTART; return error - -#define SUBTASK_ASSERT_STATUS(sts) \ - ASSERT_DEFINE_WITH_HANDLER(_SUBTASK_ASSERT_ERROR_HANDLER, , tusb_error_t status = (tusb_error_t)(sts),\ - TUSB_ERROR_NONE == status, status, "%s", TUSB_ErrorStr[status]) - -#define SUBTASK_ASSERT_STATUS_WITH_HANDLER(sts, func_call) \ - ASSERT_DEFINE_WITH_HANDLER(_SUBTASK_ASSERT_ERROR_HANDLER, func_call, tusb_error_t status = (tusb_error_t)(sts),\ - TUSB_ERROR_NONE == status, status, "%s", TUSB_ErrorStr[status]) - -// TODO allow to specify error return -#define SUBTASK_ASSERT(condition) \ - ASSERT_DEFINE_WITH_HANDLER(_SUBTASK_ASSERT_ERROR_HANDLER, , , \ - (condition), TUSB_ERROR_OSAL_TASK_FAILED, "%s", "evaluated to false") -// TODO remove assert with handler by catching error in enum main task -#define SUBTASK_ASSERT_WITH_HANDLER(condition, func_call) \ - ASSERT_DEFINE_WITH_HANDLER(_SUBTASK_ASSERT_ERROR_HANDLER, func_call, ,\ - condition, TUSB_ERROR_OSAL_TASK_FAILED, "%s", "evaluated to false") - -//--------------------------------------------------------------------+ -// Semaphore API -//--------------------------------------------------------------------+ -typedef volatile uint8_t osal_semaphore_t; -typedef osal_semaphore_t * osal_semaphore_handle_t; - -#define OSAL_SEM_DEF(name)\ - osal_semaphore_t name - -#define OSAL_SEM_REF(name)\ - &name - -static inline osal_semaphore_handle_t osal_semaphore_create(osal_semaphore_t * p_sem) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; -static inline osal_semaphore_handle_t osal_semaphore_create(osal_semaphore_t * p_sem) -{ - (*p_sem) = 0; // TODO consider to have initial count parameter - return (osal_semaphore_handle_t) p_sem; -} - -static inline tusb_error_t osal_semaphore_post(osal_semaphore_handle_t sem_hdl) ATTR_ALWAYS_INLINE; -static inline tusb_error_t osal_semaphore_post(osal_semaphore_handle_t sem_hdl) -{ - (*sem_hdl)++; - - return TUSB_ERROR_NONE; -} - -static inline void osal_semaphore_reset(osal_semaphore_handle_t sem_hdl) ATTR_ALWAYS_INLINE; -static inline void osal_semaphore_reset(osal_semaphore_handle_t sem_hdl) -{ - (*sem_hdl) = 0; -} - -#define osal_semaphore_wait(sem_hdl, msec, p_error) \ - do {\ - timeout = osal_tick_get();\ - state = __LINE__; case __LINE__:\ - if( *(sem_hdl) == 0 ) {\ - if ( ( ((uint32_t) (msec)) != OSAL_TIMEOUT_WAIT_FOREVER) && (timeout + osal_tick_from_msec(msec) <= osal_tick_get()) ) /* time out */ \ - *(p_error) = TUSB_ERROR_OSAL_TIMEOUT;\ - else\ - return TUSB_ERROR_OSAL_WAITING;\ - } else{\ - (*(sem_hdl))--; /*TODO mutex hal_interrupt_disable consideration*/\ - *(p_error) = TUSB_ERROR_NONE;\ - }\ - }while(0) - -//--------------------------------------------------------------------+ -// MUTEX API (priority inheritance) -//--------------------------------------------------------------------+ -typedef osal_semaphore_t osal_mutex_t; -typedef osal_semaphore_handle_t osal_mutex_handle_t; - -#define OSAL_MUTEX_DEF(name)\ - osal_mutex_t name - -#define OSAL_MUTEX_REF(name)\ - &name - -static inline osal_mutex_handle_t osal_mutex_create(osal_mutex_t * p_mutex) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; -static inline osal_mutex_handle_t osal_mutex_create(osal_mutex_t * p_mutex) -{ - (*p_mutex) = 1; - return (osal_mutex_handle_t) p_mutex; -} - -static inline tusb_error_t osal_mutex_release(osal_mutex_handle_t mutex_hdl) ATTR_ALWAYS_INLINE; -static inline tusb_error_t osal_mutex_release(osal_mutex_handle_t mutex_hdl) -{ - (*mutex_hdl) = 1; // mutex is a binary semaphore - - return TUSB_ERROR_NONE; -} - -static inline void osal_mutex_reset(osal_mutex_handle_t mutex_hdl) ATTR_ALWAYS_INLINE; -static inline void osal_mutex_reset(osal_mutex_handle_t mutex_hdl) -{ - (*mutex_hdl) = 1; -} - -#define osal_mutex_wait osal_semaphore_wait - -//--------------------------------------------------------------------+ -// QUEUE API -//--------------------------------------------------------------------+ -typedef struct{ - uint8_t* const buffer ; ///< buffer pointer - uint8_t const depth ; ///< max items - uint8_t const item_size ; ///< size of each item - volatile uint8_t count ; ///< number of items in queue - volatile uint8_t wr_idx ; ///< write pointer - volatile uint8_t rd_idx ; ///< read pointer -} osal_queue_t; - -typedef osal_queue_t * osal_queue_handle_t; - -// use to declare a queue, within the scope of tinyusb, should only use primitive type only -#define OSAL_QUEUE_DEF(name, queue_depth, type)\ - STATIC_ASSERT(queue_depth < 256, "OSAL Queue only support up to 255 depth");\ - type name##_buffer[queue_depth];\ - osal_queue_t name = {\ - .buffer = (uint8_t*) name##_buffer,\ - .depth = queue_depth,\ - .item_size = sizeof(type)\ - } - -#define OSAL_QUEUE_REF(name) (&name) - -static inline osal_queue_handle_t osal_queue_create(osal_queue_t * const p_queue) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; -static inline osal_queue_handle_t osal_queue_create(osal_queue_t * const p_queue) -{ - p_queue->count = p_queue->wr_idx = p_queue->rd_idx = 0; - return (osal_queue_handle_t) p_queue; -} - -// TODO move to osal_none.c -// when queue is full, it will overwrite the oldest data in the queue -static inline tusb_error_t osal_queue_send(osal_queue_handle_t const queue_hdl, void const * data) ATTR_ALWAYS_INLINE; -static inline tusb_error_t osal_queue_send(osal_queue_handle_t const queue_hdl, void const * data) -{ - //TODO mutex lock hal_interrupt_disable - - memcpy( queue_hdl->buffer + (queue_hdl->wr_idx * queue_hdl->item_size), - data, - queue_hdl->item_size); - - queue_hdl->wr_idx = (queue_hdl->wr_idx + 1) % queue_hdl->depth; - - if (queue_hdl->depth == queue_hdl->count) // queue is full, 1st rd is overwritten - { - queue_hdl->rd_idx = queue_hdl->wr_idx; // keep full state - }else - { - queue_hdl->count++; - } - - //TODO mutex unlock hal_interrupt_enable - - return TUSB_ERROR_NONE; -} - -static inline void osal_queue_flush(osal_queue_handle_t const queue_hdl) ATTR_ALWAYS_INLINE; -static inline void osal_queue_flush(osal_queue_handle_t const queue_hdl) -{ - queue_hdl->count = queue_hdl->rd_idx = queue_hdl->wr_idx = 0; -} - -#define osal_queue_receive(queue_hdl, p_data, msec, p_error) \ - do {\ - timeout = osal_tick_get();\ - state = __LINE__; case __LINE__:\ - if( queue_hdl->count == 0 ) {\ - if ( (msec != OSAL_TIMEOUT_WAIT_FOREVER) && ( timeout + osal_tick_from_msec(msec) <= osal_tick_get() )) /* time out */ \ - *(p_error) = TUSB_ERROR_OSAL_TIMEOUT;\ - else\ - return TUSB_ERROR_OSAL_WAITING;\ - } else{\ - /*TODO mutex lock hal_interrupt_disable */\ - memcpy(p_data, queue_hdl->buffer + (queue_hdl->rd_idx * queue_hdl->item_size), queue_hdl->item_size);\ - queue_hdl->rd_idx = (queue_hdl->rd_idx + 1) % queue_hdl->depth;\ - queue_hdl->count--;\ - /*TODO mutex unlock hal_interrupt_enable */\ - *(p_error) = TUSB_ERROR_NONE;\ - }\ - }while(0) - - -// queue_send, queue_receive - -#ifdef __cplusplus - } -#endif - -#endif /* _TUSB_OSAL_NONE_H_ */ - -/** @} */ +/**************************************************************************/
+/*!
+ @file osal_none.h
+ @author hathach (tinyusb.org)
+
+ @section LICENSE
+
+ Software License Agreement (BSD License)
+
+ Copyright (c) 2013, hathach (tinyusb.org)
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the copyright holders nor the
+ names of its contributors may be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
+ EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ INCLUDING NEGLIGENCE OR OTHERWISE ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ This file is part of the tinyusb stack.
+*/
+/**************************************************************************/
+
+/** \file
+ * \brief TBD
+ *
+ * \note TBD
+ */
+
+/** \ingroup TBD
+ * \defgroup TBD
+ * \brief TBD
+ *
+ * @{
+ */
+
+#ifndef _TUSB_OSAL_NONE_H_
+#define _TUSB_OSAL_NONE_H_
+
+#include "osal_common.h"
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+// variable that retains value after OSAL blocking service need to declare with OSAL_VAR
+#define OSAL_VAR static
+
+//--------------------------------------------------------------------+
+// TICK API
+//--------------------------------------------------------------------+
+extern volatile uint32_t osal_tick_current;
+static inline void osal_tick_tock(void) ATTR_ALWAYS_INLINE;
+static inline void osal_tick_tock(void)
+{
+ osal_tick_current++;
+}
+
+static inline uint32_t osal_tick_get(void) ATTR_ALWAYS_INLINE;
+static inline uint32_t osal_tick_get(void)
+{
+ return osal_tick_current;
+}
+
+//--------------------------------------------------------------------+
+// TASK API
+// NOTES: Each blocking OSAL_NONE services such as semaphore wait,
+// queue receive embedded return statement, therefore local variable
+// retain value before/after such services needed to declare as static
+// OSAL_TASK_LOOP
+// {
+// OSAL_TASK_LOOP_BEGIN
+//
+// task body statements
+//
+// OSAL_TASK_LOOP_ENG
+// }
+//--------------------------------------------------------------------+
+#define OSAL_TASK_DEF(code, stack_depth, prio)
+#define OSAL_TASK_REF
+#define osal_task_create(x) TUSB_ERROR_NONE
+
+#define OSAL_TASK_FUNCTION(task_func) \
+ tusb_error_t task_func
+
+#define TASK_RESTART \
+ state = 0
+
+#define OSAL_TASK_LOOP_BEGIN \
+ ATTR_UNUSED static uint32_t timeout = 0;\
+ static uint16_t state = 0;\
+ switch(state) { \
+ case 0: { \
+
+#define OSAL_TASK_LOOP_END \
+ default:\
+ TASK_RESTART;\
+ }}\
+ return TUSB_ERROR_NONE;
+
+
+#define osal_task_delay(msec) \
+ do {\
+ timeout = osal_tick_get();\
+ state = __LINE__; case __LINE__:\
+ if ( timeout + osal_tick_from_msec(msec) > osal_tick_get() ) /* time out */ \
+ return TUSB_ERROR_OSAL_WAITING;\
+ }while(0)
+
+//--------------------------------------------------------------------+
+// SUBTASK (a sub function that uses OS blocking services & called by a task
+//--------------------------------------------------------------------+
+//------------- Sub Task -------------//
+#define OSAL_SUBTASK_INVOKED_AND_WAIT(subtask, status) \
+ do {\
+ state = __LINE__; case __LINE__:\
+ {\
+ status = subtask; /* invoke sub task */\
+ if (TUSB_ERROR_OSAL_WAITING == status) /* sub task not finished -> continue waiting */\
+ return TUSB_ERROR_OSAL_WAITING;\
+ }\
+ }while(0)
+
+#define OSAL_SUBTASK_BEGIN OSAL_TASK_LOOP_BEGIN
+#define OSAL_SUBTASK_END OSAL_TASK_LOOP_END
+
+//------------- Sub Task Assert -------------//
+#define SUBTASK_EXIT(error) \
+ do {\
+ TASK_RESTART; return error;\
+ }while(0)
+
+#define _SUBTASK_ASSERT_ERROR_HANDLER(error, func_call) \
+ func_call; TASK_RESTART; return error
+
+#define SUBTASK_ASSERT_STATUS(sts) \
+ ASSERT_DEFINE_WITH_HANDLER(_SUBTASK_ASSERT_ERROR_HANDLER, , tusb_error_t status = (tusb_error_t)(sts),\
+ TUSB_ERROR_NONE == status, status, "%s", TUSB_ErrorStr[status])
+
+#define SUBTASK_ASSERT_STATUS_WITH_HANDLER(sts, func_call) \
+ ASSERT_DEFINE_WITH_HANDLER(_SUBTASK_ASSERT_ERROR_HANDLER, func_call, tusb_error_t status = (tusb_error_t)(sts),\
+ TUSB_ERROR_NONE == status, status, "%s", TUSB_ErrorStr[status])
+
+// TODO allow to specify error return
+#define SUBTASK_ASSERT(condition) \
+ ASSERT_DEFINE_WITH_HANDLER(_SUBTASK_ASSERT_ERROR_HANDLER, , , \
+ (condition), TUSB_ERROR_OSAL_TASK_FAILED, "%s", "evaluated to false")
+// TODO remove assert with handler by catching error in enum main task
+#define SUBTASK_ASSERT_WITH_HANDLER(condition, func_call) \
+ ASSERT_DEFINE_WITH_HANDLER(_SUBTASK_ASSERT_ERROR_HANDLER, func_call, ,\
+ condition, TUSB_ERROR_OSAL_TASK_FAILED, "%s", "evaluated to false")
+
+//--------------------------------------------------------------------+
+// Semaphore API
+//--------------------------------------------------------------------+
+typedef volatile uint8_t osal_semaphore_t;
+typedef osal_semaphore_t * osal_semaphore_handle_t;
+
+#define OSAL_SEM_DEF(name)\
+ osal_semaphore_t name
+
+#define OSAL_SEM_REF(name)\
+ &name
+
+static inline osal_semaphore_handle_t osal_semaphore_create(osal_semaphore_t * p_sem) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+static inline osal_semaphore_handle_t osal_semaphore_create(osal_semaphore_t * p_sem)
+{
+ (*p_sem) = 0; // TODO consider to have initial count parameter
+ return (osal_semaphore_handle_t) p_sem;
+}
+
+static inline tusb_error_t osal_semaphore_post(osal_semaphore_handle_t sem_hdl) ATTR_ALWAYS_INLINE;
+static inline tusb_error_t osal_semaphore_post(osal_semaphore_handle_t sem_hdl)
+{
+ (*sem_hdl)++;
+
+ return TUSB_ERROR_NONE;
+}
+
+static inline void osal_semaphore_reset(osal_semaphore_handle_t sem_hdl) ATTR_ALWAYS_INLINE;
+static inline void osal_semaphore_reset(osal_semaphore_handle_t sem_hdl)
+{
+ (*sem_hdl) = 0;
+}
+
+#define osal_semaphore_wait(sem_hdl, msec, p_error) \
+ do {\
+ timeout = osal_tick_get();\
+ state = __LINE__; case __LINE__:\
+ if( *(sem_hdl) == 0 ) {\
+ if ( ( ((uint32_t) (msec)) != OSAL_TIMEOUT_WAIT_FOREVER) && (timeout + osal_tick_from_msec(msec) <= osal_tick_get()) ) /* time out */ \
+ *(p_error) = TUSB_ERROR_OSAL_TIMEOUT;\
+ else\
+ return TUSB_ERROR_OSAL_WAITING;\
+ } else{\
+ (*(sem_hdl))--; /*TODO mutex hal_interrupt_disable consideration*/\
+ *(p_error) = TUSB_ERROR_NONE;\
+ }\
+ }while(0)
+
+//--------------------------------------------------------------------+
+// MUTEX API (priority inheritance)
+//--------------------------------------------------------------------+
+typedef osal_semaphore_t osal_mutex_t;
+typedef osal_semaphore_handle_t osal_mutex_handle_t;
+
+#define OSAL_MUTEX_DEF(name)\
+ osal_mutex_t name
+
+#define OSAL_MUTEX_REF(name)\
+ &name
+
+static inline osal_mutex_handle_t osal_mutex_create(osal_mutex_t * p_mutex) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+static inline osal_mutex_handle_t osal_mutex_create(osal_mutex_t * p_mutex)
+{
+ (*p_mutex) = 1;
+ return (osal_mutex_handle_t) p_mutex;
+}
+
+static inline tusb_error_t osal_mutex_release(osal_mutex_handle_t mutex_hdl) ATTR_ALWAYS_INLINE;
+static inline tusb_error_t osal_mutex_release(osal_mutex_handle_t mutex_hdl)
+{
+ (*mutex_hdl) = 1; // mutex is a binary semaphore
+
+ return TUSB_ERROR_NONE;
+}
+
+static inline void osal_mutex_reset(osal_mutex_handle_t mutex_hdl) ATTR_ALWAYS_INLINE;
+static inline void osal_mutex_reset(osal_mutex_handle_t mutex_hdl)
+{
+ (*mutex_hdl) = 1;
+}
+
+#define osal_mutex_wait osal_semaphore_wait
+
+//--------------------------------------------------------------------+
+// QUEUE API
+//--------------------------------------------------------------------+
+typedef struct{
+ uint8_t* const buffer ; ///< buffer pointer
+ uint8_t const depth ; ///< max items
+ uint8_t const item_size ; ///< size of each item
+ volatile uint8_t count ; ///< number of items in queue
+ volatile uint8_t wr_idx ; ///< write pointer
+ volatile uint8_t rd_idx ; ///< read pointer
+} osal_queue_t;
+
+typedef osal_queue_t * osal_queue_handle_t;
+
+// use to declare a queue, within the scope of tinyusb, should only use primitive type only
+#define OSAL_QUEUE_DEF(name, queue_depth, type)\
+ STATIC_ASSERT(queue_depth < 256, "OSAL Queue only support up to 255 depth");\
+ type name##_buffer[queue_depth];\
+ osal_queue_t name = {\
+ .buffer = (uint8_t*) name##_buffer,\
+ .depth = queue_depth,\
+ .item_size = sizeof(type)\
+ }
+
+#define OSAL_QUEUE_REF(name) (&name)
+
+static inline osal_queue_handle_t osal_queue_create(osal_queue_t * const p_queue) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+static inline osal_queue_handle_t osal_queue_create(osal_queue_t * const p_queue)
+{
+ p_queue->count = p_queue->wr_idx = p_queue->rd_idx = 0;
+ return (osal_queue_handle_t) p_queue;
+}
+
+// TODO move to osal_none.c
+// when queue is full, it will overwrite the oldest data in the queue
+static inline tusb_error_t osal_queue_send(osal_queue_handle_t const queue_hdl, void const * data) ATTR_ALWAYS_INLINE;
+static inline tusb_error_t osal_queue_send(osal_queue_handle_t const queue_hdl, void const * data)
+{
+ //TODO mutex lock hal_interrupt_disable
+
+ memcpy( queue_hdl->buffer + (queue_hdl->wr_idx * queue_hdl->item_size),
+ data,
+ queue_hdl->item_size);
+
+ queue_hdl->wr_idx = (queue_hdl->wr_idx + 1) % queue_hdl->depth;
+
+ if (queue_hdl->depth == queue_hdl->count) // queue is full, 1st rd is overwritten
+ {
+ queue_hdl->rd_idx = queue_hdl->wr_idx; // keep full state
+ }else
+ {
+ queue_hdl->count++;
+ }
+
+ //TODO mutex unlock hal_interrupt_enable
+
+ return TUSB_ERROR_NONE;
+}
+
+static inline void osal_queue_flush(osal_queue_handle_t const queue_hdl) ATTR_ALWAYS_INLINE;
+static inline void osal_queue_flush(osal_queue_handle_t const queue_hdl)
+{
+ queue_hdl->count = queue_hdl->rd_idx = queue_hdl->wr_idx = 0;
+}
+
+#define osal_queue_receive(queue_hdl, p_data, msec, p_error) \
+ do {\
+ timeout = osal_tick_get();\
+ state = __LINE__; case __LINE__:\
+ if( queue_hdl->count == 0 ) {\
+ if ( (msec != OSAL_TIMEOUT_WAIT_FOREVER) && ( timeout + osal_tick_from_msec(msec) <= osal_tick_get() )) /* time out */ \
+ *(p_error) = TUSB_ERROR_OSAL_TIMEOUT;\
+ else\
+ return TUSB_ERROR_OSAL_WAITING;\
+ } else{\
+ /*TODO mutex lock hal_interrupt_disable */\
+ memcpy(p_data, queue_hdl->buffer + (queue_hdl->rd_idx * queue_hdl->item_size), queue_hdl->item_size);\
+ queue_hdl->rd_idx = (queue_hdl->rd_idx + 1) % queue_hdl->depth;\
+ queue_hdl->count--;\
+ /*TODO mutex unlock hal_interrupt_enable */\
+ *(p_error) = TUSB_ERROR_NONE;\
+ }\
+ }while(0)
+
+
+// queue_send, queue_receive
+
+#ifdef __cplusplus
+ }
+#endif
+
+#endif /* _TUSB_OSAL_NONE_H_ */
+
+/** @} */
diff --git a/tinyusb/tusb.c b/tinyusb/tusb.c index f9a457599..980e19402 100644 --- a/tinyusb/tusb.c +++ b/tinyusb/tusb.c @@ -1,91 +1,91 @@ -/**************************************************************************/ -/*! - @file tusb.c - @author hathach (tinyusb.org) - - @section LICENSE - - Software License Agreement (BSD License) - - Copyright (c) 2013, hathach (tinyusb.org) - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - 3. Neither the name of the copyright holders nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY - EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY - DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - INCLUDING NEGLIGENCE OR OTHERWISE ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - This file is part of the tinyusb stack. -*/ -/**************************************************************************/ - -#define _TINY_USB_SOURCE_FILE_ - -#include "tusb.h" - -tusb_error_t tusb_init(void) -{ - ASSERT_STATUS( hal_init() ) ; // hardware init - -#if MODE_HOST_SUPPORTED - ASSERT_STATUS( usbh_init() ); // host stack init -#endif - -#if MODE_DEVICE_SUPPORTED - ASSERT_STATUS ( usbd_init() ); // device stack init -#endif - -#if (TUSB_CFG_CONTROLLER_0_MODE) - hal_interrupt_enable(0); -#endif - -#if (TUSB_CFG_CONTROLLER_1_MODE) - hal_interrupt_enable(1); -#endif - - return TUSB_ERROR_NONE; -} - -// called from hal layer -void tusb_isr(uint8_t controller_id) -{ -#if MODE_HOST_SUPPORTED - hcd_isr(controller_id); -#endif - -#if MODE_DEVICE_SUPPORTED - dcd_isr(controller_id); -#endif - -} - -#if TUSB_CFG_OS == TUSB_OS_NONE -// periodically/continuously called in the main loop -void tusb_task_runner(void) -{ - #if MODE_HOST_SUPPORTED - usbh_enumeration_task(NULL); - #endif - - #if MODE_DEVICE_SUPPORTED - usbd_task(NULL); - #endif -} -#endif +/**************************************************************************/
+/*!
+ @file tusb.c
+ @author hathach (tinyusb.org)
+
+ @section LICENSE
+
+ Software License Agreement (BSD License)
+
+ Copyright (c) 2013, hathach (tinyusb.org)
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the copyright holders nor the
+ names of its contributors may be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
+ EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ INCLUDING NEGLIGENCE OR OTHERWISE ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ This file is part of the tinyusb stack.
+*/
+/**************************************************************************/
+
+#define _TINY_USB_SOURCE_FILE_
+
+#include "tusb.h"
+
+tusb_error_t tusb_init(void)
+{
+ ASSERT_STATUS( hal_init() ) ; // hardware init
+
+#if MODE_HOST_SUPPORTED
+ ASSERT_STATUS( usbh_init() ); // host stack init
+#endif
+
+#if MODE_DEVICE_SUPPORTED
+ ASSERT_STATUS ( usbd_init() ); // device stack init
+#endif
+
+#if (TUSB_CFG_CONTROLLER_0_MODE)
+ hal_interrupt_enable(0);
+#endif
+
+#if (TUSB_CFG_CONTROLLER_1_MODE)
+ hal_interrupt_enable(1);
+#endif
+
+ return TUSB_ERROR_NONE;
+}
+
+// called from hal layer
+void tusb_isr(uint8_t controller_id)
+{
+#if MODE_HOST_SUPPORTED
+ hcd_isr(controller_id);
+#endif
+
+#if MODE_DEVICE_SUPPORTED
+ dcd_isr(controller_id);
+#endif
+
+}
+
+#if TUSB_CFG_OS == TUSB_OS_NONE
+// periodically/continuously called in the main loop
+void tusb_task_runner(void)
+{
+ #if MODE_HOST_SUPPORTED
+ usbh_enumeration_task(NULL);
+ #endif
+
+ #if MODE_DEVICE_SUPPORTED
+ usbd_task(NULL);
+ #endif
+}
+#endif
|
