Multi Source Translation Content

キャンセル
次の結果を表示 
表示  限定  | 次の代わりに検索 
もしかして: 

Multi Source Translation Content

ディスカッション

ソート順:
i.mx8M Plus の wm8962 エラー NXP i.MX 8M Plus(i.MX8MP)プロセッサとWolfson WM8962オーディオコーデックをベースにカスタムボードを設計しています。現在、このドライバーをLinuxカーネル5.4に移植中です。以下に、エラーログとDTS(デバイスツリーソース)の設定を示します。 ログ: [ 2.097680] imx-wm8962 sound-wm8962: 2111111111111111111111111 [ 2.103533] imx-wm8962 sound-wm8962: 22222222222222222222222222 [ 2.109467] imx-wm8962 sound-wm8962: 333333333333333333 [ 2.114705] imx-wm8962 sound-wm8962: 888888888888888888 [ 2.119953] imx-wm8962 sound-wm8962: failed to find codec platform device [ 2.126759] imx-wm8962: probe of sound-wm8962 failed with error -22 [ 2.995796] wm8962 2-001a: afrrgrgtrggggggggggggggggggg [ 3.001038] wm8962 2-001a: bbbbbbbbbbbbbbbbbbbbbbbbb [ 3.008259] random: fast init done [ 3.011807] wm8962 2-001a: customer id 0 revision F​ DTS:   sound-wm8960-forenex { compatible = "fsl,imx-audio-wm8962"; model = "wm8962-audio"; audio-codec = <&codec>; audio-cpu = <&sai3>; audio-routing = "Headphone Jack", "HPOUTL", "Headphone Jack", "HPOUTR", "Ext Spk", "SPKOUTL", "Ext Spk", "SPKOUTR", "AMIC", "MICBIAS", "IN3R", "AMIC", "IN1R", "AMIC"; }; &i2c3 { clock-frequency = <100000>; pinctrl-names = "default"; pinctrl-0 = <&pinctrl_i2c3>; status = "okay"; pca6416: gpio@20 { compatible = "ti,tca6416"; reg = <0x20>; gpio-controller; #gpio-cells = <2>; }; ov5640_1: ov5640_mipi@3c { compatible = "ovti,ov5640"; reg = <0x3c>; pinctrl-names = "default"; pinctrl-0 = <&pinctrl_csi0_pwn>, <&pinctrl_csi0_rst>, <&pinctrl_csi_mclk>; clocks = <&clk IMX8MP_CLK_IPP_DO_CLKO2>; clock-names = "xclk"; assigned-clocks = <&clk IMX8MP_CLK_IPP_DO_CLKO2>; assigned-clock-parents = <&clk IMX8MP_CLK_24M>; assigned-clock-rates = <24000000>; csi_id = <0>; powerdown-gpios = <&gpio4 1 GPIO_ACTIVE_HIGH>; reset-gpios = <&gpio4 0 GPIO_ACTIVE_LOW>; mclk = <24000000>; mclk_source = <0>; mipi_csi; status = "disabled"; port { ov5640_mipi_1_ep: endpoint { remote-endpoint = <&mipi_csi1_ep>; data-lanes = <1 2>; clock-lanes = <0>; }; }; }; codec: wm8962@1a { compatible = "wlf,wm8962"; reg = <0x1a>; clocks = <&audiomix_clk IMX8MP_CLK_AUDIOMIX_SAI3_MCLK1>; clock-names = "mclk"; wlf,shared-lrclk; AVDD-supply = <&reg_audio_pwr>; CPVDD-supply = <&reg_audio_pwr>; DBVDD-supply = <&reg_audio_pwr>; DCVDD-supply = <&reg_audio_pwr>; MICVDD-supply = <&reg_audio_pwr>; PLLVDD-supply = <&reg_audio_pwr>; SPKVDD1-supply = <&reg_audio_pwr>; SPKVDD2-supply = <&reg_audio_pwr>; gpio-cfg = < 0x0000 /* 0:Default */ 0x0000 /* 1:Default */ 0x0000 /* 2:FN_DMICCLK */ 0x0000 /* 3:Default */ 0x0000 /* 4:FN_DMICCDAT */ 0x0000 /* 5:Default */ >; }; };​ 私たちの分析によれば、カーネルがimx-wm8962マシンドライバの初期化を試みる際、I2Cバス上のWM8962コーデックはまだプローブ/登録を完了していません。WM8962はその後になってようやく初期化を完了する。このプローブの順序不一致により、ドライバーの初期化がエラーで失敗します。 この問題を分析し、この行動を解決するための解決策を提案していただけませんか? IMX8MPLUSオーディオソフトウェア_NXP_MICR Android Linux Re: wm8962 on i.mx8M Plus error コーデックやSAIプラットフォームデバイスが準備できない場合は-EPROBE_DEFER返します imx-wm8962.c でプローブパス、以下を区別する: DT phandle が欠落/無効です → 実際のエラー、-EINVAL を返します。 phandle は存在しますが、参照されているデバイスがまだ登録されていません → 依存関係が準備できていないため、-EPROBE_DEFER を返します。 例えば、概念的には: codec_np = of_parse_phandle(np、「オーディオコーデック」、0); if (!codec_np) { dev_err(&pdev->dev、「オーディオ-codec missing またはinvalid\n」);         -EINVAL を返します。 } codec_dev = of_find_i2c_device_by_node(codec_np); if (!codec_dev) { dev_info(&pdev->dev, "codec device not ready, defer probe\n"); of_node_put(codec_np);         return -EPROBE_DEFER; } CPU DAI / SAIノードについても同様です。 cpu_np = of_parse_phandle(np、「audio-cpu」、0); if (!cpu_np) { dev_err(&pdev->dev、「audio-cpu missing or invalid\n」);         -EINVAL を返します。 } cpu_pdev = of_find_device_by_node(cpu_np); if (!cpu_pdev) { dev_info(&pdev->dev、「SAIプラットフォームデバイスは準備完了、プローブを延期\n」); of_node_put(cpu_np);         return -EPROBE_DEFER; } 現在のマシンドライバーを使い続けるなら、これが最も直接的な解決策です。 可能であればLinux 5.4のFSL-asoc-cardパスを推奨します Linux 5.4時代のNXPカーネルでは、互換=「fsl,imx-audio-wm8962」はsound/soc/fsl/fsl-asoc-card.cによって処理され、コーデックDAI名「wm8962」やWM8962クロック/FLL IDを含む明示的なWM8962処理が行われます。また、snd-soc-fsl-asoc-card.ko がロードされているか、組み込まれていることを確認してください。 つまり、レガシー/カスタムのimx-wm8962マシンドライバーとFSL-ASOC-cardの両方が同じ互換文字列をバインドしようとするのは避けるべきです。推奨されるアプローチ: CONFIG_SND_SOC_FSL_ASOC_CARD を有効化/使用する; サウンドノードがCompatible = "FSL,IMX-オーディオ-WM8962"; 意図的に維持する場合を除き、その互換性のある文字列のレガシー/カスタム imx-wm8962 バインディングを削除または無効にします。 DTSに必要なSAIとコーデックDAIプロパティが備わっていることを確認してください。 コーデックノードは概ね想定どおりの形状です。WM8962 の例では compatible = "wlf,wm8962"、reg =<0x1a> �、clocks、supply properties、gpio-cfg を使用します。ただし、DTSに表示されていない部品を確認してください。 &sai3 {      #sound-dai-cells = <0>;         pinctrl-names = "default";      pinctrl-0 = <&pinctrl_sai3>;         assignment-clocks = <&clk IMX8MP_CLK_SAI3>;         assigned-clock-parents = <&clk IMX8MP_AUDIO_PLL1_OUT>; assignment-clock-rates = <12288000>; /* またはボード指定のMCLK */ status = "オーケー"; }; また、コーデックは通常、以下の情報も公開する必要があります。 コーデック: wm8962@1a { 互換性 = "wlf,wm8962";      reg = <0x1a>;      #sound-dai-cells = <0>;      clocks = <&audiomix_clk IMX8MP_CLK_AUDIOMIX_SAI3_MCLK1>;      clock-names = "mclk";      ... }; また、reg_audio_pwr で参照されるレギュレータが定義され、有効になっており、有効な電圧範囲を持っていることを確認してください。コーデックが検出されているので、電源がこの特定のエラーの原因ではない可能性が高いですが、電源の不具合やMCLKの設定不良が後のオーディオ故障の原因になることがあります。 MCLKイネーブルメントの検証 WM8962のブリングアップ問題の中には、オーディオマシンドライバでコーデックMCLKを有効にする必要があることが知られています。imx_wm8962_probe()にclk_prepare_enable(codec_clk)を加えると、WM8962の音声が動作すると報告されています。コーデックのプローブが成功したにもかかわらず、その後の再生/キャプチャが失敗する場合は、コーデックの初期化時およびストリームの起動時に、SAI3 MCLKが実際にコーデックピンに存在していることを確認してください。 サウンドカードのノードに重複や競合がないか確認してください。 このコーデック/SAIペアをターゲットにしているアクティブなサウンドノードは1つだけ、モデル文字列が一意であることを確認しましょう。コーデックプラットフォームデバイスの見つかりに失敗した類似の失敗は、NXPコミュニティデバッグにおけるサウンドカード命名や重複カードの競合に関連していました。ノード名はsound-wm8960-forenexと表示されていますが、対応モデルはWM8962です。ノード名自体は通常機能しませんが、明確にするために名前を変更し、他に2つ目のSound-WM8962ノードがないか確認したほうがいいでしょう。 推奨される最小パス 可能であればLinux 5.4用にFSL-asoc-cardを使いましょう。 WM8962 ノードに #sound-dai-cells = <0> が追加されている場合は、追加してください。 &sai3 が有効になっており、clocks/pinctrl が設定されていることを確認してください。 カスタムのimx-wm8962ドライバーを維持する場合は、失敗したコーデックやCPUの検索パスを-EINVALではなく-EPROBE_DEFERにパッチしてください。 MCLKが有効になっており、存在していることを確認してください。
記事全体を表示
wm8962 on i.mx8M Plus error We are designing our custom board based on the NXP i.MX 8M Plus (i.MX8MP) processor with the Wolfson WM8962 audio codec. We are currently porting the driver to the Linux kernel 5.4. Below are the error logs and our DTS (Device Tree Source) configuration. LOG: [ 2.097680] imx-wm8962 sound-wm8962: 2111111111111111111111111 [ 2.103533] imx-wm8962 sound-wm8962: 22222222222222222222222222 [ 2.109467] imx-wm8962 sound-wm8962: 333333333333333333 [ 2.114705] imx-wm8962 sound-wm8962: 888888888888888888 [ 2.119953] imx-wm8962 sound-wm8962: failed to find codec platform device [ 2.126759] imx-wm8962: probe of sound-wm8962 failed with error -22 [ 2.995796] wm8962 2-001a: afrrgrgtrggggggggggggggggggg [ 3.001038] wm8962 2-001a: bbbbbbbbbbbbbbbbbbbbbbbbb [ 3.008259] random: fast init done [ 3.011807] wm8962 2-001a: customer id 0 revision F​ DTS:   sound-wm8960-forenex { compatible = "fsl,imx-audio-wm8962"; model = "wm8962-audio"; audio-codec = <&codec>; audio-cpu = <&sai3>; audio-routing = "Headphone Jack", "HPOUTL", "Headphone Jack", "HPOUTR", "Ext Spk", "SPKOUTL", "Ext Spk", "SPKOUTR", "AMIC", "MICBIAS", "IN3R", "AMIC", "IN1R", "AMIC"; }; &i2c3 { clock-frequency = <100000>; pinctrl-names = "default"; pinctrl-0 = <&pinctrl_i2c3>; status = "okay"; pca6416: gpio@20 { compatible = "ti,tca6416"; reg = <0x20>; gpio-controller; #gpio-cells = <2>; }; ov5640_1: ov5640_mipi@3c { compatible = "ovti,ov5640"; reg = <0x3c>; pinctrl-names = "default"; pinctrl-0 = <&pinctrl_csi0_pwn>, <&pinctrl_csi0_rst>, <&pinctrl_csi_mclk>; clocks = <&clk IMX8MP_CLK_IPP_DO_CLKO2>; clock-names = "xclk"; assigned-clocks = <&clk IMX8MP_CLK_IPP_DO_CLKO2>; assigned-clock-parents = <&clk IMX8MP_CLK_24M>; assigned-clock-rates = <24000000>; csi_id = <0>; powerdown-gpios = <&gpio4 1 GPIO_ACTIVE_HIGH>; reset-gpios = <&gpio4 0 GPIO_ACTIVE_LOW>; mclk = <24000000>; mclk_source = <0>; mipi_csi; status = "disabled"; port { ov5640_mipi_1_ep: endpoint { remote-endpoint = <&mipi_csi1_ep>; data-lanes = <1 2>; clock-lanes = <0>; }; }; }; codec: wm8962@1a { compatible = "wlf,wm8962"; reg = <0x1a>; clocks = <&audiomix_clk IMX8MP_CLK_AUDIOMIX_SAI3_MCLK1>; clock-names = "mclk"; wlf,shared-lrclk; AVDD-supply = <&reg_audio_pwr>; CPVDD-supply = <&reg_audio_pwr>; DBVDD-supply = <&reg_audio_pwr>; DCVDD-supply = <&reg_audio_pwr>; MICVDD-supply = <&reg_audio_pwr>; PLLVDD-supply = <&reg_audio_pwr>; SPKVDD1-supply = <&reg_audio_pwr>; SPKVDD2-supply = <&reg_audio_pwr>; gpio-cfg = < 0x0000 /* 0:Default */ 0x0000 /* 1:Default */ 0x0000 /* 2:FN_DMICCLK */ 0x0000 /* 3:Default */ 0x0000 /* 4:FN_DMICCDAT */ 0x0000 /* 5:Default */ >; }; };​ Based on our analysis, when the kernel attempts to initialize the imx-wm8962 machine driver, the WM8962 codec on the I2C bus has not yet completed its probing/registration. The WM8962 only finishes its initialization afterward. This probe ordering discrepancy causes the driver initialization to fail with an error. Could you please help analyze this issue and suggest solutions to resolve this behavior? IMX8MPLUS AUDIO_SOFTWARE_NXP_MICR  Android Linux Re: wm8962 on i.mx8M Plus error Return -EPROBE_DEFER when the codec or SAI platform device is not ready In your imx-wm8962.c probe path, distinguish between: missing/invalid DT phandle → real error, return -EINVAL ; phandle exists, but referenced device is not registered yet → dependency not ready, return -EPROBE_DEFER . For example, conceptually: codec_np = of_parse_phandle(np, "audio-codec", 0); if (!codec_np) {         dev_err(&pdev->dev, "audio-codec missing or invalid\n");         return -EINVAL; } codec_dev = of_find_i2c_device_by_node(codec_np); if (!codec_dev) {         dev_info(&pdev->dev, "codec device not ready, defer probe\n");         of_node_put(codec_np);         return -EPROBE_DEFER; } Similarly for the CPU DAI / SAI node: cpu_np = of_parse_phandle(np, "audio-cpu", 0); if (!cpu_np) {         dev_err(&pdev->dev, "audio-cpu missing or invalid\n");         return -EINVAL; } cpu_pdev = of_find_device_by_node(cpu_np); if (!cpu_pdev) {         dev_info(&pdev->dev, "SAI platform device not ready, defer probe\n");         of_node_put(cpu_np);         return -EPROBE_DEFER; } This is the most direct fix if you keep your current machine driver. Prefer the Linux 5.4 fsl-asoc-card path if available For Linux 5.4-era NXP kernels, compatible = "fsl,imx-audio-wm8962" is handled by sound/soc/fsl/fsl-asoc-card.c , which has explicit WM8962 handling, including codec DAI name "wm8962" and WM8962 clock/FLL IDs . Also verify that snd-soc-fsl-asoc-card.ko is loaded or built in . That means you should avoid having both a legacy/custom imx-wm8962 machine driver and fsl-asoc-card trying to bind the same compatible string. Recommended approach: enable/use CONFIG_SND_SOC_FSL_ASOC_CARD ; ensure your sound node uses compatible = "fsl,imx-audio-wm8962"; ; remove or disable the legacy/custom imx-wm8962 binding for that compatible string, unless you intentionally maintain it. Make sure the DTS has the required SAI and codec DAI properties Your codec node is broadly in the expected shape: examples for WM8962 use compatible = "wlf,wm8962" , reg = <0x1a> , clocks , supply properties, and gpio-cfg . However, confirm the parts not shown in your DTS: &sai3 {         #sound-dai-cells = <0>;         pinctrl-names = "default";         pinctrl-0 = <&pinctrl_sai3>;         assigned-clocks = <&clk IMX8MP_CLK_SAI3>;         assigned-clock-parents = <&clk IMX8MP_AUDIO_PLL1_OUT>;         assigned-clock-rates = <12288000>; /* or board-required MCLK */         status = "okay"; }; And the codec should also normally expose: codec: wm8962@1a {         compatible = "wlf,wm8962";         reg = <0x1a>;         #sound-dai-cells = <0>;         clocks = <&audiomix_clk IMX8MP_CLK_AUDIOMIX_SAI3_MCLK1>;         clock-names = "mclk";         ... }; Also ensure the regulator referenced by reg_audio_pwr is defined, enabled, and has a valid voltage range. Your codec is being detected, so the supplies are probably not the cause of this specific error, but bad supply or MCLK setup can cause later audio failures. Verify MCLK enablement There is a known class of WM8962 bring-up issues where enabling the codec MCLK in the audio machine driver was required; adding clk_prepare_enable(codec_clk) in imx_wm8962_probe() was reported to make WM8962 audio work . If your codec probe succeeds but playback/capture later fails, check that SAI3 MCLK is actually present at the codec pin during codec initialization and stream startup. Check for duplicate or conflicting sound-card nodes Make sure only one active sound node targets this codec/SAI pair and that the model string is unique. A similar failure involving failed to find codec platform device was also associated with sound-card naming / duplicate-card conflicts in NXP community debugging . Your node name says sound-wm8960-forenex while the compatible/model are WM8962; the node name itself is not normally functional, but I would rename it for clarity and verify there is no second enabled sound-wm8962 node elsewhere. Recommended minimal path Use fsl-asoc-card for Linux 5.4 if possible. Add #sound-dai-cells = <0>; to the WM8962 node if missing. Confirm &sai3 is enabled and has clocks/pinctrl configured. If keeping your custom imx-wm8962 driver, patch the failed codec/CPU lookup paths to return -EPROBE_DEFER instead of -EINVAL . Confirm MCLK is enabled and present.
記事全体を表示
FRDM-IMX95でWi-Fi接続を自動で行うスクリプトの書き方 (日本語ブログ) ​ 1. はじめに FRDM-IMX95のようなボードで開発を進めていると、起動後に毎回手作業でWi-Fiに接続するのが煩わしくなってきます。そこで、モジュールのロードからDHCPによるIPアドレス取得までを一気に行うシェルスクリプト connect_wifi.sh を用意すると便利です。 一見単純なタスクですが、組み込みLinux環境(特にNXPの *moal ドライバや、機能を絞った wpa_supplicant ビルド)では、デスクトップLinuxでは遭遇しないいくつかの落とし穴があります。ここでは、実際に動作するスクリプト(connect_wifi.sh)を1行ずつ解説しながら、それぞれの処理がなぜ必要なのかを説明します。 対象は、i.MX 8M / i.MX 93 / i.MX 95 などNXP SoC上でYoctoベースのLinuxを扱う開発者を想定しています。 *MOAL(MAC OS/A-kernel/OS-adaptor Layer)ドライバとは?  主にNXP Semiconductors(旧Marvell)製の無線LAN(Wi-Fi)チップセットにおいて、LinuxやAndroidなどのOS上で動作するOS依存型のホストドライバモジュールです。   <目次> 1. はじめに 2.  完成版スクリプト (connect_wifi.sh) 3. 各ブロックの解説 3.1 前提チェック — 静かに失敗させない 3.2 認証情報の読み込み — クオートという落とし穴 3.3 ドライバのロードとインターフェース起動 3.4 PSKをPBKDF2で計算 — wpa_passphraseを使わない理由 3.5 wpa_supplicant.conf の生成 — ctrl_interfaceを忘れない 3.6 wpa_supplicant の起動 — 既存プロセスの掃除 3.7 接続完了のポーリング — 固定sleepにしない 3.8 DHCPでIPアドレス取得 3.9 DNS設定 4. スクリプトの実行 5. まとめ 6. 関連情報   ​ 2.  完成版スクリプト (connect_wifi.sh) まずconnect_wifi.shの全体像を示します。以降のセクションで各ブロックを順に解説します。 #!/bin/bash set -uo pipefail readonly CRED_FILE="/etc/wifi/wifi.conf" readonly WPA_CONF="/etc/wpa_supplicant.conf" readonly IFACE="mlan0" # --- 1. 前提チェック --- if [[ ${EUID} -ne 0 ]]; then     echo "[ERROR] root権限で実行してください" >&2     exit 1 fi if [[ ! -f "${CRED_FILE}" ]]; then     echo "[ERROR] 認証情報ファイルが見つかりません: ${CRED_FILE}" >&2     exit 1 fi # --- 2. 認証情報の読み込み --- SSID=$(grep -E '^SSID=' "${CRED_FILE}" | cut -d= -f2-) PASSWORD=$(grep -E '^PASSWORD=' "${CRED_FILE}" | cut -d= -f2-) # 前後のクオートを防御的に除去 SSID="${SSID%\"}"; SSID="${SSID#\"}" SSID="${SSID%\'}"; SSID="${SSID#\'}" PASSWORD="${PASSWORD%\"}"; PASSWORD="${PASSWORD#\"}" PASSWORD="${PASSWORD%\'}"; PASSWORD="${PASSWORD#\'}" if [[ -z "${SSID}" || -z "${PASSWORD}" ]]; then     echo "[ERROR] SSID または PASSWORD が読み取れません" >&2     exit 1 fi echo "[OK] 認証情報を読み込みました (SSID=${SSID})" # --- 3. ドライバのロードとインターフェース起動 --- modprobe moal mod_para=nxp/wifi_mod_para.conf echo "[OK] モジュールをロードしました" ip link set "${IFACE}" up 2>/dev/null echo "[OK] ${IFACE} をupにしました" # --- 4. PSKをPBKDF2で計算 --- PSK_HEX=$(python3 -c " import sys, hashlib, binascii ssid = sys.argv[1] passphrase = sys.stdin.readline().rstrip('\n') psk = hashlib.pbkdf2_hmac('sha1', passphrase.encode(), ssid.encode(), 4096, 32) print(binascii.hexlify(psk).decode()) " "${SSID}" <<< "${PASSWORD}") unset PASSWORD if [[ -z "${PSK_HEX}" ]]; then     echo "[ERROR] PSKの計算に失敗しました" >&2     exit 1 fi # --- 5. wpa_supplicant.conf の生成 --- cat > "${WPA_CONF}" <<EOF ctrl_interface=/var/run/wpa_supplicant ctrl_interface_group=0 network={     ssid="${SSID}"     psk=${PSK_HEX} } EOF chmod 600 "${WPA_CONF}" # --- 6. wpa_supplicant の起動 --- pkill -f "wpa_supplicant.*${IFACE}" 2>/dev/null sleep 1 wpa_supplicant -B -i "${IFACE}" -c "${WPA_CONF}" if [[ $? -ne 0 ]]; then     echo "[ERROR] wpa_supplicantの起動に失敗しました" >&2     exit 1 fi echo "[OK] wpa_supplicantを起動しました" # --- 7. 接続完了のポーリング --- connected=0 for i in $(seq 1 20); do     state=$(wpa_cli -i "${IFACE}" status 2>/dev/null | grep ^wpa_state | cut -d= -f2)     echo "  [${i}/20] wpa_state=${state:-unknown}"     if [[ "${state}" == "COMPLETED" ]]; then         connected=1         break     fi     sleep 1 done if [[ ${connected} -eq 0 ]]; then     echo "[ERROR] Wi-Fi認証に失敗しました(タイムアウト)" >&2     exit 1 fi echo "[OK] Wi-Fi認証に成功しました" # --- 8. DHCPでIPアドレス取得 --- udhcpc -i "${IFACE}" -n -t 5 -T 3 if [[ $? -ne 0 ]]; then     echo "[ERROR] DHCPによるIPアドレス取得に失敗しました" >&2     exit 1 fi echo "[OK] DHCPでIPアドレスを取得しました" # --- 9. DNS設定 --- if ! grep -q "nameserver 8.8.8.8" /etc/resolv.conf 2>/dev/null; then     echo "nameserver 8.8.8.8" >> /etc/resolv.conf fi echo "=== 接続完了 ===" ip addr show "${IFACE}" 認証情報は、スクリプト本体とは分離した /etc/wifi/wifi.conf に置きます。 root@frdm-imx95:~# mkdir -p /etc/wifi root@frdm-imx95:~# cat > /etc/wifi/wifi.conf <<'EOF' SSID=exampleSSID PASSWORD=examplePassword EOF 認証情報は他のユーザーからアクセスできないよう、権限を変更しておきます。 root@frdm-imx95:~# chmod 600 /etc/wifi/wifi.conf   ​ 3. 各ブロックの解説 ​ 3.1 前提チェック — 静かに失敗させない set -uo pipefail '-u'オプション は未定義変数の参照をエラーにし、'-o pipefail' はパイプ内のいずれかのコマンドが失敗した場合に終了コードへ反映します。 なお、あえて '-e'(エラーで即終了)は付けていません。ネットワーク系のコマンドは「失敗しても後続の診断を続けたい」ケースが多く、'-e' があると失敗した瞬間に何のメッセージも出さずにスクリプトが終わってしまうためです。代わりに、各コマンドの直後で '$?' を明示的にチェックし、どの段階で失敗したかを '[OK]' / '[ERROR]' のログとして残す方針にしています。 root権限チェックと認証情報ファイルの存在チェックも、後続処理が意味不明なエラーで落ちる前に、原因を明確にして早期終了させるためのものです。 ​ 3.2 認証情報の読み込み — クオートという落とし穴 SSID=$(grep -E '^SSID=' "${CRED_FILE}" | cut -d= -f2-) 認証情報ファイルから 'SSID=' で始まる行を取り出し、'=' 以降を値として抽出します。'cut -d= -f2-' の '-f2-'(2フィールド目以降すべて)がポイントで、これによりパスワードに '=' が含まれていても正しく取り出せます。 続く4行のクオート除去が、実は本スクリプトで最も重要な防御処理です。 SSID="${SSID%\"}"; SSID="${SSID#\"}" これはbashのパラメータ展開で、'${var%\"}' が末尾のダブルクオート、'${var#\"}' が先頭のダブルクオートを除去します。 なぜ必要かというと、認証情報ファイルにうっかり 'SSID="exampleSSID"' とクオート付きで書いてしまった場合、'cut' はクオートも含めて値として取り込みます。その状態で後段の 'wpa_supplicant.conf' 生成時に 'ssid="${SSID}"' とさらにクオートを付けると、 ssid=""exampleSSID"" という二重クオートになります。'wpa_supplicant' のパーサーは外側の1組しか想定していないため、内側のクオートまでSSIDの一部として解釈してしまい、スキャン結果に存在するはずのAPとマッチしません。結果として 'wpa_state' が 'SCANNING' から一切進まないという、原因の分かりにくい症状になります。 この防御処理を入れておけば、認証情報ファイルの記法がクオートあり・なしのどちらでも正しく動作します。 ​ 3.3 ドライバのロードとインターフェース起動 modprobe moal mod_para=nxp/wifi_mod_para.conf ip link set "${IFACE}" up 2>/dev/null NXPのWi-Fiは 'moal' カーネルモジュールで提供され、'mod_para' でファームウェアの動作パラメータファイルを指定します。ロード後にインターフェース(ここでは 'mlan0')を明示的にupしておきます。 ​ 3.4 PSKをPBKDF2で計算 — wpa_passphraseを使わない理由 通常、WPA2-PSKの設定生成には 'wpa_passphrase' コマンドを使います。しかし組み込み環境では2つの問題に直面しました。 パスワードの露出です。'wpa_passphrase SSID PASSWORD' のように引数で渡すと、実行中に 'ps' コマンドや '/proc/ /cmdline ' から平文パスワードが見えてしまいます。 標準入力経由での動作不良です。露出を避けるため 'wpa_passphrase "$SSID" <<< "$PASSWORD"' とヒアストリングで渡すと、環境によっては次のエラーが出て空のファイルが生成されました。 reading passphrase from stdin tcgetattr: Inappropriate ioctl for device これは 'wpa_passphrase' が端末のエコーを制御しようと 'tcgetattr()' を呼ぶものの、標準入力が実端末(TTY)ではないために失敗し、その後のパスフレーズ読み込みも中断されるためです。 そこで、WPA2-PSKの鍵導出仕様をそのままpython3で実装しました。 psk = hashlib.pbkdf2_hmac('sha1', passphrase.encode(), ssid.encode(), 4096, 32) WPA2-PSKのPSKは、仕様上 PBKDF2-HMAC-SHA1(パスフレーズ, SSID, 4096回, 256bit) という決まった計算で導出されます。これを直接計算することで、'wpa_passphrase' のTTY依存を完全に回避できます。パスワードは引数ではなく 'sys.stdin' から受け取るため 'ps' にも露出しません。 unset PASSWORD 計算が終わったら、平文パスワードを保持する変数は速やかに破棄します。 ​ 3.5 wpa_supplicant.conf の生成 — ctrl_interfaceを忘れない cat > "${WPA_CONF}" <<EOF ctrl_interface=/var/run/wpa_supplicant ctrl_interface_group=0 network={     ssid="${SSID}"     psk=${PSK_HEX} } EOF このブロックで見落としやすいのが冒頭の `ctrl_interface` の指定です。 'wpa_cli' は '/var/run/wpa_supplicant/<インターフェース名>' というUNIXドメインソケット経由で 'wpa_supplicant' と通信します。このソケットは 'ctrl_interface' を設定ファイルに書かないと生成されません。これを忘れると、後段のポーリング('wpa_cli status')が次のエラーで動かず、実際には接続に成功していても状態を取得できないため「失敗」と誤判定してしまいます。 Failed to connect to non-global ctrl_ifname: mlan0  error: No such file or directory また、'psk=' 行の値('PSK_HEX')は16進のハッシュ値なのでクオートを付けません。クオートを付けると平文パスフレーズとして再解釈されてしまうため注意が必要です。一方 'ssid=' は文字列なのでクオートで囲みます。 生成後は 'chmod 600' で他ユーザーから読めないようにします。 ​ 3.6 wpa_supplicant の起動 — 既存プロセスの掃除 pkill -f "wpa_supplicant.*${IFACE}" 2>/dev/null sleep 1 wpa_supplicant -B -i "${IFACE}" -c "${WPA_CONF}" 再実行時に古い 'wpa_supplicant' プロセスが残っていると、新しいプロセスとソケットが競合したり、古い設定のまま動き続けたりします。起動前に 'pkill' で確実に掃除しておきます。'-B' はバックグラウンド実行を指定するオプションです。 デバッグ時にログをファイルへ出したくなりますが、ビルドによっては '-B'(バックグラウンド)と '-f'(ログファイル)を併用できないことがあります('-f' 未サポートのビルドでは引数解析に失敗し、ヘルプが表示されて起動しません)。その場合は次のようにシェルのリダイレクトを使います。 wpa_supplicant -dd -i "${IFACE}" -c "${WPA_CONF}" > /var/log/wpa_supplicant.log 2>&1 &   ​ 3.7 接続完了のポーリング — 固定sleepにしない for i in $(seq 1 20); do     state=$(wpa_cli -i "${IFACE}" status 2>/dev/null | grep ^wpa_state | cut -d= -f2)     echo "  [${i}/20] wpa_state=${state:-unknown}"     if [[ "${state}" == "COMPLETED" ]]; then         connected=1         break     fi     sleep 1 done 電波状況によって認証完了までの時間は変動するため、固定待機は「まだ繋がっていないのに次へ進む」「無駄に待ちすぎる」のどちらかになりがちです。 代わりに 'wpa_cli status' の 'wpa_state' を1秒間隔でポーリングし、'COMPLETED' になった時点で先へ進みます。各ステップで状態を出力しているので、認証がどのフェーズで止まっているか('SCANNING' / 'ASSOCIATING' / '4WAY_HANDSHAKE' など)がリアルタイムに見えるのも利点です。 'wpa_state' の正常な遷移は次のとおりです。 DISCONNECTED → SCANNING → AUTHENTICATING → ASSOCIATING → ASSOCIATED → 4WAY_HANDSHAKE → GROUP_HANDSHAKE → COMPLETED どこで止まるかによって原因の切り分けができます。'SCANNING' から進まなければAPが見つかっていない(SSID誤り、電波、バンド設定など)、'4WAY_HANDSHAKE' で 'WRONG_KEY' が出れば鍵(パスワードまたはSSID)の不一致、といった具合です。   ​ 3.8 DHCPでIPアドレス取得 udhcpc -i "${IFACE}" -n -t 5 -T 3 BusyBoxの 'udhcpc' (Micro DHCP Client) でIPアドレスを取得します。 オプションは、 '-n'(リース取得失敗時に終了) '-t 5'(リクエスト再送を最大5回) '-T 3'(再送間隔3秒) です。これらを指定しないと、DHCPサーバに到達できない環境でスクリプトが無限に待ち続けてしまうため、必ず入れておきます。 ​ 3.9 DNS設定 if ! grep -q "nameserver 8.8.8.8" /etc/resolv.conf 2>/dev/null; then     echo "nameserver 8.8.8.8" >> /etc/resolv.conf fi '/etc/resolv.conf' にフォールバック用のDNSサーバを追記します。既に同じ行があれば重複追記しないよう 'grep' でチェックしています。 なお、DHCP取得したDNS情報をネットワーク管理系(udhcpcのデフォルトスクリプトやsystemd-resolvedなど)が '/etc/resolv.conf' に書き込む構成では、手動追記が上書きされることがあります。固定DNSを確実に効かせたい場合は、udhcpc側のフックスクリプトで制御するのが本来は堅実です。   ​ 4. スクリプトの実行 作成したスクリプトに'chmod'コマンドで実行権限を付加し、実行します。 root@frdm-imx95:~# chmod +x connect_wifi.sh root@frdm-imx95:~# ./connect_wifi.sh ​ 5. まとめ FRDM-IMX95上でのWi-Fi自動接続スクリプトを題材に、組み込みLinux特有の注意点を解説しました。デスクトップLinuxでは意識する必要のない、次のようなポイントがつまずきどころになります。 'wpa_passphrase' はヒアストリング入力でTTYエラーになることがあり、PBKDF2の自前計算が確実 'wpa_supplicant.conf' に 'ctrl_interface' がないと 'wpa_cli' で状態を取得できない SSIDのクオートの二重化は 'SCANNING' から進まない原因になる SSIDはPSK計算の入力の一部であり、SSIDの誤りは鍵の不一致として現れる ビルドによっては '-B' と '-f' を併用できない 同様の課題に取り組まれている方の参考になれば幸いです。 ​ 6. 関連情報 i.MX FRDMボードの部屋 Yocto Linux BSPの利用方法 ~まとめページ~ (日本語ブログ) ========================= 本投稿の「Comment」欄にコメントをいただいても、現在返信に対応しておりません。 お手数をおかけしますが、お問い合わせの際には「NXPへの技術質問 - 問い合わせ方法 (日本語ブログ)」をご参照ください。 (既に弊社NXP代理店、もしくはNXPとお付き合いのある方は、直接担当者へご質問いただいてもかまいません。) FRDM-IMX95に搭載されているWi-Fiモジュールを、起動後に毎回手作業で接続するは非常に煩わしいです。そこで本記事では、起動時に自動でWi-Fi接続するための方法と、スクリプトの書き方例について紹介します。 同様のWi-Fiモジュールを搭載しているi.MXファミリの評価ボードにも流用できます。 (読了:20分) (作業時間: 10分) ※i.MX向けYocto Linuxをビルド、動作確認している前提 i.MX Processors 日本語ブログ
記事全体を表示
MPC5748G 在 SJA1105SMBEVM 上:代码闪存读取的是返回地址而不是数据;RAM/外设正常 您好, 我有一块 SJA1105SMBEVM 评估板(MPC574xB/C/G + SJA1105P/Q/R/S 网关评估套件,通过 Digi-Key 购买,货号为 568-SJA1105SMBEVM-ND)。板载 MPC5748G 的代码闪存似乎无法正常工作。我希望对以下诊断进行核实,并在申请退货授权 (RMA) 之前了解是否有已记录的恢复程序。 症状 该主板自开箱以来从未运行过其出厂固件。“Alive” LED D3(AH1721 第 5.4 节)从未闪烁过,事实上,板上的任何 LED 都从未闪烁过。 使用 S32DS for Power Architecture v2.1 和 PEmicro USB Multilink Universal 对 sja1105smbevm_tc10example 示例项目进行编程时,程序无限期地卡在以下位置: 编程顺序为:擦除、空白检查、编程和验证 {default}     CMD>VC 验证目标文件 CRC-16 校验值是否与设备范围匹配……        块 00FA0000-00FA0003 ... 它始终停留在这一点上(观察超过 14 分钟)。请注意,00FA0000-00FA0003 只有 4 个字节(RCHW),而 CMD>VC 是在擦除之前运行的预检查,因此在会话的第一次闪存读取时就会失败。 已排除 - J6 跳线:板出厂时未安装跳线,因此稳压器在上电后约 21 秒关闭(AH1721 第 6.4 节)。用跳线连接引脚 2-3 固定。现在电路板可以无限期地保持通电状态。D3 依然纹丝不动。 - PEmicro 探针固件:配置为 ARM 而不是 Qorivva MPC5xxx / ST SPC5xxx。已使用 PEFirmwareConfig.exe 进行修正,现在固件版本为 11.52,架构正确。这确实解决了另一个“空白检查期间出错”对话框的问题,该问题不再出现,但并没有解决闪存读取失败的问题。 - 启动配置中已禁用半主机模式。 - 调试移位频率从 5000 降至 1000 KHz,复位延迟增加到 500 ms,JTAG 排线重新安装在 A 端口 / J10 上。 - 审查:PEmicro 报告没有审查,并正常进入在线调试模式。 使用 S32DS 旁路进行诊断 直接运行 pegdbserver_power_console.exe 并使用 powerpc-eabivle-gdb 探测内存。 连接正常: 检测到 P&E 接口 - Flash 版本 11.52 设备 IDCODE 为 $00000082 启动重置脚本 (s32e200_mpc574xg.mac)... 将 RAM 从 $40000000 初始化为 $400BFFFF。 RESET 脚本已完成。 检测到 MPC574xG 设备。 设备型号为mpc5748g。 模式为在线调试。 内存探测结果: === RAM 写入/读取 @ 0x40001000(写入 0xDEADBEEF) === 0x40001000: 0xdeadbeef <- 确定 === SIUL2 MIDR1 @ 0xFFFC0004 === 0xfffc0004: 0x57483020 0x42004700 <- PARTNUM 0x5748,正常 === 代码闪现 ===     0xfa0000:    0x00fa0000  0x00fa0004  0x00fa0008  0x00fa000c     0xfa0010:    0x00fa0010  0x00fa0014     0xf90000:    0x00f90000  0x00f90004  0x00f90008  0x00f9000c     0x1000000:   0x01000000  0x01000004 每个闪词都会被读取为它自己的地址。那不是数据,也不是擦除后的闪存读取到的 0xFFFFFFFF。RAM 写入/读取、外设读取和寄存器读取均正常工作。 测试的地址来自示例项目自身的链接器脚本(Project_Settings/Linker_Files/linker_flash.ld): flash_rchw:org = 0x00FA0000,len = 0x4 FLASH_BASE_ADDR = 0x01000000 SRAM_BASE_ADDR = 0x40000000 这似乎可以解释这两种症状。At RESET时,BAM 从硬件中的 0x00FA0000 获取 RCHW,没有调试器参与,读取到的是垃圾数据,找不到有效的启动头,因此永远不会启动应用程序代码。空白支票/CMD>VC 都是闪存读取操作,因此编程失败。 问题 针对处于这种状态的 MPC5748G,是否有已记录的恢复程序,例如无需事先读取闪存即可进行的大容量擦除或闪存控制器重新初始化?S32DS 总是先执行验证读取,而验证读取操作会导致程序卡住,因此我一直无法尝试进行裸擦除。如果使用独立组网 (SA) 工具(例如 PROGPPCNEXUS?)是正确的方法,请告知。 否则,这块电路板是否应该被视为有缺陷? 谢谢。 Re: MPC5748G on SJA1105SMBEVM: code flash reads return address instead of data; RAM/peripherals OK 你好, 既然你能读取闪存,我估计这个设备没问题。 尝试加载一个简单的示例并进行调试。例如以下之一: https://community.nxp.com/t5/MPC5xxx-Knowledge-Base/MPC5-software-example-list/ta-p/1102445#MPC5748G 如果在上述任何位置均未找到启动头,则 BAF 确定 设备的生命周期状态。如果生命周期在 CUST_DELIV(客户) 交付)或 MCU 生产,它尝试串行启动。否则,启动失败。 BAF 发出破坏性重置 顺祝商祺! Peter Re: MPC5748G on SJA1105SMBEVM: code flash reads return address instead of data; RAM/peripherals OK 无法读取闪存。 已下载 Example_MPC5748G_FlexCAN_RXFIFO_SDK303.zip,但该项目在 S32DS 中编译失败。 我用 Claude 搭建了一个简单的“闪烁”项目,该项目在内存中运行。程序加载到目标板上后运行正常。然后创建了一个调试配置文件,用于从闪存运行。启动过程停留在 98%。问题与“sja1105smbevm_tc10example”完全相同。调试启动时,尝试从闪存读取数据时卡住。控制台选项卡中的最后一条消息: 正在加载编程算法…… 完毕。 编程顺序为:擦除、空白检查、编程和验证 {default} CMD>VC 正在验证目标文件 CRC-16 校验值是否与设备范围匹配…… 区块 00FA0000-00FA0003 ... 克劳德总结道: 现在,在不打开芯片的情况下,你已经获得了相当全面的诊断结果: - ✅ 探针、JTAG、复位、SRAM、时钟、引脚复用器、GPIO、UART、FreeRTOS 调度、独立 RAM 执行——全部确认完全正常(包括脱离调试器运行) - ❌ 无论图像大小或内容如何,Flash 编程每次都会在完全相同的地址 (0x00FA0000) 处卡住。 - ❌ 并非安全/审查锁定(已通过 PEmicro 控制台直接排除——没有安全设备警告) 我的结论: 硬件有缺陷。返回。
記事全体を表示
2KL[IW610] MURATA 模块的 USB 枚举问题 您好,NXP, 我们遇到 IW610 驱动程序与基于 Ambarella 处理器的 SBC [Ambarella CV75 EVK] 配合使用的问题。IW610 HW 是村田 2KL 模块,通过 USB 接口连接到主机。 [设备设置]: 客户(VVDN)在同一主机上通过Microchip公司的USB4216 USB集线器连接5G/LTE模块和2KL模块。 【问题】:启动时,2KL模块(IW610)可以被正确检测和枚举,但5G/LTE模块检测失败。如果仅将5G/LTE模块连接到系统并重启设备,则设备枚举正常。 当枚举 2KL 模块之后枚举其他 USB 设备时,就会出现此问题。在 2KL 枚举之前枚举的所有设备均工作正常。 附件为客户控制台日志和 WiFi/BT 驱动程序调试日志。 期待您的支持。 谢谢! 潘卡杰·桑特 Re: USB ENUMERATION Issue with 2KL[IW610] MURATA MODULE 你好@pankaj 好的,我这就查看你的日志。 顺祝商祺! 肖恩 Re: USB ENUMERATION Issue with 2KL[IW610] MURATA MODULE 嗨@shaun_wu , 这个问题与外部无线电共存无关,而是与通过 USB 进行设备枚举有关。 请您协助调查所提供的日志中出现的枚举问题。如果您需要更多日志文件,请与我们联系。 Re: USB ENUMERATION Issue with 2KL[IW610] MURATA MODULE 你好@pankaj 对于多无线芯片,我们提供外部共存接口来控制无线流量。您可以按照以下指南连接和配置共存系统: https://www.nxp.com/webapp/Download?colCode=AN14410&appType=license 顺祝商祺! 肖恩 Re: USB ENUMERATION Issue with 2KL[IW610] MURATA MODULE 你好@pankaj 我们注意到有客户向我们反映了同样的问题。印度SAE车队正在负责此事。00994762 | 案例 | Salesforce ,您可以通过此案例进行进一步讨论。 顺祝商祺! 肖恩
記事全体を表示
i.MX93 MIPI CSI-2: clock lane never enters HS at 200 Mbps (data lanes OK) Board: FRDM-i.MX93 (imx93-11x11-lpddr4x-frdm) BSP: Linux 6.18.2, driver phy-fsl-imx9-dphy-rx.c (fsl,imx93-dphy-rx) Camera: custom 2-lane sensor behind MAX96717 / MAX96714 GMSL2 serdes Data rate: 200 Mbps per lane, 2 lanes, continuous clock (fixed by the camera, cannot be changed) PROBLEM The clock lane never enters high speed. No frames are captured. DPHY_RX_STATUS (0x4ae00000 + 0x48) stays at CLK_LANE_HS = 0. WHAT WORKS - GMSL2 link is locked. The deserializer reports VID_LOCK=1, PKT_DET=1, and its CSI-2 output is enabled. - We have scoped the clock lane at the SoC pins. The clock lane is driven, makes the LP-11 to HS transition, and runs continuously while streaming. - Both data lanes are alive and the i.MX93 is decoding them. Polling DPHY_STOPSTATE (offset 0x4c) in a tight kernel loop shows about 500 transitions per 15 ms on each data lane. That matches the per-line data bursts from the camera, so the D-PHY low-power receivers are working and are following the HS entry requests. - The media pipeline is configured and STREAMON is accepted. WHAT DOES NOT WORK - CLK_LANE_HS never becomes 1. We checked it 20000 times in a tight kernel loop, so even a very short pulse would have been seen. - No errors are reported anywhere. INT_ST_MAIN (0x0c), INT_ST_DPHY_FATAL (0xe0) and INT_ST_DPHY (0x110) all read 0x00000000. - 0 bytes are captured. REGISTER VALUES READ ON THE RUNNING BOARD - hsfreqrange = 0x03 (the 205 Mbps row, correct for 200 Mbps) - cfgclkfreqrange = 28 (the config clock is 24 MHz, so (24-17)*4 = 28) - DPHY_STOPSTATE = 0x00000003 when idle, both data lanes in stop state WHAT WE NOTICED IN THE DRIVER The i.MX93 Reference Manual (Rev 7, section 55.3.1) says the D-PHY start-up needs hsfreqrange, cfgclkfreqrange AND osc_freq_target[11:0] to be configured. It also gives a value for counter_for_des_en_config_if in Table 541. The i.MX93 config function in phy-fsl-imx9-dphy-rx.c (imx93_dphy_config) writes only hsfreqrange and cfgclkfreqrange. It does not write osc_freq_target or counter_for_des_en_config_if. QUESTIONS 1. On i.MX93, does osc_freq_target need to be programmed? If so, how should it be written? 2. If it does not, what is supposed to make the clock lane enter HS? 3. Is 200 Mbps with a continuous clock a supported configuration on the i.MX93 CSI-2 port? Thank you.
記事全体を表示
RT117x RTC_XTAL(OSC_32K) test output pin Hello, Is there A way to test the frequency of RTC_XTAL(OSC_32K) in RT117x? I found one for 24MHz clock but not 32K in the clock tree in the reference manual. Kind regards, Marwan Re: RT117x RTC_XTAL(OSC_32K) test output pin Hi @Marwan, On the i.MX RT1170, you can route REF_CLK_32K to GPIO_AD_13 using ALT9, as mentioned in Table 11-1. Muxing Options of the i.MX RT1170 Processor Reference Manual. With this, you should be able to probe the 32.768 kHz clock directly with an oscilloscope. Best Regards, Pablo
記事全体を表示
i.MX93 MIPI CSI-2: クロックレーンが200MbpsでHSに進入しない(データレーンは正常) 基板:FRDM-i.MX93 (imx93-11x11-lpddr4x-frdm) BSP:Linux 6.18.2、ドライバー phy-fsl-imx9-dphy-rx.c (fsl, imx93-dphy-rx) カメラ:カスタム2レーンセンサーをMAX96717/MAX96714 GMSL2セルデス データレート:1レーンあたり200 Mbps、2レーン、連続クロック(固定 カメラは変更不可) 問題 時計車線は決して高速走行にはならない。フレームはキャプチャされませんでした。 DPHY_RX_STATUS (0x4ae00000 + 0x48) は CLK_LANE_HS = 0 のままです。 効果的な方法 - GMSL2リンクはロックされています。デシリアライザは、VID_LOCK=1、PKT_DET=1 を報告します。 また、CSI-2出力が有効になっています。 - SoCピンにおけるクロックレーンをスコープで解析しました。時計レーンは 駆動され、LP-11からHSへの移行を行い、連続運転する ストリーミング配信中。 - 両方のデータレーンは正常に動作しており、i.MX93がそれらをデコードしています。世論調査 タイトなカーネルループ内の DPHY_STOPSTATE (オフセット 0x4c) は約 500 を示しています 各データレーンにおける15ミリ秒あたりの遷移回数。これは1行あたりの料金と一致します カメラからのデータバーストが出るため、D-PHYの低出力レシーバは 勤務中で、高校の入学申請に従っています。 - メディアパイプラインの設定が完了し、STREAMONが受け入れられます。 うまくいかないこと - CLK_LANE_HS は決して 1 になりません。私たちは2万回もチェックしました カーネルループなので、非常に短いパルスでも見られたはずです。 - どこにもエラーは報告されていません。INT_ST_MAIN (0x0c) INT_ST_DPHY_FATAL (0xe0) と INT_ST_DPHY (0x110) はすべて読み取り 0x00000000。 - 0バイトがキャプチャされました。 ランニングボード上で読み取られるレジスタ値 - hsfreqrange = 0x03(205 Mbpsの行、200 Mbpsの正確) - cfgclkfreqrange = 28(設定クロックは24 MHz、つまり(24-17)*4 = 28) - DPHY_STOPSTATE = 0x00000003 アイドル時、両方のデータレーンが停止状態 ドライバに気づいたこと i.MX93リファレンス・マニュアル(Rev 7、セクション55.3.1)にはD-PHYと記載されています スタートアップにはHSFREQレンジ、CFGCLKFREQレンジ、そしてosc_freq_targetが必要[11:0] 設定されるべきです。また、counter_for_des_en_config_if の値も提供します。 表541を参照。 phy-fsl-imx9-dphy-rx.c の i.MX93 設定関数 (imx93_dphy_config) は hsfreqrange と cfgclkfreqrange のみを書き込みます。それ osc_freq_target または counter_for_des_en_config_if は書き込みません。 質問 1.i.MX93では、osc_freq_targetをプログラムする必要がありますか?もしそうなら、どのようにして 書くべきでしょうか? 2. もしそうでなければ、時計レーンがHSに入るのは何なのでしょうか? 3. 連続クロックで200 Mbpsがサポートされている構成ですか? i.MX93 CSI-2ポート? よろしくお願いします。
記事全体を表示
SJA1105SMBEVM のMPC5748G:コードフラッシュはデータではなく返元アドレスを読み取る;RAM/ペリフェラルは問題ありません こんにちは、 私はSJA1105SMBEVM評価ボード(MPC574xB/C/G + SJA1105P/Q/R/Sゲートウェイ評価キット、Digi-Key経由で568-SJA1105SMBEVM-NDとして購入)を持っています。オンボードのMPC5748Gのコードフラッシュが機能していないようです。下記の診断内容について妥当性を確認させていただきたいのと、RMA(返品承認)手続きを進める前に、文書化された回復手順が存在するかどうかを知りたいです。 兆候 この基板は開封以来、工場出荷時のファームウェアを一度も実行していません。「Alive」LED D3(AH1721セクション5.4)は一度も点滅したことがなく、実際、基板上のどのLEDも一度も点滅したことがない。 S32DS for Power Architecture v2.1とPEmicro USB Multilink Universalを使ったsja1105smbevm_tc10example例プロジェクトのプログラミングは、次の段階で無期限に止まります。 プログラミングの手順は、消去、空白チェック、プログラム、検証です(デフォルト)。     CMD>VC オブジェクトファイルのCRC-16をデバイス範囲と照合しています... ブロック 00FA0000-00FA0003 ... (14分以上観察した結果)この地点から先に進むことは決してない。00FA0000-00FA0003はわずか4バイト(RCHW)であり、CMD>VCは消去前に実行されるプリチェックなので、セッションの最初のフラッシュリードで失敗します。 既に除外済み - J6ジャンパー:ジャンパーが装着されていない基板が出荷されていたため、電源投入後約21秒でレギュレーターがシャットダウンしました(AH1721セクション6.4)。ピン2-3にジャンパー線を接続することで修正しました。基板はこれで無期限に電源供給され続ける。D3は相変わらず瞬きをしない。 - PEmicroプローブファームウェア:Qorivva MPC5xxx / ST SPC5xxxではなくARM向けに設定されました。PEFirmwareConfig.exeを使用して修正し、正しいアーキテクチャのファームウェア11.52になりました。これにより、別の「空白チェック中にエラーが発生しました」というダイアログは表示されなくなりましたが、フラッシュ読み取りエラーは解決されませんでした。 - 起動設定でセミホスティングが無効になっています。 - デバッグシフト周波数を5000kHzから1000kHzに下げ、リセット遅延を500msに上げ、JTAGリボンケーブルをポートA/J10に再接続しました。 - 検閲: PEmicro は検閲がないと報告し、正常にインサーキットデバッグモードに入ります。 S32DSバイパス時の診断 pegdbserver_power_console.exeを直接実行し、powerpc-eabivle-gdbを使用してメモリをプローブします。 接続は正常です。 P&Eインターフェース検出 - フラッシュバージョン11.52 デバイスIDコードは$00000082です リセットスクリプト(s32e200_mpc574xg.mac)を開始します...     $40000000から$400BFFFFまでのRAMを初期化しています。 リセットスクリプトが完了しました。 MPC574xG デバイスが検出されました。 デバイスはmpc5748gです。 モードはインサーキットデバッグです。 メモリプローブの結果: === RAM書き込み/読み出し @ 0x40001000 (0xDEADBEEFに書き込み) ===     0x40001000:  0xdeadbeef                                    <- OK     === SIUL2 MIDR1 @ 0xFFFC0004 ===     0xfffc0004:  0x57483020  0x42004700                        <- PARTNUM 0x5748、OK === コードフラッシュ ===     0xfa0000:    0x00fa0000  0x00fa0004  0x00fa0008  0x00fa000c     0xfa0010:    0x00fa0010  0x00fa0014     0xf90000:    0x00f90000  0x00f90004  0x00f90008  0x00f9000c     0x1000000:   0x01000000  0x01000004 フラッシュワードはそれぞれ、自身のアドレスとして読み上げられる。それはデータではなく、消去されたフラッシュメモリが読み取るであろう0xFFFFFFFFでもありません。RAMの書き込み/読み取り、ペリフェラルの読み取り、レジスタの読み取りはすべて正常に動作します。 テスト対象のアドレスは、サンプルプロジェクト自身のリンカースクリプト(Project_Settings/Linker_Files/linker_flash.ld)からのものです。     flash_rchw      : org = 0x00FA0000、len = 0x4 FLASH_BASE_ADDR = 0x01000000 SRAM_BASE_ADDR = 0x40000000 これは両方の症状を説明しているように思われる。リセット時、BAMはハードウェアのRchWを0x00FA0000から取得し、デバッガを使わずにゴミデータを読み込み、有効なブートヘッダーを見つけず、アプリケーションコードを起動しません。そしてブランクチェック/CMD>VCはどちらもフラッシュ読み取りなので、プログラミングは失敗します。 質問 この状態のMPC5748Gに対して、例えばマス消去やフラッシュコントローラの再初期化など、事前のフラッシュ読み取りを必要としない文書化された復旧手順はありますか?S32DSは常に最初に検証読み取りを行いますが、これがハングする操作なので、裸消去を試みることはできませんでした。スタンドアロンツール(PROGPPCNEXUSなど)が適切なアプローチであれば、ご教示ください。 そうでなければ、この基板は不良品として扱われるべきでしょうか? ありがとうございます。 Re: MPC5748G on SJA1105SMBEVM: code flash reads return address instead of data; RAM/peripherals OK こんにちは、 フラッシュメモリを読み取れるということは、そのデバイスは正常だと思います。 簡単なサンプルを読み込んでデバッグしてみてください。例えば、以下のいずれかの例: https://community.nxp.com/t5/MPC5xxx-Knowledge-Base/MPC5-software-example-list/ta-p/1102445#MPC5748G 上記のいずれの場所にもブートヘッダーが見つからない場合、BAFは デバイスのライフサイクルステータス。ライフサイクルがCUST_DELIV(顧客)にある場合 Delivery)またはMCUプロダクションで、シリアルブートを試みます。そうでなければ、ブートは失敗しました。 そしてBAFは破壊的なリセットを発行する よろしくお願いいたします。 ピーター Re: MPC5748G on SJA1105SMBEVM: code flash reads return address instead of data; RAM/peripherals OK Flashを読み取れません。 Example_MPC5748G_FlexCAN_RXFIFO_SDK303.zipをダウンロードしましたが、S32DSでコンパイルに失敗します。 Claudeを使って、RAM上で動作するシンプルな「点滅」プロジェクトをセットアップしました。それはターゲットボードにロードされ、問題なく動作しました。次に、フラッシュメモリから実行するためのデバッグ構成を作成しました。起動が98%で停止します。「sja1105smbevm_tc10example」と全く同じ問題です。デバッグ起動時にフラッシュメモリからの読み取り中にハングアップする。コンソールタブの最新メッセージ: プログラミングアルゴリズムを読み込んでいます... 終わり。 プログラミングの手順は、消去、空白チェック、プログラム、検証です。{default} CMD>VC オブジェクトファイルのCRC-16をデバイス範囲と照合しています... ブロック 00FA0000-00FA0003 ... クロードはこう結論づけた。 これでチップを開けずに得られる限りの詳細な診断が得られます: - ✅ プローブ、JTAG、リセット、SRAM、クロック、ピン多重化、GPIO、UART、FreeRTOSスケジューリング、スタンドアロンRAM実行など、すべて正常に動作することが確認されています(デバッガから独立して実行することも含む)。 - ❌ フラッシュプログラミングは、イメージのサイズや内容に関係なく、毎回まったく同じアドレス(0x00FA0000)でハングアップします。 - ❌ セキュリティや検閲ロックではない(PEmicroコンソールで直接除外 — セキュアデバイス警告なし) 私の結論: ハードウェアに不具合があります。戻ります。
記事全体を表示
i.MX93 MIPI CSI-2:时钟通道在 200 Mbps 速率下始终无法进入高速模式(数据通道正常) 主板:FRDM-i.MX93 (imx93-11x11-lpddr4x-frdm) BSP:Linux 6.18.2,驱动程序 phy-fsl-imx9-dphy-rx.c (fsl,imx93-dphy-rx) 摄像头:MAX96717 / MAX96714 GMSL2 串行器/解串器后方的定制双车道传感器 数据速率:每通道 200 Mbps,2 条通道,连续时钟(由……固定) (摄像头,无法更改) 问题 时钟车道永远不会进入高速行驶状态。未捕获任何帧。 DPHY_RX_STATUS (0x4ae00000 + 0x48) 保持 CLK_LANE_HS = 0。 哪些方法有效 - GMSL2 链路已锁定。反序列化器报告 VID_LOCK=1,PKT_DET=1, 并且其 CSI-2 输出已启用。 - 我们已经对 SoC 引脚的时钟通道进行了测量。时钟车道是 驱动后,完成 LP-11 到 HS 的转换,并持续运行 直播时。 - 两条数据通道均已启用,i.MX93 正在解码它们。轮询 在紧凑的内核循环中,DPHY_STOPSTATE(偏移量 0x4c)显示大约 500 每条数据通道每 15 毫秒的转换次数。这与每行数据相符。 由于摄像头会发出数据突发,因此需要使用D-PHY低功耗接收器。 正在努力工作,并按照高中入学申请流程进行操作。 - 媒体管道已配置,STREAMON 已被接受。 哪些方法行不通? - CLK_LANE_HS 永远不会变为 1。我们在严密的环境下检查了20000次。 由于是内核循环,所以即使是很短的脉冲也会被检测到。 - 未报告任何错误。INT_ST_MAIN (0x0c) INT_ST_DPHY_FATAL (0xe0) 和 INT_ST_DPHY (0x110) 均被读取 0x00000000。 - 捕获到 0 字节。 读取仪表盘上的寄存器值 - hsfreqrange = 0x03(205 Mbps 行,更正为 200 Mbps) - cfgclkfreqrange = 28(配置时钟为 24 MHz,因此 (24-17)*4 = 28) - 当空闲时,DPHY_STOPSTATE = 0x00000003,两条数据通道均处于停止状态 我们注意到司机身上的一些特点 i.MX93 参考手册(修订版 7,第 55.3.1 节)指出 D-PHY 启动需要 hsfreqrange、cfgclkfreqrange 和 osc_freq_target[11:0] 待配置。它还为 counter_for_des_en_config_if 提供了一个值 见表541。 phy-fsl-imx9-dphy-rx.c 中的 i.MX93 配置函数 (imx93_dphy_config)仅写入 hsfreqrange 和 cfgclkfreqrange。它 不写入 osc_freq_target 或 counter_for_des_en_config_if。 问题 1.在 i.MX93 上,是否需要对 osc_freq_target 进行编程?如果是这样,该如何操作? 应该写下来吗? 2. 如果不是这样,是什么原因导致时钟通道进入高速通道? 3. 200 Mbps 的速率和连续时钟是否是受支持的配置? i.MX93 CSI-2 端口? 谢谢!
記事全体を表示
2KL[IW610] MURATAモジュールにおけるUSB列挙の問題 こんにちは、NXPさん。 AnbarellaプロセッサベースのSBC(Ambarella CV75 EVK)でIW610ドライバが動作する問題が発生しています。IW610ハードウェアは、USBインターフェースでホストに接続された村田2KLモジュールです。 [デバイス設定]: 構成は、顧客(VVDN)がMicrochipのUSB HUB-USB4216を介して同じホスト上で5G/LTEモジュール+2KLモジュールを使用しているというものです。 [問題]:起動時に2KLモジュール(IW610)は正しく検出・列挙されていますが、5G/LTEモジュールの検出が失敗しています。5G/LTEモジュールだけをシステムに接続した状態で再起動すると、正しく列挙されます。 この問題は、2KLモジュールの列挙後に他のUSBデバイスが列挙される際に発生します。2KL列挙前に列挙されたすべてのデバイスは正常に動作します。 添付は顧客のコンソールログとWiFi/BTドライバのデバッグログです。 皆さまのサポートを心よりお待ちしています。 ありがとうございます パンカジ・サント Re: USB ENUMERATION Issue with 2KL[IW610] MURATA MODULE こんにちは、 @pankaj さん。 はい、ログを確認させてください。 よろしくお願いいたします。 ショーン Re: USB ENUMERATION Issue with 2KL[IW610] MURATA MODULE こんにちは@shaun_wuさん この問題は、外部無線機器との共存とは関係なく、USB経由のデバイス列挙に関するものです。 提供されたログの列挙問題を調査するサポートはできますか?追加のログが必要な場合はお知らせください。 Re: USB ENUMERATION Issue with 2KL[IW610] MURATA MODULE こんにちは、 @pankaj さん。 複数無線チップの場合、無線通信を制御するための外部共存インターフェースを提供しています。共存環境の接続と設定については、以下のガイドを参照してください。 https://www.nxp.com/webapp/Download?colCode=AN14410&appType=license よろしくお願いいたします。 ショーン Re: USB ENUMERATION Issue with 2KL[IW610] MURATA MODULE こんにちは、 @pankaj さん。 同じ問題を報告しているお客様に気づきました。そして、インドのSAEチームがそれを担当しています。00994762 | CASE |Salesforceの皆さん、このケースを通じてさらに議論を進めてください。 よろしくお願いいたします。 ショーン
記事全体を表示
MPC5748G on SJA1105SMBEVM: code flash reads return address instead of data; RAM/peripherals OK Hi, I have an SJA1105SMBEVM evaluation board (MPC574xB/C/G + SJA1105P/Q/R/S Gateway Evaluation Kit, purchased via Digi-Key as 568-SJA1105SMBEVM-ND). The onboard MPC5748G appears to have non-functional code flash. I would like a sanity check on the diagnosis below, and to know whether there is a documented recovery procedure before I pursue an RMA. SYMPTOM The board has never executed its factory firmware since unboxing. The "Alive" LED D3 (AH1721 section 5.4) has never blinked, and in fact no LED on the board has ever blinked. Programming the sja1105smbevm_tc10example example project with S32DS for Power Architecture v2.1 and a PEmicro USB Multilink Universal hangs indefinitely at:     Programming sequency is : erase, blank check, program, and verify {default}     CMD>VC     Verifying object file CRC-16 to device ranges ...        block 00FA0000-00FA0003 ... It never advances past this point (observed for more than 14 minutes). Note that 00FA0000-00FA0003 is only 4 bytes (the RCHW), and CMD>VC is a pre-check that runs before erase, so this is failing on the very first flash read of the session. ALREADY RULED OUT - J6 jumper: board shipped with no jumper installed, so the regulators shut down about 21 s after power-up (AH1721 section 6.4). Fixed with a jumper on pins 2-3. The board now stays powered indefinitely. D3 still never blinks. - PEmicro probe firmware: was configured for ARM rather than Qorivva MPC5xxx / ST SPC5xxx. Corrected with PEFirmwareConfig.exe, now firmware 11.52 with the correct architecture. This did resolve a separate "Error during blank check" dialog, which no longer occurs, but it did not resolve the flash read failure. - Semihosting disabled in the launch configuration. - Debug Shift Freq lowered from 5000 to 1000 KHz, reset delay raised to 500 ms, JTAG ribbon reseated on Port A / J10. - Censorship: PEmicro reports no censorship and enters In-Circuit Debug mode normally. DIAGNOSTICS WITH S32DS BYPASSED Driving pegdbserver_power_console.exe directly and probing memory with powerpc-eabivle-gdb. Connection is clean:     P&E Interface detected - Flash Version 11.52     Device IDCODE is $00000082     Starting reset script (s32e200_mpc574xg.mac) ...     Initializing RAM from $40000000 to $400BFFFF.     Reset script completed.     MPC574xG Device detected.     Device is mpc5748g.     Mode is In-Circuit Debug. Memory probe results:     === RAM write/readback @ 0x40001000 (wrote 0xDEADBEEF) ===     0x40001000:  0xdeadbeef                                    <- OK     === SIUL2 MIDR1 @ 0xFFFC0004 ===     0xfffc0004:  0x57483020  0x42004700                        <- PARTNUM 0x5748, OK     === code flash ===     0xfa0000:    0x00fa0000  0x00fa0004  0x00fa0008  0x00fa000c     0xfa0010:    0x00fa0010  0x00fa0014     0xf90000:    0x00f90000  0x00f90004  0x00f90008  0x00f9000c     0x1000000:   0x01000000  0x01000004 Every flash word reads back as its own address. That is not data, and not 0xFFFFFFFF as erased flash would read. RAM writes/reads, peripheral reads, and register reads all work correctly. The addresses tested are the ones from the example project's own linker script (Project_Settings/Linker_Files/linker_flash.ld):     flash_rchw      : org = 0x00FA0000, len = 0x4     FLASH_BASE_ADDR = 0x01000000     SRAM_BASE_ADDR  = 0x40000000 This appears to explain both symptoms. At reset the BAM fetches the RCHW from 0x00FA0000 in hardware, with no debugger involved, reads garbage, finds no valid boot header, and never starts application code. And blank check / CMD>VC are both flash reads, so programming fails. QUESTION Is there a documented recovery procedure for an MPC5748G in this state, for example a mass erase or flash controller re-initialization that does not require a preceding flash read? S32DS always performs the verify read first, which is the operation that hangs, so I have not been able to attempt a bare erase. If a standalone tool is the correct approach (PROGPPCNEXUS?), please advise. Otherwise, should this board be treated as defective? Thanks. Re: MPC5748G on SJA1105SMBEVM: code flash reads return address instead of data; RAM/peripherals OK Hello, Since you are able to read flash, I expect that device is good. Try to load simple example and debug it. For example one of these: https://community.nxp.com/t5/MPC5xxx-Knowledge-Base/MPC5-software-example-list/ta-p/1102445#MPC5748G If no boot header is found in any of the locations mentioned above, the BAF determines the Life Cycle status of the device. If the Life Cycle is in CUST_DELIV (Customer Delivery) or MCU Production, it attempts a serial boot. Otherwise, the boot has failed and BAF issues a destructive reset Best regards, Peter Re: MPC5748G on SJA1105SMBEVM: code flash reads return address instead of data; RAM/peripherals OK Unable to read flash. Downloaded Example_MPC5748G_FlexCAN_RXFIFO_SDK303.zip, but the project fails to compile in S32DS. Used Claude to setup a simple "blinky" project that runs from RAM.  That loaded to the target board and ran just fine.  Then created a debug config to run from flash.  Launch stops at 98%.  Same exact issue as "sja1105smbevm_tc10example".  Debug launch hangs while trying to read from flash.  Last messages in console tab: Loading programming algorithm ... Done. Programming sequency is : erase, blank check, program, and verify {default} CMD>VC Verifying object file CRC-16 to device ranges ... block 00FA0000-00FA0003 ... Claude concludes: You now have about as thorough a diagnosis as you can get without opening the chip: - ✅ Probe, JTAG, reset, SRAM, clocks, pin mux, GPIO, UART, FreeRTOS scheduling, standalone RAM execution — all confirmed fully healthy (including running untethered from the debugger) - ❌ Flash programming hangs at the exact same address (0x00FA0000), every time, regardless of image size or content - ❌ Not a security/censorship lock (ruled out directly via PEmicro console — no secured-device warning) My conclusion: Hardware is defective. RETURNING.
記事全体を表示
USB ENUMERATION Issue with 2KL[IW610] MURATA MODULE Hi NXP, We have an issue with the IW610 DRIVER working with Ambarella processor-based SBC [Ambarella CV75 EVK]. The IW610 HW is the Murata 2KL Module which is connected to the host over USB interface.  [DEVICE SETUP]:  The setup is that the customer (VVDN) is using a 5G/LTE module + 2KL Module on the same host through a USB HUB -USB4216 from Microchip.  [ISSUE]: At boot up the 2KL MODULE (IW610) is detected and enumerated correctly, but the 5G/LTE module detection is failing.  If the device is rebooted  with the 5G/LTE modules only connected to the system it enumerates correctly.  The issue is seen whenever the other USB devices are getting enumerated post the enumeration of the 2KL module. All devices enumerated before the 2KL enumeration work correctly.  Attached is the customer console logs and WiFi/BT driver Debug logs. Looking forward to your support. Thanks, Pankaj Sant Re: USB ENUMERATION Issue with 2KL[IW610] MURATA MODULE Hello @pankaj  Sure let me check your logs. Best Regards Shaun Re: USB ENUMERATION Issue with 2KL[IW610] MURATA MODULE Hi @shaun_wu , The issue is not related to external radio co existence but with the device enumeration over USB. Can you support to investigate the enumeration issue with the provided logs. incase if you need additional logs kindly let us know. Re: USB ENUMERATION Issue with 2KL[IW610] MURATA MODULE Hello @pankaj  For multiple radio chip, we provide external coexistence interface to control radio traffic. You may follow the guide to connect and configure coexistence:  https://www.nxp.com/webapp/Download?colCode=AN14410&appType=license  Best Regards Shaun Re: USB ENUMERATION Issue with 2KL[IW610] MURATA MODULE Hello @pankaj  We notice we have customer report same issue to us. And India SAE team is handling it. 00994762 | Case | Salesforce, you may do further discussion via this case.  Best Regards Shaun
記事全体を表示
16MHz external crystal not working on the S32K314HMS custom board Hi, I am facing an issue with an external crystal of 16MHz not working with S32K314HMS custom board. I am using a build created from S32 Design Studio for S32 Platform Version: 3.6.9 Build id: 260624. I am using raw code to test the board function, as shown below in main.c: #include /* Corrected Raw Hardware Register Addresses for S32K314 */ #define SIUL2_MSCR_PTB5 (*(volatile uint32_t*)(0x40290294U)) #define MC_CGM_CLKOUT_CNTRL (*(volatile uint32_t*)(0x402D4000U)) /* --- CORRECTED FXOSC REAL ADDRESSES --- */ #define FXOSC_CTRL_REG (*(volatile uint32_t*)(0x40288000U)) /* Corrected from 402D4000 */ #define FXOSC_STAT_REG (*(volatile uint32_t*)(0x40288004U)) /* Corrected from 402D4004 */ volatile uint32_t rawTimeoutCounter = 0; volatile uint32_t crystalStableResult = 0; int main(void) { /* 1. RAW PIN SETUP: Configure PTB5 as a High-Drive Output mapped to CLKOUT */ SIUL2_MSCR_PTB5 = (5U << 0) | (1U << 21) | (1U << 19); /* 2. RAW CLOCK ROUTING: Route the Raw FXOSC clock directly to the CLKOUT hardware block */ MC_CGM_CLKOUT_CNTRL = (1U << 24) | (0U << 16); /* Source = FXOSC_CLK, Divider = 1, Enable = 1 */ /* 3. RAW HARDWARE KICKSTART: Power on the External Crystal (FXOSC) analog circuitry */ FXOSC_CTRL_REG |= 0x01U; /* 4. NON-BLOCKING SOFTWARE POLL We read the raw hardware status register. If a crystal is physically oscillating, the status register will flip a hardware bit or report a non-zero value. */ for (rawTimeoutCounter = 0; rawTimeoutCounter < 800000U; rawTimeoutCounter++) { /* Check if the FXOSC status register reports it is locked and stable (Bit 31) */ if ((FXOSC_STAT_REG & 0x80000000U) != 0U) { crystalStableResult = 1; /* HW SUCCESS: Crystal is alive and shaking! */ break; } } /* 5. PASS / FAIL EVALUATION PADS */ if (crystalStableResult == 1) { /* --- CRYSTAL HARDWARE PASSED --- */ for (;;) { __asm("NOP"); /* Put a breakpoint here for success */ } } else { /* --- CRYSTAL HARDWARE FAILED --- */ for (;;) { __asm("NOP"); /* Put a breakpoint here for a safe failure catch */ } } return 0; } I am attaching the board schematic for your reference. board_schematic.pngboard_schematic.png   Also attaching the .mex configuration for your reference. Re: 16MHz external crystal not working on the S32K314HMS custom board Hello @sksingh4476 , a 16 MHz crystal is within the supported FXOSC crystal frequency range for the S32K3 family, so the crystal frequency itself should not be the issue. However, from the raw code snippet it is not clear whether the complete FXOSC configuration is being applied. In particular, please check the FXOSC gain/transconductance setting (GM_SEL). In crystal mode, GM_SEL = 0000b should not be used, because this corresponds to zero transconductance and the oscillator may not start or become stable. Regarding the mex file: The generated clock initialization code must be called by the application. If the test code bypasses the generated RTD initialization and writes only a few registers manually, then all mandatory FXOSC settings, including GM_SEL, must also be configured manually. I would recommend first creating any standard S32DS/RTD example project and configuring the FXOSC through the Clock Configuration tool. Please verify whether the external crystal starts correctly with the generated RTD clock initialization code. This is a better baseline than starting directly with a minimal raw-register test, because the generated configuration should include all required FXOSC settings, including the oscillator mode and gain configuration. If the standard example works, you can then compare the generated FXOSC register values with your minimal code and gradually reduce the code to the smallest required sequence. If the standard example does not work either, then the next step should be to check the hardware side, especially the crystal parameters, ESR, load capacitors including PCB stray capacitance, layout around EXTAL/XTAL, and the gain margin calculation. The datasheet specifies the oscillator build-up condition using gmXOSC > 5 * gm_crit, so the selected crystal and external components should be verified against this requirement. Best regards, Pavel
記事全体を表示
RT117x RTC_XTAL(OSC_32K) 测试输出引脚 你好, RT117x中是否有办法测试RTC_XTAL(OSC_32K)的频率? 我在参考手册的时钟树中找到了 24MHz 时钟的,但没有找到 32K 时钟的。 此致敬礼, 马尔万 Re: RT117x RTC_XTAL(OSC_32K) test output pin 嗨@Marwan , 在 i.MX RT1170 上,您可以按照表 11-1 中所述,使用 ALT9 将 REF_CLK_32K 连接到 GPIO_AD_13。i.MX RT1170 处理器复用选项参考手册。 这样,你就可以用示波器直接探测 32.768 kHz 时钟了。 此致, 巴勃罗
記事全体を表示
定制 i.MX95 设计:当使用不同的 REFCLK 源时,PCIE1 和 PCIE2 能否形成 PCIe x2 链路? 您好,NXP团队, 我们正在开发基于 i.MX95 的定制设计。 在我们的设计中,PCIE1 REFCLK 来自 i.MX95 PCIe 时钟输出,而 PCIE2 REFCLK 来自外部时钟发生器。 鉴于 PCIE1 和 PCIE2 使用不同的 REFCLK 源,它们还能组合成 PCIe x2 链路吗? 附图为简化的示意图,供您参考。在我们的自定义设计中,PCIE1 REFCLK 和 PCIE2 REFCLK 由不同的源生成。 (PCIE1_REF_PAD_CLK 为 10K 端接,PCIE2_REF_PAD_CLK_P 由时钟发生器 (U22) 提供时钟信号) Screenshot 2026-08-17 110108.pngScreenshot 2026-08-17 110108.png   谢谢! Re: Custom i.MX95 Design: Can PCIE1 and PCIE2 Form a PCIe x2 Link When Using Different REFCLK Source @Louisliyuan 不——i.MX95 上的 PCIE1 和 PCIE2 不能合并成一条 PCIe x2 链路。i.MX95 PCIe 子系统有两个 PCIe Gen 3.0 接口,每个接口支持 x1 通道,配备两个单通道 SerDes 控制器和两个单通道 PHY。 这意味着 PCIE1 和 PCIE2 是独立的 x1 PCIe 链路,而不是一个 x2 控制器的两条通道。 所以,对于您的定制设计: PCIE1 可以使用 i.MX95 PCIe 时钟输出/参考时钟架构作为 x1 链路运行。 PCIE2 可以使用外部时钟发生器作为独立的 x1 链路运行,但需满足已记录的独立参考时钟要求,例如时钟发生器差异限制为 300 ppm。 在 i.MX95 上,PCIE1 + PCIE2 不能合并成单个 x2 PCIe 链路。  
記事全体を表示
Custom i.MX95 Design: Can PCIE1 and PCIE2 Form a PCIe x2 Link When Using Different REFCLK Sources? Hello NXP Team, We are developing a custom i.MX95-based design. In our design, PCIE1 REFCLK is sourced from the i.MX95 PCIe clock output, while PCIE2 REFCLK is sourced from an external clock generator. Given that PCIE1 and PCIE2 use different REFCLK sources, can they still be combined to form a PCIe x2 link? A simplified schematic snippet is attached for reference. PCIE1 REFCLK and PCIE2 REFCLK are generated from different sources in our custom design. (PCIE1_REF_PAD_CLK are 10K terminated, PCIE2_REF_PAD_CLK_P are sourced from clock generator(U22)) Screenshot 2026-08-17 110108.pngScreenshot 2026-08-17 110108.png   Thank you. Re: Custom i.MX95 Design: Can PCIE1 and PCIE2 Form a PCIe x2 Link When Using Different REFCLK Source @Louisliyuan  No — PCIE1 and PCIE2 on i.MX95 cannot be combined into one PCIe x2 link. The i.MX95 PCIe subsystem has two PCIe Gen 3.0 interfaces, each supporting x1 lane , with two single-lane SerDes controllers and two single-lane PHYs.  That means PCIE1 and PCIE2 are independent x1 PCIe links, not two lanes of one x2 controller. so, for your custom design: PCIE1 can operate as an x1 link using the i.MX95 PCIe clock output/reference-clock architecture. PCIE2 can operate as an independent x1 link using the external clock generator, subject to the documented separate-reference-clock requirements such as the clock-generator difference limit of 300 ppm . PCIE1 + PCIE2 cannot be combined into a single x2 PCIe link on i.MX95  
記事全体を表示
RT117x RTC_XTAL(OSC_32K) テスト出力ピン こんにちは、 RT117xでRTC_XTAL(OSC_32K)の周波数をテストする方法はありますか? 24MHzのクロック用のものは見つかりましたが、リファレンスマニュアルのクロックツリーには32Kはありませんでした。 敬具 マルワン Re: RT117x RTC_XTAL(OSC_32K) test output pin こんにちは、 @Marwan さん。 i.MX RT1170では、表11-1に記載されているようにALT9を使ってREF_CLK_32KをGPIO_AD_13にルーティングできます。i.MX RT1170プロセッサのリファレンス・マニュアルのMuxingオプション。 これにより、オシロスコープを使って32.768kHzのクロックを直接観測できるようになるはずです。 よろしくお願いします、 パブロ
記事全体を表示
カスタムi.MX95設計:異なるREFCLKソースを使用した場合、PCIE1とPCIE2がPCIe x2リンクを形成できますか? NXPチームの皆様、こんにちは。 私たちはカスタムのi.MX95ベースの設計を開発しています。 当社の設計では、PCIE1 RECCLKはi.MX95 PCIeクロック出力から供給され、PCIE2 RECCLKは外部クロックジェネレーターから供給されています。 PCIE1とPCIE2は異なるREFCLKソースを使用しているにもかかわらず、それらを組み合わせてPCIe x2リンクを形成することは可能でしょうか? 参考のために、簡略化した回路図の一部を添付します。PCIE1 REFCLKとPCIE2 REFCCLKは、カスタム設計で異なるソースから生成されます。 (PCIE1_REF_PAD_CLKは10KΩ終端、PCIE2_REF_PAD_CLK_Pはクロックジェネレータ(U22)から供給されます) Screenshot 2026-08-17 110108.pngスクリーンショット 2026-08-17 110108.png   よろしくお願いします。 Re: Custom i.MX95 Design: Can PCIE1 and PCIE2 Form a PCIe x2 Link When Using Different REFCLK Source @Louisliyuan  いいえ — i.MX95上のPCIE1とPCIE2は1つのPCIe x2リンクに統合できません。i.MX95 PCIeサブシステムは、x1レーンをサポートする2つのPCIe Gen 3.0インターフェースを持ち、2つのシングルレーンのSerDesコントローラと2つのシングルレーンのPHYを備えています。 つまり、PCIE1とPCIE2は独立したx1 PCIeリンクであり、1つのx2コントローラーが2レーンになるわけではありません。 SO,あなたのカスタムデザインについて: PCIE1はi.MX95 PCIeクロック出力/参照クロックアーキテクチャを用いてx1リンクとして動作可能です。 PCIE2は外部クロックジェネレーターを用いた独立したx1リンクとして動作可能であり、クロック-ジェネレーター差制限300 ppmなどの文書化された別リファレンスクロック要件に従います。 PCIE1 + PCIE2はi.MX95上で単一のx2 PCIeリンクに統合することはできません  
記事全体を表示
S32K328 的 GMAC RX 中断 我使用的是 S32K328 的 GMAC,想使用中断方法从我的 PC 接收数据包。但发现了一些不同的现象: 1. 可以调用中断处理程序 GMAC0_CH0_RX_IRQHandler,并正常接收数据包。 2. PC 发送数据包后,GMAC0_CH0_RX_IRQHandler 被调用了数秒。 3. GMAC0_CH0_RX_IRQHandler 无法调用,且未收到数据包? 原因可能是什么?如何解决这个问题? Re: GMAC RX interrupt of S32K328 你好@zyt , 感谢您分享配置信息。由于我没有 EB Tresos 设备,所以我根据提供的文件手动检查了 GMAC 的配置。 我将您的 Eth_43_GMAC 配置与一个可正常运行的 S32K358 GMAC 1G lwIP FreeRTOS 参考项目进行了比较。一个显著的区别是出口 FIFO 配置。在您的项目中,出口 FIFO 缓冲区长度配置为 128 字节,MTL 出口队列大小为 256 字节。而在参考项目中,出口 FIFO 缓冲区长度为 1536 字节,MTL 出口队列大小为 4096 字节。   如果您的应用程序发送任何帧或上层发送响应,则这种小型 TX/Egress 配置对于标准以太网帧来说可能过于有限,尤其是在 1G RGMII 模式下。请尝试增加以下数值:   - 将 EthCtrlConfigEgressFifoBufLenByte 设置为 1536 - 将 EthCtrlConfigMTLEgressQueueSizeInBytes 设置为 4096   对于 RX 路径,RX 缓冲区长度本身为 1536 字节,这看起来很合理。但是,您的 MTL Ingress 队列大小也是 1536 字节,而参考项目使用 4096 字节。因此,作为另一项测试,请尝试增加以下数值:   - 将 EthCtrlConfigMTLIngressQueueSizeInBytes 设置为 4096   另外,为了进行调试,请暂时启用接收所有模式。您当前的配置已禁用 PKT_FILTER_RECV_ALL,而参考项目已启用它。这有助于将 MAC 过滤从分析中排除。   此外,还有其他一些区别,例如EthEnableCacheManagement 和 EthCtrlReleaseResourceAfterReception,但这未必是错误的。   顺祝商祺! 帕维尔 Re: GMAC RX interrupt of S32K328 你好: 我尝试过单播帧和广播帧,每帧之间的延迟是 1 秒,我觉得这速度已经够慢了。 现象相同,开始时没有 RxStatsDropEvents,但几帧后就会出现。 我的EB配置如附件所示,请帮忙检查一下是否方便您使用。 谢谢。 Re: GMAC RX interrupt of S32K328 你好@zyt , RxStatsDropEvents 表明 GMAC 接收到了一些帧,但这些帧在接收路径中的某个地方被丢弃了。这可能与接收资源可用性、接收 FIFO/队列处理、描述符/缓冲区可用性、数据包过滤或上层接收处理有关。   请尝试以下检查:   1. 请从 PC 缓慢发送相同的单播帧,例如一次发送一帧或帧之间延迟较大,并比较测试前后的 RX 统计数据。如果 RxStatsDropEvents 不再增加,则问题可能与 RX 缓冲区回收、处理时间或来自 PC 的突发流量有关。   2. 请用广播帧重复测试,然后用精确到 GMAC 驱动程序中配置的 MAC 地址的单播帧重复测试。这有助于排除 MAC 地址/过滤问题。   请同时检查RGMII时钟和外设配置。作为参考,我在NXP社区发布了一个S32K358 GMAC示例: https://community.nxp.com/t5/S32K-Knowledge-Base/Example-S32K358-GMAC-1G-lwIP-FreeRTOS-S32DS-3-6-1-RTD600/ta-p/2355872     请注意,此示例适用于 S32K358,而不是 S32K328,因此未经检查 S32K328 引脚排列和时钟配置,不得直接复制。但是,它可以作为整体时钟设置、Eth_43_GMAC 配置和 DCMRWF 寄存器解决方法的参考。   如果可以的话,能否也分享一下您压缩后的项目文件?如果没有该项目,很难确定丢包是由配置、RX 资源处理、队列路由还是应用程序接收路径引起的。 顺祝商祺! 帕维尔 Re: GMAC RX interrupt of S32K328 你好: 我通过 RTD 函数 Eth_43_GMAC_GetRxStats 读取帧信息,看起来有丢帧事件。 zyt_0-1787017861198.pngzyt_0-1787017861198.pngzyt_0-1787017861198.pngzyt_0-1787017861198.pngzyt_0-1787017861198.pngzyt_0-1787017861198.pngzyt_0-1787017861198.pngzyt_0-1787017861198.pngzyt_0-1787017861198.png RX 流全部由 RTD 处理,如下所示,我没有修改。 GMAC0_CH0_RX_IRQHandler > GMAC_RxIRQHandler > Eth_43_GMAC_RxIrqCallback > Eth_43_GMAC_Receive 造成这种情况的原因可能是什么?谢谢。 Re: GMAC RX interrupt of S32K328 你好@zyt , 谢谢你提供的详细信息。   请同时根据此帖检查 Pins/Clocks/device_init(): S32K358 - GMAC 时钟配置   从截图中可以看出,GMAC0 中断向量似乎已配置并映射到 RTD 处理程序,包括 GMAC0_CH_0_RX_IRQHandler。由于有时会进入此处理程序并接收到帧,因此基本的中断路由看起来并没有完全错误。   但是,在使用 AUTOSAR Eth_43_GMAC 驱动程序时,请同时检查底层 IRQ 处理程序之上的接收流程。RX 中断处理程序本身通常不是完整的应用程序级接收处理。应用程序或上层仍然需要调用预期的 Eth_43_GMAC 接收 API 流程,例如 Eth_43_GMAC_Receive(),以便从驱动程序读取接收到的帧,并通过配置的回调路径进一步传递。   请检查以下几点:   1. 请确认 Eth_43_GMAC_Receive() 是否在 RX 中断事件之后调用,或者根据您的应用程序设计,是否定期从您的主/任务上下文中调用。如果发生中断,但接收到的帧没有从 RX 缓冲区中被消耗,则后续帧可能无法按预期接收。   2. 请验证接收到的单播帧目标 MAC 地址是否与 GMAC 驱动程序中配置的 MAC 地址完全匹配。为了进行调试,您可以暂时启用接收所有/混杂模式,以排除 MAC 过滤作为原因。   3. 请检查使用的是哪个接收队列/FIFO。您的屏幕截图显示了 CH0、CH1 和 CH2 的 RX 中断处理程序。如果数据包过滤器或队列配置将帧路由到另一个 RX 队列,则应用程序必须使用相应的 FIFO 索引调用接收函数并正确处理该队列。   4. 请验证接收缓冲区/描述符的可用性。接收到帧并处理完毕后,驱动程序必须能够再次重用或获取 RX 缓冲区。如果接收缓冲区耗尽,第一帧可能被正确接收,但后面的帧可能会延迟或丢失。   5. 如果启用了缓存,请验证 GMAC 描述符和 RX 缓冲区是否放置在不可缓存的内存区域中,或者是否执行了所需的缓存维护。否则,CPU 可能会看到过时的描述符状态或过时的接收数据。   6. 由于帧是从 Python 脚本以单播帧的形式发送的,请通过 Wireshark 确认 PC 是否确实连续发送了具有预期目标 MAC 地址的帧。如果某些帧需要地址解析,或者目标地址无法按预期到达,则 PC 端可能会引入重试或延迟,这在 MCU 端可能看起来像是延迟的 RX 中断行为。   作为参考,我建议先将该项目与改编的 S32K3 Ethernet/lwIP 示例进行比较。这有助于确认 RGMII PHY 接口、时钟、MAC 地址和基本 RX 路径是否正常工作,然后再关注自定义 AUTOSAR Eth_43_GMAC 中断接收实现。   如果问题仍然存在,请分享应用程序的 Eth_43_GMAC 接收部分,特别是调用 Eth_43_GMAC_Receive() 的位置、RX FIFO 配置、MAC 地址/过滤器配置以及故障后的 GMAC DMA/MTL/MAC 状态寄存器。 贝茨致意, 帕维尔 Re: GMAC RX interrupt of S32K328 Hello: 1. I use RGMII 2. I use  RTD 6.0.0. 3. I use Eth_43_GMAC driver. 4. Interrupt is like below: zyt_0-1786962682804.pngzyt_0-1786962682804.pngzyt_0-1786962682804.pngzyt_0-1786962682804.pngzyt_0-1786962682804.pngzyt_0-1786962682804.pngzyt_0-1786962682804.pngzyt_0-1786962682804.pngzyt_0-1786962682804.png 5. I send unicast frames with python script. All the packages I send are the same, and GMAC0_CH0_RX_IRQHandler is from RTD which is the lowest handler like picture above. Re: GMAC RX interrupt of S32K328 你好@zyt , 您能否提供更多关于您设备配置的详细信息?   1. 你在 S32K328 上使用的是哪个 MAC/PHY 接口,例如 MII、RMII 或 RGMII? 2. 您使用的是哪个版本的S32K3 RTD? 3. 您使用的是 AUTOSAR MCAL Eth_43_GMAC 驱动程序还是底层 GMAC IP 驱动程序? 4. 能否分享一下相关的中断配置以及 GMAC0_CH0_RX_IRQHandler 的实现? 5. PC 发送的是哪种类型的帧,例如 ping/ICMP、UDP、原始以太网帧、广播帧或单播帧?   作为参考测试,我还建议首先尝试使用修改后的 S32K3 Ethernet/lwIP 示例来重现该行为。这有助于将基本的 GMAC/PHY/时钟/配置问题与特定应用中断或 RX 缓冲区处理问题区分开来。     关于症状,如果 RX 中断有时会被调用,并且可以正确接收帧,则基本的 RX 路径可能至少部分有效。然而,这种不一致的行为仍然可能由以下几点之一造成:   - RX 缓冲区或描述符处理:在处理接收到的帧之后,必须将 RX 缓冲区/描述符返回给驱动程序/DMA。如果操作不当,RX 缓冲区可能变得不可用,并且进一步的 RX 中断可能会停止或变得不一致。   - 中断处理:请确保 RX 中断已配置为正确的 GMAC 通道,并且使用了预期的驱动程序中断处理程序/状态清除流程。如果中断状态未正确清除,则以下 RX 事件可能无法按预期报告。   - 缓存/内存一致性:如果启用了缓存,请验证 GMAC 描述符和 RX 缓冲区是否放置在合适的不可缓存内存区域中,或者是否执行了所需的缓存维护。否则,CPU 可能会看到过时的描述符状态或过时的接收数据。   - 数据包过滤/MAC 地址:为了调试目的,请尝试暂时启用接收所有/混杂模式。这有助于检查帧是否被 MAC 地址过滤器、VLAN 过滤器或其他数据包过滤器设置拒绝。   - 帧类型和 PC 行为:如果 PC 发送 ping 等 IP 流量,则在发送 ICMP 流量之前,第一个帧可能是 ARP 请求/回复。如果 ARP 解析失败或某些帧被过滤/丢弃,则中断可能会延迟几秒钟,因为 PC 会重新发送 ARP 或应用程序稍后重试。   - PHY 链路和时钟:请确认 PHY 链路是否正常,以及所选 MII/RMII/RGMII 接口所需的输入时钟是否存在且稳定。   请分享上述配置详情,如果可能,请提供故障发生后的 GMAC DMA/MTL/MAC 状态寄存器。这应该有助于确定问题是与中断配置、RX 描述符/缓冲区处理、数据包过滤还是外部 PHY/接口设置有关。 顺祝商祺! 帕维尔 Re: GMAC RX interrupt of S32K328 你好@zyt , 谢谢你的更新。我再次查看了您的文件,没有发现任何可疑之处。如果在增加 FIFO/队列资源后行为仍然没有改变,我不会盲目地继续更改配置参数。下一步应该是确定哪些帧实际被计为 RxStatsDropEvents。请检查丢包计数器是否仅在发送 Python 单播帧时增加,还是在没有 Python 流量运行时也会增加,因为 PC 端后台流量或过滤帧也可能影响 RX 统计信息。 贝茨致意, 帕维尔 Re: GMAC RX interrupt of S32K328 抱歉,我忘了你没有EB。 附件是修改后生成的文件。 Re: GMAC RX interrupt of S32K328 你好: 我按照您的建议进行了如下配置: zyt_0-1787045193851.pngzyt_0-1787045193851.pngzyt_0-1787045193851.pngzyt_0-1787045193851.pngzyt_0-1787045193851.pngzyt_0-1787045193851.png zyt_1-1787045222335.pngzyt_1-1787045222335.pngzyt_1-1787045222335.pngzyt_1-1787045222335.pngzyt_1-1787045222335.pngzyt_1-1787045222335.png zyt_2-1787045282610.pngzyt_2-1787045282610.pngzyt_2-1787045282610.pngzyt_2-1787045282610.pngzyt_2-1787045282610.pngzyt_2-1787045282610.png zyt_3-1787045358003.pngzyt_3-1787045358003.pngzyt_3-1787045358003.pngzyt_3-1787045358003.pngzyt_3-1787045358003.pngzyt_3-1787045358003.png EthCtrlReleaseResourceAfterReception 为灰色,无法修改,因为它仅在使用外部数据缓冲区时应用。 zyt_4-1787045508280.pngzyt_4-1787045508280.pngzyt_4-1787045508280.pngzyt_4-1787045508280.pngzyt_4-1787045508280.pngzyt_4-1787045508280.png 修改这些设置后,结果仍然一样,出现了 RxStatsDropEvents。 zyt_5-1787045605969.pngzyt_5-1787045605969.pngzyt_5-1787045605969.pngzyt_5-1787045605969.pngzyt_5-1787045605969.pngzyt_5-1787045605969.png 修改后的配置文件就像附件一样。 您还能提供一些建议吗?谢谢。 Re: GMAC RX interrupt of S32K328 你好: 根据我的测试,无论是广播帧还是单播帧都可能丢失,p现象相同,而且 PC 不会发送任何其他超出我控制范围的帧。 我发现一个特殊情况,有时当我发送帧时,RTD 函数 Gmac_Ip_ReadFrame 会进入以下分支: zyt_0-1787101369298.pngzyt_0-1787101369298.pngzyt_0-1787101369298.pngzyt_0-1787101369298.pngzyt_0-1787101369298.png 这是因为 (((Bd->Des3 & GMAC_RDES3_OWN_MASK) != 0U) zyt_1-1787101442166.pngzyt_1-1787101442166.pngzyt_1-1787101442166.pngzyt_1-1787101442166.pngzyt_1-1787101442166.png 函数调用流程如下所示,全部属于RTD驱动程序: zyt_2-1787101651452.pngzyt_2-1787101651452.pngzyt_2-1787101651452.pngzyt_2-1787101651452.pngzyt_2-1787101651452.png 此时,Eth_43_GMAC_Receive 将不会读取 GMAC 缓冲区的数据。 因此,一段时间后,GMAC 的 FIFO 已满,所以后来的帧将被丢弃。 你觉得我的分析有道理吗? 如果是这样,为什么会发生 (((Bd->Des3 & GMAC_RDES3_OWN_MASK) != 0U)?原因可能是什么? 谢谢。 Re: GMAC RX interrupt of S32K328 你好: 问题是由缓存引起的,当我从项目中删除宏 D_CACHE_ENABLE 时,一切就恢复正常了。 那是不是意味着缓存一致性问题? 但是,当我添加 D_CACHE_ENABLE 并选中下面的复选框时,问题仍然存在。 zyt_2-1787215536381.pngzyt_2-1787215536381.pngzyt_2-1787215536381.pngzyt_2-1787215536381.png 我没有修改RTD的任何可变区域设置,并且我检查了RTD驱动程序,GMAC_0_Rx/TXRing_0_Desc/DataBuffer位于no_cache区域,但其他一些变量(例如Gmac_apxState)不在,而是在mcal_bss区域,而mcal_bss区域是缓存的。这合理吗? zyt_4-1787215940789.pngzyt_4-1787215940789.pngzyt_4-1787215940789.pngzyt_4-1787215940789.png 那么,在添加了 D_CACHE_ENABLE 之后,该如何解决这个问题呢? 谢谢。 Re: GMAC RX interrupt of S32K328 你好@zyt , 感谢您提供的详细调试信息。你的观察很有用,但我对“OWN”这部分会有不同的解读。   当设置了 RDES3.OWN 时,RX 描述符归 DMA 所有,而不是归 CPU 所有。因此,Gmac_Ip_ReadFrame() 正确地报告 GMAC_STATUS_RX_QUEUE_EMPTY,因为当前描述符尚未完成并返回给软件。OWN = 1 的 RX 描述符通常可供 DMA 使用,因此仅凭此条件并不能表明 RX 环被阻塞或 GMAC FIFO 必须已满。   关键问题是,为什么在 RxCurrentDesc 指向仍由 DMA 拥有的描述符时,会进入 RX 中断回调。中断可能是由另一个 RX/DMA 状态条件引起的,或者已完成的描述符可能与当前的软件描述符指针不匹配。   生成的代码将 GMAC RX 描述符和 RX 数据缓冲区放入不可缓存的 MemMap 部分。但是,我在共享项目中没有看到链接器映射文件,因此我无法验证该部分是否真的映射到最终可执行文件中不可缓存的内存区域。   请问您能否分享一下构建过程中生成的链接器映射文件?我尤其想核对以下各项的最终地址和部分内容:   - GMAC_0_RxRing_0_DescBuffer - GMAC_0_RxRing_0_DataBuffer - GMAC_0_TxRing_0_DescBuffer - GMAC_0_TxRing_0_DataBuffer   请确认 GMAC_STATUS_RX_QUEUE_EMPTY 是在 RX 中断后的第一次 Gmac_Ip_ReadFrame() 调用时发生,还是仅在成功读取一个或多个帧后发生。OWN 位设置为 1 可能仅仅表示接收循环的正常结束,其中下一个描述符已被 DMA 拥有,并正在等待另一个帧。 顺祝商祺! 帕维尔 Re: GMAC RX interrupt of S32K328 你好@zyt , 谢谢你的更新。是的,移除 D_CACHE_ENABLE 后问题消失这一事实强烈表明存在缓存一致性或内存区域配置问题。   但是,Gmac_apxState 本身通常不需要放在不可缓存的内存中。它包含 CPU 端驱动程序状态和指针,但 GMAC DMA 不会直接访问它。CPU 和 GMAC DMA 之间共享的重要对象是硬件描述符环和 RX/TX 数据缓冲区。   我检查了之前共享的生成文件。在 Gmac_Ip_Cfg.h 中,生成的配置包含:   #define GMAC_HAS_CACHE_MANAGEMENT (STD_OFF)   同时,Gmac_Ip_Cfg.c将 GMAC RX/TX 描述符和数据缓冲区放入 NO_CACHEABLE MemMap 部分。因此,生成的配置似乎依赖于将这些对象映射到真正不可缓存的内存区域,而不是依赖于 GMAC 驱动程序的显式缓存维护。   启用 EthEnableCacheManagement 后,请重新生成完整的 RTD 配置并执行清理构建。然后请检查 Gmac_Ip_Cfg.h 文件中 GMAC_HAS_CACHE_MANAGEMENT 的值。实际编译的文件。如果仍然保持 STD_OFF 状态,则该复选框不会在生成的版本中启用底层 GMAC 缓存维护。   请同时分享链接器映射文件和相关的链接器/MPU内存区域配置。我们需要验证以下部分的最终内容和内存属性:   - GMAC_0_RxRing_0_DescBuffer - GMAC_0_RxRing_0_DataBuffer - GMAC_0_TxRing_0_DescBuffer - GMAC_0_TxRing_0_DataBuffer   生成的源代码将这些对象放入不可缓存的部分,但链接器脚本和 MPU 配置也必须将该部分映射到真正不可缓存的区域。否则,即使 DMA 已更新 RAM 中的描述符,CPU 也可能读取过时的缓存描述符值,例如 OWN = 1。   目前我不建议将 Gmac_apxState 移动到不可缓存的内存中。第一步是验证所有 DMA 共享描述符和缓冲区是否放置在正确的不可缓存 MPU 区域中,或者验证编译后的驱动程序配置中是否真正启用了 GMAC 缓存管理。 顺祝商祺! 帕维尔
記事全体を表示