summaryrefslogtreecommitdiff
path: root/src/typec
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
parentb893f1d5417adf8cf874d6b2e7946582ca37982a (diff)
able to response with good crc
Diffstat (limited to 'src/typec')
-rw-r--r--src/typec/tcd.h15
-rw-r--r--src/typec/utcd.c57
-rw-r--r--src/typec/utcd.h16
3 files changed, 84 insertions, 4 deletions
diff --git a/src/typec/tcd.h b/src/typec/tcd.h
index 397c0ac83..e823bf8d7 100644
--- a/src/typec/tcd.h
+++ b/src/typec/tcd.h
@@ -38,13 +38,19 @@ extern "C" {
//--------------------------------------------------------------------+
//
//--------------------------------------------------------------------+
+typedef struct {
+ uint8_t rhport;
+ uint8_t event_id;
+
+
+} tcd_event_t;;
//--------------------------------------------------------------------+
//
//--------------------------------------------------------------------+
// Initialize controller
-bool tcd_init(uint8_t rhport, typec_port_type_t port_type);
+bool tcd_init(uint8_t rhport, tusb_typec_port_type_t port_type);
// Enable interrupt
void tcd_int_enable (uint8_t rhport);
@@ -55,4 +61,11 @@ void tcd_int_disable(uint8_t rhport);
// Interrupt Handler
void tcd_int_handler(uint8_t rhport);
+//--------------------------------------------------------------------+
+//
+//--------------------------------------------------------------------+
+
+bool tcd_rx_start(uint8_t rhport, uint8_t* buffer, uint16_t total_bytes);
+bool tcd_tx_start(uint8_t rhport, uint8_t const* buffer, uint16_t total_bytes);
+
#endif
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
diff --git a/src/typec/utcd.h b/src/typec/utcd.h
index 2f9b84fb7..06a62ef23 100644
--- a/src/typec/utcd.h
+++ b/src/typec/utcd.h
@@ -34,11 +34,23 @@ extern "C" {
#endif
//--------------------------------------------------------------------+
+// TypeC Configuration
+//--------------------------------------------------------------------+
+
+#ifndef CFG_TUC_TASK_QUEUE_SZ
+#define CFG_TUC_TASK_QUEUE_SZ 16
+#endif
+
+
+//--------------------------------------------------------------------+
// Application API
//--------------------------------------------------------------------+
-// init typec stack
-bool tuc_init(uint8_t rhport, typec_port_type_t port_type);
+// Init typec stack on a port
+bool tuc_init(uint8_t rhport, tusb_typec_port_type_t port_type);
+
+// Check if typec port is initialized
+bool tuc_inited(uint8_t rhport);
#ifndef _TUSB_TCD_H_
extern void tcd_int_handler(uint8_t rhport);