Allwinner A10のUART出力をベアメタルで動かしてみました。
QEMUで動かしてみました。
QEMUの場合は初期化しなくとも、とりあえずデータ出力が確認できるので簡単です。
コード
# include <stddef.h>
# include <stdint.h>
extern void io_halt(void);
# define UART0_THR ((volatile uint32_t *)(0x01C28000))
void uart_putc(unsigned char c)
{
*UART0_THR = c;
}
void uart_puts(const char* str)
{
for (size_t i = 0; str[i] != '\0'; i ++)
uart_putc((unsigned char)str[i]);
}
void kernel_main(void)
{
uart_puts("uart01: uart tx\n");
uart_puts("exit : Ctrl-A x ,monitor : Ctrl-A c\n\n");
while (1)
io_halt();
}
UART0_THRに一文字分のデータを書き込めばUART0にデータを出力します。
実行例
QEMUにはAllwinner A10を搭載したcubueboardのエミュレーション機能があります。
オプションでUART0 を 標準出力に割り当てます。
qemu-system-arm -M cubieboard -m 512 -serial mon:stdio -kernel kernel.elf -nographic
uart01: uart tx
exit : Ctrl-A x ,monitor : Ctrl-A c
参考
- AllwinnerA64(SOPINE)でGPIOとUARTをBaremetalで使ってみた
- こちらの記事では、初期化をちゃんと行って実機で動くコードになっているみたいです。
- https://linux-sunxi.org/A10
- レジスタ仕様が載っているUsers manualがダウンロードできます。