3 #include <debug-uart.h> 6 #include <lib/assert.h> 7 #include <app_util_platform.h> 10 #ifndef DBG_XMIT_BUFFER_LEN 11 #define DBG_XMIT_BUFFER_LEN 1024 14 struct dbg_uart_state_t {
16 uint8_t *
volatile xmit_buffer_head;
17 uint8_t *
volatile xmit_buffer_tail;
19 uint8_t write_overrun;
20 uint8_t xmit_buffer[DBG_XMIT_BUFFER_LEN];
23 struct dbg_uart_state_t dbg_uart_state;
24 #define XMIT_BUFFER_END(s) (&(s)->xmit_buffer[DBG_XMIT_BUFFER_LEN]) 26 static void dbg_uart_event_hander(
const struct uart_t *uart,
void *
data);
30 struct dbg_uart_state_t *s = &dbg_uart_state;
31 s->xmit_buffer_head = s->xmit_buffer;
32 s->xmit_buffer_tail = s->xmit_buffer;
38 struct dbg_uart_state_t *s = &dbg_uart_state;
41 if (s->xmit_buffer_tail == s->xmit_buffer_head)
44 if (s->xmit_buffer_head < s->xmit_buffer_tail)
45 bytes = s->xmit_buffer_tail - s->xmit_buffer_head;
47 bytes = XMIT_BUFFER_END(s) - s->xmit_buffer_head;
53 UartStartBasicTx(s->uart, s->xmit_buffer_head, bytes, dbg_uart_event_hander, NULL);
59 static void dbg_uart_event_hander(
const struct uart_t *uart,
void *
data)
61 struct dbg_uart_state_t *s = &dbg_uart_state;
62 CRITICAL_REGION_ENTER();
63 s->xmit_buffer_head += s->dma_size;
64 if (s->xmit_buffer_head == XMIT_BUFFER_END(s))
65 s->xmit_buffer_head = s->xmit_buffer;
66 dbg_uart_state.dma_size = update_dma();
67 CRITICAL_REGION_EXIT();
71 dbg_send_bytes(
const uint8_t *
seq,
unsigned int len)
75 struct dbg_uart_state_t *s = &dbg_uart_state;
76 uint8_t *head = s->xmit_buffer_head;
77 uint8_t *tail = s->xmit_buffer_tail;
81 unsigned int xfer_len = XMIT_BUFFER_END(s) - tail;
82 unsigned int free = DBG_XMIT_BUFFER_LEN - (tail - head) - 1;
87 memcpy(tail, seq, xfer_len);
89 xfer_len = len - xfer_len;
90 memcpy(s->xmit_buffer, seq, xfer_len);
91 tail = s->xmit_buffer + xfer_len;
93 memcpy(tail, seq, len);
95 if (tail == XMIT_BUFFER_END(s))
96 tail = s->xmit_buffer;
100 unsigned int free = (head - tail) - 1;
103 memcpy(tail, seq, len);
109 CRITICAL_REGION_ENTER();
110 s->xmit_buffer_tail = tail;
111 if (!dbg_uart_state.dma_size)
112 dbg_uart_state.dma_size = update_dma();
113 CRITICAL_REGION_EXIT();
120 dbg_putchar(
const char ch)
122 struct dbg_uart_state_t *s = &dbg_uart_state;
123 if (s->write_overrun) {
124 if (dbg_send_bytes((
const uint8_t*)
"^", 1) != 1)
127 s->write_overrun = 0;
128 if (dbg_send_bytes((
const uint8_t*)&ch, 1) != 1) {
129 s->write_overrun = 1;
134 dbg_blocking_putchar(
const char ch)
136 struct dbg_uart_state_t *s = &dbg_uart_state;
137 if (s->write_overrun) {
138 while (dbg_send_bytes((
const uint8_t*)
"^", 1) != 1)
141 s->write_overrun = 0;
142 while (dbg_send_bytes((
const uint8_t*)&ch, 1) != 1)
149 struct dbg_uart_state_t *s = &dbg_uart_state;
150 while(s->xmit_buffer_tail != s->xmit_buffer_head)
160 dbg_uart_set_uart(
const struct uart_t *uart)
162 struct dbg_uart_state_t *s = &dbg_uart_state;
Abstract UART driver header.
Header file for the EVE power management framework.
static void UartStartBasicTx(const struct uart_t *Uart, uint8_t *DataSrc, uint16_t DataSize, uart_tx_callback_t Callback, void *CallbackData)
Name: UartStartBasicTx Transmit data using DMA transfer in basic mode. Using primary DMA descriptor o...
uint8_t data[USBNET_RX_BUF_SIZE]