summaryrefslogtreecommitdiff
path: root/src/typec/utcd.c
diff options
context:
space:
mode:
authorhathach <[email protected]>2023-06-07 18:57:48 +0700
committerhathach <[email protected]>2023-06-07 18:57:48 +0700
commit9b7dee563e83a548f0d0fb68dd991a868a6427c9 (patch)
treebb3879ea4b24160615d9df177eda266c8a4ccbc6 /src/typec/utcd.c
parentb893f1d5417adf8cf874d6b2e7946582ca37982a (diff)
able to response with good crc
Diffstat (limited to 'src/typec/utcd.c')
-rw-r--r--src/typec/utcd.c57
1 files changed, 56 insertions, 1 deletions
diff --git a/src/typec/utcd.c b/src/typec/utcd.c
index baa95fbe5..b5f9965fe 100644
--- a/src/typec/utcd.c
+++ b/src/typec/utcd.c
@@ -29,20 +29,75 @@
#if CFG_TUC_ENABLED
#include "tcd.h"
+#include "utcd.h"
//--------------------------------------------------------------------+
//
//--------------------------------------------------------------------+
+// Debug level of USBD
+#define UTCD_DEBUG 2
+#define TU_LOG_UTCD(...) TU_LOG(UTCD_DEBUG, __VA_ARGS__)
+
+// Event queue
+// utcd_int_set() is used as mutex in OS NONE config
+void utcd_int_set(bool enabled);
+OSAL_QUEUE_DEF(utcd_int_set, utcd_qdef, CFG_TUC_TASK_QUEUE_SZ, tcd_event_t);
+tu_static osal_queue_t utcd_q;
+
+// if stack is initialized
+static bool utcd_inited = false;
+
+// if port is initialized
+static bool port_inited[TUP_TYPEC_RHPORTS_NUM];
//--------------------------------------------------------------------+
//
//--------------------------------------------------------------------+
+bool tuc_inited(uint8_t rhport) {
+ return utcd_inited && port_inited[rhport];
+}
+
+bool tuc_init(uint8_t rhport, tusb_typec_port_type_t port_type) {
+ // Initialize stack
+ if (!utcd_inited) {
+ tu_memclr(port_inited, sizeof(port_inited));
+
+ utcd_q = osal_queue_create(&utcd_qdef);
+ TU_ASSERT(utcd_q != NULL);
+
+ utcd_inited = true;
+ }
+
+ // skip if port already initialized
+ if ( port_inited[rhport] ) {
+ return true;
+ }
+
+ TU_LOG_UTCD("UTCD init on port %u\r\n", rhport);
-bool tuc_init(uint8_t rhport, typec_port_type_t port_type) {
TU_ASSERT(tcd_init(rhport, port_type));
tcd_int_enable(rhport);
+
+ port_inited[rhport] = true;
return true;
}
+
+//--------------------------------------------------------------------+
+//
+//--------------------------------------------------------------------+
+void utcd_int_set(bool enabled) {
+ // Disable all controllers since they shared the same event queue
+ for (uint8_t p = 0; p < TUP_TYPEC_RHPORTS_NUM; p++) {
+ if ( port_inited[p] ) {
+ if (enabled) {
+ tcd_int_enable(p);
+ }else {
+ tcd_int_disable(p);
+ }
+ }
+ }
+}
+
#endif