RX FIT PDC 使用時、PIXCLKの入力状態に注意が必要?

こんにちは。umetsuと申します。

RX72NのPDC(パラレルデータキャプチャ)を使用するために、動作を調べていて気がついたので、投稿しておきます。

  • 使用MCU RX72N 176pin R5F572NNDxFC
  • 開発環境 e2studio + GCC for Renesas RX 8.3.0.202204
  • Renesas FIT PDC module Ver.2.0.5
    (2.0.6が最新のようですが、ソースコードを見る限り同じ問題があります)

現象

PIXCLKが入力されていない状態で、R_PDC_Open()を呼ぶと失敗します。更にこの状態で、PIXCLKが入力されている状態でR_PDC_Open()を呼び出しても失敗します。2回目以降の失敗要因はPIXCLKとは別の要因のため、使用時に注意が必要になります。

発生するしくみ

  1. R_PDC_Open()を呼び出します。
  2. R_PDC_Open()から、R_BSP_HardwareLock((mcu_lock_t) (BSP_LOCK_PDC)) が呼ばれ、PDCがロック状態になります。
  3. R_PDC_Open()から、pdc_initialize(p_data_cfg()が呼び出され、さらにpdc_reset()が呼ばれます。
  4. pdc_reset()は PDC.PCCR0.BIT.PRST に1を書いて、0になるのを待つのですが、これはPIXCLKに同期してリセット処理が行われるため、PIXCLKが入力されていないとリセットが行われず0になりません。結果としてpdc_reset()はタイムアウトエラーを返し、R_PDC_Open()が失敗します。このとき、ロックされたPDCは解放されずに抜けてきます。
  5. PIXCLKが入力可能な状態に設定してから R_PDC_Open()を呼び出すと、R_BSP_HardwareLock((mcu_lock_t) (BSP_LOCK_PDC)) が失敗し、R_PDC_Open() がエラーで終わります。

わかりにくいので要約すると R_PDC_Open処理が
パラメータチェック
   ↓
ハードウェアロック試行 (2回目以降はここで失敗。PIXCLK入力状態に関係ない)
   ↓
初期化処理 (初回呼び出しはここで失敗。PIXCLK入力状態に依る)
   ↓
終了
ということです。

問題になるケース

  • R_PDC_Open()より後に、外部に接続されたカメラ(等)からのクロック入力が開始される構成の場合。
  • R_PDC_Open()しておいて、必要時だけカメラ(等)からの映像が入力したいと考えた場合。

対処方法

外部のカメラ(等)から信号を出すようなってから、R_PDC_Open()を呼び出します。
または、下記のようにしても、ロックによる失敗の問題は回避できるようです。

static int open_succeed = 0;
    :
if (open_succeed == 0)
{
    if (R_PDC_Open(&s_pdc_config) != PDC_SUCCESS)
    {
        R_BSP_HardwareUnlock((mcu_lock_t) (BSP_LOCK_PDC));
    }
    else
    {
        open_succeed = 1;
    }
}

ただ、FITモジュール内で持っているis_opendの変数と、上記のopen_succeedが同じような意味合いになるところと、FIT内でやっているR_BSP_HardwareLock()の後始末的なUnlock呼び出しをAPI呼び出し側でやるところが、美しくないなあと思います。

その他

R_PDC_Open()が失敗したなら、R_PDC_Close()を呼べばR_BSP_HardwareUnlock()が呼ばれそうに思いましたが、FITドライバ内のis_opendがtruenになっていないため、アンロック処理は呼ばれません。
ハードウェアロックし、失敗するとアンロックしないで抜ける構造は、他のFITドライバにもありますが、外部要因で失敗しないので、問題にならないようです。

個人的にはFITドライバの方が、生成コードに手を入れなくて済むので好きなのですが、CGドライバが出てくるのを待った方がいいのかもしれません。RXクラスのマイコンで画像データを扱うのは(メモリ的に)結構厳しいので、PDCのCGドライバが出てくるのを待つのは厳しいかもしれないですが。