关于DMA——以前总有一个错误的认识——PCI卡的DMA操作是由主板上的DMA控制器8237控制,但是想利用8237控制器进行DMA操作,需要首先发DMA申请,然后8237会在空闲的时候发DMA允许信号。然而,通过查看PCI规范发现,PCI根本就没有相应的信号连线。后来查看了9054手册之后才知道,原来DMA控制器是嵌在了9054芯片内部,这样就不难想象DMA操作的全流程了:首先在需要传输数据的时候,通过9054和PCI向主机发中断,然后由主机通过读取中断向量来判断是何种中断,如果是需要DMA方式传输数据,则在DMA控制器的一些寄存器(源端起始地址、数据块大小、目的端起始地址寄存器等)写数据,同时会通过对9054的本地配置寄存器的操作配置DMA的操作方式等。待DMA控制器配置完毕后,DMA控制器通过LHOLD#、LHOLDA和REQ#、GNT#分别来申请占用本地总线和系统,之后进行DMA操作。
9054提供两个DMA通道,每个通道都支持Gather/Scatter(分散/集中) DMA和Block(块) DMA两种模式。这两种模式的区别在于后者要求源端和目的端的数据块都是连续存储的,否则就需要进行多次DMA操作;而前者则可以只用一次DMA操作传输非连续存储的多个数据块,但是主机或者本地处理器需要首先建立描述块(Descriptor Block: composed of PCI and Local addresses, transfer count, transfer direction, and address of next descriptor block),然后设置DMA的方式,并(用描述块的地址)初始化9054内部的DMA描述指针寄存器(Descriptor Pointer Register),最后设置DMACSR0或者DMACSR1来启动DMA操作。DMA启动之后9054首先从描述块中读出第一个描述块,然后开始DMA传输。
注:至于该描述块(Descriptor Block)如何建立还需要进一步查看9054的数据手册,可能该描述块的建立需要由驱动程序或主机程序完成。
关于中断——9054内部包含很多的中断源,都可以通过寄存器来配置是否发中断,向主机还是本地总线发中断。如果向主机发中断,则主机检测到中断之后,从9054寄存器中读取中断向量(INTCSR)来判断来进行何种中断操作;同样,如果向本地总线发中断,则由本地的处理器用同样方式来处理中断。
关于基地址寄存器——基地址寄存器是用于将本地的存储空间映射到系统得内存(或I/O)空间中,这样主机可以很方便的操作本地的存储器。在指纹比对加速卡系统中,可以采用一个基地址寄存器来映射所有的存储空间(包括库指纹缓冲、平方根表存储器、th_grade表存储器、现场指纹相关的表存储器等),然后本地接口模块检测到属于该基地址内存空间的地址时,可以通过译码来判断该地址属于哪个表数据。
基地址寄存器是一个32bit的寄存器,分为两个部分,后n个bit为只读(表示映射空间的大小),前32-n个为可读可写(表示该映射空间在内存空间中的基偏移地址)。PCI规范规定,主机初始化时,首先向该寄存器写全’1’,然后读该寄存器,通过该寄存器返回值来判断所映射空间的大小以及映射类型(内存或者I/O,最后一位为‘0’表示内存空间映射,否则市I/O空间映射),之后系统给该映射空间分配一个基偏移量。
用户377235 2012-9-11 18:40
用户407487 2008-5-11 00:19