PFE サブシステムに電源を投入し、適切なクロックを設定する方法の簡単な例を探しています。私が作成したドライバはネイティブ A53 (Linux なし) で動作するはずです。時計は決して動きません。このロジックに取り組む前は、PFE レジスタを読み取ることすらできなかったのですが、今は読み取れるようになりましたが、すべてが機能しているわけではなく、原因をたどってみると、このようになっていました。
サブシステムを初期化するための基本コードは次のとおりです (これは非常に断片化されており、NXP では明確に説明されていません)。SO、ソース例があれば幸いです。
こんにちは@aaronbaranoff 、
HIF とそのリング バッファに関する具体的なドキュメントはありません。現時点では、PFE に関するすべてのドキュメントをすでに共有しており、これ以上の文書はありません。ただし、 『LNX PFE ドライバー ユーザー マニュアル』のセクション2.1「ネットワーク インターフェース」 、または『PFE FCI API リファレンス』のセクション11.5.2「構成例」およびセクション11.7「出力 QoS」を確認できます。
複雑さのないパケットの Tx と Rx に関しては、それを利用したい場合、PFE の複雑さを回避する方法はないと思います。希望する場合は、かなり単純な GMAC モジュールを使用することもCANますが、すべての操作をメイン コアで処理する必要があります。
HIF、特にリング バッファ構造とレジスタに関するドキュメントはありますか?
別にSOしないと、複雑な操作をせずにパケットを送受信できなくなります。MTL の DEBUG FIFO インターフェースを介して送信および受信するにはどうすればよいですか。
こんにちは@aaronbaranoff 、
PFE レジスタの構成を表示するために、フレームを送信する直前にダンプを取得しました。
PFE を使用してパッケージを送信する方法を正確に知るには、PFE MCAL API を確認することを強くお勧めします。特に、example_application\src\sample_app_ethswt_eth.c から始まる関数呼び出しを確認すると、Tst_Pfe_SendDummyFrame() には API Eth_43_PFE_Transmit() への呼び出しがあり、MCAL コードには多くのランタイム チェックとコンパイル チェックが含まれていますが、これらは役に立たない可能性があります。必要に応じてコードを削除できますが、これは PFE 送信機能の使用方法に関する最良のリファレンスです。
よろしくお願いします。
赤色の領域のレジスタはいずれもアクセスできません (常に 0 をリードバックします)。私はそれらと通信できず、PFE コードではそれらを使用していないようです (そうでなければ、それらがゼロ以外の値を持つことが予想されます)。SO、PFE に使用される GMAC のインスタンス化で DMA インターフェースが欠落していることが確認されるようです。SO、PFE MAC から生のパケットを送信する唯一の方法は、スレーブ インターフェース (NXP では文書化されていません) またはデバッグ インターフェース (レジスタは文書化されていますが、シーケンスは文書化されていません) を使用することです。私の疑念を確認または訂正して助けてください。
ダンプしてくれてありがとう。
あなたのレジスタ設定と私のレジスタ設定を比較すると。どのキュー/チャネルにもリング バッファーまたはリスト アドレスが設定されていないようです。では、どのようにパケットを送信しているのでしょうか?明らかに文書化された DMA インターフェースではありません。そのインターフェースは PFE MAC で無効になっていますか?もしSOなら、どうやってパケットを送信すればいいのでしょうか?
こんにちは@aaronbaranoff 、
返信が遅くなり申し訳ありません。0x460A8000 から 0x460A936C までのすべての PFE EMAC レジスタの完全なダンプがここにあります。任意の 16 進ビューアでCAN確認できます。
このダンプは、すべての初期化が完了した後に取得されました。
次の場所で値が異なることに気付きました。
EL1N0xFFFF0000460A8800 の値は 0x00003FF7 ですが、問題はそれが文書化されたレジスタではないということですか?それは何ですか?
PFE 構成を確認した後、これも完全に初期化されていないことに気付きました。リストのアドレスにまだ書き込んでいない(またはCANない)
| 0x00000000 | EL1N:0xFFFF0000460A9114 | 00000000 | 0x00000000 |
| 0x00000000 | EL1N:0xFFFF0000460A9118 | 00000000 | 0x00000000 |
| 0x00000000 | EL1N:0xFFFF0000460A911C | 00000000 | 0x00000000 |
さらに、ドキュメントに従って ACCEL_PLL のレジスタ設定をダンプして比較できますか。設定は 600 MHz に設定しています。
比較の前に、PFE_MAC_2 とクロックが完全に有効になっていることを確認してください。
私は混乱していますか、それとも何かを見逃していますか。私たちの PFE 設定は十分近いと思います (MAC アドレスやその他の重要でない設定)。しかし、CGM_2 の設定は大きく外れています。おそらく、設定前にあなたの側で差異がキャプチャされたのでしょう。
ドキュメントによると、PFE_MAC2 の場合 (下の画像を参照)。
CGM_2 Mux 0は33 ACCEL_PLL_PH1_CLKに設定する必要があります(一致させる必要があります)
CGM2 Mux 3 は PERIPH_PLL_PHI5_CLK に設定する必要があります (設定はしていますが、FIRC_CLK を指定しています)
CGM2 Mux 6 は PFE_MAC2_RX_CLK に設定する必要があります (設定はしていますが、FIRC_CLK を指定しています)
こんにちは@aaronbaranoff 、
私が見つけた違いは次のとおりです。形式は前回と同じです。MC_CGM_2 の場合は前回と同じ行でプログラムを停止し、PFE_EMAC の場合はここで停止しました。
変更後に動作が変わった場合はお知らせください。
もう1つのデータポイント。PFE_MAC2 をループバック (MAC_CONFIGURATION 経由) レジスタ ビット 12 に配置することも試みました。それでも、DMA 関連のレジスタと通信できません。
こんにちは@aaronbaranoff 、
情報をありがとうございます。それらのレジスターを確認するのに少し時間をください。
できるだけ早くご連絡いたします
私の MC_CGM_2 レジスタをあなたのものと比較していただけますか。すべての PFE クロックがそのセクションにあるため、欠落しているクロックがあると思います。
以下は、DMA_CH0_RxDesc_Ring_Length と DMA_CH0_RxDesc_List_Address に正常に書き込むことができなかった直前のレジスタです。これらに書き込んで値を読み戻すと、有効なアドレスを書き込んでも 0 が読み戻されます。
ただし、リンク ステータスを取得し、MAC アドレスなどのレジスタを書き込んで読み戻すことは正常にCAN。
このコードは、GMAC を制御するために使用しているコードと実質的に同一です。ただし、PFE_MAC2 では、特定のレジスタの読み取りと書き込みは許可されません。(主に DMA 関連)。レジスター比較に加えて。DMA を有効にするために、PFE_MAC2 以外に何か必要なものはありますか (追加のクロックまたはリセット)?
私のコードではこうです。チェックを追加しましたが、次のエラーが発生します。
こんにちは@aaronbaranoff 、
PFE EMAC 内のレジスタのことですか? これは、GMAC リファレンス マニュアルに記載されているのと同じレジスタです。
もしSOなら、すべてのレジスタのダンプを共有して、送信直前のデモ アプリのレジスタの状態と比較することCAN。
前もって感謝します。
内部クロックが正しくないかのような動作をします。しかし、サブシステムのバグによりステータスを読み取ることができないため、判断するのは困難です。PIn Mux が正しいピンに設定されており、クロックも正しく設定されていることを確認しました。
差分をありがとうございます。唯一驚いたのは、PFE 内のブロックの CLKEN がコード内で設定されていなかったことです。それは既知の問題ですか?無視されるか、必要ではないのだと思います。
| 0x0000000F | EL1N:0x0000000040088530 | 00000000 | 0x00000000 | X |
OK、PFE GMAC はリセットから復帰し、リンク ステータスが有効になりました。しかし、もう一つ問題があります。DMA の外側のすべてのレジスタは読み取りと書き込みが行われており、書き込みが期待どおりに行われていることがCANます。しかし、DMA のもの (TX または RX) では書き込みは可能 (エラーなし) のように見えますが、値は保持されません (0 が読み取られます)。他に見逃しているものがあるでしょうか。PFE GMAC を動作させるために必要な、文書化されていない追加の外部ステップがあるようです。
こんにちは@aaronbaranoff 、
返信が遅くなり申し訳ありません。最終的に、PRTN2_COFB0_CLKEN レジスタを構成する直前のレジスタの違いを取得することができました。それらは添付の xlsx ファイルで見つかります。違いは赤い「X」でマークされており、各レジスタ ダンプは別のページにあります。
私のレジスターは次のような文脈で取得されました:
こんにちは@aaronbaranoff 、
すべての情報に感謝します。PFE デモ アプリケーションをテストしようとしましたが、S32 デバッグ プローブでハード フォールトにつながるいくつかの問題が発生しました。デモ アプリの説明で示唆されているように、これを Lauterbach デバッガーでテストする必要があります。しかし、現時点では持っていないので、来週入手してテストを行う必要があります。
電話に関してですが、私と私のチームはお客様との電話に対応しておらず、さらに返信に必要な情報を探すのにかなり時間がかかります。
関連する返信が遅れて申し訳ございません。
あなたが現在お住まいのタイムゾーンはいつですか。インタラクティブに作業はCANでしょうか。
S32G_GPRも追加されました
添付されているのはレジスタダム(デバッガーからのExcel内)です
こんにちは@aaronbaranoff 、
前述のように、MC_ME.PRTN2_COFB0_STAT.R が 0 であるという事実は既知の問題であり、現時点ではチェックをスキップする回避策しかないようです。根本原因を見つけるために次に考えられるのは、あなたのレジスタと私のレジスタを比較することです。PRTN2_COFB0_STAT を構成する直前に、MC_ME レジスタ範囲全体のレジスタ ダンプを送信してください。そうすれば、利用可能な例の 1 つと比較できます。
よろしくお願いします。
これをブートローダーの非常に早い段階にプッシュしてみましたが、結果は同じでした。
MC_ME.PRTN2_COFB0_STAT.R は 0 です (0xf である必要があります)...
なぜ?!?
まだ運がない。PFE パーティションが完全に初期化されていません。ブロック クロックは有効になりません。予想されるシーケンスに関する明確なドキュメントはありません。電源投入プロセスは S32G2 リファレンス マニュアルの図 148 に記載されていますが、ブロック クロック (PRTN2_COFB0_STAT または PRTN2_COFB0_CLKEN) については触れられていません。これをうまく利用できた他のユーザーが、サンプルコードの一部を投稿してくれることを期待しています。リセットから復帰し、PCS フラグにはクロックが有効になっていると表示されますが、ブロック クロックは有効になりません。ただし、その理由はわかりません。外部クロックを画像から取り除くことも試みています。FIRC を使用することにより。
(PFE_MACx_RX_CLK、PFE_MACx_TX_CLK、PFE_PE_CLK) を設定した後、デフォルトの FIRC を使用します。PFE パーティションはリセットから復帰しますが、有効化されているブロック クロックは無視されます。ブロック クロック イネーブルを、PFE パーティションの残りの部分をリセットの前後に移動することも試しましたが、影響はありませんでした。
EL1モードとEL3モードで試しました。PRTN2_COFB0_CLKEN REQ を介して有効にしようとしたにもかかわらず、PRTN2_COFB0_STAT を無視しようとしました。ステータスを無視すると、PFE レジスタを読み取ることはできますが、一部のレジスタへの書き込みは失敗し、動作が正しくありません。表195を参照してください。
私は RDB2 ボードを使用していますが (ボードが準備できるまで)、うまくいきませんでした。
こんにちは@aaronbaranoff 、
この発言について詳しく説明していただけますか?しかし、ブロック レベルのクロックは有効になりません。ステータスを無視すると、DMA レジスタに書き込むときに多くの PFE GMAC レジスタを読み取ることはCANますが、値が保持されないため、リンク ステータスが取得されません。
ドキュメントを確認しましたが、あなたと同じように、EL3 と EL0 を比較した場合の具体的な点は見つかりませんでした。ただし、メモリ領域へのアクセスに関する問題を回避するために、EL0 を使用することをお勧めします。
NXP のコードを複製しましたが、チェックを追加しました。PFE サブシステムはリセットから復帰しますが、ブロック レベル クロックは有効になりません。ステータスを無視すると、DMA レジスタに書き込むときに多くの PFE GMAC レジスタを読み取ることはCANますが、値が保持されないという動作になり、リンク ステータスが取得されません。
ステータスは手がかりになると信じていますが、その理由についてはまったくわかりません。PFE の初期化の前に、クロックとピン MUX を有効にしました。
EL1 モードと EL3 モード、または類似のモードに関して、他に何かルールはありますか? ドキュメントには何も記載されていません。
こんにちは@aaronbaranoff 、
AUTOSARドライバのバグに関する参照をありがとうございます。そのバグ修正に関連する変更を内部的に確認しました。変更された関数はPower_Ip_MC_ME_ConfigureCOFB()です。RTD 5.0.0の最終実装を確認できます。QLP3。私の理解では、問題はプロセスの書き込み部分にあるのではなく、検証のために読み取ると、POWER_IP_MC_ME_PRTN2_COFB0_STAT_RESERVED が定義され、STD_ON の場合に PartitionIndex の検証がスキップされることが関数内でわかります。任意の S32G の構成ファイルを確認すると、POWER_IP_MC_ME_PRTN2_COFB0_STAT_RESERVED が true であることがわかります。例: Resource_TS_T40D11M50I0R0\resource\CORTEXM_S32G2XXM7_s32g274a_bga525.properties :
私が理解しているのは、そのレジスタ検証には既知の問題があり、現時点ではそれをスキップすることが既知の回避策であるということです。
AUTOSAR コードでも同様の問題が報告されていますが、解決策や明確さは示されていません。
私が尋ねているのはドライバ特有のものではありません。これは単純なレジスタ(リファレンスマニュアル)に関する質問です。
PRTN2_COFB0_STAT でブロック 0 ~ 3 のクロックを有効にしようとしています。たとえ47.4のドライバを使いたかったとしてもこのドキュメントの「MC_ME パーティション 2 マッピング」セクションで説明されているように、MC_ME で PFE COFB クロックを有効にする必要があります。
これは基本的なシーケンスですが、機能せず、データシートには他に必要なものについての情報は一切記載されていません。パーティションはリセットから復帰しますが、リファレンス マニュアルの図 148 ではパーティション内のブロック クロックの有効化については説明されていません。
MC_ME.PRTN2_COFB0_CLKEN.B.REQ0 = 1;
MC_ME.PRTN2_COFB0_CLKEN.B.REQ1 = 1;
MC_ME.PRTN2_COFB0_CLKEN.B.REQ2 = 1;
MC_ME.PRTN2_COFB0_CLKEN.B.REQ3 = 1;
MC_ME.PRTN2_PCONF.B.OSSE = 1;
MC_ME.PRTN2_PUPD.B.OSSUD = 1;
MC_ME.PRTN2_PCONF.B.PCE = 1;
MC_ME.PRTN2_PUPD.B.PCUD = 1;
/* ハードウェアに上記のレジスタの変更をチェックするように指示します */
コントロールキーを書き込みます();
この後、PRTN2_COFB0_STAT を読み取りましたが、ステータスにはクロックが有効になっていることが示されません。
こんにちは@aaronbaranoff 、
再度ご連絡いただきありがとうございます。この移行では、リファレンス・マニュアル、FCI API ドキュメント、コード、コード サンプルなど、これまで共有したことのないリソースを共有することはできません。A53 のソフトウェア サポートは Linux に重点が置かれており、PFE は非常に複雑なモジュールであるため、プログラムを見ても多くのサポートを提供することはできませんが、私がいつも行っているように、既に提供されている実装をチェックして、ニーズに合わせて調整することをお勧めします。
PFE の初期化に関連するドキュメントをさらに公開する予定があるかどうかは社内で確認できますが、お客様のCASEに役立つものがあるかどうかは保証できません。
折り返しご連絡いたします