#include "hal.h"
|
|
#include <stddef.h>
|
|
|
|
/* Murax UART */
|
|
|
|
typedef struct {
|
|
volatile uint32_t DATA;
|
|
volatile uint32_t STATUS;
|
|
volatile uint32_t CLOCK_DIVIDER;
|
|
volatile uint32_t FRAME_CONFIG;
|
|
} Uart_Reg;
|
|
|
|
enum UartParity { NONE = 0, EVEN = 1, ODD = 2 };
|
|
enum UartStop { ONE = 0, TWO = 1 };
|
|
|
|
typedef struct {
|
|
uint32_t dataLength;
|
|
enum UartParity parity;
|
|
enum UartStop stop;
|
|
uint32_t clockDivider;
|
|
} Uart_Config;
|
|
|
|
static uint32_t uart_writeAvailability(Uart_Reg* reg)
|
|
{
|
|
return (reg->STATUS >> 16) & 0xFF;
|
|
}
|
|
|
|
static void uart_write(Uart_Reg* reg, uint32_t data)
|
|
{
|
|
while (uart_writeAvailability(reg) == 0)
|
|
;
|
|
reg->DATA = data;
|
|
}
|
|
|
|
#define UART ((Uart_Reg*)(0xF0010000))
|
|
|
|
void hal_send(const uint8_t* in, const size_t len) {
|
|
for (size_t i = 0; i < len; i++) {
|
|
uart_write(UART, in[i]);
|
|
}
|
|
}
|
|
|
|
void hal_send_str(const char* in)
|
|
{
|
|
const char* cur = in;
|
|
while(*cur) {
|
|
uart_write(UART, *cur);
|
|
cur += 1;
|
|
}
|
|
}
|
|
|
|
__attribute__((naked)) uint64_t hal_get_time(void)
|
|
{
|
|
#define LE "\n\t"
|
|
asm volatile (LE"csrr a1, mcycleh"
|
|
LE"csrr a0, mcycle"
|
|
LE"csrr a2, mcycleh"
|
|
LE"bne a1, a2, hal_get_time"
|
|
LE"ret");
|
|
}
|