摘要:FAS466是Qlogic公司的一款Fast结构的SCSI处理器。而FAS466处理器的开发难点之一是软件设计。文中通过对FAS466处理器内部结构和操作原理的深入分析,给出了基于FAS466的系统的通用软件解决方案和应用实例。
关键词:FAS466;SCSI;SCSI控制器;微控制器
FAS466是Qlogic公司生产的一款高性能SCSI处理器,它可提供Fast40 SCSI同步传输速率,其高度集成的SCSI核心支持先进的SCAM一层和二层协议,而内嵌的微控制器则使用户可以通过灵活多变的编程方式协调SCSI队列,简明清晰的外部接口使得硬件设计更为简单,尤其适合于开发专用SCSI存储系统。硬件接口的设计此前已有文章介绍,而软件设计是基于FAS466系统的开发难点,目前此类文章尚不多见。本文通过对FAS466处理器内部结构和操作原理的深入分析,给出了基于FAS466处理器系统的通用软件解决方案和应用实例。
1 FAS466的结构和原理
FAS466的内部结构如图1所示,该器件由SCSI控制器、微控制器、FIFO以及连接它们的总线和信号线组成,并通过它们为外部提供微处理器接口、DMA接口和SCSI总线接口。
FAS466微处理器接口可以连接多种微处理器或DSP;而DMA接口则主要与外部DMA控制器连接?组成DMA通道;SCSI总线接口可以连接各种SCSI设备。其中,SCSI控制器与微控制器分别是SCSI协议的执行中心和控制核心。
1.1 SCSI控制器操作原理
SCSI控制器为SCSI协议操作提供了灵活有力的底层硬件支持。它通过32个8位宽的寄存器与外部微处理器作用。SCSI控制器命令集包括中断命令、断开命令、目标器模式命令、启动器模式命令和混合命令。外部微处理器或者FAS466微控制器通过向SCSI控制器命令寄存器中写入代表特定行为的命令代码来实现命令的发送。SCSI控制器将自动执行命令,通过命令中断状态寄存器和命令状态寄存器来反映命令完成的状态信息。
SCSI控制器内部有五个状态阶段:复位状态、断开(空闲)状态、选择和重选允许状态、目标器空闲状态和启动器空闲状态。其状态转换图如图2所示。
(1)复位状态
上电复位后,SCSI控制器处于复位状态,此时SCSI控制器不能驱动任何SCSI总线信号,也不响应任何信号,命令寄存器中的命令被忽略?而且只要FAS466外部复位信号有效,SCSI控制器始终保持在这个状态。在操作过程中,外部微处理器可以通过给SCSI控制器模块的复位位写1(微处理器接口模块复位寄存器1位)使SCSI控制器处于复位状态,写0使SCSI控制器进入空闲状态。
(2) 断开(空闲)状态
当SCSI总线复位信号(RST)有效,且SCSI控制器不处于复位状态或者SCSI控制器与SCSI总线断开时,SCSI控制器进入该状态,此状态不能进行选择和重选操作。
(3)选择和重选允许状态
当断开模式命令允许SCSI控制器响应选择和重选信号时,系统进入此状态,所有参与仲裁使用SCSI总线的命令都必须经过此状态。该状态下,SCSI控制器响应总线发出选择和重选事件。除非进入目标器或启动器空闲状态,或者RST信号有效,否则SCSI控制器将一直保持这个状态。
(4)目标器空闲状态
当SCSI控制器响应总线发起事件或者作为其它SCSI设备重选的结果时,系统进入该状态。此状态下,SCSI控制器将作为目标器连接到SCSI总线,且当BSY(总线忙)信号有效时,系统将驱动SCSI阶段流水线。此状态承认目标器模式和混合命令。除非SCSI控制器目标器断开(总线空闲)或者RST信号有效,否则SCSI控制器将一直保持该状态。
(5)启动器空闲状态
当SCSI控制器响应总线重选事件或者作为其它SCSI设备选择的结果时,系统进入该状态。此状态下,SCSI控制器将作为启动器连接到SCSI总线上,而FAS466并不使BSY信号有效,也不驱动SCSI阶段流水线。SCSI控制器将一直保持这个状态、直到SCSI总线空闲(目标器断开)或者RST信号有效。
SCSI控制器根据当前状态,总线发起事件和命令寄存器中的命令来决定各个状态阶段之间的转换,以实现SCSI总线的仲裁作用,并响应总线发起选择或者重选事件以及进行命令、消息、数据、状态在SCSI总线上的传输等任务。
1.2 FAS466微控制器操作原理
FAS466微控制器是一个小型的Fast结构(40Million指令每秒)RISC微处理器,内部有一个32位的寄存器文件、一个五级深度的堆栈、一个整型ALU和其它特殊功能寄存器。该微控制器的所有指令都是16位宽,除了子程序在两个指令周期(四个时钟周期)内完成外,其它所有指令均在一个指令周期内完成。
FAS466微控制器有三种操作状态:复位状态,空闲状态和运行状态,其状态转换图如图3所示。
系统复位时,微控制器进入复位状态,在空闲和复位状态下,外部微处理器可以通过I/O口操作微控制器的内部寄存器和程序存储器。首先由外部微处理器通过地址指针寄存器加载寄存器地址,然后再通过内部寄存器或者程序存储器的字节操作寄存器来进行操作。外部微处理器则通过设置地址指针寄存器和写程序数据到程序存储器的字节寄存器来将程序下载到微控制器的程序存储器中。下载完毕后,外部微处理器向程序计数器写程序开始执行的地址,然后写01h到控制状态寄存器,这样程序就会从指定的位置开始执行以进入运行状态。微控制器运行过程中,外部微处理器不能打断微控制器或者SCSI控制器,直到收到微控制器产生的一个中断。在运行状态,外部微处理器可以操作邮箱寄存器但不能操作通用功能寄存器。当微控制器已执行完当前指令又没有接收到新的指令时,系统将进入空闲状态以等待新的命令。
2 FAS466的软件解决方案
基于FAS466的系统可通过外部微处理器、FAS466微控制器和SCSI控制器的协调工作来实现系统功能。根据FAS466的内部结构和原理分析,这里给出如图4所示的基于FAS466的系统整体软件设计流程。其软件工作过程如下:
(1)外部微处理器初始化FAS466微控制器和SCSI控制器。(FAS466微控制器初始化包括装载和执行它的固件)。
(2)FAS466微控制器允许SCSI控制器对SCSI总线选择队列的响应。
(3)外部微处理器写一个SCSI操作命令给外部命令/设置邮箱寄存器,然后设置LoadTBS位(外部 TBS寄存器6位),以通知FAS466微控制器有一个未响应请求。
(4)FAS466位控制器检查 LoadTBS位,确认请求。
(5)FAS466禁止SCSI控制器对SCSI总线选择和重选事件的响应。
(6)FAS466微控制器复制外部命令/设置寄存器的内容给存储器,清除LoadTBS位,以允许外部微处理器在等待一个微控制器中断前设置下一个命令。
(7)FAS466微控制器向SCSI控制器发送命令(一般用EXEC #k),SCSI控制器执行命令并在命令完成后产生一个中断。
(8)FAS466微控制器进行中断处理得到SCSI操作的逻辑结果后,产生一个中断给外部微处理器。
(9)外部微处理器根据命令的执行情况进行中断处理。
重复执行(2)~(9)步实现系统的连续操作。
DMA传输是基于FAS466系统的主要工作。在传输数据量确定的情况下,数据量可由编程时写入的块数计数器和块大小寄存器中的值决定。但由于实际应用系统的传输数据量存在不确定性,在设计DMA数据传输程序时,应使SCSI FIFO中始终充满数据,或使DMA控制器或SCSI控制器持续读写SC-SI FIFO,以使SCSI总线上的数据传输不受启动器或目标器的限制。FIFO的空、满门限可由外部微处理器在初始化时通过编程设定。
在传输数据量不确定的情况下,从外部DMA控制器接收数据的子程序如图5所示。SCSI控制器接收到传输命令后即可参与总线仲裁以获得总线的控制权,而外部微处理器则通过设置RDATA位来决定数据传送的方向;在FIFO为空而数据接收未完成时,SCSI控制器进行一次空操作,等待数据。数据量的不确定性可能使得命令完成后FIFO中仍残留数据,此时可以选择暂停传输进入EXFER(表示数据传输过程中出现错误)中断并清空FIFO,也可使其它处理回到传输起点,或者忽略错误直接回到传输起点。数据传送完毕可以选择是否断开与SCSI总线的连接。若选择断开则进入XFERCMPDSC(表示传输完成并与SCSI总线断开)中断,以释放总线的控制权而让其它的命令使用总线,此时,如果想要进行下一次数据传输,必须重新获得总线控制权。若选择不断开总线则进入XFERCMPNODSC(表示传输完成且不与SCSI总线断开)中断,可直接回到数据传输的起点。在所有正常情况下,FAS466都将循环回到数据传输起点,以便进行连续数据传输。
3 应用实例
基于FAS466的视频存储系统可实现数字图像的无压缩海量存储,该系统硬件框图如图6所示。图中,DSP接收到开拍信号后将进行系统初始化,CCD相机可将原始图像信号经过视频采集卡转换成数字图像信号暂存到缓冲器中,并在DMA控制器的作用下,以DMA方式传送给FAS466,数据在FAS466的控制下存入SCSI硬盘组。这样,在硬件基础上,就可通过本文所述的软件解决方案实现视频图像的持续高速存储。
4 软件设计中的注意事项
在设计基于FAS466的系统软件时,应注意以下一些问题:
(1)在FAS466支持的多种处理器中,每个外部微处理器类型都有其相应的代码,因此必须通过芯片配置寄存器选择正确的微处理器模式。如TMS320C5X系列DSP的模式选择值就应为3Fh。
(2)SCSI控制器并不允许命令堆栈,因此,每次只能接收和执行一个命令。
(3)DMA传输时,块大小不能为奇数。
(4)非法写入命令寄存器的命令将引起非法命令中断,并设置非法命令错误位(错误中断状态寄存器第2位),因此,在将其它命令写到命令寄存器前,这个中断必须得到处理。