如何在16位x86实模式下通过BIOS访问USB端口?

4

我是一个汇编世界的新手,

我正在尝试编写一些汇编代码来与硬件设备如串口、并口、VGA、键盘等进行通信。

我是在x86英特尔处理器的实模式下进行的,通过从我个人编写的引导程序中引导我的汇编代码来完成。

根据我从教程中学到的知识,最简单的方法是使用BIOS INTs服务例程(ISR),而访问硬件不同寄存器(例如:串行端口的状态寄存器和控制寄存器)的最长方法则是另一种方式……

问题1:我对此理解正确吗?

我可以使用BIOS INTs与VGA和串行硬件通信,但我找不到任何用于USB控制器的bios中断……?!

问题2:你能帮我解决这个问题并使其变得更加通俗易懂吗?其他剩余的端口也请做一般性的说明。

问题3:


你为什么想要编写汇编代码?为什么不在操作系统上方编写代码(例如Linux的某些程序)?你的目标是什么(学习汇编语言,编写操作系统)?现今的编译器生成的汇编代码比大多数人能够编写的更好。 - Basile Starynkevitch
4
这就像是一部电影,你可以看到人类与恐龙搏斗。USB的发明时间与32位操作系统普及的时间相差甚远,这是一个时间上的错位。因此,从来没有16位的支持,也没有必要。 - Hans Passant
1
OP的问题很严肃。我认为像“如果已经安装了某些软件,为什么不以某种方式处理”这样的答案并不适用于汇编程序员,即使该软件是操作系统或BIOS,你也几乎不会假设任何软件已经安装。考虑到你正在编写一个BIOS模块。 - xmllmx
3个回答

5

5

正如Alex所说,目前还没有适用于所有BIOS层面的USB支持。不过,已经有一些尝试制作实模式DOS驱动程序以支持USB设备的做法。我找到了一个包含一些源代码的页面,您应该能够使用:http://bretjohnson.us/source/source.htm


4

PC BIOS中没有任何支持USB I/O的内容,与所有其他I/O(键盘、显示器、串行、并行、磁盘、扬声器)不同。USB来得太晚了。BIOS中唯一与USB相关的事情是支持连接USB键盘和存储设备(现代PC可以从它们引导)。除此之外,您必须自己实现USB堆栈。


@ Alex 所以我猜编写自己的USB堆栈函数只能在保护模式(32位模式)下进行,对吗? 你能给我一些好的资源来帮助我在保护模式下使用汇编或C编程USB吗? 或者你有什么建议吗,Alex? - KhiloMilitant Khilo
它不必在保护模式下运行,硬件不关心CPU处于哪种模式。我无法提供USB参考资料,因为我自己对USB并不熟悉。我只能说有一个USB标准,您可以与Linux USB代码一起学习,以了解USB的工作原理以及如何编程。 - Alexey Frunze

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接