mirror of
https://github.com/CTCaer/hekate
synced 2025-01-03 10:41:14 +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]);
|
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]);
|
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))
|
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;
|
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_init(u32 idx, u32 baud);
|
||||||
void uart_wait_idle(u32 idx, u32 which);
|
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);
|
||||||
void uart_recv(u32 idx, u8 *buf, u32 len);
|
u32 uart_recv(u32 idx, u8 *buf, u32 len);
|
||||||
|
|
||||||
#endif
|
#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]);
|
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]);
|
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))
|
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;
|
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_init(u32 idx, u32 baud);
|
||||||
void uart_wait_idle(u32 idx, u32 which);
|
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);
|
||||||
void uart_recv(u32 idx, u8 *buf, u32 len);
|
u32 uart_recv(u32 idx, u8 *buf, u32 len);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue