Repostiory containing DAPLink source code with Reset Pin workaround for HANI_IOT board.

Upstream: https://github.com/ARMmbed/DAPLink

Revision:
0:01f31e923fe2
diff -r 000000000000 -r 01f31e923fe2 source/daplink/usb2uart/usbd_user_cdc_acm.c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/source/daplink/usb2uart/usbd_user_cdc_acm.c	Tue Apr 07 12:55:42 2020 +0200
@@ -0,0 +1,193 @@
+/**
+ * @file    usbd_user_cdc_acm.c
+ * @brief   implementation of USB CDC ACM middleware
+ *
+ * DAPLink Interface Firmware
+ * Copyright (c) 2009-2019, ARM Limited, All Rights Reserved
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "cmsis_os2.h"
+#include "rl_usb.h"
+#include "main.h"
+#include "uart.h"
+#ifdef DRAG_N_DROP_SUPPORT
+#include "flash_intf.h"
+#endif
+#include "target_family.h"
+
+UART_Configuration UART_Config;
+
+/** @brief  Vitual COM Port initialization
+ *
+ *  The function inititalizes the hardware resources of the port used as
+ *  the Virtual COM Port.
+ *
+ *  @return 0 Function failed.
+ *  @return 1 Function succeeded.
+ */
+int32_t USBD_CDC_ACM_PortInitialize(void)
+{
+    uart_initialize();
+    main_cdc_send_event();
+    return 1;
+}
+
+/** @brief  Vitual COM Port uninitialization
+ *
+ *  The function uninititalizes/releases the hardware resources of the port used
+ *  as the Virtual COM Port.
+ *
+ *  @return 0 Function failed.
+ *  @return 1 Function succeeded.
+ */
+int32_t USBD_CDC_ACM_PortUninitialize(void)
+{
+    uart_uninitialize();
+    return 1;
+}
+
+/** @brief  Vitual COM Port reset
+ *
+ *  The function resets the internal states of the port used
+ *  as the Virtual COM Port.
+ *
+ *  @return 0 Function failed.
+ *  @return 1 Function succeeded.
+ */
+int32_t USBD_CDC_ACM_PortReset(void)
+{
+    uart_reset();
+    return 1;
+}
+
+/** @brief  Virtual COM Port change communication settings
+ *
+ *  The function changes communication settings of the port used as the
+ *  Virtual COM Port.
+ *
+ *  @param [in] line_coding Pointer to the loaded CDC_LINE_CODING structure.
+ *  @return 0 Function failed.
+ *  @return 1 Function succeeded.
+ */
+int32_t USBD_CDC_ACM_PortSetLineCoding(CDC_LINE_CODING *line_coding)
+{
+    UART_Config.Baudrate    = line_coding->dwDTERate;
+    UART_Config.DataBits    = (UART_DataBits) line_coding->bDataBits;
+    UART_Config.Parity      = (UART_Parity)   line_coding->bParityType;
+    UART_Config.StopBits    = (UART_StopBits) line_coding->bCharFormat;
+    UART_Config.FlowControl = UART_FLOW_CONTROL_NONE;
+    return uart_set_configuration(&UART_Config);
+}
+
+/** @brief  Vitual COM Port retrieve communication settings
+ *
+ * The function retrieves communication settings of the port used as the
+ *  Virtual COM Port.
+ *
+ *  @param [in] line_coding Pointer to the CDC_LINE_CODING structure.
+ *  @return 0 Function failed.
+ *  @return 1 Function succeeded.
+ */
+int32_t USBD_CDC_ACM_PortGetLineCoding(CDC_LINE_CODING *line_coding)
+{
+    line_coding->dwDTERate   = UART_Config.Baudrate;
+    line_coding->bDataBits   = UART_Config.DataBits;
+    line_coding->bParityType = UART_Config.Parity;
+    line_coding->bCharFormat = UART_Config.StopBits;
+    return (1);
+}
+
+static U32 start_break_time = 0;
+int32_t USBD_CDC_ACM_SendBreak(uint16_t dur)
+{
+    uint32_t end_break_time;
+#ifdef DRAG_N_DROP_SUPPORT
+    if (!flash_intf_target->flash_busy())
+#endif
+    { //added checking if flashing on target is in progress
+        // reset and send the unique id over CDC
+        if (dur != 0) {
+            start_break_time = osKernelGetSysTimerCount();
+            target_set_state(RESET_HOLD);
+        } else {
+            end_break_time = osKernelGetSysTimerCount();
+
+            // long reset -> send uID over serial (300 -> break > 3s)
+            if ((end_break_time - start_break_time) >= (300)) {
+                main_reset_target(1);
+            } else {
+                main_reset_target(0);
+            }
+        }
+    }
+    return (1);
+}
+
+/** @brief  Virtual COM Port set control line state
+ *
+ *  The function sets control line state on the port used as the
+ *  Virtual COM Port.
+ *
+ *  @param [in] ctrl_bmp Control line settings
+ *      bitmap (0. bit - DTR state, 1. bit - RTS state).
+ *  @return 0 Function failed.
+ *  @return 1 Function succeeded.
+ */
+int32_t USBD_CDC_ACM_PortSetControlLineState(uint16_t ctrl_bmp)
+{
+    return (1);
+}
+
+void cdc_process_event()
+{
+    int32_t len_data = 0;
+    uint8_t data[64];
+
+    len_data = USBD_CDC_ACM_DataFree();
+
+    if (len_data > sizeof(data)) {
+        len_data = sizeof(data);
+    }
+
+    if (len_data) {
+        len_data = uart_read_data(data, len_data);
+    }
+
+    if (len_data) {
+        if (USBD_CDC_ACM_DataSend(data , len_data)) {
+            main_blink_cdc_led(MAIN_LED_FLASH);
+        }
+    }
+
+    len_data = uart_write_free();
+
+    if (len_data > sizeof(data)) {
+        len_data = sizeof(data);
+    }
+
+    if (len_data) {
+        len_data = USBD_CDC_ACM_DataRead(data, len_data);
+    }
+
+    if (len_data) {
+        if (uart_write_data(data, len_data)) {
+            main_blink_cdc_led(MAIN_LED_FLASH);
+        }
+    }
+
+    // Always process events
+    main_cdc_send_event();
+}