You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by je...@apache.org on 2022/08/24 09:31:09 UTC

[mynewt-core] 03/04: tinyusb: Allow USB console with other CDC interfaces

This is an automated email from the ASF dual-hosted git repository.

jerzy pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mynewt-core.git

commit e82d0609fb11919e9faca2f0a86c45d7f1191eea
Author: Jerzy Kasenberg <je...@codecoup.pl>
AuthorDate: Thu Aug 18 13:38:24 2022 +0200

    tinyusb: Allow USB console with other CDC interfaces
    
    This converts USB console to use common CDC code that
    allows co-existence of several CDC interfaces
---
 hw/usb/tinyusb/cdc_console/pkg.yml                 |  1 +
 hw/usb/tinyusb/cdc_console/src/cdc_console.c       | 61 +++++++++++++++-------
 hw/usb/tinyusb/cdc_console/syscfg.yml              |  8 +--
 .../tinyusb/std_descriptors/include/tusb_config.h  | 47 ++++++++++++++++-
 .../tinyusb/std_descriptors/src/std_descriptors.c  | 26 +++++++--
 hw/usb/tinyusb/std_descriptors/syscfg.yml          |  5 +-
 6 files changed, 120 insertions(+), 28 deletions(-)

diff --git a/hw/usb/tinyusb/cdc_console/pkg.yml b/hw/usb/tinyusb/cdc_console/pkg.yml
index 45800d7e1..9cdc5612e 100755
--- a/hw/usb/tinyusb/cdc_console/pkg.yml
+++ b/hw/usb/tinyusb/cdc_console/pkg.yml
@@ -29,6 +29,7 @@ pkg.deps:
     - "@apache-mynewt-core/hw/hal"
     - "@apache-mynewt-core/kernel/os"
     - "@apache-mynewt-core/hw/usb/tinyusb"
+    - "@apache-mynewt-core/hw/usb/tinyusb/cdc"
     - "@tinyusb/tinyusb"
 
 pkg.init:
diff --git a/hw/usb/tinyusb/cdc_console/src/cdc_console.c b/hw/usb/tinyusb/cdc_console/src/cdc_console.c
index be6490d32..e91a3cea0 100755
--- a/hw/usb/tinyusb/cdc_console/src/cdc_console.c
+++ b/hw/usb/tinyusb/cdc_console/src/cdc_console.c
@@ -20,6 +20,7 @@
 #include <os/mynewt.h>
 
 #include <class/cdc/cdc_device.h>
+#include <cdc/cdc.h>
 
 #include <console/console.h>
 #include <bsp/bsp.h>
@@ -28,6 +29,12 @@ static struct os_event rx_receive_event;
 static struct os_event tx_flush_event;
 static bool connected;
 
+static const struct cdc_callbacks console_cdc_callback;
+
+cdc_itf_t console_cdc_itf = {
+    .callbacks = &console_cdc_callback
+};
+
 static void
 cdc_schedule_tx_flush(void)
 {
@@ -39,11 +46,11 @@ cdc_write(int c)
 {
     uint32_t written;
 
-    written = tud_cdc_write_char(c);
-    if (tud_cdc_write_available() == 0) {
-        tud_cdc_write_flush();
+    written = tud_cdc_n_write_char(console_cdc_itf.cdc_num, c);
+    if (tud_cdc_n_write_available(console_cdc_itf.cdc_num) == 0) {
+        tud_cdc_n_write_flush(console_cdc_itf.cdc_num);
         if (written == 0) {
-            tud_cdc_write_char(c);
+            tud_cdc_n_write_char(console_cdc_itf.cdc_num, c);
         }
     }
 }
@@ -72,11 +79,11 @@ static void
 tx_flush_ev_cb(struct os_event *ev)
 {
 #if MYNEWT_VAL(USBD_CDC_TX_BUFSIZE)
-    if (connected && tud_cdc_write_available() < CFG_TUD_CDC_TX_BUFSIZE) {
+    if (connected && tud_cdc_n_write_available(console_cdc_itf.cdc_num) < CFG_TUD_CDC_TX_BUFSIZE) {
 #else
-    if (connected && tud_cdc_write_available() < USBD_CDC_DATA_EP_SIZE) {
+    if (connected && tud_cdc_n_write_available(console_cdc_itf.cdc_num) < USBD_CDC_DATA_EP_SIZE) {
 #endif
-        if (tud_cdc_write_flush() == 0) {
+        if (tud_cdc_n_write_flush(console_cdc_itf.cdc_num) == 0) {
             /*
              * Previous data not sent yet.
              * There is no data sent notification in tinyusb/cdc, retry flush later.
@@ -100,8 +107,8 @@ rx_ev_cb(struct os_event *ev)
         }
     }
 
-    while (tud_cdc_available()) {
-        console_rejected_char = tud_cdc_read_char();
+    while (tud_cdc_n_available(console_cdc_itf.cdc_num)) {
+        console_rejected_char = tud_cdc_n_read_char(console_cdc_itf.cdc_num);
         if (console_rejected_char >= 0) {
             ret = console_handle_char(console_rejected_char);
             if (ret < 0) {
@@ -115,9 +122,12 @@ rx_ev_cb(struct os_event *ev)
     console_rejected_char = -1;
 }
 
-void
-tud_cdc_line_state_cb(uint8_t itf, bool dtr, bool rts)
+static void
+cdc_console_line_state_cb(cdc_itf_t *itf, bool dtr, bool rts)
 {
+    (void)itf;
+    (void)rts;
+
     if (dtr != connected) {
         connected = dtr;
         cdc_schedule_tx_flush();
@@ -125,20 +135,23 @@ tud_cdc_line_state_cb(uint8_t itf, bool dtr, bool rts)
 }
 
 /* Invoked when CDC interface received data from host */
-void
-tud_cdc_rx_cb(uint8_t itf)
+static void
+cdc_console_rx_cb(cdc_itf_t *itf)
 {
+    (void)itf;
     os_eventq_put(os_eventq_dflt_get(), &rx_receive_event);
 }
 
-void
-tud_cdc_line_coding_cb(uint8_t itf, const cdc_line_coding_t *p_line_coding)
+static void
+cdc_console_line_coding_cb(cdc_itf_t *itf, const cdc_line_coding_t *p_line_coding)
 {
+    (void)itf;
 }
 
-void
-tud_cdc_rx_wanted_cb(uint8_t itf, char wanted_char)
+static void
+cdc_console_rx_wanted_cb(cdc_itf_t *itf, char wanted_char)
 {
+    (void)itf;
 }
 
 int
@@ -147,11 +160,23 @@ usb_cdc_console_pkg_init(void)
     rx_receive_event.ev_cb = rx_ev_cb;
     tx_flush_event.ev_cb = tx_flush_ev_cb;
 
+    cdc_itf_add(&console_cdc_itf);
+
     return 0;
 }
 
 int
 usb_cdc_console_is_init(void)
 {
-    return (int)tud_cdc_connected();
+    return (int)tud_cdc_n_connected(console_cdc_itf.cdc_num);
 }
+
+static const struct cdc_callbacks console_cdc_callback = {
+    .cdc_rx_cb = cdc_console_rx_cb,
+    .cdc_line_coding_cb = cdc_console_line_coding_cb,
+    .cdc_line_state_cb = cdc_console_line_state_cb,
+    .cdc_rx_wanted_cb = cdc_console_rx_wanted_cb,
+    .cdc_send_break_cb = NULL,
+    .cdc_tx_complete_cb = NULL,
+};
+
diff --git a/hw/usb/tinyusb/cdc_console/syscfg.yml b/hw/usb/tinyusb/cdc_console/syscfg.yml
index 0dc36b980..7c64373bd 100755
--- a/hw/usb/tinyusb/cdc_console/syscfg.yml
+++ b/hw/usb/tinyusb/cdc_console/syscfg.yml
@@ -18,12 +18,12 @@
 #
 
 syscfg.defs:
-    USBD_CDC_DECRIPTOR_STRING:
-        description: String for CDC interface
+    USBD_CDC_CONSOLE_DECRIPTOR_STRING:
+        description: String for CDC/Console interface
         value: '"Mynewt console"'
 
 syscfg.vals:
-    USBD_CDC: 1
+    USBD_CDC_CONSOLE: 1
 
 syscfg.restrictions:
-    - "USBD_CDC"
+    - "USBD_CDC_CONSOLE"
diff --git a/hw/usb/tinyusb/std_descriptors/include/tusb_config.h b/hw/usb/tinyusb/std_descriptors/include/tusb_config.h
index dc98585ee..42cc716dd 100755
--- a/hw/usb/tinyusb/std_descriptors/include/tusb_config.h
+++ b/hw/usb/tinyusb/std_descriptors/include/tusb_config.h
@@ -72,11 +72,54 @@ extern "C" {
 #define CFG_TUD_ENDPOINT0_SIZE   MYNEWT_VAL(USBD_EP0_SIZE)
 
 /* ------------- CLASS ------------- */
+/*
+ * If CDC_CONSOLE does not have specific values for endpoint configuration,
+ * use values for unspecified CDC
+ */
+#if defined(MYNEWT_VAL_USBD_CDC_CONSOLE_NOTIFY_EP_SIZE)
+#define USBD_CDC_CONSOLE_NOTIFY_EP_SIZE MYNEWT_VAL(USBD_CDC_CONSOLE_NOTIFY_EP_SIZE)
+#else
+#define USBD_CDC_CONSOLE_NOTIFY_EP_SIZE USBD_CDC_NOTIFY_EP_SIZE
+#endif
+
+#if defined(MYNEWT_VAL_USBD_CDC_CONSOLE_NOTIFY_EP)
+#define USBD_CDC_CONSOLE_NOTIFY_EP      MYNEWT_VAL(USBD_CDC_CONSOLE_NOTIFY_EP)
+#else
+#define USBD_CDC_CONSOLE_NOTIFY_EP      USBD_CDC_NOTIFY_EP
+#endif
+
+#if defined(MYNEWT_VAL_USBD_CDC_CONSOLE_DATA_OUT_EP)
+#define USBD_CDC_CONSOLE_DATA_OUT_EP    MYNEWT_VAL(USBD_CDC_CONSOLE_DATA_OUT_EP)
+#else
+#define USBD_CDC_CONSOLE_DATA_OUT_EP    USBD_CDC_DATA_OUT_EP
+#endif
+
+#if defined(MYNEWT_VAL_USBD_CDC_CONSOLE_DATA_IN_EP)
+#define USBD_CDC_CONSOLE_DATA_IN_EP     MYNEWT_VAL(USBD_CDC_CONSOLE_DATA_IN_EP)
+#else
+#define USBD_CDC_CONSOLE_DATA_IN_EP     USBD_CDC_DATA_IN_EP
+#endif
+
+#if defined(MYNEWT_VAL_USBD_CDC_CONSOLE_DATA_EP_SIZE)
+#define USBD_CDC_CONSOLE_DATA_EP_SIZE   MYNEWT_VAL(USBD_CDC_CONSOLE_DATA_EP_SIZE)
+#else
+#define USBD_CDC_CONSOLE_DATA_EP_SIZE   USBD_CDC_DATA_EP_SIZE
+#endif
+
 #if MYNEWT_VAL(USBD_CDC)
-#define CFG_TUD_CDC              MYNEWT_VAL(USBD_CDC)
+#define CFG_CDC                  MYNEWT_VAL(USBD_CDC)
 #else
-#define CFG_TUD_CDC              0
+#define CFG_CDC                  0
 #endif
+
+#if MYNEWT_VAL(CONSOLE_USB)
+#define CFG_CDC_CONSOLE          MYNEWT_VAL(CONSOLE_USB)
+#else
+#define CFG_CDC_CONSOLE          0
+#endif
+
+#define CFG_TUD_CDC              ((CFG_CDC) + (CFG_CDC_CONSOLE))
+
 #if MYNEWT_VAL(USBD_HID)
 #define CFG_TUD_HID              MYNEWT_VAL(USBD_HID)
 #else
diff --git a/hw/usb/tinyusb/std_descriptors/src/std_descriptors.c b/hw/usb/tinyusb/std_descriptors/src/std_descriptors.c
index 311edde9d..515777bfc 100755
--- a/hw/usb/tinyusb/std_descriptors/src/std_descriptors.c
+++ b/hw/usb/tinyusb/std_descriptors/src/std_descriptors.c
@@ -48,6 +48,11 @@ enum usb_desc_ix {
 #else
 #define CDC_IF_STR_IX 0
 #endif
+#if defined MYNEWT_VAL_USBD_CDC_CONSOLE_DESCRIPTOR_STRING
+    CDC_CONSOLE_IF_STR_IX,
+#else
+#define CDC_CONSOLE_IF_STR_IX   0
+#endif
 #if defined MYNEWT_VAL_USBD_MSC_DESCRIPTOR_STRING
     MSC_IF_STR_IX,
 #else
@@ -257,11 +262,16 @@ enum {
 #endif
 #endif
 
-#if CFG_TUD_CDC
+#if CFG_CDC
     ITF_NUM_CDC,
     ITF_NUM_CDC_DATA,
 #endif
 
+#if CFG_CDC_CONSOLE
+    ITF_NUM_CDC_CONSOLE,
+    ITF_NUM_CDC_CONSOLE_DATA,
+#endif
+
 #if CFG_TUD_MSC
     ITF_NUM_MSC,
 #endif
@@ -278,7 +288,8 @@ enum {
 };
 
 #define CONFIG_TOTAL_LEN    (TUD_CONFIG_DESC_LEN + \
-                             CFG_TUD_CDC * TUD_CDC_DESC_LEN + \
+                             CFG_CDC * TUD_CDC_DESC_LEN + \
+                             CFG_CDC_CONSOLE * TUD_CDC_DESC_LEN + \
                              CFG_TUD_MSC * TUD_MSC_DESC_LEN + \
                              CFG_TUD_HID * TUD_HID_DESC_LEN + \
                              CFG_TUD_BTH * TUD_BTH_DESC_LEN + \
@@ -296,7 +307,13 @@ const uint8_t desc_configuration[] = {
                        0, 9, 17, 25, 33, 49),
 #endif
 
-#if CFG_TUD_CDC
+#if CFG_CDC_CONSOLE
+    TUD_CDC_DESCRIPTOR(ITF_NUM_CDC_CONSOLE, CDC_CONSOLE_IF_STR_IX, USBD_CDC_CONSOLE_NOTIFY_EP,
+                       USBD_CDC_CONSOLE_NOTIFY_EP_SIZE, USBD_CDC_CONSOLE_DATA_OUT_EP, USBD_CDC_CONSOLE_DATA_IN_EP,
+                       (CFG_TUSB_RHPORT0_MODE & OPT_MODE_HIGH_SPEED) ? 512 : USBD_CDC_CONSOLE_DATA_EP_SIZE),
+#endif
+
+#if CFG_CDC
     TUD_CDC_DESCRIPTOR(ITF_NUM_CDC, CDC_IF_STR_IX, USBD_CDC_NOTIFY_EP, USBD_CDC_NOTIFY_EP_SIZE,
                        USBD_CDC_DATA_OUT_EP, USBD_CDC_DATA_IN_EP,
                        (CFG_TUSB_RHPORT0_MODE & OPT_MODE_HIGH_SPEED) ? 512 : USBD_CDC_DATA_EP_SIZE),
@@ -338,6 +355,9 @@ const char *string_desc_arr[] = {
 #if defined MYNEWT_VAL_USBD_CDC_DESCRIPTOR_STRING
     MYNEWT_VAL(USBD_CDC_DESCRIPTOR_STRING),
 #endif
+#if defined MYNEWT_VAL_USBD_CDC_CONSOLE_DESCRIPTOR_STRING
+    MYNEWT_VAL(USBD_CDC_CONSOLE_DESCRIPTOR_STRING),
+#endif
 #if defined MYNEWT_VAL_USBD_MSC_DESCRIPTOR_STRING
     MYNEWT_VAL(USBD_MSC_DESCRIPTOR_STRING),
 #endif
diff --git a/hw/usb/tinyusb/std_descriptors/syscfg.yml b/hw/usb/tinyusb/std_descriptors/syscfg.yml
index 25f2e524a..1ab4916d7 100644
--- a/hw/usb/tinyusb/std_descriptors/syscfg.yml
+++ b/hw/usb/tinyusb/std_descriptors/syscfg.yml
@@ -62,7 +62,10 @@ syscfg.defs:
         description: Device friendly name
         value: '"Dev device"'
     USBD_CDC:
-        description: Enable CDC device function in TinyUSB stack.
+        description: Enable CDC device function in TinyUSB stack (other then console or hci).
+        value:
+    USBD_CDC_CONSOLE:
+        description: Enable CDC device function for console in TinyUSB stack.
         value:
     USBD_HID:
         description: Enable HID device function in TinyUSB stack.