CAMERA_DmaPipeInfinity

構文

#include <twl/camera.h>

void CAMERA_DmaPipeInfinity(u32 dmaNo, void *dest, u32 unit, MINDmaCallback callback, void* arg);

引数

dmaNo 使用する新規DMAチャンネル(0〜3)
dest 転送先アドレス
unit 1回の転送サイズ(横サイズ×ライン数)
callback 新規DMA終了時のコールバック
arg 新規DMA終了時のコールバック引数

返り値

なし

説明

非同期にカメラバッファからフレームデータを連続して受信します。
本関数を一度呼び出すと、MI_StopNDma(dmaNo) を呼び出すまで、データを受信し続けます。

本関数は内部で新規DMAを用いてデータを受信しています。
新規DMAについての詳しい説明は、MI_NDmaCopy() 等を参照してください。

1回の転送サイズを求める際に使用する横サイズ、ライン数は、それぞれ1ラインの転送バイト数と1回の転送ライン数を意味しています。
転送バイト数は、1ピクセル2バイトになるので、横サイズ×2として計算してください。
横サイズは、CAMERA_SetTrimmingParams() 等を呼び出した場合は、そこで設定した幅となり、呼び出していなければ、CAMERA_I2CSize*() で設定した幅となります。
(どちらの関数も呼び出していない場合は、カメラ解像度の初期値の幅となります。初期値については概要を参照してください。)
ライン数は CAMERA_SetTransferLines() で設定したライン数で計算してください。CAMERA_SetTransferLines() で値を設定しなかった場合の初期ライン数は 1 です。

また、最終的に指定する1回の転送サイズは 2KB (1024ピクセル) 以内になるように調整してください。

(注意)
本関数は CAMERA_DmaRecv() 等と違い、転送先のアドレス dest は固定となり、一回の転送サイズ unit 分のデータがdest に転送され続ける動作になっています。
そのため、フレーム全体のデータを得るためには、本関数で指定するコールバック関数内で別のフレームバッファに dest に転送された unit 分のデータをコピーする必要があります。

以下に具体的なコードを示します。

(例)

#define WIDTH 256
#define HEIGHT 192

CAMERA_SetTrimmingParamsCenter(WIDTH, HEIGHT, 320, 240);
CAMERA_SetTrimming(TRUE);
CAMERA_SetTransferLines(CAMERA_GET_MAX_LINES(WIDTH)); /* 256*4=1024ピクセル */

.
.
.

CAMERA_DmaPipeInfinity(0, buffer, CAMERA_GetBytesAtOnce(WIDTH), NULL, NULL);

参照

CAMERA_SetTransferLinesMI_StopNDmaCAMERA_SetTrimmingParamsCAMERA_SetTrimmingCAMERA_I2CSize*CAMERA_GetBytesAtOnceCAMERA_GET_MAX_LINES

履歴

2008/09/11 サンプルコードの変更
2007/11/14 横サイズの指定、CAMERA_DmaRecv()との違いについて説明修正
2007/10/22 説明追加
2007/10/02 初版