DirectIO: The SRIO DirectIO transfer class is similar to a memcopy transfer between two SRIO devices. One of the devices is the master that initiates the transfer. The second deviceis the slave that responds to the masters requests. The slave device application normallydoes not become aware of the access(被访问的salve DSP并不知道master DSP通过SRIO发起的访问). The master must know the destination memoryaddress for running a DirectIO transfer(master必须知道他想要访问的salve端的访问地址,即如果master想write/read salve端的从0x80000000地址开始的若干字节的数据,必须知道0x80000000这个地址)。
Direct IO模式又可进一步分为以下几种传输格式(每种传输模式都有表示自己的传输包):
1, NWRITE: 普通写操作。可以直接往对端内存写数。一个包最大为256bytes,不要求接收端响应。
2, NWRITE_R: 带响应的NWRITE(NWRITE with Response),要求接收端响应。
3, SWRITE:流写(Stream Write),数据长度必须是8字节的整数倍,不要求接收端响应。
4, NREAD: 普通读操作。可以直接从对端内存取数。一包最大为256bytes,即master dsp要读取slave dsp的内存的数据。
上面讲到SRIO的direct IO包,其实C66x DSP的SRIO包有direct IO包、DOORBELL包、Message包以及Maintenance包等等。其中最重要的是直接direct IO包和DOORBELL包的传输控制,对于direct IO包和DOORBELL包,它的传输控制模块分成LSU(Load/Store Unit)控制单元和MAU(Memo-ry Access Unit)控制单元。LSU用于实现Direct IO包、DOORBELL包的发送,MAU则负责Direct IO包的接收。
LSU单元其实是一系列寄存器,在msater端,master DSP要想通过SRIO访问(读/写)slave端DSP的内存数据,master需要配置LSU寄存器,硬件会把寄存器中的内容打包到包中(如做NWRITE操作时,),作为包的头。C66x DSP上提供了8组LSU来进行DirectIO数据发送,每个LSU有7个寄存器,当第五个寄存器写完后,数据会发送出去,第6个寄存器主要用于检测当前的LSU状态。
LSU寄存器(可参考SRIO Guide 3.8 LSU/MAU Registers)
读写操作和门铃操作主要由上图中的7个寄存器进行控制,这些寄存器里的值会自动加入到包中。在SRIO总线上,每个SRIO设备都有一个相应的设备地址,设备地址好比一个SRIO设备的ID,用于区别不同的SRIO设备。当SRIO总线上的一个SRIO设备进行读写访问时,它发送的包就含有设备地址,只有自身设备地址与包的设备地址符合的SRIO设备才会对此次传输做出响应。SRIO Address MSB和SRIO Address LSB共同构成64-bit寻址,指示的是被访问SRIO设备的地址。开发板上只用到32-bit寻址,因此,SRIO Address MSB为0,SRIO Address LSB指示的是被访问的DSP的地址。DSP address指示的是本地DSP的地址,如当操作是NWRITE时,该地址处的数据将会写到slave DSP的SRIO Address LSB地址处。Byte_count这一项给出的是传输字节数,一次读写操作(可以是很多包)最多可以传送4Kbytes的数据,可以分为很多个包进行传输,因为每个包的payload的最大size为256字节。DestID是目标设备的ID号,用来区分SRIO总线上的设备。Drbll Info用于门铃事件,通过此位段的设置,从而向目标DSP产生中断。Packet Type用来指示此次传输的类型,例如NREAD、NWRITE和DOORBELL等。
对DSP来说,初始化完SRIO后,master DSP便可以通过SRIO来发送数据给slave DSP,但是要注意,slave并不知道什么时候master开始发数据,什么时候master发送完了数据,所以通常master会在数据传输完成后由硬件自动产生一个DoorBell(通过doorbell消息,即doorbell包)信息来告知slave,master数据已发送完毕,slave的SRIO硬件收到DoorBell消息后,可以触发中断,从而slave可以处理数据。这里数据完成后自动触发发送doorbell消息的机制,也是通过设置LSU寄存器实现,即当设置了LSU_Reg3的Drbll_val位为1(means:There is doorbell information which needs to be sent out at the end of the packet),表示LSU_Reg5的Drbll_Info值是有效的,这样Drbll_Info(16bit,doorbell消息的payload仅有16bit)会通过doorbell包发送到slave DSP。
|