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