TI中文支持网
TI专业的中文技术问题搜集分享网站

c6678 hyperlink双向传输(比较急,希望能尽快得到回复,多谢)

您好:

1.我想知道hyperlink能否在发送数据的同时,也在接收数据,即收发同时进行,物理链路上感觉是可以的,但是文档中hyperlink 协议那部分提到过,接收的数据优先级比较高,这又让我觉得hyperlink没法同时收发

2.对于第一个问题的缘由,是由于:我想让local device 通过hyperlink去访问remote device的 DDR,同时,让remote device 通过hyperlink去访问local device 的 DDR,不知道这中想法可以实现吗?

3.如果local device通过 hyperlink访问remote DDR,在remote端的DSP能否同时去访问它自己的DDR,我知道这样会造成DDR总线冲突,但是我觉得应该会有总线仲裁管理,如果总线仲裁管理这种方法实现local和remote访问 同一个DDR的话,是否会造成读写的数据不正确,又或者造成读写带宽下降?

多谢!

Andy Yin1:

您好,

1. Hyperlink是双向的。根据手册中的框图,不同slave发起的写操作是完全使用不同的物理链路,所以可以并行进行没有冲突;但是对于相同slave同时发起的读写操作,由于存在相应的物理链路冲突,此时读回来的数据即read return data优先级要高些,但是也是可以并行读写;具体可以看一下读写方向所涉及到的链路就可理解;

2.  可以。如上描述,同时发起写的操作没有冲突;如果分别是读写的操作,会存在物理冲突,但是此时读回来的数据的优先级高;

3. 可以实现。此种操作方式,可以理解为同一个DSP内部不同的master同时去访问DDR,都会由MSMC进行数据带宽的管理,会保证数据的正确性,带宽会有所下降。

si cheng:

回复 Andy Yin1:

您好:

1.对于第二个问题,如果local device 通过hyperlink去读remote device的 DDR,同时,让remote device 通过hyperlink去读local device 的 DDR,这样物理上是不是也会也冲突?

2. 如果local device的BufferA 想读或者写remote device的BufferB,以下流程是否正确:

 对于remote device来说,需要做BufferB的映射:

  hyplnkExampleAddrMap (&BufferB , (void **)&BufferBThroughHypLnk),

 对于local device而言,需要做BufferA的映射:

  hyplnkExampleAddrMap (&BufferA , (void **)&BufferAThroughHypLnk),

如果local device  CPU读remote device BufferB,则

  memcpy( BufferA,  BufferAThroughHypLnk,   sizeof(BufferAThroughHypLnk));

     DMA读则:DMATransfer(BufferA,  BufferAThroughHypLnk,   sizeof(BufferAThroughHypLnk),该函数触发DMA传输

如果local device  写remote device BufferB,则

  memcpy( BufferAThroughHypLnk,   BufferA,  sizeof(BufferAThroughHypLnk));

     DMA读则:DMATransfer( BufferAThroughHypLnk,  BufferA,  sizeof(BufferAThroughHypLnk),该函数触发DMA传输

3. 2中用到的hyplnkExampleAddrMap函数是MCSDK中hyperlink例子中的,实际用的话,是否需要做相应修改?

4。如果local device  写remote device BufferB后,remote device 应该是通过中断知道数据已经接收完毕,这个中断是怎么产生的?是由local device给出的还是remote device 产生的? 是否和SRIO 门铃类似?

多谢!

Andy Yin1:

回复 si cheng:

1. 读的过程相对比较复杂,这种情况下会有冲突;

2. 你可以自己在板子上测试看看,我还没有看这个代码;

3. 地址映射可以根据应用需要修改,主要是写64个entry的地址及长度值;

4. 可以在完成最后写中断事件通知,查看hyperlink手册的interrupt一节。

si cheng:

回复 Andy Yin1:

您好:

1.我这边没有hyperlink数据线,没法测试hyperlink接口,您能不能帮我测试下正确性啊?多谢!

2.这64个entry主要是干什么用到,文档中没看明白?

3.BufferA和BufferB做完地址映射后,这个地址映射能映射多大的地址空间啊?   hyplnkExampleAddrMap 函数好像没说每次可以映射的地址空间大小, 如果我调用完这个函数后,BufferA能否连续读写 或者 跳变读写BufferB开始的1GB或者其他大小的 地址空间?

多谢!

Xinhai Chen:

回复 si cheng:

不结合程序运行调试,没有谁能真正理解文档的内容。

没有数据线可以实验例程的hyplnk_EXAMPLE_LOOPBACK。

Thomas Yang1:

回复 Xinhai Chen:

Hi  Si cheng

1) 您可以从如下link 购买到 Hyperlink cable

estore.ti.com/Search.aspx

2)64个entry主要是对接受到的地址进行译码,具体信息如下:

a. 64 个segment每个segment 都有其对应的base address和 seg size

b. 对接受到的Hyperlink 包, 接受端根据RxSegSel获得相应的seg index,找到基地址和seg size

c  译码后的地址 = base address + input address & seg size(mask)

3) local device在一个segment内可以看到 remote device 最多 256M bytes 空间, 你需要注意的是每个segment都要按照128KB对齐。只要应用的segment设计合理,local是可以实现跳变读写remote device的不同空间的,你可以参考userguide 2-12

谢谢!

si cheng:

回复 Thomas Yang1:

你好:

多谢您的回复,还有几个疑问:

1.64个entry应该是对应着64个相同功能但地址不相同的寄存器,但是文档中只给出了一个寄存器表示segment的base address和 seg size,按理说会给出其他剩余寄存器的地址的,这点有点疑惑

2.对于local访问remote device 的DDR 1GB空间,我现在是将每个段的大小设置成256MB,然后访问完这256MB空间后,重新将DDR的下一个256MB空间映射到hyperlink空间上,这样会导致每次访问后256MB空间后,都需要重新映射下,如果我整个DDR空间循环着访问每个地址空间的话,就不太好了,因此,在remote 端,能否一次设置后,local就可以循环访问remote端DDR 1GB空间,如果可以,改怎么设置?

多谢!

Thomas Yang1:

回复 si cheng:

Hi Si cheng

1. 可以通过Rx Address Segment Index Register 中的 rxseg_index 来选择哪一个Segment/Length array elment是被读或者被写。通过Rx Address Segment Value Register配置rxseg_val和rxlen_val

2 你可以通过配置local device的输出address的upper bit的不同实现访问不同的segment index,具体upper bit和original Rx address的关系你可以参考寄存器Rx Address Selector Control中rxsegsel域的定义,Hyperlink userguide 3.10

谢谢!

si cheng:

回复 Thomas Yang1:

你好:

你好,应该是没法实现一次设置后就能访问remote DDR 1GB空间, 论坛发布的 2012年6月份的培训资料中提到了:

从这个表格中可以看到,如果将每个segment size设置成256MB的话, 这样的segment只有一个, 所以,如果循环使用DDR 连续1GB空间的话,必须是每次用完256MB空间后,重新做一次地址映射,将下一个256MB空间映射到hyperlink的地址区域(0x40000000-0x4FFFFFFF)

谢谢

Andy Yin1:

回复 si cheng:

对,你的理解是对的,依次最多映射256MB的访问空间。

赞(0)
未经允许不得转载:TI中文支持网 » c6678 hyperlink双向传输(比较急,希望能尽快得到回复,多谢)
分享到: 更多 (0)