From 3ddda900487f55bec506562fffd9f38e419a3ecd Mon Sep 17 00:00:00 2001
From: chen <15335560115@163.com>
Date: 星期六, 12 七月 2025 16:34:10 +0800
Subject: [PATCH] 成功调好485串口接和收逻辑,usb串口用于查看log输出和上位机配置,需要注意在打印彻底完成后进行切换

---
 keil/include/drivers/mk_trace.c |  449 ++++++++++++++++++++++++++++---------------------------
 1 files changed, 226 insertions(+), 223 deletions(-)

diff --git a/keil/include/drivers/mk_trace.c b/keil/include/drivers/mk_trace.c
index d40da8d..9a42237 100644
--- a/keil/include/drivers/mk_trace.c
+++ b/keil/include/drivers/mk_trace.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2019-2023 Beijing Hanwei Innovation Technology Ltd. Co. and
+ * Copyright (c) 2019-2025 Beijing Hanwei Innovation Technology Ltd. Co. and
  * its subsidiaries and affiliates (collectly called MKSEMI).
  *
  * All rights reserved.
@@ -202,11 +202,12 @@
     (TRACE_LVL_CONFIG_1 >> (4 * (TRACE_MODULE_SE - 8))) & 0xf,
     // SCP03
     (TRACE_LVL_CONFIG_1 >> (4 * (TRACE_MODULE_SCP03 - 8))) & 0xf,
+    // Aliro
+    (TRACE_LVL_CONFIG_1 >> (4 * (TRACE_MODULE_ALIRO - 8))) & 0xf,
 };
 
-const static char *module_name[TRACE_MODULE_NUM] = {"[MAC]",  "[PHY]", "[DRV]",  "[APP]", "[UWB]", "[UCI]",  "[TEST]",
-        "[BOOT]", "[OS]",  "[FIRA]", "[CCC]", "[SE]",  "[SCP03]"
-                                                   };
+const static char *module_name[TRACE_MODULE_NUM] = {"[MAC]",  "[PHY]", "[DRV]",  "[APP]", "[UWB]", "[UCI]",   "[TEST]",
+                                                    "[BOOT]", "[OS]",  "[FIRA]", "[CCC]", "[SE]",  "[SCP03]", "[ALIRO]"};
 
 const static char *level_tag[TRACE_LEVEL_NUM] = {
     "[ERROR]",
@@ -297,20 +298,19 @@
     {
         enum UART_DEV_T trace_uart = (trace_handle.port == TRACE_PORT_UART0) ? UART_ID0 : UART_ID1;
         struct UART_CFG_T trace_uart_cfg = {.parity = UART_PARITY_NONE,
-            .stop = UART_STOP_BITS_1,
-             .data = UART_DATA_BITS_8,
-              .flow = UART_FLOW_CONTROL_NONE,
-               .rx_level = UART_RXFIFO_CHAR_1,
-                .tx_level = UART_TXFIFO_EMPTY,
-                 .baud = baud_rate,
+                                            .stop = UART_STOP_BITS_1,
+                                            .data = UART_DATA_BITS_8,
+                                            .flow = UART_FLOW_CONTROL_NONE,
+                                            .rx_level = UART_RXFIFO_CHAR_1,
+                                            .tx_level = UART_TXFIFO_EMPTY,
+                                            .baud = baud_rate,
 #ifdef TRACE_BLOCKING
-                  .dma_en = false,
+                                            .dma_en = false,
 #else
-                  .dma_en = true,
+                                            .dma_en = true,
 #endif
-                   .int_rx = false,
-                    .int_tx = false
-        };
+                                            .int_rx = false,
+                                            .int_tx = false};
 
         ret = uart_open(trace_uart, &trace_uart_cfg);
 
@@ -330,6 +330,9 @@
 int trace_close(void)
 {
     int ret = 0;
+    // flush the trace buffer before close
+    trace_flush();
+
     trace_handle.enabled = 0;
     if ((trace_handle.port == TRACE_PORT_UART0) || (trace_handle.port == TRACE_PORT_UART1))
     {
@@ -570,65 +573,65 @@
         enum UART_DEV_T trace_uart = (trace_handle.port == TRACE_PORT_UART0) ? UART_ID0 : UART_ID1;
         switch (trace_handle.console_fsm)
         {
-        case CONSOLE_RX_HEADER:
-        {
-            if (trace_handle.rx_buf[POS_PREAMBLE] == CONSOLE_CMD)
+            case CONSOLE_RX_HEADER:
             {
-                payload_len = (uint16_t)(trace_handle.rx_buf[POS_LENGTH + 1] << 8) + trace_handle.rx_buf[POS_LENGTH];
-                trace_handle.console_fsm = CONSOLE_RX_PAYLOAD;
-                uart_receive(trace_uart, &trace_handle.rx_buf[POS_ID], payload_len, console_receive_callback);
-            }
-            else if (trace_handle.rx_buf[1] == CONSOLE_CMD)
-            {
-                trace_handle.rx_buf[POS_PREAMBLE] = CONSOLE_CMD;
-                trace_handle.rx_buf[1] = trace_handle.rx_buf[2];
-                uart_receive(trace_uart, &trace_handle.rx_buf[2], 1, console_receive_callback);
-            }
-            else if (trace_handle.rx_buf[2] == CONSOLE_CMD)
-            {
-                trace_handle.rx_buf[POS_PREAMBLE] = CONSOLE_CMD;
-                uart_receive(trace_uart, &trace_handle.rx_buf[1], 2, console_receive_callback);
-            }
-            else
-            {
-                uart_receive(trace_uart, &trace_handle.rx_buf[POS_PREAMBLE], LEN_HEADER, console_receive_callback);
-            }
-            break;
-        }
-
-        case CONSOLE_RX_PAYLOAD:
-        {
-            // check crc
-            payload_len = (uint16_t)(trace_handle.rx_buf[POS_LENGTH + 1] << 8) + trace_handle.rx_buf[POS_LENGTH];
-            uint16_t crc_frame =
-                (uint16_t)(trace_handle.rx_buf[payload_len + LEN_HEADER - LEN_CRC + 1] << 8) + trace_handle.rx_buf[payload_len + LEN_HEADER - LEN_CRC];
-            uint16_t crc_cal = crc16(&trace_handle.rx_buf[0], payload_len + LEN_HEADER - LEN_CRC);
-
-            if (crc_frame == crc_cal)
-            {
-                uint16_t id = (uint16_t)(trace_handle.rx_buf[POS_ID + 1] << 8) + trace_handle.rx_buf[POS_ID];
-
-                // packet process
-                if (console_cmd_handler_list[id].function)
+                if (trace_handle.rx_buf[POS_PREAMBLE] == CONSOLE_CMD)
                 {
-                    console_cmd_handler_list[id].function(&trace_handle.rx_buf[POS_DATA], payload_len - LEN_CRC - LEN_ID);
+                    payload_len = (uint16_t)(trace_handle.rx_buf[POS_LENGTH + 1] << 8) + trace_handle.rx_buf[POS_LENGTH];
+                    trace_handle.console_fsm = CONSOLE_RX_PAYLOAD;
+                    uart_receive(trace_uart, &trace_handle.rx_buf[POS_ID], payload_len, console_receive_callback);
+                }
+                else if (trace_handle.rx_buf[1] == CONSOLE_CMD)
+                {
+                    trace_handle.rx_buf[POS_PREAMBLE] = CONSOLE_CMD;
+                    trace_handle.rx_buf[1] = trace_handle.rx_buf[2];
+                    uart_receive(trace_uart, &trace_handle.rx_buf[2], 1, console_receive_callback);
+                }
+                else if (trace_handle.rx_buf[2] == CONSOLE_CMD)
+                {
+                    trace_handle.rx_buf[POS_PREAMBLE] = CONSOLE_CMD;
+                    uart_receive(trace_uart, &trace_handle.rx_buf[1], 2, console_receive_callback);
                 }
                 else
                 {
-                    LOG_ERROR(TRACE_MODULE_DRIVER, "Console CMD ID %04x Function is Null\r\n", id);
+                    uart_receive(trace_uart, &trace_handle.rx_buf[POS_PREAMBLE], LEN_HEADER, console_receive_callback);
                 }
+                break;
             }
-            else
-            {
-                LOG_ERROR(TRACE_MODULE_DRIVER, "Console CRC Error %04x %04x\r\n", crc_cal, crc_frame);
-            }
-            trace_handle.console_fsm = CONSOLE_RX_HEADER;
-            uart_receive(trace_uart, &trace_handle.rx_buf[0], LEN_HEADER, console_receive_callback);
-            break;
-        }
 
-        default:
-            break;
+            case CONSOLE_RX_PAYLOAD:
+            {
+                // check crc
+                payload_len = (uint16_t)(trace_handle.rx_buf[POS_LENGTH + 1] << 8) + trace_handle.rx_buf[POS_LENGTH];
+                uint16_t crc_frame =
+                    (uint16_t)(trace_handle.rx_buf[payload_len + LEN_HEADER - LEN_CRC + 1] << 8) + trace_handle.rx_buf[payload_len + LEN_HEADER - LEN_CRC];
+                uint16_t crc_cal = crc16(&trace_handle.rx_buf[0], payload_len + LEN_HEADER - LEN_CRC);
+
+                if (crc_frame == crc_cal)
+                {
+                    uint16_t id = (uint16_t)(trace_handle.rx_buf[POS_ID + 1] << 8) + trace_handle.rx_buf[POS_ID];
+
+                    // packet process
+                    if (console_cmd_handler_list[id].function)
+                    {
+                        console_cmd_handler_list[id].function(&trace_handle.rx_buf[POS_DATA], payload_len - LEN_CRC - LEN_ID);
+                    }
+                    else
+                    {
+                        LOG_ERROR(TRACE_MODULE_DRIVER, "Console CMD ID %04x Function is Null\r\n", id);
+                    }
+                }
+                else
+                {
+                    LOG_ERROR(TRACE_MODULE_DRIVER, "Console CRC Error %04x %04x\r\n", crc_cal, crc_frame);
+                }
+                trace_handle.console_fsm = CONSOLE_RX_HEADER;
+                uart_receive(trace_uart, &trace_handle.rx_buf[0], LEN_HEADER, console_receive_callback);
+                break;
+            }
+
+            default:
+                break;
         }
     }
 }
@@ -727,15 +730,15 @@
         while (1)
         {
             if (NumDigits > 1u)
-            {   // User specified a min number of digits to print? => Make sure we loop at least that often, before
-                // checking anything else (> 1 check avoids problems with NumDigits being signed / unsigned)
+            { // User specified a min number of digits to print? => Make sure we loop at least that often, before
+              // checking anything else (> 1 check avoids problems with NumDigits being signed / unsigned)
                 NumDigits--;
             }
             else
             {
                 Div = v / Digit;
                 if (Div < Base)
-                {   // Is our divider big enough to extract the highest digit from value? => Done
+                { // Is our divider big enough to extract the highest digit from value? => Done
                     break;
                 }
             }
@@ -901,25 +904,25 @@
                 c = *fmt;
                 switch (c)
                 {
-                case '-':
-                    FormatFlags |= FORMAT_FLAG_LEFT_JUSTIFY;
-                    fmt++;
-                    break;
-                case '0':
-                    FormatFlags |= FORMAT_FLAG_PAD_ZERO;
-                    fmt++;
-                    break;
-                case '+':
-                    FormatFlags |= FORMAT_FLAG_PRINT_SIGN;
-                    fmt++;
-                    break;
-                case '#':
-                    FormatFlags |= FORMAT_FLAG_ALTERNATE;
-                    fmt++;
-                    break;
-                default:
-                    v = 0;
-                    break;
+                    case '-':
+                        FormatFlags |= FORMAT_FLAG_LEFT_JUSTIFY;
+                        fmt++;
+                        break;
+                    case '0':
+                        FormatFlags |= FORMAT_FLAG_PAD_ZERO;
+                        fmt++;
+                        break;
+                    case '+':
+                        FormatFlags |= FORMAT_FLAG_PRINT_SIGN;
+                        fmt++;
+                        break;
+                    case '#':
+                        FormatFlags |= FORMAT_FLAG_ALTERNATE;
+                        fmt++;
+                        break;
+                    default:
+                        v = 0;
+                        break;
                 }
             } while (v);
             //
@@ -977,65 +980,65 @@
             //
             switch (c)
             {
-            case 'c':
-            {
-                char c0;
-                v = va_arg(args, int);
-                c0 = (char)v;
-                _StoreChar(&BufferDesc, c0);
-                break;
-            }
-            case 'd':
-                v = va_arg(args, int);
-                _PrintInt(&BufferDesc, v, 10u, NumDigits, FieldWidth, FormatFlags);
-                break;
-            case 'u':
-                v = va_arg(args, int);
-                _PrintUnsigned(&BufferDesc, (unsigned)v, 10u, NumDigits, FieldWidth, FormatFlags);
-                break;
-            case 'x':
-            case 'X':
-                v = va_arg(args, int);
-                _PrintUnsigned(&BufferDesc, (unsigned)v, 16u, NumDigits, FieldWidth, FormatFlags);
-                break;
-            case 's':
-            {
-                const char *s = va_arg(args, const char *);
-                do
+                case 'c':
                 {
-                    c = *s;
-                    s++;
-                    if (c == '\0')
+                    char c0;
+                    v = va_arg(args, int);
+                    c0 = (char)v;
+                    _StoreChar(&BufferDesc, c0);
+                    break;
+                }
+                case 'd':
+                    v = va_arg(args, int);
+                    _PrintInt(&BufferDesc, v, 10u, NumDigits, FieldWidth, FormatFlags);
+                    break;
+                case 'u':
+                    v = va_arg(args, int);
+                    _PrintUnsigned(&BufferDesc, (unsigned)v, 10u, NumDigits, FieldWidth, FormatFlags);
+                    break;
+                case 'x':
+                case 'X':
+                    v = va_arg(args, int);
+                    _PrintUnsigned(&BufferDesc, (unsigned)v, 16u, NumDigits, FieldWidth, FormatFlags);
+                    break;
+                case 's':
+                {
+                    const char *s = va_arg(args, const char *);
+                    do
                     {
-                        break;
-                    }
-                    _StoreChar(&BufferDesc, c);
-                } while (BufferDesc.ReturnValue >= 0);
-            }
-            break;
-            case 'f':
-            case 'F':
-            {
-                float fv = (float)va_arg(args, double);
-                if (fv < 0)
-                    _StoreChar(&BufferDesc, '-');
-                v = abs((int)fv);
-                _PrintInt(&BufferDesc, v, 10u, NumDigits, FieldWidth, FormatFlags);
-                _StoreChar(&BufferDesc, '.');
-                v = abs((int)(fv * 1000000));
-                v = v % 1000000;
-                _PrintInt(&BufferDesc, v, 10u, 6, FieldWidth, FormatFlags);
-            }
-            break;
-            case 'p':
-                v = va_arg(args, int);
-                _PrintUnsigned(&BufferDesc, (unsigned)v, 16u, 8u, 8u, 0u);
+                        c = *s;
+                        s++;
+                        if (c == '\0')
+                        {
+                            break;
+                        }
+                        _StoreChar(&BufferDesc, c);
+                    } while (BufferDesc.ReturnValue >= 0);
+                }
                 break;
-            case '%':
-                _StoreChar(&BufferDesc, '%');
+                case 'f':
+                case 'F':
+                {
+                    float fv = (float)va_arg(args, double);
+                    if (fv < 0)
+                        _StoreChar(&BufferDesc, '-');
+                    v = abs((int)fv);
+                    _PrintInt(&BufferDesc, v, 10u, NumDigits, FieldWidth, FormatFlags);
+                    _StoreChar(&BufferDesc, '.');
+                    v = abs((int)(fv * 1000000));
+                    v = v % 1000000;
+                    _PrintInt(&BufferDesc, v, 10u, 6, FieldWidth, FormatFlags);
+                }
                 break;
-            default:
-                break;
+                case 'p':
+                    v = va_arg(args, int);
+                    _PrintUnsigned(&BufferDesc, (unsigned)v, 16u, 8u, 8u, 0u);
+                    break;
+                case '%':
+                    _StoreChar(&BufferDesc, '%');
+                    break;
+                default:
+                    break;
             }
             fmt++;
         }
@@ -1062,7 +1065,6 @@
 }
 
 #endif
-
 int trace_printf(uint16_t module, uint8_t level, const char *fmt, ...)
 {
     if (trace_handle.enabled == 0)
@@ -1090,7 +1092,7 @@
     // uint32_t lock = int_lock();
     if ((module & TRACE_NO_TIMESTAMP) == 0)
     {
-        mk_snprintf(&buf[pre_len], sizeof(buf) - pre_len, "%10u | ", sys_tick_us());
+        mk_snprintf(&buf[pre_len], sizeof(buf) - pre_len, "%10u | ", rtc_us());
         pre_len = strlen(buf);
     }
     if ((module & TRACE_NO_MODULE_NAME) == 0)
@@ -1198,7 +1200,7 @@
     j = 3;
 
     while (*p != '\0')
-    {   // fill begin at recdBuf[3]
+    { // fill begin at recdBuf[3]
         if (*p != '%')
         {
             p++;
@@ -1212,82 +1214,82 @@
 
         switch (*++p)
         {
-        case 's':
-        {
-            recdBuf[j++] = 0;
-            dataBits |= 1 << 2 * var_count++;
-        }
-        break;
-        case 'c':
-        case 'd':
-        {
-            it = va_arg(aq, int);
-            if (it > 0x7FFF)
+            case 's':
             {
-                *(recdBuf + j++) = 0xff;
-                *(recdBuf + j++) = 0x7f;
-                dataBits |= 2 << 2 * var_count++;
-            }
-
-            if (it < 256)
-            {   // 1byte
-                recdBuf[j++] = (char)it;
+                recdBuf[j++] = 0;
                 dataBits |= 1 << 2 * var_count++;
             }
-            else
-            {   // 2byte
-                *(recdBuf + j++) = it & 0xff;
-                *(recdBuf + j++) = it >> 8 & 0xff;
-                dataBits |= 2 << 2 * var_count++;
-            }
-        }
-        break;
-        case 'x':
-        case 'X':
-        case 'u':
-        {
-            it = va_arg(aq, int);
-            if (it > 0xFFFF)
+            break;
+            case 'c':
+            case 'd':
             {
-                *(recdBuf + j++) = 0xff;
-                *(recdBuf + j++) = 0xff;
-                dataBits |= 2 << 2 * var_count++;
-            }
+                it = va_arg(aq, int);
+                if (it > 0x7FFF)
+                {
+                    *(recdBuf + j++) = 0xff;
+                    *(recdBuf + j++) = 0x7f;
+                    dataBits |= 2 << 2 * var_count++;
+                }
 
-            if (it < 0x100) //<0xFF
-            {   // 1byte
-                recdBuf[j++] = (char)it;
-                dataBits |= 1 << 2 * var_count++;
+                if (it < 256)
+                { // 1byte
+                    recdBuf[j++] = (char)it;
+                    dataBits |= 1 << 2 * var_count++;
+                }
+                else
+                { // 2byte
+                    *(recdBuf + j++) = it & 0xff;
+                    *(recdBuf + j++) = it >> 8 & 0xff;
+                    dataBits |= 2 << 2 * var_count++;
+                }
             }
-            else
-            {   // 2byte
-                *(recdBuf + j++) = it & 0xff;
-                *(recdBuf + j++) = it >> 8 & 0xff;
-                dataBits |= 2 << 2 * var_count++;
-            }
-        }
-        break;
-        case 'f':
-        {
-            dd = va_arg(aq, double);
-            if (dd > 3.4e38)
+            break;
+            case 'x':
+            case 'X':
+            case 'u':
             {
-                *(recdBuf + j++) = 0xff;
-                *(recdBuf + j++) = 0xff;
-                *(recdBuf + j++) = 0xff;
-                *(recdBuf + j++) = 0xff;
-                dataBits |= 3 << 2 * var_count++;
+                it = va_arg(aq, int);
+                if (it > 0xFFFF)
+                {
+                    *(recdBuf + j++) = 0xff;
+                    *(recdBuf + j++) = 0xff;
+                    dataBits |= 2 << 2 * var_count++;
+                }
+
+                if (it < 0x100) //<0xFF
+                {               // 1byte
+                    recdBuf[j++] = (char)it;
+                    dataBits |= 1 << 2 * var_count++;
+                }
+                else
+                { // 2byte
+                    *(recdBuf + j++) = it & 0xff;
+                    *(recdBuf + j++) = it >> 8 & 0xff;
+                    dataBits |= 2 << 2 * var_count++;
+                }
             }
-            else
+            break;
+            case 'f':
             {
-                *(recdBuf + j++) = (unsigned int)dd & 0xff;
-                *(recdBuf + j++) = (unsigned int)dd >> 8 & 0xff;
-                *(recdBuf + j++) = (unsigned int)dd >> 16 & 0xff;
-                *(recdBuf + j++) = (unsigned int)dd >> 24 & 0xff;
-                dataBits |= 3 << 2 * var_count++;
+                dd = va_arg(aq, double);
+                if (dd > 3.4e38)
+                {
+                    *(recdBuf + j++) = 0xff;
+                    *(recdBuf + j++) = 0xff;
+                    *(recdBuf + j++) = 0xff;
+                    *(recdBuf + j++) = 0xff;
+                    dataBits |= 3 << 2 * var_count++;
+                }
+                else
+                {
+                    *(recdBuf + j++) = (unsigned int)dd & 0xff;
+                    *(recdBuf + j++) = (unsigned int)dd >> 8 & 0xff;
+                    *(recdBuf + j++) = (unsigned int)dd >> 16 & 0xff;
+                    *(recdBuf + j++) = (unsigned int)dd >> 24 & 0xff;
+                    dataBits |= 3 << 2 * var_count++;
+                }
             }
-        }
-        break;
+            break;
         }
         p++;
     }
@@ -1444,18 +1446,12 @@
     } while (1);
 }
 
-#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wuninitialized"
-#endif
-
-#if BACKTRACE_EN
 void trace_flush(void)
 {
     if ((trace_handle.port == TRACE_PORT_UART0) || (trace_handle.port == TRACE_PORT_UART1))
     {
         enum UART_DEV_T trace_uart = (trace_handle.port == TRACE_PORT_UART0) ? UART_ID0 : UART_ID1;
-        while (uart_tx_in_progress(trace_uart))
+        while (uart_tx_fifo_is_empty(trace_uart) == false)
         {
         }
     }
@@ -1491,6 +1487,13 @@
     trace_handle.sending = false;
     int_unlock(lock);
 }
+
+#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wuninitialized"
+#endif
+
+#if BACKTRACE_EN
 
 static const char trace_new_line[] = TRACE_NEW_LINE;
 
@@ -1529,7 +1532,7 @@
     trace_output_blocking(separate_line, sizeof(separate_line) - 1);
 
     // Timestamp
-    len += mk_snprintf(&trace_handle.tx_buf[len], sizeof(trace_handle.tx_buf) - (uint32_t)len, "%10d | " TRACE_NEW_LINE, sys_tick_us());
+    len += mk_snprintf(&trace_handle.tx_buf[len], sizeof(trace_handle.tx_buf) - (uint32_t)len, "%10d | " TRACE_NEW_LINE, rtc_us());
 
     // Title and PC
     len += mk_snprintf(&trace_handle.tx_buf[len], sizeof(trace_handle.tx_buf) - (uint32_t)len, TRACE_NEW_LINE "### ASSERT @ 0x%08X ###" TRACE_NEW_LINE,
@@ -1589,8 +1592,8 @@
 #if defined(__CC_ARM)
 
 #else
-__ASM volatile("mov %0, sp" : "=r"(sp));
-__ASM volatile("mov %0, lr" : "=r"(lr));
+    __ASM volatile("mov %0, sp" : "=r"(sp));
+    __ASM volatile("mov %0, lr" : "=r"(lr));
 #endif
 
     // Parameters
@@ -1626,7 +1629,7 @@
     uint32_t *stack;
 
     // Timestamp
-    len += mk_snprintf(&trace_handle.tx_buf[len], sizeof(trace_handle.tx_buf) - (uint32_t)len, "%10d | " TRACE_NEW_LINE, sys_tick_us());
+    len += mk_snprintf(&trace_handle.tx_buf[len], sizeof(trace_handle.tx_buf) - (uint32_t)len, "%10d | " TRACE_NEW_LINE, rtc_us());
 
     // Title
     len += mk_snprintf(&trace_handle.tx_buf[len], sizeof(trace_handle.tx_buf) - (uint32_t)len,

--
Gitblit v1.9.3