Multi Source Translation Content

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

Multi Source Translation Content

Discussions

Sort by:
CANバスを介して通信すること 1. はじめに これは、ビギナーズ・ガイド・シリーズの第4回目の記事で、MR-CANHUBK344 評価ボードを使用して、CANバスを介してCANメッセージを送受信できるようにCANペリフェラルを構成する方法を紹介することを目的としています。 MR-CANHUBK344ボードの詳細や、MBDTを使用してMR-CANHUBK344ボード上でSimulink ® モデルを実行するステップバイステップの手順については、シリーズの最初の記事「MR-CANHUBK344でのデジタル入力/出力の操作」を確認してください。 この記事のアプリケーションは、デジタル入力とアナログ入力を読み取り、それらをCANバスを介して1つのCANインスタンスから別のCANインスタンスに送信する前に処理し、受信したメッセージに基づいてデジタル出力とアナログ出力を制御することにより構成されています。 1.1.追加の必須ソフトウェア 最初の記事でご紹介した要件に加え、この記事で開発するアプリケーションには、MathWorksのVehicle Network Toolbox TM が必要です。 1.2.オプションのハードウェア この記事では、CANバスとやりとりを行えるデバイスを使用して、CANバスを介して送信されるメッセージを紹介します。使用している特定のモデルは、PCAN-USB Pro FDです。 2. CAN設定 この章では、ボードのコンポーネントが相互に正しく通信を行うために、構成プロジェクトで変更しなければならない点に焦点を当てます。DIO、ADC、PWM の設定については前回の記事で説明しましたので、今回は主にCAN関連の設定に焦点を当てます。 2.1.ハードウェアの接続 MR-CANHUBK344 ボードには6 つの CAN インスタンスがあり、その中に 3 つの異なるトランシーバーがあります。CAN0 と CAN1 は TJA1443ATK を使用し、CAN2 と CAN3 は TJA1463ATK を使用し、CAN4 と CAN5 は TJA1153 を使用します。各CANインスタンスには、デイジーチェーン配線を可能にするために、互いに配線された2つの同一のコネクタがあり、AとBのラベルが付いています。 この記事では、CAN0とCAN1のインスタンス間の通信に焦点を当てます。 注意:CANバスは通常、両端に60Ωの終端抵抗が必要です。これは、付属のCAN Termボードのいずれかを使用して行うことができます。 CANインスタンスが適切に動作するためには、未使用のコネクタ(ある場合)は、MR-CANHUBK344パッケージに同梱されているCAN Termボードに接続する必要があります。 以下に、CAN0インスタンスがトランシーバーに接続され、それらの間で信号がどのようにルーティングされるかを示す回路図があります。 2.2.ピンの構成 CANインスタンスのピンは、回路図内のコンポーネント名を検索することで見つけることができます。 この記事の目的のために、以下に必要なピンを抽出しました。_RX ピンと _TX ピンは CAN インスタンスに直接リンクされていますが、_ERRN、_STB、および _EN ピンは、上の回路図に示すように、CAN インスタンスに関連付けられたトランシーバーに対応しています。 ピンの構成を開始するには、S32 Configuration Tools内のPins Toolを開く必要があります。モデルの構成プロジェクトをすばやく開くには、MBDTブロックをダブルクリックして表示されるウィンドウからConfigure(構成)ボタンをクリックします。ソフトウェアが開いたら、Pin(ピン)ボタンをクリックすると、Pins Toolが開きます。 Pins Tool内では、Pinsタブと呼ばれる左上のウィンドウに焦点を当てます。 まず、検索バーに名前を入力して、追加しようとしているピンが構成にすでに存在するかどうかを確認します。 ここでは、この目的で他のピンが構成されていないことがわかります(左側のボックスに緑色のチェックマークがないためです)。 これは、構成する12個のピンごとに実行する必要があります。このプロセスは、最初の記事「MR-CANHUBK344でのデジタル入出力の操作」で詳しく紹介されています。 ここでは、ピンがすでに存在するケースを説明します。古い構成を削除するために実行すべきステップは、緑色のチェックマークをクリックし、ポップアップ・ウィンドウで現在選択されているオプションのチェックを外すことです。 すべてのピンを確認した後、構成したいピンの追加を開始できます。 注意:CAN_RX、CAN_ERRNは入力であり、CAN_TX、CAN_STB、CAN_ENは出力です。CAN_STB と CAN_ENは出力です。なぜなら、トランシーバーを通常の動作モードに切り替えて初期化するために、これらに適切な値を設定するからです。一方、CAN_ERRNは入力です。これは、トランシーバーの初期化時に発生する可能性のある問題をMCUに通知するために使用されます。 これを行うには、検索バーにピンの値を入力します。例として、構成しているピンの一部を見てみましょう:LED_CAN0ピンは、CANコネクタの近くに配置された赤色のLEDに接続されています。このLEDは、ボード上の他のLEDと同様に、CANとは別に使用されます。また、他のLEDと同様に逆論理を共有しています。 対応する値はPTC18であり、これをフィルターに入力します。その後、Identifier(識別子)とLabel(ラベル)のフィールドにピンの名前を入力します。次に、左側のチェックマークをクリックし、表示されたウィンドウで適切なオプションを選択します。ここでは、LED用にSIUL2:gpio,82オプションを選択します。出力であるLEDを構成するため、ピンの方向を指定するウィンドウでOutput(出力)オプションを選択します。 他のピンの場合もプロセスは同様ですが、CAN_RXピンとCAN_TXピンを構成する際には、使用可能な信号のリストから別の信号を選択する必要があることに注意してください。設定しているピンの違いにより、CAN_ERRN、CAN_EN、CAN_STB は入力/出力として SIUL2 周辺機器に接続されており、CAN_RX と CAN_TX はそれぞれの CAN 周辺機器に接続されています。CAN0_RXピンの見え方は次のとおりです: これは、構成後のCAN0およびCAN1インスタンスの信号の様子です。 信号を同様に表示するには、下部のウィンドウのRouting Details(詳細のルーティング)という検索バーに「CAN」と入力してください。 次に、強調表示されたボタンをクリックしてPeripherals Tool(ペリフェラル・ツール)に戻る必要があります。 2.3.コンポーネントの構成 2.3.1.CanController CAN インスタンスの設定を開始するには、まず Can_43_FlexCAN コンポーネントを開き、CanConfigSet パネル内の CanController タブに移動します。 ここでは、CAN0とCAN1のインスタンスに対応する2つのCANコントローラを構成します。 CanControllerセクションは、アプリケーションの要件に応じてCANコントローラのインスタンスを構成するために必要なすべての設定を提供します。他のものよりも頻繁にやり取りすることが予期されているものもあるため、これらが何を行うのかを説明することに焦点を当てています。 Name(名前)フィールドは、コントローラに関連づけられた名前を管理し、他のメニューでコントローラを参照するために使用されます。 Can Hardware Channel(CANハードウェア・チャネル)は、現在のコントローラに接続されている物理的なCANインスタンスを制御します。 Can Controller Activation(Canコントローラの有効化)チェックボックスをオンにすると、Canコントローラが有効になります。それがないと、コントローラは動作しません。 CAN Rx/Tx Processing Type(CAN Rx/Tx処理タイプ)は、ポーリングに設定されている間、PDU(プロトコル・データ・ユニット)イベントを処理するために、CAN_MainFunction_Read()およびCAN_MainFunction_Write()を通じて読み取りおよび書き込み操作を有効化/無効化します。パラメータがPOLLING(ポーリング)またはMIXED(ミックス)に設定されている場合、記載された機能はRX Indication(RX表示)またはTX Confirmation(TX確認)のためにポーリングを行います。パラメータがMIXED(ミックス)に設定されている場合、属性CanHardwareObjectUsesPollingがtrue(真)に設定されているハードウェア・オブジェクトのみが影響を受けます。あるいは、パラメータがINTERRUPTに設定されている場合、 Can FD ISO は、コントローラでフレキシブルデータレート機能が有効かどうかを制御します。この例では、CANインスタンス間の通信にCan FDプロトコルを使用するため、これが確認されます。 Can Controller Default Baudrate(CANコントローラのデフォルト・ボーレート)フィールドは、コントローラに割り当てるボーレート構成を選択する役割を担っています。ボーレートの構成は、次の画面に表示されます。 CanCpuClockRefを使用すると、基準クロックを選択できます。CANペリフェラルには、FLEXCAN_PE_CLK0_2とFLEXCAN_PE_CLK3_5の2つのクロックがあり、それぞれCAN0、CAN1、CAN2とCAN3、CAN4、CAN5をカバーしています。これらのクロックはMcuコンポーネント内で構成できます。次の章でこれが示されます。 「Name」フィールドは、前の画面の「Can Controller Default Baudrate」フィールドで選択するために使用されます。 Can Automatic Time Segments Calculation(Can自動タイムセグメント計算)は、ビットレートとCanコントローラのプリスケーラに応じて、Canプロパゲーション・セグメント、Canフェーズ・セグメント1、およびCanフェーズ・セグメント2を自動的に設定するために使用できます。 Can Controller Prescaler (Canコントローラプリスケーラ)は、選択したクロックに基づいて、コントローラのプリスケーラを設定します。 Can Controller BaudRate (Kbps)(Canコントローラのボーレート(Kbps))はデータ転送速度を制御します。 Can Propagation Segment(Canプロパゲーション・セグメント)、Can Phase Segment 1(Canフェーズ・セグメント1)、およびCan Phase Segment 2(Canフェーズ・セグメント2)を含む次のセクションでは、CAN転送のタイミングを構成できます。 最後に、下部のセクションで、Can FD Controller Baudrate(Can FDコントローラ・ボーレート)、Can FD Propagation Segment(Can FDプロパゲーション・セグメント)、Can FD Phase Segment 1(Can FDフェーズ・セグメント1)、Can FD Phase Segment 2(Can FDフェーズ・セグメント2)、Can FD Resynch Jump Width(Can FD再同期ジャンプ幅)、Can FD Prescaler (Can FDプレスケータ)を変更することにより、FD(Flexible Data-Rate)プロトコルのタイミングを構成できます。これらは、以前の設定のFD相当として見なすことができます。 最初のセクションでは、現在のCanコントローラに関連づけられているCanRamBlockを構成することができます。CANコントローラのCAN RAMには、PDUバッファとして定義されたCANハードウェア・オブジェクトが含まれています。CAN RAMブロックは、異なるサイズ構成でメッセージ・バッファを保存できます。 S32K3XXリファレンス・マニュアルによると、RAMブロックには8バイトのメッセージを32件、16バイトのメッセージを21件、32バイトのメッセージを12件、または64バイトのメッセージを7件、保存できます。 第2セクションCanRxFifoでは、RX Fifoを追加または削除できます。S32K3XXリファレンス・マニュアルによると、Enhanced RX FIFOを使用できるのはCAN0のみです。したがって、別のCANインスタンスとFDプロトコルを使用している場合、CanLegacyFifoとFDプロトコルの非互換性のためにCanRxFifoを無効にする必要があります。 この記事のアプリケーションには、相互に通信する2つのCANインスタンスが含まれているため、既存のCANコントローラに加えて、別のCANコントローラをセットアップする必要があります。 2番目のCanコントローラの構成を確実に始めるには、現在のコントローラの構成をコピーして新しいものに貼り付けてください。 上記の手順を完了すると、2つの同一のCanコントローラができあがり、アイテムが重複しているために競合が発生します。これを解決するには、2番目のCanコントローラの詳細を入力してください。 この場合、Name(名前)、Can Hardware Channel(Canハードウェア・チャネル)、Can Controller ID(CanコントローラID)(単にインクリメントする必要があります)、およびCan Controller Default Baudrate(Canコントローラのデフォルト・ボーレート)(Name(名前)フィールドを変更すると、ドロップダウン・リストに正しいボーレートが表示されます)を変更するだけです。 この新しく作成された Can コントローラで変更する必要がある最後の設定は、CAN1 には Enhanced Fifo 機能がなく、同時に FD プロトコルを使用しているため、CanRxFifo を削除することです。 2.3.2。CanHardwareObject 次のステップは、CanConfigSet メニュー内の CanHardwareObject タブで Can Hardware Objects を設定することです。 前のサブチャプターと同様の方法で、使用できるオプションの説明に焦点を当てます。 まず、一般的なルールとして、RXオブジェクトはオブジェクト・リスト内のTXオブジェクトの前に配置する必要があります。したがって、最も低いTXオブジェクトのID以上のIDのあるRXオブジェクトは存在しないはずです。 名前フィールドは、MBDTブロック内に表示されるハードウェアオブジェクトに関連付けられた名前を制御します。 Can ID メッセージタイプは、CAN メッセージの ID タイプが拡張、混合、または標準であるかを制御します。 Can Object ID(CanオブジェクトID)はハードウェア・オブジェクトの識別子として機能します。0から始まり、空白や欠落なく続ける必要があります。 Can Object Type(Can Object Type)は、ハードウェア・オブジェクトがCANメッセージの送受信に使用されるかどうかを制御します。 CANコントローラー参照は、このオブジェクトがどのCANコントローラーに設定されているかを選択します。 Can Hw Object Countは、ハードウェアFIFO内の要素数を定義します。 CanHwFilterはメッセージをフィルタリングするために使用されます。 Can Hw Filter Mask (Canハードウェア・フィルター・マスク)はフィルターのどの部分をアクティブにするかを特定します。10進数536870911を2進数に変換すると11111111111111111111111111111(29桁)です。これは、拡張ID形式が29ビットであるため、マスクがフィルター全体を有効にしていることを意味します。 Can Hw フィルターコードは、フィルターマスクに基づいてメッセージと比較されるIDです。 画像の例を見てみましょう: フィルター・コード: 00000000000000000001111110000(10進数で1008) フィルター・マスク:11111111111111111111111111111 許可されるID:00000000000000000001111110000(10進数で1008) これは、フィルターが拡張ID 1008からのメッセージのみを許可することを意味します。 フィルターに複数の値を許可したい場合は、フィルター・マスクを変更して、すべてのビットがフィルター・コードと等しいかどうかをフィルターがチェックしないようにする必要があります。 別の例: フィルター・コード:00000000000000000001111110000(10進数で1008) フィルターマスク:1111111111111111111111111111 0許可されたID:00000000000000000001111110000、                      00000000000000000001111110001 (10進数で1008と1009) この場合、フィルター・マスクはフィルター・コードと異なる最後のビットを許可します。 すでに存在するCanハードウェア・オブジェクトはCanController_0に対して適切に構成されているため、変更を行う必要はありません。 しかし、CAN1がCAN0インスタンスと通信できるようにするためには、TX(送信)ハードウェアオブジェクトを追加する必要があります。 それを行うには、強調表示された「+」ボタンをクリックし、それに応じてオブジェクトを設定してください。代替案として、CanHardwareObject_Can0_Tx_Interruptから構成をコピーし、CAN1に関連するフィールドのみを変更することができます。 これは、正しいコントローラーを反映するようにNameを変更し、Can Object IDを更新し、Can Object TypeがTRANSMITに設定されていることを確認し、Can Controller ReferenceをCanController1を指すように変更することを意味します。 これらの構成手順を完了すると、CAN0はメッセージの受信と送信の両方を行うように設定され、CAN1はメッセージの送信のみを行うように設定されます。 2.4.CanIfの構成 CANインターフェースは、低レベルのCANドライバーとAUTOSARスタックの上位通信サービス層の間にあります。CANトランシーバーやCANコントローラなどのさまざまな CANハードウェア・デバイス・タイプとやりとりする手段を提供します。 次に、新しく作成されたCanコントローラ(CAN1用)をCanInterfaceのCanIfCtrlDrvCfgメニュー内のCanIfCtrlCfgセクションに追加する必要があります。 新しい CanIfCtrlCfg 要素を追加するには、+ ボタンを押してから、CanIfCtrlId フィールドを更新し、CanIfCtrlCanCtrlRef に対して適切な Can Controller を選択する必要があります。 2.5.クロック構成(MCU) CANインスタンスを正しく機能させるためには、McuコンポーネントのMcuModuleConfiguration内のMcuModeSettingsConfタブでクロックを有効にする必要があります。 このページに移動したら、下にスクロールして、FlexCANインスタンスに対応するクロックが有効になっていることを確認する必要があります。デフォルトでは、現在の構成で有効になっていますが、CANペリフェラルにはクロックが必要であることを忘れないことが重要です。 一連のCanコントローラの基準クロックCanCpuClockRefを変更する場合は、McuClockSettingsConfig > McuClockReferencePointで確認することができます。 2.6.割り込みの構成(プラットフォーム) 設定ツールの最後のステップは、このモデルで使用しているCANインスタンスの割り込みを設定し、割り込みベースのブロックを使用できるようにすることです。それを行うには、Peripherals Toolの左側にあるPlatformボタンをクリックして、プラットフォームコンポーネントに移動します。 その後、Interrupt Controller(割り込みコントローラ)タブに移動する必要があります。ここで、現在構成されているすべての割り込みを確認できます。 CANインスタンスを構成するには、構成するFlexCANインスタンスが表示されるまでスクロールしてください。この記事では、CAN0インスタンスとCAN1インスタンスを使用するため、これら2つのインスタンスを構成します。 FlexCAN割り込みに関しては、FlexCAN0_0には9つの一般的な割り込みリクエストが含まれ、FlexCAN0_1~FlexCAN0_3インスタンスには96のメッセージバッファ割り込みが含まれます。割り込みマッピングの詳細については、リファレンス・マニュアルS32K3XXRM内の添付ファイルS32K3xx_interrupt_map.xlsxを参照してください。 ご覧のとおり、そのうちの1つはすでに構成されているため、FlexCAN1インスタンスを次のように構成するだけで済みます: 2.7.Dioの構成 以前に構成した入力/出力ピンも、第2.3章と同様に、Dioコンポーネントで構成する必要があります。最初の記事MR-CANHUBK344のデジタル入力/出力の操作を参照してください。 現在、Dioコンポーネントの内部で、後でモデル内でトランシーバーを有効にするために使用する入出力ピンを構成しています。 プロセスを簡単に説明すると、作業中の構成と一致しないデフォルトのピンを削除する必要があります。この状況では、DioPort PTC_HからCanController_0_EN、CanController_0_STB、CanController_0_ERRN チャネルを削除することを意味します。 その後、以前に設定した入力/出力ピンを追加します。 2.8.Uart、FreeMASTER、Adc、およびPwmの構成 この記事のアプリケーションでは、前回の記事で構成された方法で、AdcおよびPwmコンポーネントとFreeMASTER機能を使用します。 UartとFreeMASTERの構成方法の詳細については、2番目の記事UART経由でデータを送信し、FreeMASTERで信号を監視」を参照してください。 AdcとPwmの構成については、このシリーズの3番目の記事ADCとPWMによるLEDの強度の制御でステップバイステップの手順を確認できます。 これらのコンポーネントの場合、参照記事で説明されているセットアップと違いはありません。 3. CANモデルの概要 この記事のアプリケーションの目的は、以前のコンポーネントを1つの例に組み込むことです。このアプリケーションは、ADCポテンショメータとUSER_SW2ボタンの2つの入力からデータを収集し、それを処理してパッケージ化し、CANバスを介して送信することで構成されています。これにより、他のCANインスタンスがデータを受信し、2つの出力を制御できるようになります。2つの出力は、USER_SW2ボタンの押下に応じて点灯する青色LEDと、ポテンショメータの回転に基づいて強度が変化する赤色LEDです。 次の図は、このアプリケーションのフローをよりよく理解するためのものです。 さて、モデルを小さな部分に分解してみましょう。 左上から始めますが、モデルはいくつかの変数を使用します。これらは、目的に基づいてグループ化されています。例えば、ADCのChannel1変数は、ADCから読み取った値を保持する責任があります。同様に、CANインスタンスの場合、変数Dataと変数Length は、CANバスで受信したメッセージを表します。 最後のパネルは最も重要なもので、CANメッセージが展開された直後のDioペリフェラルおよび Aioペリフェラルの値を表します。 初期化セクションに進み、ここでコンポーネントを準備するために必要な操作を実行します。この特定のケースでは、2つのCANトランシーバーを初期化するために、その入力の2つをHIGHに設定します。 初期化サブシステムでは、結果バッファがADC変換に対して設定され、グループ通知が有効化されているため、グループの変換が完了すると、構成されたADCコールバックが実行されます。 最後に、このボードではLEDに反転ロジックが使用されているため、ボードのLEDをオフにします。つまり、通常はボードと一緒にLEDもオンになります。 FreeMASTER Config ブロックは、このプロジェクトで FreeMASTER 機能を有効にするために使用されます。 次に進みますが、モデルのアクティブな部分、つまり各ステップを実行し、ADCのグループ変換を開始する部分について説明する前に、もう1つ説明すべきブロックがあります。変換が完了すると、ADCのハードウェア割り込みがトリガーされ、ハードウェア割り込みコールバック・ブロックにリンクされているサブシステムがADC信号を出力します。 CAN Packブロックは、ポテンショメータの回転量に応じて0Vから3.3Vの電圧を表す浮動小数点数を受け入れるように構成されているため、単一データ型への変換が行われます。 指定どおり、入力であるAioとDioからデータを収集することから始めます。Aioの場合、ADCによって読み取られた電圧を表すために値をスケーリングします。 データをパッケージ化し、転送後に解釈できるように、DBCファイルを使用しています。DBCはCANデータベース・ファイルであり、CANメッセージを通じてどのような信号が保存され送信されるかを記述します。 その後、データは VNT パッキングブロック(VNT は Vehicle Network Toolbox TM の略)に送信されます。CAN PACK ブロックを開くと、DBC ファイルで設定された信号が適切に解析され、ブロックがそれらを入力として期待していることがわかります。 ADC値は0V~3.3Vの電圧を表す32ビット変数になりますが、Dio変数はボタンが押されているかどうかを表す1ビットのみです。合計で、変数は5バイトを占め、これがメッセージの長さになります。 次のブロックであるCAN Unpackは、CANトランスミッション・ブロックによって送信される生データをCANフレームから抽出するために使用されます。 Can_Writeは、Canブロックで利用可能な機能の1つであり、その名前が示すように、CANバスを介してCANメッセージを送信する役割を担っています。 2番目のドロップダウン・アイテムでは、どのCanHardwareObjectがデータを送信するかをユーザーが選択できます。ここに表示されるアイテムは、2.3.2セクションのメニューでTRANSMIT(送信)として構成されたアイテムです。このアプリケーションでは、データは割り込みベースのハードウェア・オブジェクトを使用して送信されています。 CAN FD Message(CAN FD メッセージ)チェックボックスは、送信するメッセージがCAN FDプロトコルを使用しているかどうかを選択し、Extended ID CAN Message(拡張 ID CAN メッセージ)は ID の形式を選択します。 これらは、構成ソフトウェアで行われた設定を反映する必要があります。 アプリケーションの後半は、CAN1 から送信されたメッセージを CAN0 が受信することから始まります。 この仕組みについて注意すべき重要な点の1つは、メッセージの受信は、ハードウェア割り込みコールバックをトリガーするCANif_RxIndicationに基づいているということです。その後、データにアクセスすることができます。 Hardware_Interrupt_Handler ブロックで Interrupt Group(割り込みグループ)としてCanを選択すると、次のCan関連のコールバックの一覧が表示されます。 このアプリケーションには、受信するCANメッセージを読み取る機能が必要なため、CanIf_RxIndicationがその目的で使用されます。CanIf_RxIndicationは、割り込みベースの実行のあるコールバックで、CANフレームが受信されるたびに呼び出されます。 CANメッセージ内から実際の値を取得する前に、もう一度 CAN Packブロックと Unpackブロックを使用してデータを抽出し、DBCファイルに従って複合する必要があります。 値が得られたので、ADCの値を使用して赤色LEDの明るさを比例的に調整し、DIOの値を使用して青色LEDのオン/オフを切り替えます。 モデルを検証するには、FreeMASTERツールを使用して値を読み取り、グラフ化することができます。ご覧のとおり、受信したメッセージは、Adc値とDio値を表す5バイトのデータで構成されています。 以下では、FreeMASTERソフトウェアでリアルタイムに作成されたグラフ上の変数の表現を確認できます。赤色の信号は、0Vから3.3Vの間にあるポテンショメータから読み取られた値を表します。青色の信号はボタンの状態に対応します。ボタンが押されている場合、青色の信号は1になります。それ以外の場合、信号は0になります。 ウィンドウの下部には、スクリーン・キャプチャが行われた時点の信号の値が表示されます。グラフの赤色と青色の信号に対応するADC_Received変数とDio_Received変数とは別に、他の変数は最後に受信したCANメッセージの詳細を示します。  CANメッセージを読み取ることができるデバイスを接続すると、CANバスを介してメッセージが送信されるのを確認することもできます。ここでは、PCAN-Vieソフトウェア・アプリケーションを使用して、PCAN-USB Pro FDによってキャプチャされたメッセージを表示します。 4. 結論 チュートリアルのステップを実行した後、MR-CANHUBK344ボードとサード・パーティの間、または同じボードの異なるCANインスタンス間で、CAN通信を必要とするアプリケーションにMR-CANHUBK344ボードを組み込むことができるようになります。 この記事の適用は、単一のモデルに複数のMBDTコンポーネントを追加するワークフローを管理する方法の例としても役立ちます。 添付されたモデルの実行方法に関する手順: アーカイブのコンテンツをダウンロードして展開してください。 .mdlファイルおよび.mexファイルを両方ともプロジェクトをセットアップしたい場所にコピーしてください。 注意:モデルが正しく動作させるために、.mexファイルと.dbcファイルをモデルの隣に配置してください。 .mdlファイルを開き、MATLAB の現在のフォルダーがモデルを含むフォルダーを指していることを確認してください。 Hardware(ハードウェア)タブをクリックし、[Build, Deploy & Start](ビルド、デプロイ、開始)ボタンを押してください。 Simulinkは登録商標であり、Vehicle Network ToolboxはThe MathWorks, Inc.の商標です。追加の商標のリストについては、mathworks.com/trademarksを参照してください。
View full article
i.MX 8 GStreamerユーザー・ガイド 本ドキュメントは、NXP BSP L5.4.24_1.1.0でサポートされているすべてのi.MX 8ファミリSoCに含まれるGStreamerバージョン1.0ベースのアクセラレーション・ソリューションのユーザー・ガイドです。 一部の手順は、UbuntuなどのLinuxディストリビューションを実行しているホストマシンがi.MX 8デバイスに接続されているという前提に立ちます。これらのコマンドはUbuntu 18.04 LTDを使用してテストされました。ホストマシンにUbuntuは必要ありませんが、他のディストリビューションはテストされていません。 これらの手順は次のハードウェアでの使用が想定されています。 • i.MX 8MQ EVK • i.MX 8MN EVK • i.MX 8MN EVK • i.MX 8QXP MEK B0 • i.MX 8QM MEK B0 リリース履歴 v1.0 - 2020年3月 - 初回リリース。 v2.0 - 2020年9月:次のコンテンツを追加: - Mux/Demuxの例 - オーディオの例 - 画像の例 - トランスコードの例 - ストリーミングの例 - マルチディスプレイの例 - スケーリングと回転の例 - ゼロ・コピーの例 - デバッグの例 保守担当者: Marco Franchi . Pedro Jardim グラフィックスとディスプレイ i.MX 8ファミリ | i.MX 8QuadMax (8QM) | 8QuadPlus i.MX 8M | i.MX 8M Mini | i.MX 8M Nano マルチメディア Re:i.MX 8 GStreamerのユーザー・ガイド このドキュメントの更新はありますか?内容が古いように感じられます。
View full article
Linux 源代码迁移 (CAF -> Github) 大家好,我们最近已将源代码从 CAF(Codeaurora)迁移至 Github,因此指向 Codeaurora 的 i.MX NXP 旧版 recipes/manifest 将会更新为指向 Github,以避免在使用 Yocto 拉取代码时出现问题。此外,所有旧版本的 repo init 命令都应由: $ repo init -u https://source.codeaurora.org/external/imx/imx-manifest-b [ -m ]改为:$ repo init -u https://github.com/nxp-imx/imx-manifest-b [ -m ]这同样适用于原先存储在 Codeaurora 的所有源代码,i.MX NXP 源代码的新仓库为:https://github.com/nxp-imx如有任何相关问题,请在社区发帖或提交支持工单。此致Aldo Android 图形与显示 i.MX 8 系列 | i.MX 8QuadMax (8QM) | 8QuadPlus i.MX 8M | i.MX 8M Mini | i.MX 8M Nano i.MX6 全部 i.MX6DL i.MX6 双核 i.MX6DualPlus | 6QuadPlus i.MX6 四核 i.MX6S i.MX6SL i.MX6SoloX i.MX6UL i.MX7 双核 i.MX7 单核 i.MX7ULP i.MX8ULP Linux 多媒体 安全 Yocto Project
View full article
HOWTO: S32DS v3.5 に S32K3 RTD 4.0.0 をオフラインでインストールする方法 S32K RTDのリリース・ノートには、通常、インストールが必要な依存ソフトウェア・パッケージが記載されています。SW32K3_S32M27x_RTD_R21-11_4.0.0_D2311_ReleaseNotes.pdfを例として見てみると、以下のソフトウェア・パッケージをインストールする必要があることがわかります。 ダウンロード・リンクにアクセスするには、NXP.comでアカウントにログインしている必要があります。 1. S32Design Studio 3.5をダウンロードしてインストールしてください。[S32 Design Studio 3.5 – Windows/Linux 3.5]をクリックし、[S32 Design Studio for S32 Platform v.3.5(S32 Platform用S32 Design Studio v.3.5)]をクリックし、S32DS.3.5_b220726_win32.x86_64.exeをダウンロードしてください 注意:Windows OSの場合、S32 Platform用S32 Design Studioをインストールするために指定されたユーザーアカウントは、ローカルの Administrators セキュリティ・グループのメンバーである必要があります。   2. S32 Design Studio 3.5 Update 8 D2311: SW32_S32DS_3.5.8_D2311.zip (com.nxp.s32ds.update_3.5.8.20231116041033.zip) をダウンロードしてインストールします。 ステップ3でダウンロードしたSW32K3_S32DS_3.5.8_D2311.zipには、ステップ2のSW32_S32DS_3.5.8_D2311.zipのファイルがすでに含まれているため、このステップはここでスキップします。   3. [S32K3 Standard Software(S32K3標準ソフトウェア)]をクリックして、[Automotive SW - S32K3 - S32 Design Studio(オートモーティブSW - S32K3 - S32 Design Studio)]をクリックします S32K3xxデバイスのサポートのあるS32 Design Studio 3.5.8開発パッケージ (3.5.8_D2311) をダウンロードしてインストールしてください。SW32K3_S32DS_3.5.8_D2311.zip(com.nxp.s32ds.s32k3xx.update_3.5.8.20231116045533.zip) インストール中に必要なソフトウェアを見つけるためにすべての更新サイトに連絡するのチェックを外すと、オフラインインストールをより迅速に完了できます。   4. S32K39xデバイスをサポートするS32 Design Studio 3.5.6 RTM (3.5.6_D2309) をダウンロードしてインストールします。SW32K39x_S32DS_3.5.6_D2309.zip   5. S32M27xを使用する必要があるユーザー(そうでない場合はステップ6に進んでください)は、[S32M2 Standard Software(S32M2標準ソフトウェア)]をクリックし、[Automotive SW - S32M2 - S32 Design Studio(オートモーティブSW - S32M2 - S32 Design Studio)]をクリックしてください S32M2xxデバイスをサポートするS32 Design Studio 3.5.8開発パッケージ (3.5.8_D2311) をダウンロードしてインストールしてください。SW32M2_S32DS_3.5.8_D2311.zip (com.nxp.s32ds.s32m2.update_3.5.8.20231116044631.zip)   6. [S32K3 Standard Software(S32K3標準ソフトウェア)]をクリックし、[Automotive SW - S32K3/S32M27x - Real-Time Drivers for Cortex-M(オートモーティブSW - S32K3/S32M27x - Cortex-M用リアルタイム・ドライバ)]をクリックしてください S32K3 RTD 4.0.0 の更新サイトの1つを選択してインストールしてください。 最新のS32K3 RTDバージョンが通常推奨されます。ただし、リファレンス・ソフトウェアまたはプレミアム・ソフトウェア(FreeRTOS、LINスタック、TCP/IPスタック、S32K3用AWSライブラリ、S32K3xx用S32セーフティ・ソフトウェア・フレームワーク (SAF)、構造的コア・セルフテスト (SCST)、HSEプレミアムファームウェア、ISELEDドライバーなど)を使用する必要がある場合は、リリース・ノートに従って特定のバージョンのS32K3 RTDをインストールすることをお勧めします。 S32K3 RTD 4.0.0には多くのバージョンがあるため、ここではRTDのバージョンを1つだけインストールします。 S32K3_S32M27xリアルタイム・ドライバーAUTOSAR R21-11バージョン4.0.0をダウンロードしてインストールしてください。SW32K3_S32M27x_RTD_R21-11_4.0.0_D2311_DS_updatesite.zip 次に、S32DS v3.5で[File(ファイル)] > [New(新規)] > [S32DS Project from Examples(例からS32DSプロジェクト)]をクリックすると、S32K3 RTD 4.0.0のプロジェクト例が表示されます。 アクティベーション |インストール |ライセンス |インストーラーのダウンロード
View full article
使用 Linux 的 fw_printenv 和 fw_setenv 来访问 U-Boot 的环境变量 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 本文档介绍如何在 Linux 根文件系统下修改 U-Boot 环境变量。 同时提供了在 i.MX6ull EVK 上的 SD 卡镜像演示。 Linux fw_printenv fw_setenv to access U-Boot's environment variables.pdf  --- 文档 fw_printenv_fw_setenv_demo_iMX6ullevk_L4.14.98_2.0.0_ga.sdcard  --- demo sdcard mirror i.MX 8 系列 | i.MX 8QuadMax (8QM) | 8QuadPlus i.MX 8M | i.MX 8M Mini | i.MX 8M Nano i.MX6_全部 i.MX7 双核 i.MX7 单核 Linux
View full article
Segger J-Link Plusを使用してi.MX 8MプロセッサEVKでSDKアプリケーションをデバッグする方法 注記:こちらのガイドはSeggerソフトウェア専用です。VSCode用のMCUXpresso拡張機能を使用する手順については、 「Segger J-Link Plusを使用してi.MX 8Mプロセスで...する方法 - NXPコミュニティ」を参照してください。 こちらのガイドは、i.MX 8MファミリープロセッサでSEGGER J-Link Plusデバッグプローブの使用を開始するためのテクニカルリファレンスです。こちらのガイドで使用されるボードは具体的には i.MX 8M Nano EVK ですが、i.MX 8M ファミリーのすべてのプロセッサにも適用されます。 ここでは、以下の構造を使用してプロセスについて説明します。 ハードウェア要件 ソフトウェア要件 i.MX SDKを検索、ビルド、およびダウンロードする方法 ホストのセットアップ サンプルアプリケーションのビルド ターゲットのセットアップ サンプルアプリケーションの実行 ハードウェア要件 i.MX8M Nanoアプリケーション・プロセッサ向け評価キット(i.MX 8M Nano評価キット | NXP Semiconductors) i.MX8M Nano向けクイック・スタート・ガイド(I.MX 8M Nano EVKクイック・スタート・ガイド (nxp.com)) J-Link Plus JTAG/SWDデバッグ・プローブ(USBインターフェース付き)(SEGGER J-Link PLUS) 機能 ダウンロード速度は最大1MB/s フラッシュ・メモリに無制限のブレークポイント RAMおよびフラッシュ・メモリへの直接ダウンロードをサポート サポートされているNXPデバイス サポートされているデバイス - 検索結果「nxp」(segger.com) 9ピンCortex-Mアダプタ(9ピンCortex-Mアダプタ (segger.com)) 説明 20ピン0.1インチJTAGコネクタを、Armが定義する9ピン0.05インチSamtecFTSHコネクタに適応させます。 ソフトウェア要件 Windows 10 OS(ホスト) Windows用J-Linkソフトウェアおよびドキュメンテーション・パック (https://www.segger.com/products/debug-probes/j-link/models/j-link-plus/) i.MX 8M Nano SDK (Welcome | MCUXpresso SDK Builder (nxp.com)) MinGW CMake GNU Arm Embeddedツールチェーン シリアルポート接続用のターミナルエミュレーター(Tera Term、PuTTYなど) i.MX 8M Nano SDKを検索、ビルド、およびダウンロードする方法 Welcome | MCUXpresso SDK Builder (nxp.com)に進みます [Select Development Board(開発ボートの選択)]をクリックします ボードから[EVK-MIMX8MN (MIMX8MN6xxxJZ)]->[i.MX]->[EVK-MIMX8MN]を選択します [Build MCUXpresso SDK(MCUXpresso SDKのビルド)]ボタンをクリックします [Download SDK(SDKのダウンロード)]をクリックすると、[MCUXpresso SDK Dashboard(MCUXpresso SDKダッシュボード)]にリダイレクトされます i.MX 8M Nano SDKを探して、[Download SDK(SDKのダウンロード)]をクリックします [Download SDK archive and documentation(SDKアーカイブとドキュメントのダウンロード)]をクリックし、ソフトウェアの利用規約に同意します。SDKから.zipファイルがダウンロードされます ホストのセットアップ Windows用J-Linkソフトウェアおよびドキュメントパック Windows版J-Linkソフトウェアおよびドキュメントパックをダウンロードします(https://www.segger.com/products/debug-probes/j-link/models/j-link-plus/) ダウンロードした.exeファイルを実行したら[Next(次へ)]をクリックします デフォルトのパラメータを使用してインストールウィザードに従い、[Finish(完了)]をクリックします。 MinGW SourceForge.netのMinGW - Minimalist GNU for Windows - Browse /InstallerからMinGWインストーラをダウンロードします。インストーラの指示に従い、すべてのオプションをデフォルト値のままにしてください。 インストーラーが終了したら、「続行」をクリックしてください。 MinGWインストールマネージャーのウィンドウが表示されますので、基本セットアップからmingw32-baseとmsys-baseを選択してください。[Installation(インストール)]メニューをクリックし、[Apply Changes(変更の適用)]を選択します。 次のウィンドウで「適用」をクリックし、パッケージのダウンロードが完了するまでお待ちください。 WindowsオペレーティングシステムのPATH環境変数に適切なアイテムを追加します。これは、[Environment Variables(環境変数...)]セクションの[Control Panel(コントロールパネル)]→[System and Security(システムとセキュリティ)]→[System(システム)]→[Advanced System Settings(システムの詳細設定)]のにあります。パスは \bin です。デフォルトのインストールパスである「C:\MinGW」を使用した例を以下に示します。パスが正しく設定されていないと、ツールチェーンは機能しません。注:PATH変数にC:\MinGW\msys\x.x\binが設定されている場合(KSDK 1.0.0向けの旧仕様)、新しいGCCビルドシステムが正しく機能するように、これを削除してください。 CMake Download CMakeからCMake Windows x64インストーラをダウンロードします。下にスクロールしてインストーラの最新リリースを見つけてください。 インストーラーを実行し、指示に従ってください。インストールプロセス中に、「すべてのユーザーのシステム PATH に CMake を追加」オプションを選択していることを確認してください。 PCを再起動して変更を適用してください。 GNU Arm Embedded Toolchain Downloads | GNU Arm Embedded Toolchain Downloads – Arm DeveloperからGNU ARM Embedded Toolchainインストーラをダウンロードし、下にスクロールしてインストーラの最新リリースを見つけてください。 インストーラの指示に従い、プロセスの最後に[Add to PATH(PATHに追加)]オプションを確認してください。 新しいシステム環境変数を追加してARMGCC_DIRと名前を付けます。この変数の値をGNU ARM Embedded Toolchainのインストールパスにします。 ARMGCC_DIR=ARMGCC_DIR=C:\Program Files (x86)\GNU Arm Embedded Toolchain\10 2021.10​ サンプル・アプリケーションを構築する [Windowsキー]を押して、GCC Command Promptを検索して実行します。 ディレクトリをサンプルアプリケーションプロジェクトディレクトリ(armgccフォルダ内)に変更します。例えば、 C:\Users/ \Documents\8MNANO\boards\evkmimx8mn\demo_apps\hello_world\armgcc コマンドラインにbuild_debug.batと入力するか、Windows Explorerでbuild_debug.batファイル(アプリケーションプロジェクトのarmgccフォルダ内)をダブルクリックします。 ビルドプロセスが終了するまで待機し、エラーメッセージが表示されないことを確認してください。 ターゲットセットアップ デバッグ・ケーブル (USB-UART) をボードに接続し、もう一方の端をPCに接続します。 電源ケーブルを2番目のUSB-Cポートと壁のコンセントに接続します。まだボードをオンにしないでください。 JLink PlusをUSBケーブルでPCに接続します。 JLink Plusをi.MX 8M Nano EVKボードのJTAGに接続します。 この部分で9ピンCortex-Mアダプタとi.MX 8M Nano EVKボードからピン番号1を特定する必要があります。最初に「非接続ピン」のピン7を特定できます。 i.MX 8M Nanoの場合、コネクタの片隅にある数字の1で簡単に識別できます。  全体のセットアップは次のようになります。 サンプルアプリケーションの実行 ホストPCでターミナルアプリケーション(TeraTerm、PuTTYなど)を開き、次の設定で最も番号の小さいシリアルデバッグポートに設定してください。 速度:115200 データ:8ビット パリティ:なし ストップビット:1ビット フロー制御:なし SEGGER J-Link GDBサーバーを起動します。 [Target Device(ターゲット・デバイス)]セクションで、[MIMX8MN6_M7]を選択し、[OK]をクリックします。 次のウィンドウが表示されます。 GCCコマンドプロンプトの新しいインスタンスを開きます。 以前にコンパイルしたサンプルのディレクトリに移動します。ファイルが含まれているフォルダへのパスは次のとおりです。 /boards/ / / /armgcc/debug​ 次のコマンドを実行します。 arm-none-eabi-gdb.exe .elf.​ 例: この時点でGDBコマンドプロンプトが表示されているので、次のコマンドを実行します。 target remote localhost:2331 monitor reset monitor halt load monitor go アプリケーションが実行され、ターミナル(PuTTY、Tera Term など)に「hello world」が表示されます。 i.MX 8M | i.MX 8M Mini | i.MX 8M Nano
View full article
RT1170EVKB USB-RNDIS こんにちは、MIMXRT1170-EVKBでUSB-RNDIS機能を使用するためのテストを行っています。 SDK で提供されている lwip_dhcp_usb_bm コードを実行すると、「USB host init success.」というメッセージが表示されますが、その後は何も起こりません。 コードをデバッグすると、USB_HostApplicationInit()の次の部分で無限ループに陥っていることがわかりました。 while (!g_RndisInstance.attach) { USB_HostTaskFn(g_RndisInstance.hostHandle); USB_HostClassTask(&g_RndisInstance); } EVKBにジャンパ設定が必要ですか?それとも、テストの実施が間違っていますか? これが私のテストの現在の状態です。 1.EVKBボードのジャンパ設定を変更していません。 2. SDKバージョン:2.16.000 3.USB1からPCへ よろしくお願いいたします。 Re: RT1170EVKB USB-RNDIS ご協力いただきありがとうございます。 vnicとlwipを組み合わせてrndisの送受信機能のテストを完了しました。 回复: RT1170EVKB USB-RNDIS Hi @seobi , NXP MIMXRTシリーズにご興味をお寄せいただきありがとうございます。 ボードのジャンパーはデフォルトのままにしておく必要がありますが、アダプターと電話をボードに接続する必要があります。 これをテストする方法の詳細については、次のドキュメントを確認してください: boards\evkbmimxrt1170\lwip_examples\lwip_dhcp_usb\bm\cm7\MCUXpresso SDK USB RNDIS & LWIP ユーザー Guide.pdf
View full article
[ツール] GUI Guiderの使用方法ステップバイステップ・ガイド 無料の オープンソースグラフィックスライブラリとして、LVGLは、アニメーションの作成、高度なグラフィックスの構築、およびさまざまなブロックの構築において、関連する一連のチップに非常に便利です。LVGLはMCUXpresso SDKパッケージに統合されており、SDKのダウンロードまたはGUI Guiderで直接インポートできます。 GUI Guiderは、NXPが提供するすぐに使えるGUIです。NXP機器では無料で使用できることを前提とし、操作が便利、自動プログラミング、中国語と英語のインターフェースおよび入力など、一連のメリットがあります。 以下では、LPC54S018 開発ボードを例に、シンプルな UI インターフェースを作成し、基本的な操作プロセスと使用方法を皆様にご理解いただけるようにします。 新規プロジェクトの作成 LVGLバージョンはV8、開発ボードはLPC54S018、アプリケーション・テンプレートはEmptyUIを選択し、プロジェクトの名前とパスを設定して[Finish(完了)]をクリックします。 図1 全体のバックグラウンドを設定します。 [Widget(ウィジェット)]タブをGUI Editorにドラッグし、全画面サイズに拡大します。 図2 時間表示とTo-Do機能を追加してください。 1) 右側の赤いボックスの[Content 1(コンテンツ1)]のタブで、コンテンツ名を「Clock」に変更します。 図3 2) aclockをエディタにドラッグし、サイズと位置を調整し、図4の赤いボックスに従って時刻を設定します。 図4 3) dclockをエディタにドラッグし、サイズと位置を調整し、図5の赤いボックスに従って時刻を設定します。 図5 4) チェックボックスをエディタにドラッグし、サイズと位置を調整し、図6に従って内容を編集します。 図6 2番目のタブのコンテンツに、簡単なカウント機能を追加し、プログレスバーがそれと連動するように設定します。 1) バックグラウンドを追加します。[Import(インポート)]をクリックしてバックグラウンド用の画像をインポートし、ウィジェットで画像をエディタにドラッグしてサイズと位置を設定し、画像パスでインポートした画像を選択して透明度を設定します(図7を参照)。 図7 2) カウント値、プログレスバー、ボタンを追加します。図8、9、10。 図8は、プログレスバーを追加するときに、2番目のステップで開始値を設定しています。プログレスバーの範囲値は、lv_bar_set_range(guider_ui.screen_progress_bar, 0, 100) によって設定されます。これをキーイベントに追加して、クリックごとに実行できます。したがって、このコードをこの後のエクスポート・ファイルcostomer.cに追加し、初期化時に一度だけ設定することをお勧めします。 図8 図9 図10 3) プログレスバーに説明テキストを追加してください。操作手順は図11に示されています。 図11 4) 対応するボタンにイベントを作成し、顧客コードを選択し、対応するコードを入力して、インタラクションを完了させます。図12に示されているADDボタンを例として取り上げます。 図12 3番目のタブのコンテンツには、3Dアニメーション・エフェクトが表示されます。 1) 3D画像を設定します。「3Dimg」を選択し、エディタにドラッグして、画像パスに画像を設定し、次に回転の中心と回転角度を選択します(図13を参照)。 図13 2) ディスプレイ・スイッチを設定します。スイッチをオンにすると3D画像が表示され、スイッチをオフにすると画像が消えます。図14をご覧ください。 図14 4番目のタブのコンテンツに、「ヘルプ」を追加します。 1) ロゴを追加します。imgを追加し、画像をインポートして透明度を設定します。 図15 2) 最初の3つのモジュールを一覧にします。「Widget」リストをエディタにドラッグし、新しい行を作成し、画像とテキストを変更します。 完了したら、図16に示すコードを生成します。結果はシミュレーションで直接表示するか、開発ボードにインポートすることができます。図17は、シミュレータと選択可能なターゲットを示しています。シミュレーション結果を図18に示します。 このデザインを開発ボードにダウンロードする方法は2つあります。1つ目の方法は、図17で利用可能なIDEを選択し、GUI Guiderから直接ダウンロードすることです。2つ目の方法は、まずソース・ファイルをエクスポートし、関連するSDKのデモ・コード内で1つずつ置き換え、IDEでアプリケーション・コードを使ってビルドし、IDEデバッガによりダウンロード/デバッグすることです。 図16 図17 図18 Video Class : https://www.youtube.com/watch?v=QM52Nu16zKQ
View full article
QSPI QE および DQS ファクターのための RT10XX RT-UFL モディフィケーション QSPI QE および DQS ファクターのための RT10XX RT-UFL モディフィケーション 1. アブストラクト 最近、RT1050プロジェクトのXIPメモリとしてQSPIフラッシュ(Puya simi P25Q16H)を使用しているお客様がいましたが、初回のダウンロードに失敗し、再度電源を入れた後に再度ダウンロードが成功し、アプリが実行できるという現象が常に発生していました。プログラムアルゴリズムには、RT-UFLを使用します。解析後、この状況は通常、新しい QSPI フラッシュの QE が有効になっていないことに関連しています。したがって、お客様が使用したQSPIフラッシュのQE位置に基づいて、作成者はSDK flexspi_nor_polling_transferコードで対応するQEを特別に有効にし、新しいQSPIフラッシュでQEを有効にした後もRAMで実行してプログラムの問題があるかどうかを確認しました。ただし、お客様はプロジェクトを実行することさえできませんflexspi_nor_polling_transfer。お客様の以前の説明によると、ハードウェアはRAMコードを実行でき、最初のフラッシュダウンロードは機能しませんが、再ダウンロード後に実行できるため、ハードウェアは機能します。この現象から、当初はFlexSPI DQSが占有されていることに新たな問題が関係しているのではないかと推測されています。通常の状況では、FlexSPI DQS をフローティング状態のままにしておくことをお勧めします。プロジェクトでは flexSPI の周波数が 120MHz であるため、DQS を使用する場合、FlexSPI リード データの内部サンプリング クロック ソースは、メモリ デバイスによるリード ストロボと DQS パッドからの入力となります。この方法には問題があります。そのため、お客様にハードウェアを再度確認するように依頼しました。その結果、DQSはお客様のボード上の他の回路の制御ピンとして使用されます。通常、この状況では注意すべき点が 2 つあります。 まず、FlexSPIクロックは60MHz以内に制御されます。 次に、FlexSPI リード データの内部サンプリング クロック ソース コンフィギュレーションは、FlexSPI コントローラによって生成され、内部でループバックされるダミー リード ストロボ (FlexSPIn_MCR0[RXCLKSRC] = 0x0) です。 したがって、この記事では、お客様が使用するQSPIフラッシュに基づいて対応するQE位置のテストコードを準備する方法、DQSが有効になっている場合の動作を考慮し、RT-UFLダウンロードアルゴリズムを変更してテストする方法に焦点を当てます。 2. ハードウェアとソフトウェアの準備 お客様の問題を再現するには、関連するソフトウェア、ハードウェア、フラッシュプログラミング用フラッシュドライバー、量的緩和状況をテストするためのコードを準備する必要があります。 2.1 ハードウェアの準備 MIMXRT1050-EVKBで、オンボード抵抗をデフォルトのハイパーフラッシュからQSPIフラッシュに変更します。変更点は次のとおりです。 USE QSPI FLASH(Mount R153~R158, DNP R356,R361~R366)。 搭載されているU33 ISSI QSPIフラッシュを取り外し、お客様が使用したPuya simi P25Q16Hで新しいQSPIフラッシュを書き込みます。 JLINKをご利用いただいておりますので、JLINK plusのダウンロードをご用意ください。 2.2 flexspi_nor_ポーリング_転送ソフトウェアの準備をしてください SDK2.14.0コード:flexspi_nor_polling_transfer、QE状況のテストに使用されます。 アプリ プロジェクト: led_blinky RT-UFL プログラムのアルゴリズムコード:https://github.com/JayHeng/RT-UFL JLINKドライバ:JLINKV768B使用し、それ以上のバージョンでもOKです。 2.2.1 QEポジションP25Q16H 図1 これはまだ一般的なステータスレジスタビット9であることがわかります。 関連する LUT の書き込みおよび読み取りコマンダーは次のとおりです。 図2 書き込みにはコマンド0X01で、2バイト連続で書き込む必要があることがわかります。しかし、readコマンドの場合、2つのステータスレジスタバイトのコマンドは別々です。QEビットを操作するときは、この点に注意する必要があります。 2.2.2 flexspi_nor_polling_transferコードの準備 このコードは主に、外部フラッシュの量的緩和の有効化と無効化、消去、書き込み、読み取り機能をテストするために使用されます。 コードの変更ポイントには、P25Q16Hに準拠するようにLUTコマンドを変更することが含まれます。QE読み取り、書き込み、消去機能の追加。flexSPI の周波数と DQS ループバック内部の状況を変更します。 関連するコードは次のとおりです。 LUT関連車長:flexspi_nor_polling_transfer.c const uint32_t customLUT[CUSTOM_LUT_LENGTH] = { /* Normal read mode -SDR */ [4 * NOR_CMD_LUT_SEQ_IDX_READ_NORMAL] = FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x03, kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_1PAD, 0x18), [4 * NOR_CMD_LUT_SEQ_IDX_READ_NORMAL + 1] = FLEXSPI_LUT_SEQ(kFLEXSPI_Command_READ_SDR, kFLEXSPI_1PAD, 0x04, kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0), /* Fast read mode - SDR */ [4 * NOR_CMD_LUT_SEQ_IDX_READ_FAST] = FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x0B, kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_1PAD, 0x18), [4 * NOR_CMD_LUT_SEQ_IDX_READ_FAST + 1] = FLEXSPI_LUT_SEQ( kFLEXSPI_Command_DUMMY_SDR, kFLEXSPI_1PAD, 0x08, kFLEXSPI_Command_READ_SDR, kFLEXSPI_1PAD, 0x04), /* Fast read quad mode - SDR */ [4 * NOR_CMD_LUT_SEQ_IDX_READ_FAST_QUAD] = FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0xEB, kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_4PAD, 0x18), [4 * NOR_CMD_LUT_SEQ_IDX_READ_FAST_QUAD + 1] = FLEXSPI_LUT_SEQ( kFLEXSPI_Command_DUMMY_SDR, kFLEXSPI_4PAD, 0x06, kFLEXSPI_Command_READ_SDR, kFLEXSPI_4PAD, 0x04), /* Read extend parameters */ [4 * NOR_CMD_LUT_SEQ_IDX_READSTATUS] = FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x81, kFLEXSPI_Command_READ_SDR, kFLEXSPI_1PAD, 0x04), /* Write Enable */ [4 * NOR_CMD_LUT_SEQ_IDX_WRITEENABLE] = FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x06, kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0), /* Erase Sector */ [4 * NOR_CMD_LUT_SEQ_IDX_ERASESECTOR] = FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x20, kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_1PAD, 0x18),//0xD7 /* Page Program - single mode */ [4 * NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM_SINGLE] = FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x02, kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_1PAD, 0x18), [4 * NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM_SINGLE + 1] = FLEXSPI_LUT_SEQ(kFLEXSPI_Command_WRITE_SDR, kFLEXSPI_1PAD, 0x04, kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0), /* Page Program - quad mode */ [4 * NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM_QUAD] = FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x32, kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_1PAD, 0x18), [4 * NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM_QUAD + 1] = FLEXSPI_LUT_SEQ(kFLEXSPI_Command_WRITE_SDR, kFLEXSPI_4PAD, 0x04, kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0), /* Read ID */ [4 * NOR_CMD_LUT_SEQ_IDX_READID] = FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x9F, kFLEXSPI_Command_READ_SDR, kFLEXSPI_1PAD, 0x04), /* Enable Quad mode */ [4 * NOR_CMD_LUT_SEQ_IDX_WRITESTATUSREG] = FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x01, kFLEXSPI_Command_WRITE_SDR, kFLEXSPI_1PAD, 0x04), /* Enter QPI mode */ [4 * NOR_CMD_LUT_SEQ_IDX_ENTERQPI] = FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x35, kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0), /* Exit QPI mode */ [4 * NOR_CMD_LUT_SEQ_IDX_EXITQPI] = FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_4PAD, 0xF5, kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0), /* Read status register */ [4 * NOR_CMD_LUT_SEQ_IDX_READSTATUSREG] = FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x05, kFLEXSPI_Command_READ_SDR, kFLEXSPI_1PAD, 0x04), /* Read status register */ [4 * NOR_CMD_LUT_SEQ_IDX_READSTATUSREG1] = FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x35, kFLEXSPI_Command_READ_SDR, kFLEXSPI_1PAD, 0x04), /* Erase whole chip */ [4 * NOR_CMD_LUT_SEQ_IDX_ERASECHIP] = FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0xC7, kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0),//0xC7 }; flexspi_nor_flash_ops.c:私たちは読み書きします status_t flexspi_nor_enable_quad_mode(FLEXSPI_Type *base) { flexspi_transfer_t flashXfer; status_t status; uint32_t writeValue = FLASH_QUAD_ENABLE; #if defined(CACHE_MAINTAIN) && CACHE_MAINTAIN flexspi_cache_status_t cacheStatus; flexspi_nor_disable_cache(&cacheStatus); #endif /* Write enable */ status = flexspi_nor_write_enable(base, 0); if (status != kStatus_Success) { return status; } /* Enable quad mode. */ flashXfer.deviceAddress = 0; flashXfer.port = FLASH_PORT; flashXfer.cmdType = kFLEXSPI_Write; flashXfer.SeqNumber = 1; flashXfer.seqIndex = NOR_CMD_LUT_SEQ_IDX_WRITESTATUSREG; flashXfer.data = &writeValue; flashXfer.dataSize = writeValue <= 0xFFU ? 1 : 2; status = FLEXSPI_TransferBlocking(base, &flashXfer); if (status != kStatus_Success) { return status; } status = flexspi_nor_wait_bus_busy(base); /* Do software reset. */ FLEXSPI_SoftwareReset(base); #if defined(CACHE_MAINTAIN) && CACHE_MAINTAIN flexspi_nor_enable_cache(cacheStatus); #endif return status; } status_t flexspi_nor_disable_quad_mode(FLEXSPI_Type *base) { flexspi_transfer_t flashXfer; status_t status; uint32_t writeValue = 0x0;//FLASH_QUAD_ENABLE; #if defined(CACHE_MAINTAIN) && CACHE_MAINTAIN flexspi_cache_status_t cacheStatus; flexspi_nor_disable_cache(&cacheStatus); #endif /* Write enable */ status = flexspi_nor_write_enable(base, 0); if (status != kStatus_Success) { return status; } /* Enable quad mode. */ flashXfer.deviceAddress = 0; flashXfer.port = FLASH_PORT; flashXfer.cmdType = kFLEXSPI_Write; flashXfer.SeqNumber = 1; flashXfer.seqIndex = NOR_CMD_LUT_SEQ_IDX_WRITESTATUSREG; flashXfer.data = &writeValue; flashXfer.dataSize = 2; status = FLEXSPI_TransferBlocking(base, &flashXfer); if (status != kStatus_Success) { return status; } status = flexspi_nor_wait_bus_busy(base); /* Do software reset. */ FLEXSPI_SoftwareReset(base); #if defined(CACHE_MAINTAIN) && CACHE_MAINTAIN flexspi_nor_enable_cache(cacheStatus); #endif return status; } status_t flexspi_nor_QE_register(FLEXSPI_Type *base, uint32_t *QEvalue) { /* Wait status ready. */ bool isBusy; uint32_t readValue; status_t status; flexspi_transfer_t flashXfer; flashXfer.deviceAddress = 0; flashXfer.port = FLASH_PORT; flashXfer.cmdType = kFLEXSPI_Read; flashXfer.SeqNumber = 1; flashXfer.seqIndex = NOR_CMD_LUT_SEQ_IDX_READSTATUSREG1; flashXfer.data = &readValue; flashXfer.dataSize = 1; do { status = FLEXSPI_TransferBlocking(base, &flashXfer); if (status != kStatus_Success) { return status; } if (FLASH_BUSY_STATUS_POL) { if (readValue & (1U << FLASH_BUSY_STATUS_OFFSET)) { isBusy = true; } else { isBusy = false; } } else { if (readValue & (1U << FLASH_BUSY_STATUS_OFFSET)) { isBusy = false; } else { isBusy = true; } } *QEvalue = readValue; } while (isBusy); return status; } QE position:App.h #define FLASH_QUAD_ENABLE 0X0200 品質管理業務:フレックススパイ_またはポーリング_トランスファー.c PRINTF("Get the QE bit value before QE enable!\r\n"); uint32_t QEvalue=0; status = flexspi_nor_QE_register(EXAMPLE_FLEXSPI, &QEvalue); if (status != kStatus_Success) { return status; } PRINTF("QE=%X!\r\n",(uint8_t)QEvalue); #if 1 status = flexspi_nor_disable_quad_mode(EXAMPLE_FLEXSPI); if (status != kStatus_Success) { return status; } PRINTF("Get the QE bit value after QE disable!\r\n"); status = flexspi_nor_QE_register(EXAMPLE_FLEXSPI, &QEvalue); if (status != kStatus_Success) { return status; } PRINTF("QE=%X!\r\n",(uint8_t)QEvalue); #endif PRINTF("Enable the QE bit value !\r\n"); /* Enter quad mode. */ status = flexspi_nor_enable_quad_mode(EXAMPLE_FLEXSPI); if (status != kStatus_Success) { return status; } status = flexspi_nor_QE_register(EXAMPLE_FLEXSPI, &QEvalue); if (status != kStatus_Success) { return status; } PRINTF("QE=%X!\r\n",(uint8_t)QEvalue); FlexSPI周波数変更:flexspi_nor_polling_transfer.c,app.h flexspi_device_config_t deviceconfig = { .flexspiRootClk = 60000000, .flashSize = FLASH_SIZE, .CSIntervalUnit = kFLEXSPI_CsIntervalUnit1SckCycle, .CSInterval = 2, .CSHoldTime = 3, .CSSetupTime = 3, .dataValidTime = 0, .columnspace = 0, .enableWordAddress = 0, .AWRSeqIndex = 0, .AWRSeqNumber = 0, .ARDSeqIndex = NOR_CMD_LUT_SEQ_IDX_READ_FAST_QUAD, .ARDSeqNumber = 1, .AHBWriteWaitUnit = kFLEXSPI_AhbWriteWaitUnit2AhbCycle, .AHBWriteWaitInterval = 0, }; static inline void flexspi_clock_init(void) { const clock_usb_pll_config_t g_ccmConfigUsbPll = {.loopDivider = 0U}; CLOCK_InitUsb1Pll(&g_ccmConfigUsbPll); CLOCK_InitUsb1Pfd(kCLOCK_Pfd0, 24); /* Set PLL3 PFD0 clock 360MHZ. */ CLOCK_SetMux(kCLOCK_FlexspiMux, 0x3); /* Choose PLL3 PFD0 clock as flexspi source clock. */ CLOCK_SetDiv(kCLOCK_FlexspiDiv, 5); /* flexspi clock 60M. */ } 内部でループバック:app.h #define EXAMPLE_FLEXSPI_RX_SAMPLE_CLOCK kFLEXSPI_ReadSampleClkLoopbackInternally 2.2.3 変更後のflexspi_nor_polling_transferテスト 変更したコードをRT1050 RAMにダウンロードし、次のように結果を実行します。    図3 図から、QEは通常、読み取り、書き込み、消去、読み取りの機能を実装できることがわかります。この記事のQSPIは以前に運用されたことがあるので、ここでは2と読みますが、これは初めてQEが有効になります。新しいチップの場合、デフォルトで0と表示されます。これは、QEが有効になっていないことを意味します。また、変更後、外部フラッシュを正確に消去、プログラム、および読み取ることができることがわかります。これは、現在のコード変更が成功したことを示しています。LUT、QEポジション、DQS考慮事項(60MHz+ループバック内部)はすべて機能しています。 2.3 アプリ準備 SDKのled_blinkyコードを使用して、主にFCBとReadSampleCLKSRCの周波数を変更してください。 evkbimxrt1050_flexspi_nor_config.c は次のように変更されます。 const flexspi_nor_config_t qspiflash_config = { .memConfig = { .tag = FLEXSPI_CFG_BLK_TAG, .version = FLEXSPI_CFG_BLK_VERSION, .readSampleClksrc=kFlexSPIReadSampleClk_LoopbackInternally, .csHoldTime = 3u, .csSetupTime = 3u, .controllerMiscOption = (1u << kFlexSpiMiscOffset_SafeConfigFreqEnable), .deviceType = kFlexSpiDeviceType_SerialNOR, .sflashPadType = kSerialFlash_4Pads, .serialClkFreq = kFlexSpiSerialClk_60MHz, .sflashA1Size = 8u * 1024u * 1024u, … } このコードは、新しく修正されたプログラムのフラッシュドライバーをデバッグモードでテストし、プロジェクトをコンパイルし、.srecを生成するために使用されます。JFLASH方式のフラッシュプログラムに使用されます。 3. RT-UFL JLINKフラッシュアルゴリズムの修正 スーパーダウンロードアルゴリズムRT-UFLをダウンロードした後、上記の2つの要素に基づいてスーパーダウンロードアルゴリズムを変更する必要があります。 まず、QEが有効になっています。次に、DQSが使用されます。 この記事のソリューションでは、RT-UFLは引き続きオプションROMを使用してFlexSpiを初期化します。 オプションの説明に従って、以下を選択します。 オプション 0: 0xc0000201 オプション 1:0 x0 このような状況のように: 図4 3.1 RT-UFL code modification ここでは、keil プロジェクトを使用します。 \ RT-UFL-1.0\ ビルド\ mdk コードの変更は次のとおりです。 Ufl_main.c:ufl_set_target_property1 case kChipId_RT105x: uflTargetDesc->flexspiInstance = MIMXRT105X_1st_FLEXSPI_INSTANCE; uflTargetDesc->flexspiBaseAddr = MIMXRT105X_1st_FLEXSPI_BASE; uflTargetDesc->flashBaseAddr = MIMXRT105X_1st_FLEXSPI_AMBA_BASE; //p25q16h QESet bit 1 in Status Register 2 {.option0.U = 0xc0000201, .option1.U = 0x00000000}, uflTargetDesc->configOption.option0.U = 0xc0000201; uflTargetDesc->configOption.option1.U = 0x0; ufl_romapi.c: CLKSRC の設定のサンプルを読み込んでください status_t flexspi_nor_auto_config(uint32_t instance, flexspi_nor_config_t *config, serial_nor_config_option_t *option) { // Wait until the FLEXSPI is idle register uint32_t delaycnt = 10000u; while(delaycnt--) { } status_t status = flexspi_nor_get_config(instance, config, option); if (status != kStatus_Success) { return status; } config->memConfig.readSampleClksrc=kFlexSPIReadSampleClk_LoopbackInternally; //For DQS is used by other circuit return flexspi_nor_flash_init(instance, config); } FlashDev.c struct FlashDevice const FlashDevice = { FLASH_DRV_VERS, // Driver Version, do not modify! "MIMXRT_FLEXSPI", // Device Name EXTSPI, // Device Type 0x60000000, // Device Start Address 0x00800000, // Device Size in Bytes (8mB) 256, // Programming Page Size 0, // Reserved, must be 0 0xFF, // Initial Content of Erased Memory 100, // Program Page Timeout 100 mSec 5000, // Erase Sector Timeout 5000 mSec // Specify Size and Address of Sectors 0x1000, 0x00000000, // Sector Size 4kB (256 Sectors) SECTOR_END }; FlashOS.h:フラッシュページ、セクターサイズを定義するために、UFL_L0タイプを生成します #define FLASH_DRV_SIZE_OPT (0) #if (FLASH_DRV_SIZE_OPT == 0) #define FLASH_DRV_PAGE_SIZE (0x100) #define FLASH_DRV_SECTOR_SIZE (0x1000) #elif (FLASH_DRV_SIZE_OPT == 1) #define FLASH_DRV_PAGE_SIZE (0x200) #define FLASH_DRV_SECTOR_SIZE (0x1000) #elif (FLASH_DRV_SIZE_OPT == 2) #define FLASH_DRV_PAGE_SIZE (0x200) #define FLASH_DRV_SECTOR_SIZE (0x10000) #endif コードをコンパイルすると、フラッシュドライバーのファームウェアが得られます:mimxrt_flexspi_uv5_ufl.flm 名前を次のように変更します:MIMXRT_FLEXSPI_UV5_UFL_P25Q16H。FLMの 3.2 JLINKドライバー・フラッシュドライバーの更新 JLINKドライバをインストールしたら、RT-UFLアルゴリズムを使用するように変更してください。 この記事によると、JLINKの駆動アルゴリズムはRT-UFLアルゴリズムに変更されています。 https://www.cnblogs.com/henjay724/p/14942574.html   In fact, just copy: RT-UFL-1.0\RT-UFL-1.0\algo\SEGGER\JLink_Vxxx インストールされたJLINKパスへ:C:\Program Files\SEGGER\JLINKV768B しかし、この記事では、P25Q16Hの変更されたフラッシュアルゴリズムを追加するためにこれに基づいて 、変更ポイントは次のとおりです。 (1)添付ファイル RT1050_P25Q16H_JLINK\ プログラム\ JLinkDevices.xml を次の場所にコピーしてください: C:\Program Files\SEGGER\JLINKV768B 図5 .xmlの変更は次のとおりです。P25Q16H項目とそのアルゴリズムを追加してください: 図6 注:デバイス名はMIMXRT1050_UFL_P25Q16Hです (2) CopyRT1050_P25Q16H_JLINK\program\ IMXRT_FLEXSPI_UV5_UFL_P25Q16H.FLM to:C:\Program Files\SEGGER\JLINKV768B\Devices\NXP\iMXRT_UFL 図7 このMIMXRT_FLEXSPI_UV5_UFL_P25Q16H。FLM は、上記の修正フラッシュドライバーアルゴリズムです。 (3)run C:\Program Files\SEGGER\JLINKV768B\JLinkDLLUpdater.exe, update the IDE IARのドライバを変更 3.3 Flashdriverアルゴリズムのダウンロードテスト MIMXRT1050-EVKBの場合、外部JLINKを使用するには、EVKBボード上のJ33を切断し、JTAGをJ21に差し込む必要があります。 3.3.1 JFLASHのダウンロードテストを使用する まず、以前に変更したEVKB-IMXRT1050-flexspi_nor_polling_transferを使用し、QEビットを無効にして、新しいQSPIフラッシュチップをシミュレートします。テストは次のとおりです。 図8 jFlashテストの結果は: 図9 新しいフラッシュドライバーでJflashを使用すると、フラッシュが正常にプログラムできることがわかります。 3.3.2led_blinky アプリのデバッグ テスト QEビットを無効にして、新しいQSPIフラッシュチップをシミュレートし、図8のようにテストします。 アプリのデモ:IARプロジェクトを使用(お客様が使用します)。オプション選択:JLINK: 図10 図11 ここで、デバイスは変更されたスーパーダウンロードアルゴリズムデバイス名として選択されることに注意してください。方法は以下の通りです。IAR デバッグによって生成された settings->xxx.jlink は、次のように変更されます。 図12 2 つのポイント: override =1 と device は新しく変更されたアルゴリズム デバイス名です。 デバッグ テスト結果: 図 13 アルゴリズムは正常にデバッグでき、アルゴリズムもUFLによって変更されていることがわかります。 全速力で走らせると、オンボードのLEDが点滅しているのがわかります。 これは、すべてのフラッシュ ドライバー アルゴリズム、ハードウェア、およびコードが新しい P25Q16H QSPI フラッシュを既にサポートしていることを意味します。 4. 概要 新しいQSPIフラッシュを使用する場合は、まずQEの位置とDQSが使用されているかどうかに注意を払い、次に対応するRT-UFLプログラミングアルゴリズムを準備する必要があります。UFL アルゴリズムは通常、ほとんどのフラッシュ チップをデフォルトでサポートできます。QE と DQS を使用する場合は、新しい QSPI フラッシュをサポートするためにアルゴリズムを微調整するだけで済みます。したがって、この記事では、アルゴリズムを変更した後に顧客プロジェクトを書き込む問題を正常に解決しました。他のQSPIフラッシュについては、この記事の方法を使用して、書き込みアルゴリズムをそれに応じて変更し、独自のプロジェクトのニーズを確実に満たすようにすることもできます。 i.MXRT 105倍
View full article
使用 TraceX 调试 Azure RTOS 应用程序 1. TraceX 简介 Azure RTOS TraceX 是微软的主机分析工具,为开发人员提供实时系统事件的图形化视图,使他们能够可视化并更好地理解其实时系统的行为。借助 Azure RTOS TraceX,开发人员可以清晰地看到标准调试工具无法捕获的系统事件(如中断和上下文切换)的发生。 本文介绍如何使用 CUXpresso SDK 启动 TraceX 调试功能 硬件:MIMXRT1060-EVK 和 1 根 Micro-USB 线 软件:SDK_2_10_1_EVK-MIMXRT1060 2. 安装 TraceX 您可以通过在 Microsoft App Store 中搜索 TraceX 来获取 TraceX 应用,或者直接访问 TraceX 页面。随后按照弹出窗口中的说明安装 TraceX。 3. 在应用程序中启用跟踪功能 3.1 添加必要的预处理器符号 需使用 TX_ENABLE_EVENT_TRACE 宏定义激活依赖跟踪的代码该宏必须添加到编译器的预处理器部分此操作需同时针对应用程序本身及其链接的库文件执行(例如:ThreadX 库) 3.2 声明跟踪缓冲区 必须指定一个缓冲区区域用于存储运行时发生的跟踪事件,并进一步指示 ThreadX 跟踪子系统使用该缓冲区缓冲区可以是全局变量,如下例所示: /*跟踪缓冲区*/ #ifdef TX_ENABLE_EVENT_TRACE UCHAR trace_buffer[64000]; #endif 3.3 启用跟踪 必须在应用程序内部通过调用 tx_trace_enable() 显式启用跟踪功能可以通过添加以下代码来实现。  #ifdef TX_ENABLE_EVENT_TRACE /* * 使用全局“trace buffer”启用事件跟踪。 * 允许在注册表中最多有 30 个 ThreadX 对象。 */ UINT status =  tx_trace_enable(&trace_buffer, sizeof(trace_buffer), 30); 如果 (status != TX_SUCCESS) {     for (; ; ) { } } #endif 建议在 tx_application_define() 内部启用跟踪功能。 3.4 编译 编译 ThreadX 库(编译后的库文件将位于 Debug 文件夹)。 成功构建和编译后,Debug/Release 目录中会出现一个新库。它的名称类似于 libevkimixrt1060_threadx_lib.a。 请将其重命名为 libthreadx.a,并复制到 evkmimxrt1060_threadx_demo 项目中的 azure-rtos/binary/threadx/mcux/ 目录下,替换原有文件。 替换 threadx_demo 项目中的 libthreadx.a 文件。 4 导出跟踪 4.1 跟踪导出功能的配置 跟踪导出功能由一组首选项控制,可通过“窗口”→“首选项”页面访问并修改这些设置。 4.2 跟踪导出按钮 暂停您的应用程序,Trace Export 按钮位于 Debug 视图的工具栏中,如下图所示。 4.3 导出跟踪 单击 “Trace Expert” 按钮后,将弹出模态对话框窗口。必须指定文件路径,然后单击“导出”按钮。导出的文件可在后续导入 Azure RTOS TraceX 工具中使用。 5. 使用 Azure RTOS TraceX 工具显示 在 Azure RTOS TraceX 中,我们可以打开导入的文件。 系统摘要行包含上下文摘要信息,其下方显示对应的事件摘要。 Azure RTOS TraceX 为所有已执行的上下文提供内置执行分析报告。 Azure RTOS TraceX 为当前加载的跟踪文件提供内置性能统计报告。 参考文档: https://docs.microsoft.com/en-us/azure/rtos/
View full article
LX2160ARDB ‑ SD/eMMC カードに TF‑A バイナリを展開する方法 Cortex-A 用の信頼できるファームウェア (TF-A) は、EL3 セキュアファームウェアの実装です。TF-A はセキュアファームウェアの役割で PPA を置き換えます。 注:このトピックに記載されている手順は、LSDK 18.12以降のリリースでのみ実行可能であることにご注意ください。 以前のブートフロー(PPA 使用)から TF‑A ブートフローへ移行するには、bl2_..pbl と fip.bin をコンパイルし、対応するブートメディアにフラッシュする必要があります。 SD/eMMC ブートの場合、次の TF‑A バイナリをコンパイルする必要があります。 TF-A バイナリ名 コンポーネント bl2_sd.pbl/bl2_emmc.pbl BL2 バイナリ: プラットフォーム初期化用バイナリ SD/eMMC ブート用の RCW バイナリ fip.bin BL31:セキュアランタイムファームウェア BL32: 信頼できるOS、例えば、OPTEE(オプション) BL33: U-Boot/UEFIイメージ TF-A バイナリ (bl2_sd.pbl/bl2_emmc.pbl および fip.bin) をSD/eMMCカードにコンパイルして展開するには、次の手順に従ってください。 RCWバイナリをコンパイルする U-Boot バイナリをコンパイルする [オプション] OP‑TEE バイナリをコンパイル SD/eMMC ブート用に、TF-A バイナリ (bl2_sd.pbl/bl2_emmc.pbl および fip.bin) をコンパイルします。 TF‑A バイナリを SD/eMMC カードにプログラムします。 ステップ 1:RCW バイナリをコンパイルする bl2_sd.pbl/bl2_emmc.pbl バイナリをビルドするには、RCWバイナリをコンパイルする必要があります。 rcw リポジトリをクローンし、RCW バイナリをコンパイルしてください。 $ git clone https://source.codeaurora.org/external/qoriq/qoriq-components/rcw $ cd rcw $ git checkout -b <新しいブランチ名> を実行します。例: $ git checkout -b LSDK-20.04 LSDK-20.04 Rev 1 または Rev 2 ボード用に RCW をコンパイルします。 For LX2160ARDB Rev1: $ cd lx2160ardb LX2160ARDB Rev 2 の場合: $ cd lx2160ardb_rev2 必要に応じて、rcw ファイルに変更を加えてください。 $ make SD/eMMC ブート用にコンパイルされた RCW バイナリ LX2160ARDB、コア周波数 2000 MHz、プラットフォーム周波数 700 MHz、DDR メモリ データ レート 2900 MT/s、serdes1 = 19、serdes2 = 5、serdes3 = 2、rcw_2000_700_2900_19_5_2.bin は以下で入手できます: rcw/lx2160ardb/XGGFF_PP_HHHH_RR_19_5_2(LX2160ARDB Rev 1 の場合) rcw/lx2160ardb_rev2/XGGFF_PP_HHHH_RR_19_5_2(LX2160ARDB Rev 2) 注: RCW ソースファイルおよびバイナリファイルを含むディレクトリの命名規則については、rcw/lx2160ardb/README または rcw/lx2160ardb_rev2/README を参照してください。 ステップ2:U-Bootバイナリをコンパイルする u‑boot.bin をコンパイルして fip.bin をビルドする必要があります。 u‑boot リポジトリをクローンし、TF‑A 用の U‑Boot バイナリをコンパイルします。 $ git clone https://source.codeaurora.org/external/qoriq/qoriq-components/u-boot.git $ cd u-boot $ git checkout -b <新しいブランチ名> LSDK- を実行します。例: $ git checkout  -b LSDK-20.04  LSDK-20.04  $ export ARCH=arm64 $ export CROSS_COMPILE=aarch64-linux-gnu- $ make distclean $ make lx2160ardb_tfa_defconfig $ make 注: make コマンドで "*** Your GCC is older than 6.0 and is not supported" というエラーが表示された場合は、LSDK 18.12 以降の U‑Boot バイナリをビルドするため、Ubuntu 18.04(64 ビット)を使用していることを確認してください。 コンパイルされたU-Bootバイナリu-boot.binは、 u-boot/で入手可能です。 ステップ3: [オプション] OPTEEバイナリをコンパイルする OP‑TEE を利用して fip.bin をビルドするには、tee.bin をコンパイルする必要があります。 OP‑TEE を使用しない場合は、OP‑TEE のコンパイル手順を省略できます。 optee_os リポジトリをクローンして OP‑TEE バイナリをビルドします。 $ git clone https://source.codeaurora.org/external/qoriq/qoriq-components/optee_os $ cd optee_os $ git checkout -b <新しいブランチ名> LSDK- を実行します。例: $ git checkout -b LSDK-20.04  LSDK-20.04 $ export ARCH=arm $ export CROSS_COMPILE=aarch64-linux-gnu- $ make CFG_ARM64_core=y PLATFORM=ls-lx2160ardb $ aarch64-linux-gnu-objcopy -v -O binary out/arm-plat-ls/core/tee.elf out/arm-plat-ls/core/tee.bin コンパイルされた OP‑TEE イメージ tee.bin は optee_os/out/arm-plat-ls/core/ にあります。 ステップ 4: SD/eMMC ブート用に TF‑A バイナリをコンパイルする atf リポジトリをクローンし、TF‑A バイナリ(bl2_sd.pbl/bl2_emmc.pbl および fip.bin)をコンパイルします。 $ git clone https://source.codeaurora.org/external/qoriq/qoriq-components/atf $ cd atf $  git checkout -b   LSDK- . For example, $ git checkout -b LSDK-20.04 LSDK-20.04 $ export ARCH=arm64 $ export CROSS_COMPILE=aarch64-linux-gnu- OP‑TEE を使用して BL2 バイナリをビルドします。 For SD boot: $ make PLAT=lx2160ardb bl2 SPD=opteed BOOT_MODE=sd BL32= / tee.bin pbl RCW= /rcw_2000_700_2900_19_5_2.bin For eMMC boot: $ make PLAT=lx2160ardb bl2 SPD=opteed BOOT_MODE=emmc BL32= / tee.bin pbl RCW= /rcw_2000_700_2900_19_5_2.bin コンパイルされた BL2 イメージ bl2.bin と bl2_sd.pbl/bl2_emmc.pbl は、atf/build/lx2160ardb/release/ にあります。 BL2 ソースコードまたは RCW バイナリを更新した場合は、bl2_sd.pbl/bl2_emmc.pbl を再コンパイルする必要があります。 OPTEEを使用せずにBL2バイナリをコンパイルするには: For SD boot: $ make PLAT=lx2160ardb bl2 BOOT_MODE=sd pbl RCW= /rcw_2000_700_2900_19_5_2.bin     For emmc boot: $ make PLAT=lx2160ardb bl2 BOOT_MODE=emmc pbl RCW= /rcw_2000_700_2900_19_5_2.bin   OP‑TEE を使用し、Trusted Board Boot なしで FIP バイナリをビルドします。 $ make PLAT=lx2160ardb fip BL33= /u-boot.bin SPD=opteed BL32= /tee.bin コンパイルされた BL31 および FIP バイナリ(bl31.bin、fip.bin)は、atf/build/lx2160ardb/release/ にあります。 BL31、BL32、または BL33 バイナリを更新した場合は、fip.binを再コンパイルする必要があります。 OP‑TEE および Trusted Board Boot を使用せずに FIP バイナリをコンパイルするには: SD ブートの場合: $ make PLAT=lx2160ardb fip BOOT_MODE=sd BL33= / u-boot.bin For eMMC boot: $ make PLAT=lx2160ardb fip BOOT_MODE=emmc BL33= / u-boot.bin Trusted Board Boot で FIP バイナリをコンパイルする場合は、/plat/nxp/README.TRUSTED_BOO/plat/nxp/README.TRUSTED_BOO の README を参照してください。 ステップ5:TF-AバイナリをSD/eMMCカードにプログラムする FlexSPI から LX2160ARDB を起動します。スイッチが FlexSPI ブートに設定されていることを確認してください。 FlexSPI からのブート手順: SW1[1:8] = 1111 100X(X = 0 は FlexSPI NOR flash0、X = 1 は FlexSPI NOR flash1) SW2[1:8] = 0000 0110 SW3[1:8] = 1111 1100 SW4[1:8] = 1011 1000 FlexSPI NOR flash0 からブート: => qixis_reset LX2160ARDB Rev 1 の場合、ブートログには次が表示されます。 ボード: LX2160ACE Rev 1.0‑RDBボードバージョン: B、FlexSPI DEV#0 から起動 LX2160ARDB Rev 2 の場合、ブートログには次のように表示されます。 ボード:LX2160ACE Rev2.0-RDB、ボードバージョン:B、FlexSPI DEV#0から起動 イーサネット接続をセットアップする ボードが起動すると、U-Bootは有効なイーサネット・インターフェースのリストを表示します。 DPMAC2@xlaui4, DPMAC3@xgmii [PRIME], DPMAC4@xgmii, DPMAC5@25g-aui, DPMAC6@25g-aui, DPMAC17@rgmii-id, DPMAC18@rgmii-id, e1000#0 サーバーのIPアドレスを、TFTPサーバーを設定したホストマシンのIPアドレスに設定してください。 => setenv serverip ethactとethprimeをTFTPサーバに接続されたイーサネット・インターフェースとして設定します。 注: LX2160ARDB Ethernet port mapping を参照してください。これは、シャーシ前面パネルに表示される Ethernet ポート名と U‑Boot および Linux におけるポート名との対応表です。 => setenv ethprime 例: => setenv ethprime DPMAC3@xgmii => setenv ethact 例: => setenv ethact DPMAC3@xgmii ボードの IP アドレスを設定します。静的 IP アドレスを設定するか、ボードが DHCP サーバーに接続できる場合は、dhcp コマンドを使用できます。 静的IPアドレスの割り当て:=> setenv ipaddr => setenv netmask => setenv gatewayIP 動的IPアドレスの割り当て:=> dhcp 設定を保存します。 => saveenv ボードとTFTPサーバー間の接続を確認してください。 => ping $serverip DPMAC3@xgmii デバイスを使用します。 host 192.168.1.1 is alive TFTP サーバーから SD ブート用の TF‑A バイナリをロードします。 注: TF‑A バイナリのフラッシュイメージレイアウトの詳細については、LSDK memory layout for TF‑A boot flow を参照してください。 Flash bl2_sd.pbl: => tftp 82000000 bl2_sd.pbl => mmc dev 0; mmc write 82000000 8 ここで、blk_cntは、ファイルサイズに応じて書き込む必要がある SD カード上のブロック数を示します。 たとえば、TFTP サーバーから bl2_sd.pbl をロードし、転送されたバイト数が 103 353(0x193B9) の場合、blk_cnt は「103 353 / 512 = 201(0xC9)」に、最後のブロックを欠落させないように切り上げたセクタ数を加えて算出されます。したがって、この例で 10 セクタ(0xA)切り上げた場合、mmc write コマンドは次のようになります。=> mmc write 82000000 8 D3 Flash fip.bin: => tftp 82000000 fip.bin => mmc dev 0; mmc write 82000000 800 ここで、blk_cntは、ファイルサイズに応じて書き込む必要があるSDカードのブロックの数を示します。 たとえば、TFTP サーバーから fip.bin をロードし、転送されたバイト数が 1 178 967(0x11FD57)の場合、blk_cnt は「1 178 967 / 512 = 2 302(0x8FE)」に、最後のブロックを欠落させないように切り上げたセクタ数を加えて算出されます。したがって、この例で 10 セクタ(0xA)切り上げた場合、mmc write コマンドは次のようになります: => mmc write 82000000 800 908 Boot from SD カード:=> qixis_reset sd LX2160ARDB は TF‑A で起動します。ブートログには、次の内容が表示されます。 => NOTICE: BL2: v1.5(release):LSDK-20.04 NOTICE: BL2: Built : 22:01:10, Aug 20 2020 NOTICE: UDIMM 18ADF2G72AZ-3G2E1 NOTICE: DDR4 UDIMM with 2-rank 64-bit bus (x8) NOTICE: 32 GB DDR4, 64-bit, CL=22, ECC on, 256B, CS0+CS1 NOTICE: BL2: Booting BL31 NOTICE: BL31: v1.5(release):LSDK-20.04 NOTICE: BL31: Built : 22:02:07, Aug 20 2020 NOTICE: Welc U-Boot 2019.10 (Aug 14 2020 - 17:43:28 +0530) SoC: LX2160ACE Rev2.0 (0x87360020) Clock Configuration: CPU0(A72):2000 MHz CPU1(A72):2000 MHz CPU2(A72):2000 MHz CPU3(A72):2000 MHz CPU4(A72):2000 MHz CPU5(A72):2000 MHz CPU6(A72):2000 MHz CPU7(A72):2000 MHz CPU8(A72):2000 MHz CPU9(A72):2000 MHz CPU10(A72):2000 MHz CPU11(A72):2000 MHz CPU12(A72):2000 MHz CPU13(A72):2000 MHz CPU14(A72):2000 MHz CPU15(A72):2000 MHz Bus: 700 MHz DDR: 2900 MT/s Reset Configuration Word (RCW): 00000000: 50777738 24500050 00000000 00000000 00000010: 00000000 0c010000 00000000 00000000 00000020: 02e001a0 00002580 00000000 00000096 00000030: 00000000 00000000 00000000 00000000 00000040: 00000000 00000000 00000000 00000000 00000050: 00000000 00000000 00000000 00000000 00000060: 00000000 00000000 00027000 00000000 00000070: 08b30010 00150020 Model: NXP Layerscape LX2160ARDB Board Board: LX2160ACE Rev2.0-RDB, Board version: B, boot from SD TFTP サーバーから eMMC ブート用の TF‑A バイナリをロードします。 注: TF‑A バイナリのフラッシュイメージレイアウトの詳細については、LSDK memory layout for TF‑A boot flow を参照してください。 Flash bl2_emmc.pbl: => tftp 82000000 bl2_emmc.pbl => mmc dev 1; mmc write 82000000 8 ここで、blk_cntは、ファイルサイズに応じて書き込む必要がある SD カード上のブロック数を示します。 たとえば、TFTP サーバーから bl2_emmc.pbl をロードし、転送されたバイト数が 103 353(0x193B9) の場合、blk_cnt は「103 353 / 512 = 201(0xC9)」に、最後のブロックを欠落させないように切り上げたセクタ数を加えて算出されます。したがって、この例で 10 セクタ(0xA)切り上げた場合、mmc write コマンドは次のようになります。=> mmc write 82000000 8 D3 Flash fip.bin: => tftp 82000000 fip.bin => mmc dev 1; mmc write 82000000 800 ここで、blk_cntは、ファイルサイズに応じて書き込む必要があるSDカードのブロックの数を示します。 たとえば、TFTP サーバーから fip.bin をロードし、転送されたバイト数が 1 178 967(0x11FD57)の場合、blk_cnt は「1 178 967 / 512 = 2 302(0x8FE)」に、最後のブロックを欠落させないように切り上げたセクタ数を加えて算出されます。したがって、この例で 10 セクタ(0xA)切り上げた場合、mmc write コマンドは次のようになります: => mmc write 82000000 800 908 Boot from eMMC カード:=> qixis_reset emmc LX2160ARDB は TF‑A で起動します。ブートログには、次の内容が表示されます。   => NOTICE: BL2: v1.5(release):LSDK-20.04 NOTICE: BL2: Built : 22:01:10, Aug 20 2020 NOTICE: UDIMM 18ADF2G72AZ-3G2E1 NOTICE: DDR4 UDIMM with 2-rank 64-bit bus (x8) NOTICE: 32 GB DDR4, 64-bit, CL=22, ECC on, 256B, CS0+CS1 NOTICE: BL2: Booting BL31 NOTICE: BL31: v1.5(release):LSDK-20.04 NOTICE: BL31: Built : 22:02:07, Aug 20 2020 NOTICE: Welc U-Boot 2019.10 (Aug 14 2020 - 17:43:28 +0530) SoC: LX2160ACE Rev2.0 (0x87360020) Clock Configuration: CPU0(A72):2000 MHz CPU1(A72):2000 MHz CPU2(A72):2000 MHz CPU3(A72):2000 MHz CPU4(A72):2000 MHz CPU5(A72):2000 MHz CPU6(A72):2000 MHz CPU7(A72):2000 MHz CPU8(A72):2000 MHz CPU9(A72):2000 MHz CPU10(A72):2000 MHz CPU11(A72):2000 MHz CPU12(A72):2000 MHz CPU13(A72):2000 MHz CPU14(A72):2000 MHz CPU15(A72):2000 MHz Bus: 700 MHz DDR: 2900 MT/s Reset Configuration Word (RCW): 00000000: 50777738 24500050 00000000 00000000 00000010: 00000000 0c010000 00000000 00000000 00000020: 02e001a0 00002580 00000000 00000096 00000030: 00000000 00000000 00000000 00000000 00000040: 00000000 00000000 00000000 00000000 00000050: 00000000 00000000 00000000 00000000 00000060: 00000000 00000000 00027000 00000000 00000070: 08b30010 00150020 Model: NXP Layerscape LX2160ARDB Board Board: LX2160ACE Rev2.0-RDB, Board version: B, boot from eMMC
View full article
如何修复 FRDM-IMx93 Linux Kernel BSP 本指南提供了有关如何在FRDM-IMX93开发板上设置和应用Linux内核所需补丁的逐步说明。该过程包括克隆所需的仓库、应用补丁,以及为内核的定制和编译做准备。 前提条件 所需软件: 基于 Linux 的操作系统(推荐使用 Ubuntu/Debian)。 已安装 Git(运行 sudo apt install git)。 Yocto依赖项: $ sudo apt install gawk wget git diffstat unzip texinfo gcc build-essential chrpath socat cpio python3 python3-pip python3-pexpect xz-utils debianutils iputils-ping python3-git python3-jinja2 python3-subunit zstd liblz4-tool file locales libacl1 ​ 硬件: FRDM-IMX93 开发板 充足的存储空间 1. 下载存储库。 首先,下载必要的工具和仓库。如果 ~/bin 文件夹尚不存在,请创建它: $ mkdir ~/bin (this step may not be needed if the bin folder already exists) $ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo $ chmod a+x ~/bin/repo $ export PATH=~/bin:$PATH 2. 编译 Yocto SDK: $: mkdir Yocto_SDK $: cd Yocto_SDK $: repo init -u https://github.com/nxp-imx/imx-manifest -b imx-linux-scarthgap -m imx-6.6.36-2.1.0.xml $: repo sync $: MACHINE=imx93evk DISTRO=fsl-imx-xwayland source ./imx-setup-release.sh -b bld-xwayland $: bitbake imx-image-full -c populate_sdk 运行生成的 .sh文件以安装 SDK: sudo ./fsl-imx-xwayland-glibc-x86_64-imx-image-full-armv8a-imx93evk-toolchain-6.6-scarthgap.sh 最终的 .sh文件位于: bld-xwayland/tmp/deploy/sdk/ 3. 创建工作目录 首先,为内核设置创建一个专用目录并进入该目录: $ mkdir FRDM-IMX93-Kernel $ cd FRDM-IMX93-Kernel 4. 克隆内核补丁 从 NXP 仓库中获取所需的内核补丁: $ git clone https://github.com/nxp-imx-support/meta-imx-frdm.git -b lf-6.6.36-2.1.0 5. 克隆内核仓库(linux-imx 仓库) 克隆您之前构建的 Yocto SDK 的内核源代码: $ git clone https://github.com/nxp-imx/linux-imx.git -b lf-6.6.36-2.1.0 6. 应用内核补丁 对内核应用必要的补丁: $ cd linux-imx/ $ git apply ../meta-imx-frdm/meta-imx-bsp/recipes-kernel/linux/linux-imx/0001-gpio-pca953x-fix-pca953x_irq_bus_sync_unlock-race.patch $ git apply ../meta-imx-frdm/meta-imx-bsp/recipes-kernel/linux/linux-imx/0002-arm64-dts-add-i.MX93-11x11-FRDM-basic-support.patch $ git apply ../meta-imx-frdm/meta-imx-bsp/recipes-kernel/linux/linux-imx/0003-arm64-dts-add-imx93-11x11-frdm-mt9m114-dts.patch $ git apply ../meta-imx-frdm/meta-imx-bsp/recipes-kernel/linux/linux-imx/0004-Add-DSI-Panel-for-imx93.patch $ git apply ../meta-imx-frdm/meta-imx-bsp/recipes-kernel/linux/linux-imx/0005-Add-CTP-support-for-waveshare-panel.patch $ git apply ../meta-imx-frdm/meta-imx-bsp/recipes-kernel/linux/linux-imx/0006-arm64-dts-add-imx93-11x11-frdm-tianma-wvga-panel-dts.patch $ git apply ../meta-imx-frdm/meta-imx-bsp/recipes-kernel/linux/linux-imx/0007-arm64-dts-add-imx93-11x11-frdm-aud-hat-dts.patch $ git apply ../meta-imx-frdm/meta-imx-bsp/recipes-kernel/linux/linux-imx/0008-arm64-dts-add-button-support.patch $ git apply ../meta-imx-frdm/meta-imx-bsp/recipes-kernel/linux/linux-imx/0009-arm64-dts-add-imx93-11x11-frdm-ov5640-dts.patch $ cd linux-imx/ $ git apply ../meta-imx-frdm/meta-imx-bsp/recipes-kernel/linux/linux-imx/0010-arm64-dts-add-imx93-11x11-frdm-ld.dts-for-lpm.patch $ git apply ../meta-imx-frdm/meta-imx-bsp/recipes-kernel/linux/linux-imx/0011-arm64-dts-add-pwm-function-of-the-LED.patch $ git apply ../meta-imx-frdm/meta-imx-bsp/recipes-kernel/linux/linux-imx/0012-arm64-dts-add-imx93-11x11-frdm-8mic.dts.patch $ git apply ../meta-imx-frdm/meta-imx-bsp/recipes-kernel/linux/linux-imx/0013-arm64-dts-add-imx93-11x11-frdm-lpuart.dts.patch 7. 自定义设备树 可根据硬件配置修改或创建设备树。 设备树位置: arch/arm64/boot/dts/freescale/ 如果创建了新的设备树,需将其添加到相应的 Makefile 中: arch/arm64/boot/dts/freescale/Makefile 8. 设置交叉编译环境 为内核编译做准备,需运行环境设置脚本。假设 Yocto SDK 安装在 /opt 目录下,执行: 示例: $ source /opt/fsl-imx-xwayland/6.6-scarthgap/environment-setup-armv8a-poky-linux 9. 配置内核 根据需要在文件中进行配置调整: arch/arm64/configs/imx_v8_defconfig 使用适当的配置命令: $: make imx_v8_defconfig 10. 仅编译设备树 要仅编译设备树文件,请运行: $: make dtbs 11. 编译内核 最后,使用以下命令编译内核镜像: $ make -j $(nproc) 生成的内核镜像将位于: arch/arm64/boot/ 参考资料: IMX YOCTO PROJECT 用户指南 IMX LINUX USERS GUIDE  IMX 参考手册
View full article
S32G_MAC_Address_Storage この記事では、DTS ストレージ、systemd 仕様、fuse ストレージなど、S32G が MAC アドレスを保存する方法について説明します。 目次 1 必要なソフトウェア........................................................................... 2 2 背景.............................................................................................. 2 3 PFE eMAC MACアドレスの説明.................................................. 2 3.1 DTS 構成.................................................................................. 2 3.2 ソースコードの説明........................................................... 3 3.3 テスト............................................................................................ 4 4 GMAC0 MACアドレスの説明.................................................. 4 4.1 DTS 構成.................................................................................. 4 4.2 ソースコードの説明........................................................... 4 4.3 SystemD スクリプト.................................................................. 5 4.4 固定GMAC MACアドレスの変更方法............ 6 5 Ubootコマンドを使用してFUSE MACアドレス項目を書き込みます... 7 6 ヒューズから GMAC0 MAC アドレスを取得するように変更します... 9 6.1 Ubootコードの変更.................................................................. 9 6.2 Uboot書き込みMACレジスタの説明.................................................. 10 6.3 テスト........................................................................... 10 Automotive
View full article
CQHCI による emmc ダンプ こんにちはNXPチーム 最近、CQHCI機能に起因する問題に直面しています。 kernel version: 6.1.68 プラットフォーム:S32G3 eMMCモデル:FEMDME008G-A8A39 sysbenchを使用してemmcの圧力テストを実行し、emmcはダンプ情報を出力し続けました。 ダンプ・メッセージは次のとおりです。 [ 232.419161] mmc0: CQHCI: タグ 4、QCNT 25 のタイムアウト [ 232.423677] MMC0: CQHCI: ============ CQHCI レジスタ ダンプ =========== [ 232.430083] mmc0: cqhci: キャップ: 0x0000310a |バージョン: 0x00000510 [ 232.436501] mmc0:cqhci:設定:0x00001001 |コントロール:0x00000000 [ 232.442924] mmc0: cqhci: Int 統計: 0x00000000 |国際 enab: 0x00000006 [ 232.449346] mmc0: cqhci: Int sig: 0x00000006 |Int Coal: 0x00000000 [ 232.455799] mmc0: cqhci: TDL ベース: 0x823c3000 |TDL up32:0x00000000 [ 232.462202] mmc0: cqhci: ドアベル: 0x81dfffff |TCN:0x00000000 [ 232.468619] mmc0: cqhci: 開発キュー: 0x00000000 |開発ペンド:0x00800000 [ 232.475067] mmc0: cqhci: タスク clr: 0x00000000 |SSC1:0x00011000 [ 232.481469] mmc0: cqhci: SSC2: 0x00000001 |DCMD RSP : 0x00000900 [ 232.487896] mmc0:cqhci:REDマスク:0xfdf9a080 |テリー:0x00000000 [ 232.494330] mmc0: cqhci: Resp idx: 0x0000000d |応答引数: 0x00000000 [ 232.500739] MMC0: SDHCI============ レジスタ ダンプ ダンプ =========== [ 232.507158] mmc0: sdhci: Sys addr: 0x9ca3e000 |バージョン: 0x00000002 [ 232.513578] mmc0: sdhci: 白黒サイズ: 0x00000200 |ブラックCNT:0x00000020 [ 232.520001] mmc0: sdhci: 引数: 0x00018000 |Trnモード:0x00000023 [ 232.526424] mmc0: sdhci: 現在: 0x01fd8008 |ホストctl:0x00000030 [ 232.532847] mmc0: sdhci: 電源: 0x00000002 |ブラックギャップ:0x00000080 [ 232.539279] mmc0: sdhci: ウェイクアップ: 0x00000008 |時計:0x0000000f [ 232.545694] MMC0: SDHCI: タイムアウト: 0x0000008f |Int統計:0x00000000 [ 232.552126] mmc0: sdhci: Int enab: 0x107f4000 |署名enab:0x107f4000 [ 232.558568] mmc0: sdhci: ACmd 統計: 0x00000000 |スロットint:0x00000502 [ 232.564973] mmc0: sdhci: キャップ: 0x07eb0000 |Caps_1:0x0000b407 [ 232.571391] mmc0: sdhci: Cmd: 0x00000d1a |最大カー:0x00ffffff [ 232.577837] mmc0: sdhci: Resp[0]: 0x00000000 |Resp[1]:0xffffffff [ 232.584242] mmc0: sdhci: Resp[2]: 0x329f5903 |応答[3]:0x00d0ffff [ 232.590660] mmc0: sdhci: ホスト ctl2: 0x00000008 [ 232.595104] mmc0: sdhci: ADMA エラー: 0x00000000 |ADMAのPtr:0xad464408 [ 232.601514] mmc0: SDHCI-ESDHC-IMX: ========= ESDHC IMX デバッグ ステータス ダンプ ========= [ 232.609066] mmc0: SDHCI-ESDHC-IMX: CMD デバッグ ステータス: 0x2120 [ 232.614702] MMC0: SDHCI-ESDHC-IMX: データ デバッグ ステータス: 0x2200 [ 232.620431] mmc0: SDHCI-ESDHC-IMX: トランス デバッグ ステータス: 0x2300 [ 232.626246] mmc0: SDHCI-ESDHC-IMX: DMA デバッグ ステータス: 0x2400 [ 232.631888] mmc0: SDHCI-ESDHC-IMX: ADMA デバッグ ステータス: 0x2510 [ 232.637616] mmc0: SDHCI-ESDHC-IMX: FIFO デバッグ ステータス: 0x2680 [ 232.643345] mmc0: SDHCI-ESDHC-IMX: ASYNC FIFO デバッグ ステータス: 0x2750 [ 232.649595] MMC0: SDHCI: ============================================ [ 232.656073] mmc0: CQE リカバリを実行しています [ 289.818104] mmc0: CQE リカバリを実行しています [ 423.303076] mmc0: CQHCI: タグ 31、QCNT 27 のタイムアウト [ 423.307677] MMC0: CQHCI レジスタ ダンプ =========== ============ [ 423.314085] mmc0: cqhci: キャップ: 0x0000310a |バージョン: 0x00000510 [ 423.320504] mmc0: cqhci: 設定: 0x00001001 |コントロール:0x00000000 [ 423.326927] mmc0: cqhci: 国際統計: 0x00000000 |国際 enab: 0x00000006 [ 423.333381] mmc0: cqhci: Int sig: 0x00000006 |Int Coal: 0x00000000 [ 423.339786] mmc0: cqhci: TDL ベース: 0x823c3000 |TDL up32:0x00000000 [ 423.346379] mmc0: cqhci: ドアベル: 0xff1fcfff |TCN:0x00000000 [ 423.352628] mmc0: cqhci: 開発キュー: 0x00000000 |開発ペンド:0x00000400 [ 423.359047] mmc0: cqhci: タスク clr: 0x00000000 |SSC1:0x00011000 [ 423.365465] mmc0: cqhci: SSC2: 0x00000001 |DCMD RSP : 0x00000900 [ 423.371888] mmc0:cqhci:REDマスク:0xfdf9a080 |テリー:0x00000000 [ 423.378309] mmc0: cqhci: Resp idx: 0x0000000d |応答引数: 0x00000000 [ 423.384736] MMC0: SDHCI : ============ SDHCI レジスタ ダンプ =========== [ 423.391160] mmc0: sdhci: Sys addr: 0xa5b7b000 |バージョン: 0x00000002 [ 423.397583] mmc0: sdhci: 黒字サイズ: 0x00000200 |ブラックCNT:0x00000020 [ 423.404005] mmc0: sdhci: 引数: 0x00018000 |Trnモード:0x00000023 [ 423.410426] mmc0: sdhci: 現在: 0x01fd8008 |ホストctl:0x00000030 [ 423.416849] mmc0: sdhci: 電源: 0x00000002 |ブラックギャップ:0x00000080 [ 423.423280] mmc0: sdhci: ウェイクアップ: 0x00000008 |時計:0x0000000f [ 423.429696] mmc0: sdhci: タイムアウト: 0x0000008f |Int統計:0x00000000 [ 423.436119] mmc0: sdhci: Int enab: 0x107f4000 |署名enab:0x107f4000 [ 423.442568] mmc0: sdhci: ACmd 統計: 0x00000000 |スロットint:0x00000502 [ 423.449210] mmc0: sdhci: キャップ: 0x07eb0000 |Caps_1:0x0000b407 [ 423.455401] mmc0: sdhci: Cmd: 0x00000d1a |最大カー:0x00ffffff [ 423.461812] mmc0: sdhci: Resp[0]: 0x00000000 |Resp[1]:0xffffffff [ 423.468236] mmc0: sdhci: Resp[2]: 0x329f5903 |応答[3]:0x00d0ffff [ 423.474657] mmc0: sdhci: ホスト ctl2: 0x00000008 [ 423.479083] mmc0: sdhci: ADMA エラー: 0x00000000 |ADMAポイント:0xad467408 [ 423.485508] mmc0: SDHCI-ESDHC-IMX: ESDHC IMX デバッグ ステータス ダンプ ========= ========= [ 423.493061] mmc0: SDHCI-ESDHC-IMX: CMD デバッグ ステータス: 0x2120 [ 423.498701] mmc0: SDHCI-ESDHC-IMX: データ デバッグ ステータス: 0x2200 [ 423.504429] mmc0: SDHCI-ESDHC-IMX: トランス デバッグ ステータス: 0x2300 [ 423.510245] mmc0: SDHCI-ESDHC-IMX: DMA デバッグ ステータス: 0x2400 [ 423.515887] mmc0: SDHCI-ESDHC-IMX: ADMA デバッグ ステータス: 0x2510 [ 423.521615] MMC0: SDHCI-ESDHC-IMX: FIFO デバッグ ステータス: 0x2680 [ 423.527344] mmc0: SDHCI-ESDHC-IMX: 非同期 FIFO デバッグ ステータス: 0x2750 [ 423.533593] MMC0: SDHCI============================================ [ 423.540075] mmc0: CQE リカバリを実行しています [ 501.799092] MMC0: CQHCI: タグ 31、QCNT 24 のタイムアウト [ 501.803698] MMC0: CQHCI レジスタ ダンプ =========== ============ [ 501.810106] mmc0: cqhci: キャップ: 0x0000310a |バージョン: 0x00000510 [ 501.816528] mmc0: cqhci: 設定: 0x00001001 |コントロール:0x00000000 [ 501.822948] mmc0: cqhci: 国際統計: 0x00000000 |国際 enab: 0x00000006 [ 501.829398] mmc0: cqhci: Int sig: 0x00000006 |Int Coal: 0x00000000 [ 501.835801] mmc0: cqhci: TDL ベース: 0x823c3000 |TDL up32:0x00000000 [ 501.842221] mmc0: cqhci: ドアベル: 0xe01fffff |TCN:0x00000000 [ 501.848666] mmc0: cqhci: 開発キュー: 0x00000000 |開発ペンド:0x00008000 [ 501.855070] mmc0: cqhci: タスク clr: 0x00000000 |SSC1:0x00011000 [ 501.861533] mmc0: cqhci: SSC2: 0x00000001 |DCMD RSP : 0x00000900 [ 501.867916] mmc0:cqhci:REDマスク:0xfdf9a080 |テリー:0x00000000 [ 501.874333] mmc0: cqhci: Resp idx: 0x0000000d |応答引数: 0x00000000 [ 501.880756] MMC0: SDHCI : ============ SDHCI レジスタ ダンプ =========== [ 501.887180] mmc0: sdhci: システム追加: 0xa5a15000 |バージョン: 0x00000002 [ 501.893600] mmc0: sdhci: 黒字サイズ: 0x00000200 |ブラックCNT:0x00000020 [ 501.900029] mmc0: sdhci: 引数: 0x00018000 |Trnモード:0x00000023 [ 501.906450] mmc0: sdhci: 現在: 0x01fd8008 |ホストctl:0x00000030 [ 501.912875] mmc0: sdhci: 電源: 0x00000002 |ブラックギャップ:0x00000080 [ 501.919301] mmc0: sdhci: ウェイクアップ: 0x00000008 |時計:0x0000000f [ 501.925717] mmc0: sdhci: タイムアウト: 0x0000008f |Int統計:0x00000000 [ 501.932139] mmc0: sdhci: Int enab: 0x107f4000 |署名enab:0x107f4000 [ 501.938564] mmc0: sdhci: ACmd 統計: 0x00000000 |スロットint:0x00000502 [ 501.944994] mmc0: sdhci: キャップ: 0x07eb0000 |Caps_1:0x0000b407 [ 501.951435] mmc0: sdhci: Cmd: 0x00000d1a |マックス カー:0x00ffffff [ 501.957841] mmc0: sdhci: Resp[0]: 0x00000000 |Resp[1]:0xffffffff [ 501.964284] mmc0: sdhci: Resp[2]: 0x329f5903 |応答[3]:0x00d0ffff [ 501.970686] mmc0: sdhci: ホスト ctl2: 0x00000008 [ 501.975106] mmc0: sdhci: ADMA エラー: 0x00000000 |ADMAポイント:0xad463808 [ 501.981529] MMC0:SDHCI-ESDHC-IMX:========= ESDHC IMXデバッグステータスダンプ ========= [ 501.989083] mmc0: SDHCI-ESDHC-IMX: CMD デバッグ ステータス: 0x2120 [ 501.994728] mmc0: SDHCI-ESDHC-IMX: データ デバッグ ステータス: 0x2200 [ 502.000451] mmc0: SDHCI-ESDHC-IMX: TRANS デバッグ ステータス: 0x2300 [ 502.006266] MMC0:SDHCI-ESDHC-IMX:DMA デバッグ ステータス:0x2400 [ 502.011909] MMC0:SDHCI-ESDHC-IMX:ADMA デバッグ ステータス:0x2510 [ 502.017636] mmc0: SDHCI-ESDHC-IMX: FIFO デバッグ ステータス: 0x2680 [ 502.023365] mmc0: SDHCI-ESDHC-IMX: ASYNC FIFO デバッグ ステータス: 0x2750 [ 502.029650] MMC0: SDHCI: ============================================ [ 502.036090] mmc0: CQE リカバリを実行しています [ 607.207068] mmc0: CQHCI: タグ 31、QCNT 21 のタイムアウト [ 607.211666] MMC0: CQHCI レジスタ ダンプ =========== ============ [ 607.218083] mmc0: cqhci: キャップ: 0x0000310a |バージョン: 0x00000510 [ 607.224498] mmc0: cqhci: 設定: 0x00001001 |コントロール:0x00000000 [ 607.230915] mmc0: cqhci: 国際統計: 0x00000000 |国際 enab: 0x00000006 [ 607.237344] mmc0: cqhci: Int sig: 0x00000006 |Int Coal: 0x00000000 [ 607.243803] mmc0: cqhci: TDL ベース: 0x823c3000 |TDL up32:0x00000000 [ 607.250194] mmc0: cqhci: ドアベル: 0x83ffc1fe |TCN:0x00000000 [ 607.256635] mmc0: cqhci: 開発キュー: 0x00000000 |開発ペンド:0x00000001 [ 607.263039] mmc0: cqhci: タスク clr: 0x00000000 |SSC1:0x00011000 [ 607.269485] mmc0: cqhci: SSC2: 0x00000001 |DCMD RSP : 0x00000900 [ 607.275915] mmc0: cqhci: RED マスク: 0xfdf9a080 |テリー:0x00000000 [ 607.282328] mmc0: cqhci: Resp idx: 0x0000000d |応答引数: 0x00000000 [ 607.288731] MMC0: SDHCI============ レジスタ ダンプ =========== [ 607.295180] mmc0: sdhci: システム追加: 0x9cefe000 |バージョン: 0x00000002 [ 607.301577] mmc0: sdhci: 黒字サイズ: 0x00000200 |ブラックCNT:0x00000020 [ 607.308021] mmc0: sdhci: 引数: 0x00018000 |Trnモード:0x00000023 [ 607.314425] mmc0: sdhci: 現在: 0x01fd8008 |ホストctl:0x00000030 [ 607.320843] mmc0: sdhci: 電源: 0x00000002 |ブラックギャップ:0x00000080 [ 607.327263] mmc0: sdhci: ウェイクアップ: 0x00000008 |時計:0x0000000f [ 607.333725] mmc0: sdhci: タイムアウト: 0x0000008f |Int統計:0x00000000 [ 607.340117] mmc0: sdhci: Int enab: 0x107f4000 |署名enab:0x107f4000 [ 607.346575] mmc0: sdhci: ACmd 統計: 0x00000000 |スロットint:0x00000502 [ 607.352962] mmc0: sdhci: キャップ: 0x07eb0000 |Caps_1:0x0000b407 [ 607.359405] mmc0: sdhci: Cmd: 0x00000d1a |最大カー:0x00ffffff [ 607.365818] mmc0: sdhci: Resp[0]: 0x00000000 |Resp[1]:0xffffffff [ 607.372254] mmc0: sdhci: Resp[2]: 0x329f5903 |応答[3]:0x00d0ffff [ 607.378692] MMC0: sdhci: ホスト ctl2: 0x00000008 [ 607.383103] mmc0: sdhci: ADMA エラー: 0x00000000 |ADMAのPtr:0xad463408 [ 607.389505] mmc0: SDHCI-ESDHC-IMX: ========= ESDHC IMX デバッグ ステータス ダンプ ========= [ 607.397083] mmc0: SDHCI-ESDHC-IMX: CMD デバッグ ステータス: 0x2120 [ 607.402704] mmc0: SDHCI-ESDHC-IMX: データ デバッグ ステータス: 0x2200 [ 607.408454] mmc0: SDHCI-ESDHC-IMX: トランス デバッグ ステータス: 0x2300 [ 607.414245] MMC0: SDHCI-ESDHC-IMX: DMA デバッグ ステータス: 0x2400 [ 607.419880] MMC0:SDHCI-ESDHC-IMX:ADMA デバッグ ステータス:0x2510 [ 607.425607] MMC0: SDHCI-ESDHC-IMX: FIFO デバッグ ステータス: 0x2680 [ 607.431335] mmc0: SDHCI-ESDHC-IMX: ASYNC FIFO デバッグ ステータス: 0x2750 [ 607.437586] MMC0: SDHCI: ============================================ [ 607.444076] mmc0: CQE リカバリを実行しています CMD13が送信されたときにすべてのダンプが発生し、その後emmcが応答タイムアウトになったことに気付きました。原因を探るためにdebugfsを使用してみたところ、"cat /sys/kernel/debug/mmc0/mmc0\:0001/status"を実行してCMD13をemmcに送信し、返して結果を表示するのに約10秒かかる場合のみ、他のコマンドを実行する場合のみ、"cat /sys/kernel/debug/mmc0/mmc0\:0001/state"などの他のコマンドを実行してすぐに戻ることに気づきました。 結局、CQHCIを閉鎖し、問題を解決しました。CQHCIは、特定のメーカーによって製造されたemmcではうまく機能しないようです。この問題について、新たな進展を期待しています。 よろしくお願いいたします。 ヤン Re:CQHCIによるemmcダンプ Hello,jun13_chen このパッチは確かに問題を解決できます。どうもありがとうございます。 Re:CQHCIによるemmcダンプ こんにちは、 @yan4  私はローカルRDBで問題を再現しませんでしたが、他のNXPプラットフォームでそのような問題に遭遇したことがあります。CQHCI tを一時的に無効にすることをお勧めします。 @jun13_chenの入力に感謝し、言及されたパッチで機能を閉じることができます。 BR チェンイン Re:CQHCIによるemmcダンプ たぶん、このパッチで問題が解決したのでしょう。 https://github.com/nxp-auto-linux/linux/commit/185b9d9a592ca5eb97e67f9d43616d2c3de34ec8 しかし、CQHCIは安定していないため、NXPはそれを閉じることを提案しています。フォローパッチを探しています: https://github.com/nxp-auto-linux/linux/commit/d856f42b65e5a976a49adfd9e95d1d81a27a9ca9 Re:CQHCIによるemmcダンプ こんにちは、chenyin_h この問題が前述の船上で発生するかどうかを確認しましたか?追加情報が必要な場合は、喜んで提供します。 よろしくお願いいたします。 ヤン Re:CQHCIによるemmcダンプ こんにちは、 @yan4  貴重な投稿をありがとうございました、ステータスを理解することができ、それが参照ボードに存在するかどうかを確認できます。 ありがとうございます BR チェンイン Re:CQHCIによるemmcダンプ こんにちは、chenyin 私が使用しているカーネルは、正式にサポートされているBSP38のバージョンであるV5.15と一致しないようにカスタマイズされていることを説明する必要があります。しかし、コミュニティにも同様の問題があり、link:https://community.nxp.com/t5/i-MX-Processors/The-issues-on-quot-mmc0-cqhci-timeout-for-tag-0-quot/m-p/993779/thread-id/147435/page/2。 I.MX プラットフォームでも同じ問題が発生し、BSPバージョンとカーネルバージョンは公式にサポートされています。したがって、この問題がカーネルバージョンの不一致によって引き起こされているとは思いません。ちなみに、CQHCIは不安定な機能のようで、Linuxのメインブランチで無効にしてから有効にすることがありますが、2022年に有効に [email protected]。おそらく、この機能を導入する必要性を再評価するか、その中のバグを修正する必要があります。 よろしくお願いいたします ヤン Re:CQHCIによるemmcダンプ はい、BSP38 と 6.1.168私のテストではカーネルが使用されました。 Re:CQHCIによるemmcダンプ こんにちは、 @yan4  投稿ありがとうございます。 私は6.1.68カーネルはテスト中に使用されますが、BSP の観点からは正式にサポートされているバージョンではないようです。 BSP(たとえば、5.15.xまたは6.6.xのBSP41)の使用中にも問題が発生したかどうかをお知らせくださいケネル)? BR チェンイン
View full article
MX6UL_PAD_UART5_TX_DATA__ECSPI2_MOSIへの過度の電流引き込みを防ぐにはどうすればよいですか i.MX6ULLプロセッサを使用しています。 ECSPI2_MISOにはUART5_RX_DATAラインを使用しています。 問題 サーマルカメラで測定し、次に電圧プローブを行ったところ、 プロセッサのMIピンとSPIデバイスのSOピンの間に電圧競合が発生している、つまり、両方とも出力として駆動していることを示しています。問題のあるピンはMX6UL_PAD_UART5_RX_DATA__ECSPI2_MISOです。 ドライバーが読み込まれる前に、UART5_RX_DATA ピンがGPIO1_IO31され、期待どおりに入力されます。ただし、spi-imxドライバーをロードするとすぐに、入力ピンの電圧が3.3Vから2.58Vになり、2つのピン間で過剰な電流引き込み と競合が発生します。ドライバーは、ピンが読み込まれたときに入力として保持されることが期待されます。 その後、デーモンが SPI バスを使用するロードを行うと、競合は解消され、サーマルは正常に見え、バスは正常に動作します。 このSPIバスを使用するデーモンを常に実行するわけではありませんが、それ以外に、2つの出力が互いに競合する回数はゼロである必要があります。 イベントのシーケンス Linuxの起動後、spi-imxがまだロードされていません UART5_ R X_DATAパッド の電圧 3.253V SW_MUX_CTL_PAD_UART5_RX_DATAの値 (0x20e00c0) 0x5 modprobe spi-imxの後 UART5_ R X_DATAパッド の電圧 2.581V SW_MUX_CTL_PAD_UART5_RX_DATAの値 (0x20e00c0) 0x8 NVCC_UART 3.3Vに設定しています。 出力駆動と電圧の関係 出力駆動強度が強くなると、測定される電圧は低下します。出力駆動力が弱まると、出力電圧が上がります。出力駆動強度を000に設定すると、問題は解消され、電圧は予想通りの3.3Vに達します。 spi-imx.c のソースコードバージョン運転手  ここでは、 https://github.com/Freescale/linux-fslc.git のカーネル 5.4-2.1.x-imx を搭載した i.MX6ULL を使用しています。  spi-imx.c への最後の変更ログは次のとおりです。 コミット 0a8472f057642c67b84985fec3c65b7ac521ebd8 Merge: 62f022d6ecd0 a998faa9c4ce 著者: Andrey Zhizhikin > 日付: 2021年8月16日(月) 11:14:39 +0000       タグ 'v5.4.140' を 5.4-2.1.x-imx にマージします。       これは 5.4.140 安定版リリースです       サインオフ:アンドレイ・ジジキン >   i.MX6UL Re:MX6UL_PAD_UART5_TX_DATA__ECSPI2_MOSIへの過度の電流引き込みを防ぐにはどうすればよいですか MISOピンは、SPIインターフェースをマスターとして使用する場合、常に入力になります。最も簡単な解決策は、iomuxc の MISO ピンの出力を無効にすることです。そうすると、SPI Linux ドライバーがロードされた後に MISO ピンが使用されていないときに、MISO ピンが Low に駆動されなくなります。 Re:MX6UL_PAD_UART5_TX_DATA__ECSPI2_MOSIへの過度の電流引き込みを防ぐにはどうすればよいですか すべてが常に機能していましたが (出力を無効にしたかどうかにかかわらず)、熱解析の結果、ドライバーが読み込まれてからアプリケーションが開始されるまでの間に、MISO ピンが予想よりも低い電圧になっていることがわかりました (これは理論的には、設計では決してない可能性があります)。ドライバー(spi-imx)がロードされる前は、MISOピンはGPIO入力であり、その場合、予想どおりに3.2ボルトを測定します。 1つのデバイスのSPIバスがあります。スレーブの出力には、常にオンになっているレベルシフターが必要です。 使用しているレベルシフターは74LVC2T45です。MISO出力はピン2です。ピン1は3.3Vに接続されています。ピン 4 はアースに接続されています。通常、スレーブデバイスがアイドル状態のときに、ピン2に高電圧が表示されています。チップセレクトは、74LVC2T45への入力にプルアップがあるため、この電圧に影響を与えないことに注意してください。 MISOはMCIMX6Y1CVM05のG13(UART5_RX_DATA)に接続されています。これは、ドライバーがLinuxにロードされるまでトライステートであり、その時点でこのピンは出力がローになりますが、これは望ましくありません。 デバイスツリーでスレーブモードを選択していません。iomuxcを使用してUART5_RX_DATAの出力を無効にすると、読み込みの問題は解消されます。 この問題は、アプリケーションをロードしてSPIバスと通信を開始すると解消されます。 私たちの経験から、SOCがマスターの場合のMISOのNXPデバイスツリーの例は、MISOピンの出力ドライバーを有効にするのではなく、無効にする必要があります。 Re:MX6UL_PAD_UART5_TX_DATA__ECSPI2_MOSIへの過度の電流引き込みを防ぐにはどうすればよいですか Hello, pinctrlで出力ドライバーを無効にしても、使用できますか? デバイスツリーの例に従って、電圧レベルの低下が異常であることをお勧めします。あなたのつながりを共有していただけませんか? よろしくお願いいたします。 Re:MX6UL_PAD_UART5_TX_DATA__ECSPI2_MOSIへの過度の電流引き込みを防ぐにはどうすればよいですか この問題は、pinctrlで出力ドライバーを無効にすることで解消されることを明確にする必要があります。しかし、例のデバイスツリーエントリはそれを行いません。では、なぜドライバーは初期負荷でMISOピンを出力にすることにしたのでしょうか。デバイスツリーではSPIスレーブであるとは指定していないため、ピンを駆動しないでください。 Re:MX6UL_PAD_UART5_TX_DATA__ECSPI2_MOSIへの過度の電流引き込みを防ぐにはどうすればよいですか そして、今、タイトルはこうあるべきだと気づきました。 過大な電流引き込みを防ぐにはどうすればよいですか MX6UL_PAD_UART5_RX_DATA__ECSPI2_MISO ピンが間違えられてしまいました。
View full article
MCAL DET CFG Error When I configured the MCAL project of S32K310, I encountered the problem shown in the figure when adding the Det module, and there was no original file in the MCAL package. What should I do? Re: MCAL DET CFG Error Hello @Embedded_novice  Unfortunately, the functions contained in the DET plugin are sample stub functions. It is not a driver, and the functions are intended to be replaced by the user developed code or by any third-party provider as stated in the Release Notes documentation of the RTD version used. Please let me know if you have more doubts. - RomanVR.
View full article
S32K310 Interrupt CFG 割り込みを設定するときにハンドラーが何を入力する必要があるかを知りたいです。 たとえば、PIT 割り込みを使用する場合、未定義のハンドラーを置き換えるにはどの定義を使用すればよいですか。また、その定義はどのファイルにありますか。 Re: S32K310 Interrupt CFG ご協力ありがとうございます。対処方法が分かりました。統合マニュアルではなくユーザーマニュアルを見ていたのですが、関連する情報が見つかりませんでした。 Re:S32K310割り込みCFG こんにちは @user 次のパスにあるモジュールドライバーの統合マニュアルを参照してください:C:\NXP \ S32DS.3.5 \ S32DS \ software \ PlatformSDK_S32K3 \ RTD \ Gpt_TS_T40D34M50I0R0 \ doc(パスは、ソフトウェアのバージョン、インストールされているS32DS、インストールディレクトリ、およびドライバーによって異なる場合があります)。PIT1割り込みハンドラ定義の場合は「PIT_1_ISR」となります。 この情報が役に立ったかどうか、さらに疑問がある場合はお知らせください。 - RomanVR。
View full article
SDIからCSIへのシンプルなブリッジからi.mx8mpへ Debian Bookworm を実行するカスタムボードがあり、FPGA を使用して SDI ビデオを CSI2 にブリッジします。FPGA i2cインターフェースは、SDI信号がビデオフォーマット(さまざまなフレームレートで720pまたは1080p)を制御するため、非常にシンプルです。すべてのフレーム レートは、300MHz の CSI クロックと 4 レーンで 600MHz のデータ レートを使用します。 私は CSI2-SAM を使用する (と思う) サブデバイス ドライバーを作成しました。720p 50Hz入力では、次のように表示されます。 $ media-ctl -d /dev/media0 -p Media controller API version 6.1.36 Media device information ------------------------ driver mxc-md model FSL Capture Media Device serial bus info platform:32c00000.bus:camera hw revision 0x0 driver version 6.1.36 Device topology - entity 1: mxc_isi.0 (16 pads, 2 links) type V4L2 subdev subtype Unknown flags 0 pad0: Sink <- "mxc-mipi-csi2.0":4 [ENABLED] pad1: Sink pad2: Sink pad3: Sink pad4: Sink pad5: Sink pad6: Sink pad7: Sink pad8: Sink pad9: Sink pad10: Sink pad11: Sink pad12: Source -> "mxc_isi.0.capture":0 [ENABLED] pad13: Source pad14: Source pad15: Sink - entity 18: mxc_isi.0.capture (1 pad, 1 link) type Node subtype V4L flags 0 device node name /dev/video3 pad0: Sink <- "mxc_isi.0":12 [ENABLED] - entity 22: mxc-mipi-csi2.0 (8 pads, 2 links) type Node subtype V4L flags 0 device node name /dev/v4l-subdev0 pad0: Sink <- "mc_camera_mipi 3-003c":0 [ENABLED,IMMUTABLE] pad1: Sink pad2: Sink pad3: Sink pad4: Source -> "mxc_isi.0":0 [ENABLED] pad5: Source pad6: Source pad7: Source - entity 31: mc_camera_mipi 3-003c (1 pad, 1 link) type V4L2 subdev subtype Sensor flags 0 device node name /dev/v4l-subdev1 pad0: Source [fmt:UYVY8_2X8/1280x720 field:none colorspace:rec709 xfer:709 ycbcr:601 quantization:lim-range] -> "mxc-mipi-csi2.0":0 [ENABLED,IMMUTABLE] これは私には正しいように思えます。 最初に私は気づきます: /sys/devices/platform/soc@0/32c00000.bus/32c00000.bus:camera/32e40000.csi$ cat ./power/runtime_status suspended キャプチャを開始していないため、問題ありません。 次に、実行します。 $ v4l2-ctl --set-fmt-video=width=1280,height=720,pixelformat="NV12" --device=/dev/video3 --stream-count=10 --stream-mmap ランタイムステータスが「アクティブ」に変わります。'スコープを使用すると、FPGAはサブデバイスの要求に応じてCSIビデオデータの出力を開始することがわかります。 [326921.869991] mc_camera_mipi 3-003c: s_stream: 1 get_fmt は、ドキュメントに記載されている UYVY8 の出力形式に一致する 0x2006 (MEDIA_BUFS_FMT_UYVY8_2x8) のコードを返します。また、FPGAによって検出された解像度とフレームレートも出力します。 これはすべて私には問題ないように見えますが、v4l2キャプチャは最初のフレームを待って停止します。 ioctl(3, VIDIOC_G_FMT, {type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE, fmt.pix_mp={width=1280, height=720, pixelformat=v4l2_fourcc('N', 'V', '1', '2') /* V4L2_PIX_FMT_NV12 */, field=V4L2_FIELD_NONE, colorspace=V4L2_COLORSPACE_SRGB, plane_fmt=[{sizeimage=1382400, bytesperline=1280}], num_planes=1}}) = 0 ioctl(3, VIDIOC_STREAMON, [V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE]) = 0 ioctl(3, VIDIOC_G_FMT, {type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE, fmt.pix_mp={width=1280, height=720, pixelformat=v4l2_fourcc('N', 'V', '1', '2') /* V4L2_PIX_FMT_NV12 */, field=V4L2_FIELD_NONE, colorspace=V4L2_COLORSPACE_SRGB, plane_fmt=[{sizeimage=1382400, bytesperline=1280}], num_planes=1}}) = 0 pselect6(4, NULL, NULL, [3], {tv_sec=0, tv_nsec=0}, NULL) = 0 (Timeout) ioctl(3, VIDIOC_DQBUF, {type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE ですから、明らかに何かが間違っています。 私はV4L2に少し初心者ですが、同様のPCIeインターフェイスを備えたPCIeベースのビデオキャプチャ用のドライバーを作成しました。 これをデバッグするためにどのツールを適用できるかについての提案、または私が間違っていることについてのヒントは、ありがたいことに受け取られます。 ありがとうございます P.S. デバイスツリーのスニペットが続きます &i2c4 { clock-frequency = <400000>; pinctrl-names = "default", "gpio"; pinctrl-0 = <&pinctrl_i2c4>; pinctrl-1 = <&pinctrl_i2c4_gpio>; scl-gpios = <&gpio5 20 GPIO_ACTIVE_HIGH>; sda-gpios = <&gpio5 21 GPIO_ACTIVE_HIGH>; status = "okay"; mc_camera_mipi0 { compatible = "v4,mc_camera_mipi"; reg = <0x3c>; clocks = <&clk IMX8MP_CLK_IPP_DO_CLKO2>; clock-names = "xclk"; /* Disabled CLKO2, since DART-MX8MP camera expansion board uses * its own oscillator. Enable CLK02 if your desing requres it */ #if 0 assigned-clocks = <&clk IMX8MP_CLK_IPP_DO_CLKO2>; assigned-clock-parents = <&clk IMX8MP_CLK_24M>; #endif assigned-clock-rates = <24000000>; csi_id = <0>; /* powerdown-gpios = <&pca6408_1 2 GPIO_ACTIVE_HIGH>; reset-gpios = <&pca6408_1 0 GPIO_ACTIVE_LOW>; */ mclk = <24000000>; mclk_source = <0>; mipi_csi; status = "okay"; port { mc_camera_mipi_0_ep: endpoint { remote-endpoint = <&mipi_csi0_ep>; data-lanes = <1 2 3 4>; clock-lanes = <0>; }; }; }; }; &mipi_csi_0 { #address-cells = <1>; #size-cells = <0>; status = "okay"; port@0 { reg = <0>; mipi_csi0_ep: endpoint { remote-endpoint = <&mc_camera_mipi_0_ep>; data-lanes = <4>; csis-hs-settle = <6>; csis-clk-settle = <2>; csis-wclk; }; }; }; mipi_csi_0: csi@32e40000 { compatible = "fsl,imx8mp-mipi-csi", "fsl,imx8mn-mipi-csi"; reg = <0x32e40000 0x10000>; interrupts = <0 17 4>; clock-frequency = <500000000>; clocks = <&clk 271>, <&clk 97>, <&clk 269>; clock-names = "mipi_clk", "disp_axi", "disp_apb"; assigned-clocks = <&clk 170>; assigned-clock-parents = <&clk 65>; assigned-clock-rates = <500000000>; bus-width = <4>; csi-gpr = <&mediamix_gasket0>; gpr = <&media_blk_ctrl>; power-domains = <&media_blk_ctrl 1>; status = "disabled"; }; i.MX 8M | i.MX 8M Mini | i.MX 8M Nano Linux マルチメディア 日時:i.mx8mpへのシンプルなSDIからCSIへのブリッジ こんにちは、私はLinuxベースのプラットフォームでHD-SDIからMIPICIS2ブリッジソリューションに苦労しています。 あなたのチップセットソリューションを私にお勧めできますか? 日時:i.mx8mpへのシンプルなSDIからCSIへのブリッジ CSI タイミングの問題
View full article
S32G_How_to_Put_A53_to_WFI 中文版 S32G的partition off流程要求核稳定的进 入到WFI状态,本文说明如何修改Linux内核, 在A53 Linux关机或kernel panic时,如何让所 有A53 Core进入WFI。 目录 1 背景说明与参考资料 .................................................. 2 1.1 背景说明 ................................................................. 2 1.2 参考资料 ................................................................. 5 1.3 测试工具 ................................................................. 6 2 Panic ......................................................................... 7 2.1 Panic代码流程分析 ................................................. 7 2.2 BSP30修改说明(Non-ATF) ................................... 10 2.3 BSP36修改说明(ATF) .......................................... 15 3 Poweoff ................................................................... 17 3.1 Poweroff代码流程分析 ......................................... 17 3.2 BSP30修改说明(Non-ATF) ................................... 19 3.3 BSP36修改说明(ATF) .......................................... 20 4 Reboot情况说明 ....................................................... 20 5 STR情况说明 ........................................................... 21 目录 1    背景与参考资料2 1.1 背景2 1.2 参考材料5 1.3 测试工具6 2   内核崩溃7 2.1 内核崩溃代码流程分析7 2.2  BSP30 Modification (Non-ATF) 10 2.3 BSP36 改装 (ATF) 16 3    Poweoff 18 3.1 关机代码流程分析18 3.2  BSP30 Modification (Non-ATF) 20 3.3 BSP36 修改 (ATF) 21 4    重启情况说明21 5   STR 情况说明21 汽车电子
View full article
Androidでスパースイメージを有効にする方法 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> システムイメージ(ext4)には、rawとsparseの2つのフォーマットがあります。rawのイメージは大きいので、ext4に直接マウントできます(mount -t ext4 system.img system)。スパースイメージはlp5.0でサポートされていますが、少し小さいです。以下の部分では、IMX7D SDBボードを例として使用しています。プラットフォームのハードウェアに応じて設定を変更できます。   1 スパースイメージを生成する   Lollipop 5.0 および 5.1 では、デフォルトでRAWイメージとスパースイメージの両方が生成されます。 スパースシステムイメージは次の場所にあります: out/target/product/sabresd_7d/system_sparse.img rawシステムイメージは次の場所にあります:out/target/product/sabresd_7d/system.img 以下はAndroidビルドシステムでsystem.imgを生成するために使用される手順です。 スパースイメージを構築します(-sはビルドシステムイメージがスパースであることを意味します) make_ext4fs -s -T -1 -S out/target/product/sabresd_7d/root/file_contexts -l 374476800 -a system out/target/product/sabresd_7d/obj/PACKAGING/systemimage_intermediates/system.img out/target/product/sabresd_7d/system スパース画像をraw画像に変換する simg2img out/target/product/sabresd_7d/system_sparse.img out/target/product/sabresd_7d/system.img   2 スパースイメージをSDまたはeMMCに書き込む スパースイメージをAndroidのブートストレージにプログラムする方法は2つあります ホストLinux PCでスパースイメージをrawイメージに変換します。そして、ddコマンドを使用して、raw画像をブートストレージにプログラムしてください。 i.MX Android リリースパッケージのMFG ールを使用してスパースイメージをプログラムします。                手順 system_sparse.img を files/android/sabresd/ にコピーします。 simg2imgバイナリ(simg2img.zip 内)をファイル/android/へコピーします。 mfgtools-without-rootfs.tar\mfgtools\Profiles\Linux\OS Firmware\ucl2.xmlも更新する必要があります。        diff --git a/Profiles/Linux/OS Firmware/ucl2.xml b/Profiles/Linux/OS Firmware/ucl2.xml      index 3b15ddd..3c3d2ae 100755      --- a/Profiles/Linux/OS Firmware/ucl2.xml      +++ b/Profiles/Linux/OS Firmware/ucl2.xml        @@ -621,8 +621,12 @@              キャッシュパーティションをフォーマット中                 デバイスパーティションをフォーマット中      -       system.imgを送信して書き込み中     -      +       simg2img を送信      +       cp simg2img      +       chmod 777      +       tmpfsのサイズを変更      +       システムを送信     +       system_sparse.img の送信と書き込み system_sparse.img                                        ユーザーデータの送信。   3 ubootでスパースイメージをサポート(v2014.04)      スパースイメージに関連するパッチを選定します。write_sparse_imageを使用してスパースシステムイメージを書き込みます。 詳細については、添付ファイル(sparseimage.zipをサポートするuboot(v2014.04))をご覧ください。        これらのパッチを適用する手順は以下の通りです。 cd myandroid/bootable/bootloader/uboot-imx/ sparseimage.zipをmyandroid/bootable/bootloader/uboot-imx/にサポートするuboot(v2014.04)をコピー        sparseimage.zipをサポートするuboot(v2014.04)を解凍します git am 0001-add-header-for-Android-sparse-image-format.patch git am 0002-add-code-to-handle-Android-sparse-image-format.patch git am 0003-update-code-which-handles-Android-sparse-image-forma.patch git am 0004-cleanup-code-which-handles-the-Android-sparse-image-.patch git am 0005-implement-the-Android-sparse-image-format.patch git am 0006-aboot-fix-block-addressing-for-don-t-care-chunk-type.patch git am 0007-MA-6732-Add-sparse-image-flash-support-for-uboot-s-f.patch            ページは更新され続けます。   Reference:      Lollipopでuserdata.imgとcache.imgを有効にする方法 Re: Androidでスパースイメージを有効にする方法 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> こんにちは、サンシャンさん  --help を使用すると、次の出力が表示されます。 ...:~/Android_Source$ simg2img --help     Usage: simg2img しかし、依然として/bin/bash: line 1: simg2img: コマンドが見つかりません。 エラーが発生しました。 よろしくお願いします。 Kishore P Re: Androidでスパースイメージを有効にする方法 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> こんにちは、サンシャンさん 「simg2img」を「simg2img -h」に置き換えましたが、結果は同じです。 out/target/product/evk_6sl/system_sparse.img+out/target/product/evk_6sl/obj/PACKAGING/recovery_patch_intermediates/recovery_from_boot.p maxsize=481738752 blocksize=4224 total=403801046 reserve=4866048 if [ true = true ]; then \         simg2img -h out/target/product/evk_6sl/system_sparse.img out/target/product/evk_6sl/system.img; \         fi /bin/bash: 行1:simg2img:コマンドが見つかりません make: *** [out/target/product/evk_6sl/system_sparse.img] エラー127 make: *** ファイル `out/target/product/evk_6sl/system_sparse.img' を削除しています よろしくお願いします。 Kishore P Re: Androidでスパースイメージを有効にする方法 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> これが存在し、そのパスがエクスポートされている場合は、「simg2img -h」をお試しください。ログを確認してください。 Re: Androidでスパースイメージを有効にする方法 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Sanshan Zhang様  返信ありがとうございます。simg2imgは/out/host/linux-x86/binパスに存在し、PATHにもエクスポートされています。 カーネルでさらにフリースケールが提供するデフォルトオプション以外に有効にする必要があるものはありますか。 >$PATH bash: /usr/lib/jvm/java-7-openjdk-amd64/bin:/home/test/Android_Source/out/host/linux-x86/bin:/home/test/Android_Source/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.8/bin:/home/test/Android_Source/prebuilts/gcc/linux-x86/:/home/test/Android_Source/prebuilts/gcc/linux-x86/arm/arm-eabi-4.8/bin:/home/test/Android_Source/development/scripts:/home/test/Android_Source/prebuilts/devtools/tools:/home/test/Android_Source/prebuilts/android-emulator/linux-x86_64:/home/test/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games: 該当するファイルやディレクトリは存在しません よろしくお願いします。 Kishore P Re: Androidでスパースイメージを有効にする方法 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> こんにちは、キショアさん /out/host/linux-x86/bin/simg2img が存在するかどうか確認しましたか? 存在する場合は、/out/host/linux-x86/bin/ が PATHにエクスポートされているかどうかを確認できます。 Re: Androidでスパースイメージを有効にする方法 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Sanshan Zhang様 imx6slevkボード用にAndroid(Lollipop 5.0.0.1)をビルドする際、system_sparse.imgからsystem.imgを生成できません。 次のエラーが発生します。 システムfsイメージをインストールします:out/target/product/evk_6sl/system_sparse.img out/target/product/evk_6sl/system_sparse.img+out/target/product/evk_6sl/obj/PACKAGING/recovery_patch_intermediates/recovery_from_boot.p maxsize=481738752 blocksize=4224 total=403801046 reserve=4866048 if [ true = true ]; then \         simg2img out/target/product/evk_6sl/system_sparse.img out/target/product/evk_6sl/system.img; \         fi /bin/bash: 行1:simg2img:コマンドが見つかりません make: *** [out/target/product/evk_6sl/system_sparse.img] エラー127 make: *** ファイル `out/target/product/evk_6sl/system_sparse.img' を削除しています アンドロイドでスパースイメージをサポートするパッチはありますか? この問題を解決するのを手伝っていただけませんか。 よろしくお願いします。 Kishore P
View full article