- UID
- 1029342
- 性别
- 男
|
[url=]9.1.4 DMA 编程[/url] 被编程的 DMA 通道在装载任何设定之前应该总是被“屏蔽”。因为硬件可能会意想不到的给那个通道发送 DRQ 信号,而且 DMA 会回应,甚至在全部参数还没有被装载或者更新之前。
一旦被屏蔽,主机必须指出数据传输的方向(内存到 I/O 或者 I/O 到内存), DMA 操作使用什么模式(Single, Block, Demand, Cascade 等等),而且最后还要明确地址和数据的长度。数据的长度比你希望 DMA 传输的数据的长度要短。地址和 数据长度的 LSB 和 MSB被写到同一个 8比特的 I/O 端口,因此另一个必须被提前 写入数据以保证 DMA 能接受第一个字节为 LSB 而第二个字节为 MSB。
然后,确认更新页面计数器,这个计数器不在 DMA 里面而且也必须从不同的 I/O 端口去访问。
一旦所有的设定准备好了,DMA 通道就会被打开。DMA 通道已经被确认 “武装”好了,将回应通道上传来的 DRQ 信号。
请参考硬件数据书籍以获得详细的 8237 编程细节。可能你还要参考一些 PC 系统 I/O 端口映射的资料。这些资料描述了 DMA 和页面寄存器的具体位置。以下是一个完整的端口映射表格。
[url=]9.1.5 DMA 端口映射[/url] 所有基于 IBM-PC 和 PC/AT 的系统的 DMA 都位于相同的 I/O端口。以下是一个完整的列表。在非 AT 的设计中的 DMA 控制器 2 使用的端口是未定义的。
[url=]9.1.5.1 0x00-0x1f DMA 控制器 1 (通道 0, 1, 2 和 3)[/url] DMA 地址和计数寄存器
0x00 | 写 | 通道 0 开始地址 | 0x00 | 读 | 通道 0 目前地址 | 0x01 | 写 | 通道 0 初始字数统计 | 0x01 | 读 | 通道 0 剩余字数统计 | 0x02 | 写 | 通道 1 开始地址 | 0x02 | 读 | 通道 1 目前地址 | 0x03 | 写 | 通道 1 初始字数统计 | 0x03 | 读 | 通道 1 剩余字数统计 | 0x04 | 写 | 通道 2 开始地址 | 0x04 | 读 | 通道 2 目前地址 | 0x05 | 写 | 通道 2 初始字数统计 | 0x05 | 读 | 通道 2 剩余字数统计 | 0x06 | 写 | 通道 3 开始地址 | 0x06 | 读 | 通道 3 目前地址 | 0x07 | 写 | 通道 3 初始字数统计 | 0x07 | 读 | 通道 3 剩余字数统计 |
DMA 指令寄存器
0x08 | 写 | 指令寄存器 | 0x08 | 读 | 状态寄存器 | 0x09 | 写 | 需求寄存器 | 0x09 | 读 | - | 0x0a | 写 | 单屏蔽寄存比特位 | 0x0a | 读 | - | 0x0b | 写 | 模式寄存器 | 0x0b | 读 | - | 0x0c | 写 | 清除 LSB/MSB Flip-Flop | 0x0c | 读 | - | 0x0d | 写 | 主 清除/重置 | 0x0d | 读 | 临时寄存器 (在较新的版本中没有) | 0x0e | 写 | 清除屏蔽寄存器 | 0x0e | 读 | - | 0x0f | 写 | 写入所有屏蔽寄存器比特位 | 0x0f | 读 | 读出所有屏蔽寄存器比特位 (只有 Intel 82374 有) |
[url=]9.1.5.2 0xc0-0xdf DMA 控制器 2 (通道 4, 5, 6 和 7)[/url] DMA 地址和计数寄存器
0xc0 | 写 | 通道 4 开始地址 | 0xc0 | 读 | 通道 4 目前地址 | 0xc2 | 写 | 通道 4 初始字数统计 | 0xc2 | 读 | 通道 4 剩余字数统计 | 0xc4 | 写 | 通道 5 开始地址 | 0xc4 | 读 | 通道 5 目前地址 | 0xc6 | 写 | 通道 5 初始字数统计 | 0xc6 | 读 | 通道 5 剩余字数统计 | 0xc8 | 写 | 通道 6 开始地址 | 0xc8 | 读 | 通道 6 目前地址 | 0xca | 写 | 通道 6 初始字数统计 | 0xca | 读 | 通道 6 剩余字数统计 | 0xcc | 写 | 通道 7 开始地址 | 0xcc | 读 | 通道 7 目前地址 | 0xce | 写 | 通道 7 初始字数统计 | 0xce | 读 | 通道 7 剩余字数统计 |
DMA 指令寄存器
0xd0 | 写 | 指令寄存器 | 0xd0 | 读 | 状态 | 0xd2 | 写 | 需求寄存器 | 0xd2 | 读 | - | 0xd4 | 写 | 单屏蔽寄存器比特位 | 0xd4 | 读 | - | 0xd6 | 写 | 模式寄存器 | 0xd6 | 读 | - | 0xd8 | 写 | 清除 LSB/MSB Flip-Flop | 0xd8 | 读 | - | 0xda | 写 | 主 清除/重置 | 0xda | 读 | 临时寄存器 (Intel 82374 没有) | 0xdc | 写 | 清楚屏蔽寄存器 | 0xdc | 读 | - | 0xde | 写 | 写所有屏蔽寄存器比特位 | 0xdf | 读 | 读所有屏蔽寄存器比特位 (只有 Intel 82374 有) |
[url=]9.1.5.3 0x80-0x9f DMA 页面寄存器[/url]0x87 | 读/写 | 通道 0 低位 (23-16) 页面寄存器 | 0x83 | 读/写 | 通道 1 低位 (23-16) 页面寄存器 | 0x81 | 读/写 | 通道 2 低位 (23-16) 页面寄存器 | 0x82 | 读/写 | 通道 3 低位 (23-16) 页面寄存器 | 0x8b | 读/写 | 通道 5 低位 (23-16) 页面寄存器 | 0x89 | 读/写 | 通道 6 低位 (23-16) 页面寄存器 | 0x8a | 读/写 | 通道 7 低位 (23-16) 页面寄存器 | 0x8f | 读/写 | 低位页面刷新 |
|
|