You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
63 lines
1.4 KiB
63 lines
1.4 KiB
1 year ago
|
#include <stdint.h>
|
||
|
|
||
|
#include "uart.h"
|
||
|
|
||
|
|
||
|
static struct uart_memory_map *const uart_mm[] = {
|
||
|
(struct uart_memory_map *const)UART_0_ADDR,
|
||
|
(struct uart_memory_map *const)UART_1_ADDR,
|
||
|
};
|
||
|
|
||
|
|
||
|
// set the baudrate on the chosen uart, if the baud rate is incorrect or invalid
|
||
|
// then set it to the default value, return the set baudrate value
|
||
|
int uart_set_baudrate(uart_id id, int baud)
|
||
|
{
|
||
|
// FIXME: actually set the baud rate, for now leave it as the default
|
||
|
(void)baud;
|
||
|
(void)id;
|
||
|
return 115200;
|
||
|
}
|
||
|
|
||
|
|
||
|
// initialize the uart registers for transmit and receive
|
||
|
// TODO: also initialize interrupts and thesholds
|
||
|
int uart_init(uart_id id, uint32_t baud, int stop_bits)
|
||
|
{
|
||
|
// FIXME: check baud rate error and propagate it
|
||
|
(void)uart_set_baudrate(id, baud);
|
||
|
|
||
|
// change the number of stop bits only if stop_bits > 0
|
||
|
if (stop_bits > 0)
|
||
|
uart_mm[id]->txctrl.nstop = !!stop_bits;
|
||
|
|
||
|
uart_mm[id]->txctrl.txen = 1;
|
||
|
uart_mm[id]->rxctrl.rxen = 1;
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
|
||
|
// transmit a byte of data through a uart line
|
||
|
void uart_tx_byte(uart_id id, unsigned char b)
|
||
|
{
|
||
|
uart_mm[id]->txdata.data = b;
|
||
|
}
|
||
|
|
||
|
|
||
|
// busy-wait until the uart buffer is cleared
|
||
|
void uart_tx_full(uart_id id)
|
||
|
{
|
||
|
while (uart_mm[id]->txdata.full);
|
||
|
}
|
||
|
|
||
|
|
||
|
// send a buffer through uart
|
||
|
void uart_tx_buf(uart_id id, unsigned char *buf, unsigned int size)
|
||
|
{
|
||
|
for (unsigned int i = 0; i < size; i++) {
|
||
|
uart_tx_byte(id, buf[i]);
|
||
|
uart_tx_full(id);
|
||
|
}
|
||
|
}
|