2348726_ja-JP

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

2348726_ja-JP

2348726_ja-JP

i.MX8MM ECSPIドライバ (fsl_ecspi.c)FIFOカウントの不整合により割り込みが停止しない

こんにちは、

i.MX8MM上のECSPIドライバ(fsl_ecspi.c)に潜在的な問題を発見しました。具体的には、ECSPI_SendTransfer()関数に問題があります。

以下のコードは、利用可能なFIFO容量を計算します。

データカウント =
((uint32_t)FSL_FEATURE_ECSPI_TX_FIFO_SIZEn(base) - (uint32_t)ECSPI_GetTxFifoCount(base)) < txRemainingBytes ?
((uint32_t)FSL_FEATURE_ECSPI_TX_FIFO_SIZEn(base) - (uint32_t)ECSPI_GetTxFifoCount(base)) :
txRemainingBytes;

ただし、ECSPI_GetTxFifoCount(base)はハードウェアレジスタを読み取り、FIFOレベルは動的に更新されます。
この関数は同じ式の中で複数回呼び出されるため、評価ごとに返される値が異なる場合があります。

その結果、計算された利用可能なFIFOスペースが矛盾する可能性があり、
また、特定のタイミング条件下では、データカウントが予想値を超える場合があります。

これにより、転送動作が正しく行われなくなる可能性があり、私の場合は、ECSPI割り込みが停止しません(割り込みが繰り返し発生します)。

根本原因は、FIFOカウントレジスタが複数回読み取られていることだと考えます。
また、ドライバは、式の中で値が一貫していると想定します。

提案された解決策:
- FIFOカウントレジスタを一度だけ読み取る
- ローカル変数に格納する
キャッシュされた値を後続の計算に使用する

修正例:

uint32_t fifoAvailableCount = ((uint32_t)FSL_FEATURE_ECSPI_TX_FIFO_SIZEn(base) - (uint32_t)ECSPI_GetTxFifoCount(base));
dataCounts = (fifoAvailableCount < txRemainingBytes) ?fifoAvailableCount : txRemainingBytes;

これは既知の問題なのか、それとも意図しない動作なのか確認していただけますか?

i.MX 8M | i.MX 8M Mini | i.MX 8M NanoRe: i.MX8MM ECSPI driver (fsl_ecspi.c) interrupt does not stop due to FIFO count inconsistency

こんにちは、 @pengyong_zhang

ご回答ありがとうございます。

私はLinuxを使用していません。
私はi.MX8MMのA53コア上でベアメタル/RTOS環境を実行しています。

私が使用しているECSPIドライバは、MCUXpresso SDKドライバをベースにしています。
例えば、以下のような実装例があります。

https://github.com/nxp-mcuxpresso/mcuxsdk-core/blob/main/drivers/ecspi/fsl_ecspi.c#L180

この実装では、割り込みハンドラ内でFIFOの状態が複数回読み取られます。
FIFOカウントは読み取りごとに変化する可能性があるため、まれにdataCountsがtxRemainingBytesを超えることがあると考えられます。

この動作は想定内のものなのか、それともECSPIドライバの既知の問題なのか、確認していただけますか?

よろしくお願いいたします。

Re: i.MX8MM ECSPI driver (fsl_ecspi.c) interrupt does not stop due to FIFO count inconsistency

こんにちは、 @N_Eco_Logic さん。

imx8mm ECSPIドライバのコードファイルは以下のとおりです。

https://github.com/nxp-imx/linux-imx/blob/de3ebf27b0f69724f13bdd9bb8809aabd47c78b9/drivers/spi/spi-i...

使用しているカーネルのバージョンは何ですか?

BR

Re: i.MX8MM ECSPI driver (fsl_ecspi.c) interrupt does not stop due to FIFO count inconsistency

私もこの問題に遭遇しており、修正するためのプルリクエストを提出しました: https://github.com/nxp-mcuxpresso/mcuxsdk-core/pull/33

別件で、この修正があっても、IRQでRXFIFOがドレインされている間にコードが送信されると、RXFIFOのオーバーフローが発生するCASEがあることも指摘してください。例えば、ECSPI_GetRxFifoCount呼び出し時にRXFIFOに60バイト、TXFIFOに4バイトがあり、ECSPI_GetTxFifoCount呼び出し時に4バイトが送信された時点でTXFIFOは満タンになります(i.MX8MPのCASEは最大64バイト)。ISRが十分に速く再処理されない場合、読み取られる前に64+4個のアイテムが送信されるため、オーバーフローが発生します。パッチでhandle->rxRemainingBytes - handle->txRemainingBytesfifoCountsバイトの代わりに使うことでCAN修正できますが、これはISRがRXFIFOを十分に速く消耗できない場合に限り必要です(私のCASEではそうでしたが、すべての場所でCASEとは限らず、トランザクションの遅延や割り込みの増加につながる可能性があるSO、PRにはこの変更を含めないことにしました)。

Tags (1)
No ratings
Version history
Last update:
a week ago
Updated by: