1 /*
2 * Copyright (C) 2015-2020 Alibaba Group Holding Limited
3 */
4 #include "2ndboot.h"
5 #include "hal_trace.h"
6 #include "hal_uart.h"
7 #include "libc.h"
8 #include "boot_ringbuffer.h"
9
10 static enum HAL_UART_ID_T trace_uart = HAL_UART_ID_0;
11
12 #define TRACE_RX_BUFFER_SIZE 1032
13 __SRAMBSS unsigned char hal_trace_rx_buf[TRACE_RX_BUFFER_SIZE];
14 __SRAMBSS unsigned char uart_rx_ringbuf[TRACE_RX_BUFFER_SIZE*2];
15 struct HAL_DMA_DESC_T dma_desc_rx;
16
17 static boot_ringbuff_t uart_ringbuff = {NULL, NULL, NULL, NULL, 0, 0};
18
console_hal_trace_rx_start(void)19 static void console_hal_trace_rx_start(void)
20 {
21 unsigned int desc_cnt = 1;
22 union HAL_UART_IRQ_T mask;
23
24 mask.reg = 0;
25 mask.BE = 0;
26 mask.FE = 0;
27 mask.OE = 0;
28 mask.PE = 0;
29 mask.RT = 1;
30
31 hal_uart_dma_recv_mask(trace_uart, hal_trace_rx_buf, TRACE_RX_BUFFER_SIZE, &dma_desc_rx, &desc_cnt, &mask);
32 }
33
console_uart_dma_rx_handler(uint32_t xfer_size,int dma_error,union HAL_UART_IRQ_T status)34 static void console_uart_dma_rx_handler(uint32_t xfer_size, int dma_error, union HAL_UART_IRQ_T status)
35 {
36 boot_ringbuff_fill(&uart_ringbuff, hal_trace_rx_buf, xfer_size);
37 console_hal_trace_rx_start();
38 }
39
hal_trace_rx_start(void)40 int hal_trace_rx_start(void)
41 {
42 struct HAL_UART_CFG_T uart_cfg = {
43 .dma_rx = true,
44 .dma_tx = false,
45 .dma_rx_stop_on_err = false,
46 };
47 hal_uart_reopen(trace_uart, &uart_cfg);
48 hal_uart_irq_set_dma_handler(trace_uart, console_uart_dma_rx_handler, NULL, NULL);
49 console_hal_trace_rx_start();
50
51 return 0;
52 }
53
uart_ringbuffer_init(void)54 static int uart_ringbuffer_init(void)
55 {
56 int ret;
57 uint8_t *buffer = NULL;
58
59 memset(&uart_ringbuff, 0, sizeof(uart_ringbuff));
60 buffer = uart_rx_ringbuf;
61 if(buffer == NULL) {
62 return -1;
63 }
64
65 ret = boot_ringbuff_init(&uart_ringbuff, buffer, TRACE_RX_BUFFER_SIZE*2);
66
67 return ret;
68 }
69
70
uart_init(void)71 void uart_init(void)
72 {
73 uart_ringbuffer_init();
74 hal_trace_rx_start();
75 return;
76 }
77
uart_send(unsigned char * buf,int len)78 void uart_send(unsigned char *buf, int len)
79 {
80 for (uint32_t i = 0; i < len; i++) {
81 hal_uart_blocked_putc(trace_uart, buf[i]);
82 }
83 }
84
uart_send_string(char * buf)85 void uart_send_string(char *buf)
86 {
87 int len = strlen(buf);
88 uart_send(buf, len);
89 }
90
uart_send_byte(unsigned char buf)91 void uart_send_byte(unsigned char buf)
92 {
93 hal_uart_blocked_putc(trace_uart, buf);
94 }
95
uart_recv_byte(unsigned char * c)96 unsigned char uart_recv_byte(unsigned char *c)
97 {
98 int ret = 0;
99
100 ret = boot_ringbuff_read(&uart_ringbuff, c, 1);
101
102 if(ret < 0) {
103 return 0;
104 }
105
106 return 1;
107 }
108
109