基于很多朋友问DSP的SRIO具体通道怎样配置为1X,2X,4X,并且怎样设置相应速率的情况,本文给出几个实际配置例子,大家可以根据相应例子对照自身需求进行修改,基础例程仍旧是我之前在SRIO系列博客中提到的srio_loopback.c。
6678 参考时钟是250M时,怎样将SRIO配置为4X,3.125G
详细参数:
参考时钟:250M
相关寄存器:PRESCALAR_SRV_CLK(0x0291BD30)
描述:通过该寄存器能够设置参考时钟,通过以下CSL API设置,
// Set the LLM Port IP Prescalar Clock to the default value
CSL_SRIO_SetLLMPortIPPrescalar(hSrio, prescalar_Clock);
- 1
- 2
参数prescalar_Clock的计算方法如下,其中[]的意思是取最近的整数
p r e s c a l a r C l o c k = [ r e f c l k ÷ 10 ] p r e s c a l a r C l o c k = [ r e f c l k ÷ 10 ] p r e s c a l a r C l o c k = [ r e f c l k ÷ 10 ] prescalarClock=[refclk÷10]prescalarClock=[refclk÷10] prescalarClock = [refclk÷10] prescalarClock=[refclk÷10]prescalarClock=[refclk÷10]prescalarClock=[refclk÷10]Rate使用以下CSL API配置为2:
// 2指的是LaneC(第3个Lane)
CSL_BootCfgSetSRIOSERDESRxConfig (2, 0x00440495);
CSL_BootCfgSetSRIOSERDESTxConfig (2, 0x00180795);
- 1
- 2
- 3
通道数(1X 2X or 4X)
相关寄存器:PLM Port(n) Path Control Register (PLM_SP(n)_PATH_CTL) (0x0291B0B0)
该寄存器的PATH_MODE域负责配置1X,2X,4X。下图为不同mode的配置图:
使用以下CSL API完成通道数配置工作:
//此时配置为Mode0,port2,1x
CSL_SRIO_SetPLMPortPathControlMode (hSrio, 2, 0);
- 1
- 2
LSU设置
LSU主要设置要发送的包的类型,如Nread,Nwrite,doorbell等,以下以Nread类型举例,说明如何使用LSU发送。
/* LSU结构体的赋值 */
SRIO_LSU_TRANSFER LsuTransfer_read;
LsuTransfer_read.rapidIOMSB = 0x0;
LsuTransfer_read.doorbellValid = 0;
LsuTransfer_read.intrRequest = 1;
LsuTransfer_read.supInt = 0;
LsuTransfer_read.xambs = 0;
LsuTransfer_read.priority = 0;
LsuTransfer_read.outPortID = 2;// 注意将这个地方设置为2,才能从port2将数据发出
LsuTransfer_read.idSize = 1;
LsuTransfer_read.srcIDMap = 0;
LsuTransfer_read.dstID = 0x0077;// 将要发送的目标device_id
LsuTransfer_read.ttype = 4;
LsuTransfer_read.ftype = 2;
LsuTransfer_read.hopCount = 0;
LsuTransfer_read.doorbellInfo = 0;
/* 实现LSU传送流程函数 */
void srio_read(unsigned int dsp_addr,unsigned int byte_cnt,unsigned int rpio_addr)
{
unsigned char context;
unsigned char transID;
unsigned char compCode;
unsigned char contextBit;
/* 以下函数中的2都表示LSU2,也可以设置为LSU3,LSU4… */
// Get the LSU Context and Transaction Information.
CSL_SRIO_GetLSUContextTransaction (hSrio, 2, &context, &transID);
LsuTransfer_read.dspAddress = dsp_addr;
LsuTransfer_read.bytecount = byte_cnt;
LsuTransfer_read.rapidIOLSB = rpio_addr;
// Send the transfer on LSU 2
CSL_SRIO_SetLSUTransfer (hSrio, 2, &LsuTransfer_read);
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
// Wait around till the transfer is completed.
while (1)
{
if (CSL_SRIO_IsLSUBusy (hSrio, 2) == FALSE)
break;
}
// Get the completion code.
CSL_SRIO_GetLSUCompletionCode (hSrio, 2, transID, &compCode, &contextBit);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
关于port 2…
问题来了:既然使用的是LaneC,也就是只有一个port,那么为什么不使用port0,port1,port3,为什么单单使用port2呢。
回答来了:这是规定。请看下图,图中的蓝色数字就是应该使用的port number。
</div>