2015年9月30日 星期三

如何讓舊的NuStream XM板卡,設定自訂的觸發條件

XM板卡沒有像RM板卡有自動化的XTAG,所以需要自己告 訴板卡要過濾哪些包。

    XTrailer是類似XTAG,在封包裡頭加特定標記,但這標記是用來取裡頭Timestamp欄位用的,不是要達到的功能。在XM板卡上,有一個作法可以達到--Trigger」。就是觸發的意思, 告訴Rx端哪類型的封包, 需要被觸發。說明如下:

 設定Tx端:

DA(6)
SA(6)
Type(2)
IPHeader(20)
Payload
CRC(4)

    假設自定義的欄位裡頭,自行插入4byte標記,以插入「Xtra」這四個字為例,16進制值為「0x58 0x74 0x72 0x61」,    Tx端封包變成類似如此:

DA(6)
SA(6)
Type(2)
IPHeader(20)
58
74
72
61
00
……
CRC(4)

    這四個byte是給Rx端觸發的,所以等 等Rx端也要設定此條件,才搭配的起來。

 設定Rx端:

Rx端必須設定這個function - Nu_XM23L4_StartTriggerCounter(chassis, board, port, triggerSetting)
 使用到「XM23L4_STARTTGRCTR_T這個結構體,裡頭結構很簡單,一組三個欄位,
 告訴
XM-23L4要觸發的「位置,值,和長度」,可以設定6API8組,實際只用到6組)。

 以上面例子來說,我要觸發從第35byteDA+SA+Type+Header用掉34bytes)開始,長度為4bytes
 值為
0x58, 0x74, 0x72, 0x61。那我就這樣設定:
XM23L4_STARTTGRCTR_T trigger;
memset(&trigger, 0, sizeof(XM23L4_STARTTGRCTR_T));
trigger.trigger1_offset = 35;
trigger.trigger1[0] = 0x58;
trigger.trigger1[1] = 0x74;
trigger.trigger1[2] = 0x72;
trigger.trigger1[3] = 0x61;
trigger.trigger1_len = 4;
trigger.trigger_ctrl = 0x1;// 0b11111111, 從右到左分別是trigger1, 2, ..., 8。 設定trigger1, 就設0x1
Nu_XM23L4_StartTriggerCounter(chassis, board, port, trigger);

Rx端在Tx端打包之前,經過 以上設定,那我在counter裡頭就可以看到「RxTriggerN」這些欄位,會有值出現了。

沒有留言:

張貼留言