mirror of
https://github.com/CTCaer/hekate
synced 2024-12-22 11:21:23 +00:00
uart: Add timeout and len report to uart receive
This commit is contained in:
parent
da112a0ae9
commit
e3fca2bce5
4 changed files with 44 additions and 12 deletions
|
@ -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))
|
||||
;
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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))
|
||||
;
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue