[localhost] out: Generated Address Map
[localhost] out: 3000 - 4000 ARWX error-device@3000
[localhost] out: 4000 - 5000 ARW boot-address-reg@4000
[localhost] out: 10000 - 20000 R X rom@10000
[localhost] out: 110000 - 111000 ARW tile-reset-setter@110000
[localhost] out: 2000000 - 2010000 ARW clint@2000000
[localhost] out: 2010000 - 2011000 ARW cache-controller@2010000
[localhost] out: c000000 - 10000000 ARW interrupt-controller@c000000
[localhost] out: 10015000 - 10016000 ARW blkdev-controller@10015000
[localhost] out: 54000000 - 54001000 ARW serial@54000000
[localhost] out: 80000000 - 480000000 ARWXC memory@80000000
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#ifndef BAREMETAL
#include <sys/mman.h>
#endif
#define UART_REG_TXFIFO 0
#define UART_REG_RXFIFO 1
#define UART_REG_TXCTRL 2
#define UART_REG_RXCTRL 3
#define UART_TXCTRL_TXEN 0x1
#define UART_RXCTRL_RXEN 0x1
uint32_t* uart_base = (int *) 0x54000000;
void set_reg(uint32_t num, uint32_t val)
{
uart_base[num] = val;
}
static void uart_putc(char ch)
{
volatile uint32_t *uart = (volatile uint32_t*) uart_base;
while ((int32_t)(uart[UART_REG_TXFIFO]) < 0);
uart[UART_REG_TXFIFO] = ch;
}
int uart_getc()
{
uint32_t ch;
volatile uint32_t *uart = (volatile uint32_t*) uart_base;
do{
ch = uart[UART_REG_RXFIFO];
} while ((ch & 0xFF) <= 0);
return (int)ch;
}
int main (int argc, char * argv[]) {
#ifndef BAREMETAL
if (mlockall(MCL_CURRENT | MCL_FUTURE) != 0) {
perror("mlockall failed");
exit(1);
}
#endif
char ch;
/* Enable TX */
set_reg(UART_REG_TXCTRL, UART_TXCTRL_TXEN);
/* Enable Rx */
set_reg(UART_REG_RXCTRL, UART_RXCTRL_RXEN);
printf("We are starting...\n");
/* Test sending characters to the UART */
uart_putc('U');
uart_putc('A');
uart_putc('R');
uart_putc('T');
uart_putc(':');
uart_putc(' ');
uart_putc('H');
uart_putc('e');
uart_putc('y');
uart_putc('\n');
/* Test receiving characters from the UART */
printf("This is the character I received from the UART: |%c|\n", uart_getc());
printf("... and we are done.\n");
return 0;
}