3

我想知道,究竟是如何在没有系统库的情况下使用汇编或 C 直接读写 I/O 设备的。例如,我知道您可以通过将字符数据写入 0xB8000 以在 x86 实模式下渲染到基于文本的 VGA。但是,您如何在其他 CPU 架构上访问其他设备?它们是从一开始就进行内存映射的,还是有技巧让它们在你需要的时候出现?

具体来说,我想知道,在 C 或 ARM asm 中,我将如何以文本模式、usb 端口和 ps/2 端口读取/写入 vga。我不需要了解标准通信协议,我可以自己弄清楚。我只想知道如何识别端口和其他设备并与之通信。

对于编译器和汇编器,我使用在 x86_64 上运行的交叉编译 GNU 工具链作为主机架构。我在目标机器上没有任何库或操作系统,所以我实际上只是制作平面二进制文件并将它们写入 sd 卡的引导扇区。硬件是树莓派模型 b。

4

3 回答 3

4

如果您要问这个级别的问题,vga 文本模式距离您应该尝试的第一件事还有很长的路要走。尽管这当然取决于您的平台。如果这是一个树莓派,那么我仍然会从闪烁的 LED 开始,然后是 uart,然后如果你愿意,可以做视频,树莓派上的视频非常简单。文本模式,没有,你必须绘制像素,但是对基于光栅的字体有一点经验(在你的 x86 机器上做这个,制作位图或打印 xxes 和 00 的字符串或其他东西)你可以很容易地想出一个字体集然后为每个字符绘制像素。

语言与它无关,C 或 asm 工作正常,大多数人只在需要时使用 C 和 asm,这也是我会给出的建议。

我有很多裸机示例(github.com/dwelch67),其中一个为 gba 做了一些 8x8 字体的字体,你可以从我这里窃取我不在乎。我还没有真正做树莓派视频的东西,但是有很多例子,你通过一次旋转来获得手臂地址空间中的指针(并设置视频模式等)然后它只是一个问题将像素数据写入该内存范围,然后 gpu 将其回显到视频卡。

可以使用 beaglebone black 或 allwinner 卡之一(pcduino、apc.io)(由于缺乏文档,我会避免使用这些卡),它们具有与树莓派不同的视频接口,因此涉及更多工作。我还没有弄清楚裸机的 beaglebone black,并且有一些全赢的信息,但还没有在那里做过任何真正的裸机。所以除非你知道别人做过,否则不要买。实际上,如果视频真的是您所追求的,那么早期的 ipods,classi gen 1 - 至少 5,ipod nano gen 1,并不难做视频。gameboy Advance 非常简单,有大量示例,visualboyadvance 是一个很好的模拟器,所以你不需要硬件,你现在就可以开始编写 arm 代码来绘制像素。

hawkboard 和 pandaboard 也是你可能想看的东西,我想它们都有视频,我有几个 hawkboards,裸金属很容易,没有 pandaboard。我也用过open-rd board,不记得上面有什么了...

如果您想要类似 pcie 卡的 PC 体验,您必须设置根复合体、重置和训练端点、配置它们,然后您可以与它们交谈,并根据视频芯片/板确定多少即使是最简单的视频任务也涉及工作。(如果视频卡使用系统内存,那么您必须启动它,如果是 ddr,那么与启动 ddr 相比,pcie 非常微不足道)。

从游戏男孩高级模拟器开始。

于 2013-05-22T21:45:08.590 回答
3

实际上,您对 VGA 的说法只是部分正确;在模式下,这是正确的。历史教训:DOS 只提供 640K 内存的原因是为设备驱动程序保留剩余的可寻址内存。这和Linux内核被压缩的原因是一样的;直到处理器切换到保护模式,在这种情况下,每个进程都有自己的虚拟内存空间。设备驱动程序(基本上)在某种程度上通过将对驱动程序的调用转换为实际获取数据并将数据放入设备的硬件缓冲区来工作。

tl;博士。您要问的是特定于您正在写入的硬件和操作系统。对不起,我不能更具体。

于 2013-05-22T20:54:45.853 回答
1

您可以从 a) 选择一个汇编架构开始,例如 MIPS 或类似的。如果您之前没有编程过汇编程序,我建议您选择 MIPS,因为它比 x86 更容易,然后 b) 开始研究如何使用串行端口传输数据,因为这说明了使用的内存映射 i/o。如果您正在训练,FPGA 是学习这一点的好方法。

要写入硬件,您确实使用内存映射 i/o 写入某些内存地址。我找不到任何文档 ARm 是如何做到的,但在 Nios 2 程序集(这是一个 RISC)中,写入硬件例如:将值 0x17 写入地址 0x810 将点亮 LED LEDR4、LEDR2、LEDR1 和 LEDR0 以及串行端口还有一个内存地址,您可以将传输数据写入该地址。

于 2013-05-22T21:14:43.557 回答