uart: Add timeout and len report to uart receive

This commit is contained in:
CTCaer 2019-12-16 22:15:21 +02:00
parent da112a0ae9
commit e3fca2bce5
4 changed files with 44 additions and 12 deletions

View file

@ -65,7 +65,7 @@ void uart_wait_idle(u32 idx, u32 which)
}
}
void uart_send(u32 idx, u8 *buf, u32 len)
void uart_send(u32 idx, const u8 *buf, u32 len)
{
uart_t *uart = (uart_t *)(UART_BASE + uart_baseoff[idx]);
@ -77,14 +77,30 @@ void uart_send(u32 idx, u8 *buf, u32 len)
};
}
void uart_recv(u32 idx, u8 *buf, u32 len)
u32 uart_recv(u32 idx, u8 *buf, u32 len)
{
uart_t *uart = (uart_t *)(UART_BASE + uart_baseoff[idx]);
u32 timeout = get_tmr_us() + 1000;
u32 i;
for (u32 i = 0; i != len; i++)
for (i = 0; ; i++)
{
while (!(uart->UART_LSR & UART_LSR_RDR))
;
buf[i] = uart->UART_THR_DLAB;
};
{
if (!len)
{
if (timeout < get_tmr_us())
break;
}
else if (len < i)
break;
}
if (timeout < get_tmr_us())
break;
buf[i] = uart->UART_THR_DLAB;
timeout = get_tmr_us() + 1000;
};
return i ? (len ? (i - 1) : i) : 0;
}

View file

@ -76,7 +76,7 @@ typedef struct _uart_t
void uart_init(u32 idx, u32 baud);
void uart_wait_idle(u32 idx, u32 which);
void uart_send(u32 idx, u8 *buf, u32 len);
void uart_recv(u32 idx, u8 *buf, u32 len);
void uart_send(u32 idx, const u8 *buf, u32 len);
u32 uart_recv(u32 idx, u8 *buf, u32 len);
#endif

View file

@ -65,7 +65,7 @@ void uart_wait_idle(u32 idx, u32 which)
}
}
void uart_send(u32 idx, u8 *buf, u32 len)
void uart_send(u32 idx, const u8 *buf, u32 len)
{
uart_t *uart = (uart_t *)(UART_BASE + uart_baseoff[idx]);
@ -77,14 +77,30 @@ void uart_send(u32 idx, u8 *buf, u32 len)
};
}
void uart_recv(u32 idx, u8 *buf, u32 len)
u32 uart_recv(u32 idx, u8 *buf, u32 len)
{
uart_t *uart = (uart_t *)(UART_BASE + uart_baseoff[idx]);
u32 timeout = get_tmr_us() + 1000;
u32 i;
for (u32 i = 0; i != len; i++)
for (i = 0; ; i++)
{
while (!(uart->UART_LSR & UART_LSR_RDR))
;
buf[i] = uart->UART_THR_DLAB;
};
{
if (!len)
{
if (timeout < get_tmr_us())
break;
}
else if (len < i)
break;
}
if (timeout < get_tmr_us())
break;
buf[i] = uart->UART_THR_DLAB;
timeout = get_tmr_us() + 1000;
};
return i ? (len ? (i - 1) : i) : 0;
}

View file

@ -76,7 +76,7 @@ typedef struct _uart_t
void uart_init(u32 idx, u32 baud);
void uart_wait_idle(u32 idx, u32 which);
void uart_send(u32 idx, u8 *buf, u32 len);
void uart_recv(u32 idx, u8 *buf, u32 len);
void uart_send(u32 idx, const u8 *buf, u32 len);
u32 uart_recv(u32 idx, u8 *buf, u32 len);
#endif