summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorhathach <[email protected]>2023-01-20 15:30:24 +0700
committerhathach <[email protected]>2023-01-20 15:30:24 +0700
commit074289caa31297b7261d9484f529f481d0fc9f06 (patch)
treef8eafe7f442cfe906ee3761da037ea291910bb51 /src
parent3fd075b48bfe80ef7d7f61c1f6229c3aa413383e (diff)
add helper tu_desc_find/find2/find3
Diffstat (limited to 'src')
-rw-r--r--src/common/tusb_types.h13
-rw-r--r--src/tusb.c35
2 files changed, 48 insertions, 0 deletions
diff --git a/src/common/tusb_types.h b/src/common/tusb_types.h
index 32cdba450..82798a484 100644
--- a/src/common/tusb_types.h
+++ b/src/common/tusb_types.h
@@ -543,22 +543,35 @@ TU_ATTR_ALWAYS_INLINE static inline const char *tu_edpt_type_str(tusb_xfer_type_
//--------------------------------------------------------------------+
// Descriptor helper
//--------------------------------------------------------------------+
+
+// return next descriptor
TU_ATTR_ALWAYS_INLINE static inline uint8_t const * tu_desc_next(void const* desc)
{
uint8_t const* desc8 = (uint8_t const*) desc;
return desc8 + desc8[DESC_OFFSET_LEN];
}
+// get descriptor type
TU_ATTR_ALWAYS_INLINE static inline uint8_t tu_desc_type(void const* desc)
{
return ((uint8_t const*) desc)[DESC_OFFSET_TYPE];
}
+// get descriptor length
TU_ATTR_ALWAYS_INLINE static inline uint8_t tu_desc_len(void const* desc)
{
return ((uint8_t const*) desc)[DESC_OFFSET_LEN];
}
+// find descriptor that match byte1 (type)
+uint8_t const * tu_desc_find(uint8_t const* desc, uint8_t const* end, uint8_t byte1);
+
+// find descriptor that match byte1 (type) and byte2
+uint8_t const * tu_desc_find2(uint8_t const* desc, uint8_t const* end, uint8_t byte1, uint8_t byte2);
+
+// find descriptor that match byte1 (type) and byte2
+uint8_t const * tu_desc_find3(uint8_t const* desc, uint8_t const* end, uint8_t byte1, uint8_t byte2, uint8_t byte3);
+
#ifdef __cplusplus
}
#endif
diff --git a/src/tusb.c b/src/tusb.c
index a5c820b8d..44b34b0e6 100644
--- a/src/tusb.c
+++ b/src/tusb.c
@@ -74,6 +74,41 @@ bool tusb_inited(void)
}
//--------------------------------------------------------------------+
+// Descriptor helper
+//--------------------------------------------------------------------+
+
+uint8_t const * tu_desc_find(uint8_t const* desc, uint8_t const* end, uint8_t byte1)
+{
+ while(desc+1 < end)
+ {
+ if ( desc[1] == byte1 ) return desc;
+ desc += desc[DESC_OFFSET_LEN];
+ }
+ return NULL;
+}
+
+uint8_t const * tu_desc_find2(uint8_t const* desc, uint8_t const* end, uint8_t byte1, uint8_t byte2)
+{
+ while(desc+2 < end)
+ {
+ if ( desc[1] == byte1 && desc[2] == byte2) return desc;
+ desc += desc[DESC_OFFSET_LEN];
+ }
+ return NULL;
+}
+
+uint8_t const * tu_desc_find3(uint8_t const* desc, uint8_t const* end, uint8_t byte1, uint8_t byte2, uint8_t byte3)
+{
+ while(desc+3 < end)
+ {
+ if (desc[1] == byte1 && desc[2] == byte2 && desc[3] == byte3) return desc;
+ desc += desc[DESC_OFFSET_LEN];
+ }
+ return NULL;
+}
+
+
+//--------------------------------------------------------------------+
// Endpoint Helper for both Host and Device stack
//--------------------------------------------------------------------+