cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

MPSoC PS GEM TX/RX MACの簡易プログラミング・シーケンス

Xilinx Employee
Xilinx Employee
2 0 413

概要:本Blogでは、PS GEMの簡略化したプログラミング・シーケンス例を紹介します

 

プログラミング・モデル

ここに記載されている手順は、テクニカルリファレンスマニュアルに記載されている手順とは少し異なります。 PHYI / O、および割り込み設定はスキップされます。 例を簡略化するために、一部の構成が変更されています。

 

RAWイーサネットフレームとして32バイトを送受信します。

 

ここで使用されるプログラミング手順は、以下の通りです:

1.コントローラーを初期化

2.コントローラーの設定

3.バッファー・ディスクリプターの設定

4.コントローラーを有効にする

5.フレームの送信と受信

 

1.コントローラーの初期化

  • ネットワーク・コントロール・レジスタをクリアし、統計レジスタビット[5]をクリアします。

 

アドレス

0xFF0C0000

0x00000000

0xFF0C0000

0x00000020

 

image.png

image.png

統計レジスタをクリアします-このビットは書き込み専用です。 1を書き込むと、統計レジスタがクリアされます。 セルフ・クリアリング・レジスタです。

 

  • TXとRXステータス・レジスタをクリア。レジスタ・タイプはwtcです。

 

アドレス

0xFF0C0020

0x0000000F

0xFF0C0014

0x000001FF

 

image.png

このレジスタは、読み取られると、受信のステータスの詳細を提供します。 一度読み取られると、個々のビットに1を書き込むことでクリアできます。 レジスタに書き込んでビットを1に設定することはできません。

image.png

このレジスタは、読み取られると、送信のステータスの詳細を提供します。 一度読み取られると、個々のビットに1を書き込むことでクリアできます。 レジスタへの書き込みでビットを1に設定することはできません。

 

  • TX/RXバッファー・キュー・ポインターをクリア。GEMは2つのバッファー・キュー・ポインター・レジスタを持ち、未使用のレジスタ・キューは、ダミー・ディスクリプターで設定される。

 

アドレス

0xFF0C0018

0x00000000

0xFF0C001C

0x00000000

0xFF0C0440

0x00000000

0xFF0C0480

0x00000000

 

image.png

受信バッファー・キューの開始アドレス(受信バッファー・ディスクリプター・リスト)。 ネットワーク制御レジスタのビット2を介して受信を有効にする前に、受信バッファキューのベースアドレスを初期化する必要があります。 受信が有効になると、受信バッファー・キューのベースアドレスレジスタへの書き込みはすべて無視されます。 このレジスタを読み取ると、現在アクセスされている記述子の場所が返されます。 この値は、バッファーが使用されるにつれて増加します。 新しいフレームが受信されると常に変化するため、ソフトウェアは、受信したフレームをキューから削除する場所を決定するためにこのレジスタを使用しないでください。 代わりに、ソフトウェアはバッファー・ディスクリプタ・キューを通して、使用されているビットをチェックする必要があります。 システムバスの動作に関しては、受信ディスクリプタは、各32ビットディスクリプタのペアに対して64ビット境界で整列する必要があります。

 

送信バッファー・キューの開始アドレス(送信バッファ・ディスクリプター・リスト)。 送信バッファー・キューのベースアドレスレジスタは、ネットワーク制御レジスタのビット9を介して送信を開始する前に初期化する必要があります。 一旦送信が開始されると、送信バッファー・キューのベースアドレスレジスタへの書き込みは不正になるため、無視されます。 この期間に送信バッファキューのベースアドレスレジスタに書き込むと、予期しない結果が生じる可能性があります。 このレジスタを読み取ると、現在アクセスされているディスクリプターの場所が返されます。 DMAは一度に2つのフレームを処理するため、これは必ずしも送信中の現在のフレームを指しているとは限りません。 システムバスの動作に関しては、送信記述子は各32ビット・ディスクリプター・ペアに対して64ビット境界で整列する必要があります。

image.png

送信バッファー・キューの開始アドレス(送信バッファー・ディスクリプター・リスト)。 送信バッファー・キューのベースアドレスレジスタは、ネットワーク制御レジスタのビット9を介して送信を開始する前に初期化する必要があります。 送信が開始されると、送信バッファー・キューのベースアドレスレジスタへの書き込みは不正になるため、無視されます。 この期間に送信バッファキューのベースアドレスレジスタに書き込むと、予期しない結果が生じる可能性があります。 このレジスタを読み取ると、現在アクセスされているディスクリプタの場所が返されます。 DMAは一度に2つのフレームを処理するため、これは必ずしも送信中の現在のフレームを指しているとは限りません。 システムバスの動作に関しては、32ビット記述子の各ペアが単一のバスアクセスを使用してメモリから読み取られるため、送信記述子は64ビット境界で整列する必要があります。

image.png

受信バッファー・キューの開始アドレス(受信バッファー・ディスクリプター・リスト)。 ネットワーク制御レジスタのビット2を介して受信を有効にする前に、受信バッファー・キューのベースアドレスを初期化する必要があります。 受信が有効になると、受信バッファー・キューのベースアドレスレジスタへの書き込みはすべて無視されます。 このレジスタを読み取ると、現在アクセスされている記述子の場所が返されます。 この値は、バッファーが使用されるにつれて増加します。 新しいフレームが受信されると常に変化するため、ソフトウェアは、受信したフレームをキューから削除する場所を決定するためにこのレジスタを使用しないでください。 代わりに、ソフトウェアはバッファー・ディスクリプター・キューを通して、使用されているビットをチェックする必要があります。 システムバスの動作に関しては、受信記述子を64ビット境界に揃える必要があり、各32ビット・ディスクリプターのペアは単一の64ビットバスアクセスを使用して書き込まれます。

 

2.コントローラーの設定

1. 以下のオプションでネットワーク・コンフィギュレーション・レジスタをプログラムします。

 

アドレス

0xFF0C0004

0x013F2492

 

image.png

bits

Field Name

Description

24

Receive_checksum_offload_enable

Receive checksum engine is enabled

22:21

Data Bus width

64-bit AMBA AXI data bus.

20:18

MDC clock division

MDC clock division

17

Fcs remove

FCS remove

16

Length field error frame discard

Length field error frame discard

13

Pause_enable

Pause enable

10

Gigbit_mode_enable

1000 Mbps operation

7

Unicast_hash_enable

Unicast hash enable

4

Copy_all_frames

All valid frames will be accepted

1

Full duplex

Full duplex

 

2. MACアドレスを[0x00,0x0a, 0x35, 0x01,0x02, 0x03]にセットします。Spec_add1_bottom/topレジスタに値を書き込みます。

 

アドレス

0xFF0C0088

0x01350A00

0xFF0C008C

0x00000302

 

image.png

特定のアドレスレジスタに格納されているアドレスは、リセット時、または対応する特定のアドレスレジスタの下部に書き込まれるときに非アクティブ化されます。 特定のアドレスレジスタトップが書き込まれるとアクティブになります。

 

3. 以下のオプションでDMAレジスタを設定します。

アドレス

0xFF0C0010

0x40180F10

 

bits

Field Name

Description

30

Dma_addr_bus_width_1

DMA アドレス bus width 64

2316

Rx_buf_size

DMA receive buffer size in external AMBA (AHB/AXI) system memory.1536B

11

Tx_pbuf_tcp_en

Transmitter checksum generation is enabled

10

Tx_pbuf_size

Maximum configured memory size of 4KB

9:8

Rx_pbuf_size

Receive packet buffer memory size 8kB

4:0

Amba_burst_length

16 burst

 

3.バッファー・ディスクリプターを設定

gem.receive_q {、1} _ptrにはTXバッファー・ディスクリプター・リストのベースアドレスが含まれ、gem.receive_q {1} _ptrにはRXバッファー・ディスクリプター・リストのベースアドレスが含まれます。 TX / RXバッファー・ディスクリプター・リストワード[0]は、システムメモリ内のTX / RXバッファーのアドレスを指します。 N個のバッファーに対してN個のディスクリプターを構成できます。GEMコントローラには、2つのTX / RXバッファー・キューポインタ・レジスタがあります。 TX / RXの動作に使用されるTX / RXの組み合わせは1つだけです。 ダミーのディスクリプター値を使用して未使用のキューをプログラムすることが重要です。

 

次のアドレスと値は、q_ptrレジスタを構成します。

アドレス

0xFF0C0018

0x00600000

0xFF0C001C

0x00700000

0xFF0C0440

0x00610000

0xFF0C0480

0x00710000

0xFF0C04C8

0x00000000

0xFF0C04D4

0x00000000

 

アドレス

説明

0x610000

TXバッファ・ディスクリプタ・リストのベース・アドレス

0x600000

RXバッファ・ディスクリプタ・リストのベース・アドレス

0x700000

TXバッファ・ディスクリプタ・リストのダミー・アドレス

0x710000

RXバッファ・ディスクリプタ・リストのダミー・アドレス

 

0xFF0C0018

Receive_q_ptrレジスタ

0xFF0C001C

Transmit_q_ptrレジスタ

0xFF0C0440

Transmit_q1_ptrレジスタ

0xFF0C0480

Receive_q1_ptrレジスタ

0xFF0C04C8

TXバッファ・ディスクリプタ・キュー・ベース・アドレスの上位32ビット

0xFF0C04D4

RXバッファ・ディスクリプタ・キュー・ベース・アドレスの上位32ビット

 

  ダミーバッファー・ディスクリプター・リスト

以下は、ダミー・ディスクリプターを設定します。

 

アドレス

TX Qポインター・ダミー・ディスクリプター

0x00700000

0x00000000

0x00700004

0xC0000000

0x00700008

0x00000000

0x0070000C

0x00000000

RX Qポインター・ダミー・ディスクリプター

0x00710000

0x00000003

0x00710004

0x00000000

0x00710008

0x00000000

0x0071000C

0x00000000

 

TXバッファー・ディスクリプター・リスト

 

次設定は、TXバッファー・ディスクリプター・リストを構成します。 4つのバッファー・ディスクリプターが構成されます。 ただし、ここでは1つのバッファーのみが使用されます。 ここでは、DMAバス幅を64ビットに構成したため、1つのバッファー・ディスクリプターの長さは16バイトです。

 

シングル・バッファー・イーサネット・フレームの場合、ワード0のビット15)を設定する必要があります。 これが現在のフレームの最後のバッファであることを示します。 バッファーの長さはワード0ビット0:13で設定する必要があります。 割り当てられたバッファーの使用済みビットは、送信のためにビット31)をクリアする必要があります。

 

アドレス

Tx バッファーのディスクリプター1

0x00610000

0x00400000

0x00610004

0x0000802E

0x00610008

0x00000000

0x0061000c

0x00000000

Tx バッファーのディスクリプター2

0x00610010

0x00000000

0x00610014

0x80000000

0x00610018

0x00000000

0x0061001C

0x00000000

Tx バッファーのディスクリプター3

0x00610020

0x00000000

0x00610024

0x80000000

0x00610028

0x00000000

0x0061002C

0x00000000

Tx バッファーのディスクリプター4

0x00610030

0x00000000

0x00610034

0xC0000000

0x00610038

0x00000000

0x0061003C

0x00000000

 

RXバッファー・ディスクリプター・リスト

次の設定は、RXバッファー・ディスクリプター・リストを構成します。 0x600000は、RXバッファー・ディスクリプター・リストのベースアドレスです。 システムメモリ内のRXバッファの先頭のアドレスは0x500000として設定されます。 コントローラが受信したデータは、このアドレスで利用できます。

 

ここでも、4つの受信バッファーを構成しました。 ただし、32バイトしか送受信しないため、1つだけが使用されます。 最後のディスクリプターには、ラップビットが設定されています。

 

アドレス

Rx バッファーのディスクリプター1

0x00600000

0x00500000

0x00600004

0x00000000

0x00600008

0x00000000

0x0060000c

0x00000000

Rx バッファーのディスクリプター2

0x00600010

0x00000000

0x00600014

0x00000000

0x00600018

0x00000000

0x0060001C

0x00000000

Rx バッファーのディスクリプター3

0x00600020

0x00000000

0x00600024

0x00000000

0x00600028

0x00000000

0x0060002C

0x00000000

Rx バッファーのディスクリプター4

0x00600030

0x00000002

0x00600034

0x00000000

0x00600038

0x00000000

0x0060003C

0x00000000

 

 

4.コントローラーを有効にする

割り当てられたバッファーにイーサネット・フレーム・データを書き込みます。 フレームフォーマットは: <Destination MAC addr, Source MAC addr, length/type, data>

アドレス

TX データのフレーミング

0x00400000

0x01350A00

0x00400004

0x0A000302

0x00400008

0x03020135

0x0040000C

0x02012000

0x00400010

0x06050403

0x00400014

0x0A090807

0x00400018

0x0E0D0C0B

0x0040001C

0x1211100F

0x00400020

0x16151413

0x00400024

0x1A191817

0x00400028

0x1E1D1C1B

0x0040002C

0x0000201F

 

MACループバックを有効にするには、最初に送受信を無効にし、ループバックビットセットを設定して、ネットワーク制御レジスタで送受信を有効にします。

 

アドレス

ループバック・イネーブル

0xFF0C0000

0x00000000

0xFF0C0000

0x00000002

0xFF0C0000

0x0000000E

 

5.フレームの送信と受信

ネットワーク・コントロール・レジスタのビット9を設定して送信を開始します。

 

アドレス

送信開始

0xFF0C0000

0x0000020E

 

送信後、送信ステータスは送信ステータス・レジスタで読み取ることができます。 ビット5は正常な送信を表します。 バッファーに関連する送信のステータスも、TXバッファー・ディスクリプターのワード(ワード1)で更新されます。

 

TXステータス読み出し

0xFF0C0014

 

 

受信したデータは、送信が成功したため、RXバッファー(0x500000)に存在する必要があります。 バッファー・ディスクリプター・ステータス・ワード(ワード1)は、受信ステータスに基づいて更新されます。

 

RXデータ読み出し    

0x00500000

 

 

 

参考文献

Zynq UltraScale+ MPSoCテクニカルリファレンスマニュアル”, Xilinx, 2nd Feb.2017