概況:採用飛思卡爾IMAX6Q作爲主芯片,主芯片總線外接MAC芯片和PHY芯片實現網絡功能以及通過專用的物理層芯片實現1588時鐘同步功能。本節只介紹幾本原理,具體的驅動開發流程及1588時鐘同步協議開發移植流程暫不分享。
參考資料:DM9000中文手冊、IMAX6Q datasheet
分三部分講解:一、arm總線簡單講解 二、DM9000接口設計 三、DM9000和DP83640的控制流程
一、arm總線
cpu框架如下:
arm常規的總線結構如下:
二、DM9000接口設計
常見的arm外設接口設計:
本例子採用方案三,具體接口設計如下圖:
三、DM9000和DP83640的控制流程
DM9000控制DP83640寄存器讀寫原理(讀寫的實現可發到流驅動去做,應用程序只發送DP83640寄存器的索引和要寫的數據給驅動)
DP83640通過DM9000去控制,DP83640作爲DM9000的外部物理層。對DM9000的讀寫可通過一個流驅動來實現。DM9000中只有INDEX端口與DATA端口2個寄存器可以直接被CPU訪問,其它的內部控制和狀態寄存器都是通過這2個端口寄存器間接訪問;對這2個寄存器的訪問是通過控制網絡控制器DM9000的CMD引腳來實現的:當CMD=0時,主機訪問的是INDEX端口寄存器;當CMD=1時,訪問的是DATA端口寄存器。本設計將CMD引腳與處理器的地址線A2相連,則DM9000的2個端口地址分別爲:INDEX端口地址=IOaddress+0x00;DATA端口地址=IOaddress+0x04。由於INDEX端口寄存器保存的是處理器要訪問的DATA端口寄存器的內部寄存器的地址,因而對DM9000的控制或狀態寄存器的訪問順序是:首先寫要訪問寄存器的地址到INDEX端口,然後通過DATA端口來讀/寫數據。
DM9000訪問PHY寄存器的方法是:
(1)寄存器地址寫到EPAR/PHY_AR(0CH)寄存器中,注意將寄存器地址的第6位置1(地址與0x40或運算即可),以表明寫的是PHY地址,而不是EEPROM地址。
(2)將數據高字節寫到PHY_DRH(0EH)寄存器中。
(3)將數據低字節寫到PHY_DRL(0DH)寄存器中。
(4)發送PHY命令(0x0a)到EPCR/PHY_CR(0BH)寄存器中。
(5)延時5us,發送命令0x08到EPCR/PHY_CR(0BH)寄存器中,清除PHY寫操作。
DP83640功能控制說明(具體的寄存器說明見DP83640手冊)
1、 接口通信說明
DM9000與DP83640之間的接口通信主要分兩種,MDIO和MII。
任何時候都能通過MDIO接口來配置DP83640的寄存器,即通過DM9000設置物理寄存器的方式。
MII接口主要用於網絡字符串的收發,即對應應用層的socket編程,但是配置了DP83640PHY Control Frames Configuration Register(PCFCR),使能PCF後,MII接口也可以用來配置DP83640的寄存器,方式是運用socket發送PCF格式的網絡串。
PCF網絡串格式如下:
時間設置:
通過PTP Time Data Regiser設置或讀取時間,流程如下:
to set the time:
Write Clock_time_ns[15:0] to PTP_TDR
Write Clock_time_ns[31:16] to PTP_TDR
Write Clock_time_sec[15:0] to PTP_TDR
Write Clock_time_sec[31:16] to PTP_TDR
Write to PTP_CTL with the PTP_Load_Clk bit set
To read the time:
Write to PTP_CTL with the PTP_Rd_Clk bit set
Read Clock_time_ns[15:0] from PTP_TDR
Read Clock_time_ns[31:16] from PTP_TDR
Read Clock_time_sec[15:0] from PTP_TDR
Read Clock_time_sec[31:16] from PTP_TDR
步進調整,步驟如下:
Write Clock_time_ns[15:0] to PTP_TDR
Write Clock_time_ns[31:16] to PTP_TDR
Write Clock_time_sec[15:0] to PTP_TDR
Write Clock_time_sec[31:16] to PTP_TDR
Write to PTP_CTL with the PTP_Step_Clk bit set
速率調整,步驟如下:
Write Temp_Rate[25:16] to PTP Rate High Register(PTP_RATEH) with PTP_TMP_RATE bit set to 0.
Write Temp_Rate[15:0] to PTP Rate Low Register (PTP_RATEL)
臨時速率調整,步驟如下:(12爲持續時間設置,34爲臨時速率設置,標誌位不設置時則不是臨時速率)
1. Write Temp_Rate_duration[25:16] to PTP Temporary RateDuration High Register (PTP_TRDH)
2. Write Temp_Rate_duration[15:0] to PTP Temporary RateDuration Low Register (PTP_TRDL)
3. Write Temp_Rate[25:16] to PTP Rate High Register(PTP_RATEH) with PTP_TMP_RATE bit set to 1.
4. Write Temp_Rate[15:0] to PTP Rate Low Register(PTP_RATEL)
3、 時間戳
傳輸時間戳參數配置
通過PTP_TXCFG0和PTP_TXCFG1兩個寄存器來配置。
接收時間戳參數配置
通過PTP_RXCFG0, PTP_RXCFG1, PTP_RXCFG2, 和PTP_RXCFG3寄存器來配置。
獲取傳輸時間戳
連續讀四次PHY_PG4_PTP_TXTS寄存器,具體流程見PTPGetTransmitTimestamp函數
獲取接收時間戳
連續讀六次PHY_PG4_PTP_RXTS寄存器,具體流程見PTPGetReceiveTimestamp函數。
Hash Value
配置PTP_RXHASH寄存器,用於消息的過濾3002
4、 觸發
通過配置相關寄存器,可實現從GPIO輸出一個觸發信號。通過一個秒脈衝觸發信號可實現FPGA時鐘的調整。
初始化觸發,使能觸發設置時間等:
1. Set the Trig_Load bit in the PTP Control Register(PTP_CTL) along with the Trig_Sel setting for
the trigger. This will disable the trigger if it waspreviously enabled.
2. Write to PTP_TDR: Start_time_ns[15:0]
3. Write to PTP_TDR: Initial state, Wait for Rollover,Start_time_ns[29:16]
4. Write to PTP_TDR: Start_time_sec[15:0]
5. Write to PTP_TDR: Start_time_sec[31:16]
6. Write to PTP_TDR: Pulsewidth[15:0]
7. Write to PTP_TDR: Pulsewidth[31:16]
8. Write to PTP_TDR: Pulsewidth2[15:0] (for Triggers 0 and1 only)
9. Write to PTP_TDR: Pulsewidth2[31:16] (for Triggers 0 and1 only)
10. Set the Trig_En bit in the PTP_CTL register along withthe Trig_Sel setting for the trigger
讀觸發控制信息:
1. Set the Trig_Read bit in the PTP Control Register(PTP_CTL) along with the Trig_Sel setting for the trigger.
2. Read fields from PTP_TDR in same order as written above.
設置觸發:
設置PHY_PG5_PTP_TRIG寄存器。
取消觸發:
設置PHY_PG4_PTP_CTL寄存器。
5、 事件設置
設置事件,當事件到來時,可存儲一個事件時間戳,最多可存儲8個事件時間戳。
使能事件:
設置PHY_PG5_PTP_EVNT寄存器。
查詢事件:
讀取PHY_PG4_PTP_STS寄存器可以查詢是否有事件產生,也可以檢測接收發送或觸發。
獲取事件時間戳:
1. Read PTP_ESTS to determine if an event timestamp is available.
2. Read from PTP_EDATA: Extended Event Status[15:0] (available only ifPTP_ESTS:MULT_EVNT
is set to 1)
3. Read from PTP_EDATA: Timestamp_ns[15:0]
4. Read from PTP_EDATA: Timestamp_ns[29:16] (upper 2 bits are always 0)
5. Read from PTP_EDATA: Timestamp_sec[15:0]
6. Read from PTP_EDATA: Timestamp_sec[31:16]
7. Repeat Steps 1-6 until PTP_ESTS = 0
6、 中斷
觸發、事件、時間戳都可以產生中斷,可通過PTP Status Register使能相關的中斷。中斷的輸出有兩種方式,一是共享中斷通過PWRDN_INTN引腳輸出中斷信號,二是GPIO引腳輸出中斷信號。
共享中斷:
配置MII Interrupt Control Register (MICR)寄存器可設置PWRDN_INTN中斷。
中斷處理流程,
1. Read MISR to determine if PTP interrupt has occurred
2. Read PTP_STS to determine which PTP function hasgenerated an interrupt
3. Process Trigger, Event, or Timestamp as indicated byPTP_STS
4. Repeat steps 2 and 3 until PTP_STS[11:8] = 0
GPIO中斷:
配置PTP_INTCTL寄存器可配置相關的GPIO中斷。
中斷處理流程,
1. Read PTP_STS to determine which PTP function hasgenerated an interrupt
2. Process trigger, event, or timestamp as indicated by PTP_STS
3. Repeat steps 1 and 2 until PTP_STS[11:8] = 0