| | |
| | | #if TRACE_EN |
| | | |
| | | #ifndef BACKTRACE_EN |
| | | #define BACKTRACE_EN (0) |
| | | #define BACKTRACE_EN (1) |
| | | #endif |
| | | |
| | | #ifndef TRACE_BUF_SIZE |
| | |
| | | }; |
| | | |
| | | const static char *module_name[TRACE_MODULE_NUM] = {"[MAC]", "[PHY]", "[DRV]", "[APP]", "[UWB]", "[UCI]", "[TEST]", |
| | | "[BOOT]", "[OS]", "[FIRA]", "[CCC]", "[SE]", "[SCP03]"}; |
| | | "[BOOT]", "[OS]", "[FIRA]", "[CCC]", "[SE]", "[SCP03]" |
| | | }; |
| | | |
| | | const static char *level_tag[TRACE_LEVEL_NUM] = { |
| | | "[ERROR]", |
| | |
| | | { |
| | | 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); |
| | | |
| | |
| | | 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: |
| | | case CONSOLE_RX_HEADER: |
| | | { |
| | | if (trace_handle.rx_buf[POS_PREAMBLE] == CONSOLE_CMD) |
| | | { |
| | | if (trace_handle.rx_buf[POS_PREAMBLE] == CONSOLE_CMD) |
| | | { |
| | | 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); |
| | | 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; |
| | | } |
| | | |
| | | if (crc_frame == crc_cal) |
| | | 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) |
| | | { |
| | | 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); |
| | | } |
| | | 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 CRC Error %04x %04x\r\n", crc_cal, crc_frame); |
| | | LOG_ERROR(TRACE_MODULE_DRIVER, "Console CMD ID %04x Function is Null\r\n", id); |
| | | } |
| | | trace_handle.console_fsm = CONSOLE_RX_HEADER; |
| | | uart_receive(trace_uart, &trace_handle.rx_buf[0], 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; |
| | | default: |
| | | break; |
| | | } |
| | | } |
| | | } |
| | |
| | | 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; |
| | | } |
| | | } |
| | |
| | | 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); |
| | | // |
| | |
| | | // |
| | | switch (c) |
| | | { |
| | | case '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 |
| | | { |
| | | 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 |
| | | c = *s; |
| | | s++; |
| | | if (c == '\0') |
| | | { |
| | | c = *s; |
| | | s++; |
| | | if (c == '\0') |
| | | { |
| | | break; |
| | | } |
| | | _StoreChar(&BufferDesc, c); |
| | | } while (BufferDesc.ReturnValue >= 0); |
| | | } |
| | | 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); |
| | | 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); |
| | | } |
| | | case '%': |
| | | _StoreChar(&BufferDesc, '%'); |
| | | break; |
| | | case 'p': |
| | | v = va_arg(args, int); |
| | | _PrintUnsigned(&BufferDesc, (unsigned)v, 16u, 8u, 8u, 0u); |
| | | break; |
| | | case '%': |
| | | _StoreChar(&BufferDesc, '%'); |
| | | break; |
| | | default: |
| | | break; |
| | | default: |
| | | break; |
| | | } |
| | | fmt++; |
| | | } |
| | |
| | | j = 3; |
| | | |
| | | while (*p != '\0') |
| | | { // fill begin at recdBuf[3] |
| | | { // fill begin at recdBuf[3] |
| | | if (*p != '%') |
| | | { |
| | | p++; |
| | |
| | | |
| | | switch (*++p) |
| | | { |
| | | case 's': |
| | | case 's': |
| | | { |
| | | recdBuf[j++] = 0; |
| | | dataBits |= 1 << 2 * var_count++; |
| | | } |
| | | break; |
| | | case 'c': |
| | | case 'd': |
| | | { |
| | | it = va_arg(aq, int); |
| | | if (it > 0x7FFF) |
| | | { |
| | | recdBuf[j++] = 0; |
| | | *(recdBuf + j++) = 0xff; |
| | | *(recdBuf + j++) = 0x7f; |
| | | dataBits |= 2 << 2 * var_count++; |
| | | } |
| | | |
| | | if (it < 256) |
| | | { // 1byte |
| | | recdBuf[j++] = (char)it; |
| | | dataBits |= 1 << 2 * var_count++; |
| | | } |
| | | break; |
| | | case 'c': |
| | | case 'd': |
| | | 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) |
| | | { |
| | | it = va_arg(aq, int); |
| | | if (it > 0x7FFF) |
| | | { |
| | | *(recdBuf + j++) = 0xff; |
| | | *(recdBuf + j++) = 0x7f; |
| | | dataBits |= 2 << 2 * var_count++; |
| | | } |
| | | *(recdBuf + j++) = 0xff; |
| | | *(recdBuf + j++) = 0xff; |
| | | dataBits |= 2 << 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++; |
| | | } |
| | | if (it < 0x100) //<0xFF |
| | | { // 1byte |
| | | recdBuf[j++] = (char)it; |
| | | dataBits |= 1 << 2 * var_count++; |
| | | } |
| | | break; |
| | | case 'x': |
| | | case 'X': |
| | | case 'u': |
| | | 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) |
| | | { |
| | | 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++; |
| | | } |
| | | *(recdBuf + j++) = 0xff; |
| | | *(recdBuf + j++) = 0xff; |
| | | *(recdBuf + j++) = 0xff; |
| | | *(recdBuf + j++) = 0xff; |
| | | dataBits |= 3 << 2 * var_count++; |
| | | } |
| | | break; |
| | | case 'f': |
| | | else |
| | | { |
| | | 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++; |
| | | } |
| | | *(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++; |
| | | } |
| | |
| | | #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 |