53c700 驱动程序说明¶
一般描述¶
此驱动程序支持 53c700 和 53c700-66 芯片。它还支持 53c710,但仅在 53c700 模拟模式下。它功能齐全,支持同步(仅限 -66 和 710)、断开连接和标签命令队列。
由于 53c700 必须连接到总线,因此您需要将卡检测器封装在此驱动程序周围。有关示例,请参见 NCR_D700.[ch] 或 lasi700.[ch] 文件。
53c700.[ch] 文件中的注释会告诉您需要填写哪些部分才能使驱动程序正常工作。
编译时标志¶
编译时标志是
CONFIG_53C700_LE_ON_BE
定义芯片组是否必须在 big endian 架构上的 little endian 模式下受支持(用于 parisc 上的 700)。
使用芯片核心驱动程序¶
为了将 53c700 芯片核心驱动程序连接到可工作的 SCSI 驱动程序中,您需要了解有关芯片连接到系统(或扩展卡)的方式的三件事。
SCSI 核心的时钟速度
使用的中断线
53c700 寄存器的内存(或 io 空间)位置。
可选地,您可能还需要了解其他事项,例如如何从卡 BIOS 读取 SCSI Id 或芯片是否接线用于差分操作。
通常,您可以从一般规范文档中找到第 2 项和第 3 项,甚至可以通过检查另一个操作系统下工作驱动程序的配置来找到它们。
时钟速度通常深埋在技术文献中。之所以需要它,是因为它用于设置芯片的同步和异步分频器。作为一般的经验法则,制造商将时钟速度设置为与芯片的最佳运行一致的最低可能设置(尽管有些人选择从 CPU 或总线时钟驱动它,而不是花费额外的时钟芯片)。最佳运行速度为
53c700 |
25MHz |
53c700-66 |
50MHz |
53c710 |
40Mhz |
编写您的胶水驱动程序¶
这将是一个标准的 SCSI 驱动程序(我不知道有什么好的文档描述这一点,只需从其他一些驱动程序复制即可),至少有一个检测和释放条目。
在检测例程中,您需要分配一个 struct NCR_700_Host_Parameters 大小的内存区域并清除它(以便所有内容的默认值为 0)。然后,您必须填写对您重要的参数(请参见下文),将 NCR_700_intr 例程连接到中断线,并以主机模板和新参数作为参数调用 NCR_700_detect。您还应该调用相关的 request_*_region 函数,并将寄存器基地址放置到主机参数的“base”指针中。
在释放例程中,您必须释放您分配的 NCR_700_Host_Parameters,调用相应的 release_*_region 并释放中断。
处理中断¶
通常,您应该使用以下命令连接卡的 中断线:
request_irq(irq, NCR_700_intr, <irq 标志>, <驱动程序名称>, 主机);
其中主机是从相关的 NCR_700_detect() 例程返回的。
您也可以编写自己的中断处理例程,该例程直接调用 NCR_700_intr()。但是,只有当您的卡上有多个芯片并且您可以读取寄存器来判断哪组芯片需要中断时,您才应该真正这样做。
可设置的 NCR_700_Host_Parameters¶
以下是用户可设置参数的列表
- clock: (必需)
设置为芯片的时钟速度(以 MHz 为单位)。
- base: (必需)
设置为寄存器集的 io 或 mem 区域的基地址。在 64 位架构上,这只有 32 位宽,因此寄存器必须映射到内存的低 32 位。
- pci_dev: (可选)
设置为 PCI 板设备。对于非 pci 板,请保留 NULL。这用于 pci_alloc_consistent() 和 pci_map_*() 函数。
- dmode_extra: (可选,仅限 53c710)
DMODE 寄存器的额外标志。这些用于控制 710 上的总线输出引脚。这些设置应该是 DMODE_FC1 和 DMODE_FC2 的组合。这些引脚实际做什么完全取决于板设计者。通常忽略此设置是安全的。
- differential: (可选)
如果芯片驱动差分总线,则设置为 1。
- force_le_on_be:(可选,仅当设置了 CONFIG_53C700_LE_ON_BE 时)
如果芯片以 big endian 架构上的 little endian 模式运行,则设置为 1。
- chip710: (可选)
如果芯片是 53c710,则设置为 1。
- burst_disable: (可选,仅限 53c710)
禁用 DMA 传输的 8 字节突发。