2.2 UART
要输出 "Hello World!",一个关键问题是由哪个设备输出?一台计算机拥有许多输出 设备,如显示器,声卡,串口。而在虚拟机 qemu 上,uart 串口是常用的 输出设备。
查看 riscv64-virt.dts uart 部分
uart@10000000 {
interrupts = <0x0a>;
interrupt-parent = <0x03>;
clock-frequency = "\08@";
reg = <0x00 0x10000000 0x00 0x100>;
compatible = "ns16550a";
};
reg = <0x10000000 0x100>- uart 设备占用的地址空间compatible = "ns16550a"- uart 设备和 ns16550a 兼容
使用 uart 设备
通过设备描述,得知 riscv virt 的 uart 设备和 ns16550a 兼容,即该设备工作方式 和 ns16550a 相同,可以按照 ns16550a 的方式使用,也就是驱动。
通常设备都会将其控制寄存器映射在地址空间上,通过读写地址来使用这些设备,这种 方式就称为设备驱动。
重点参照 ns16550a 控制简介
ns16550a 占用了 256 个字节的地址空间,但仅使用了 10 个字节的有效空间。并且从 0x10000000 起,每个字节代表一个功能寄存器,但特例是 RHR 和 THR 即读写通道。 读写通道均映射在该地址上,并通过读写指令来区分其功能。
RHR - 0x1000000 + 0x0- 读寄存器THR - 0x1000000 + 0x0- 写寄存器IER - 0x1000000 + 0x1FCR - 0x1000000 + 0x2ISR - 0x1000000 + 0x3LCR - 0x1000000 + 0x4MCR - 0x1000000 + 0x5LSR - 0x1000000 + 0x6MSR - 0x1000000 + 0x7SPR - 0x1000000 + 0x8
通过以上信息可知,往 THR 写入字符即可进行输出。