こんにちは、
当社は、MCXN547とZephyr RTOS 4.3.0をベースとした製品を開発しています。工場出荷時のプロビジョニングプロセスの一環として、MCUXpressoセキュアプロビジョニングツールを使用して、ユニットごとに固有のEUI64をIFRのCMPA領域(アドレス`0x01004190`)にプログラムします。このEUI64から、6バイトのイーサネットMACアドレスを導き出します。
イーサネットドライバが、デバイスツリー内の静的な`local-mac-address`ではなく、起動時にこのMACアドレスを自動的に使用するようにしたいと考えています。
メモリマップドアクセスにより、`0x01004190`のCMPA領域が実行時に直接読み取り可能であることを確認しました(`devmem`で確認済み)。
私たちの質問:MCXN547で使用される`nxp,enet-qos-mac`ドライバが、起動時にIFR/CMPA内のカスタム位置からMACアドレスを読み取るための推奨される方法は何ですか?
従来の`nxp,enet-mac`ドライバがこの目的のために`nvmem-cells`をサポートしていることは承知していますが、`nxp,enet-qos-mac`ドライバでもこれがサポートされているか、または実現可能かどうか、またMCXN547の正しいデバイスツリー構成が何になるのかは不明です。
NXP社またはコミュニティからのアドバイスや事例をいただければ大変ありがたいです。
環境:
- MCU: MCXN547
- Zephyr: 4.3.0(NXPフォーク nxp-v4.3.0)
- ドライバ: `drivers/ethernet/eth_nxp_enet_qos/eth_nxp_enet_qos_mac.c`
- IDE: VS Code + MCUXpresso拡張機能
- プロビジョニング: MCUXpresso セキュアプロビジョニングツール
もし別の方法を試す気があるなら、内蔵TCP/IPスタックを持つMongooseを試してみるのも良いでしょう。Mongooseでは、MG_SET_MAC_ADDRESSを独自の関数に再定義できます。
試みるために、
1. プロジェクトコンバージョンでZephyrのTCP/IPを無効にする
2. mongoose/ディレクトリを作成し、mongoose.cをコピーしますおよび mongoose.hhttps://github.com/cesanta/mongooseより
3. mongoose_config.h を作成します。これを使って:
#pragma once
// https://mongoose.ws/documentation/#build-optionsを参照してください
#define MG_ARCH MG_ARCH_ARMGCC
#define MG_OTA MG_OTA_MCXN
#define MG_ENABLE_TCPIP 1
#define MG_ENABLE_DRIVER_MCXN 1
#define MG_ENABLE_CUSTOM_MILLIS 1
// extern void my_function(unsigned char *mac);
// #define MG_SET_MAC_ADDRESS(mac) my_function(mac)
4. ブートからのミリ秒数を返す「uint64_t mg_millis(void)」を実装します。
Mongooseを実行するZephyrタスクを作成し、8kbスタックを与えてください:
struct mg_mgr mgr;
mg_mgr_init(&mgr);
for (;;) mg_mgr_poll(&mgr, 1);
これで全てです。デバッグログを表示するには、printfをUARTにリダイレクトしてください。また、MongooseにはCRA対応のOTA機能が組み込まれています。https://mongoose.ws/ota/
少し異なるMCU用の既成テストプロジェクトがあります https://github.com/cesanta/mongoose/tree/master/tutorials/nxp/frdm-mcxn947-make-baremetal-builtin - mongoose リポジトリを閉じて、そのディレクトリで「make」と入力してビルドします。これはmakeとARM GCCのインストールが必要です。
こんにちは、 @Jorini さん。
投稿ありがとうございます!
Zephyrのドキュメントでは、実行時にMACアドレスを変更するオプションを利用できます:MACアドレス設定 — Zephyrプロジェクトドキュメント
この情報がお役に立てば幸いです!