
#include <twl/camera.h>void CAMERA_DmaRecvAsync(u32 dmaNo, void *dest, u32 unit, u32 length, MINDmaCallback callback, void* arg);
| dmaNo | 使用する新規DMAチャンネル(0〜3) |
| dest | 転送先アドレス |
| unit | 1回の転送サイズ(横サイズ×ライン数) |
| length | 転送する合計サイズ(フレームサイズ) |
| callback | 新規DMA終了時のコールバック |
| arg | 新規DMA終了時のコールバック引数 |
なし
非同期にカメラバッファからフレームデータを受信します。
本関数は内部で新規DMAを用いてデータを受信しています。
新規DMAについての詳しい説明は、MI_NDmaCopy() 等を参照してください。
1回の転送サイズを求める際に使用する横サイズ、ライン数は、それぞれ1ラインの転送バイト数と1回の転送ライン数を意味しています。
転送バイト数は、1ピクセル2バイトになるので、横サイズ×2として計算してください。
横サイズは、CAMERA_SetTrimmingParams() 等を呼び出した場合は、そこで設定した幅となり、呼び出していなければ、CAMERA_I2CSize*() で設定した幅となります。
(どちらの関数も呼び出していない場合は、カメラ解像度の初期値の幅となります。初期値については概要を参照してください。)
ライン数は CAMERA_SetTransferLines() で設定したライン数で計算してください。CAMERA_SetTransferLines() で値を設定しなかった場合の初期ライン数は 1 です。
また、最終的に指定する1回の転送サイズは 2KB (1024ピクセル) 以内になるように調整してください。
以下に具体的なコードを示します。
(例)
#define WIDTH 256
#define HEIGHT 192
void CameraDmaRcvIntr(void* arg)
{
CAMERA_DmaRecvAsync(0, buffer, CAMERA_GetBytesAtOnce(WIDTH), CAMERA_GET_FRAME_BYTES(WIDTH, HEIGHT), CameraDmaRecvIntr, NULL);
}
CAMERA_SetTrimmingParamsCenter(WIDTH, HEIGHT, 320, 240);
CAMERA_SetTrimming(TRUE);
CAMERA_SetTransferLines(CAMERA_GET_MAX_LINES(WIDTH)); /* 256*4=1024ピクセル */
.
.
.
CAMERA_DmaRecvAsync(0, buffer, CAMERA_GetBytesAtOnce(WIDTH), CAMERA_GET_FRAME_BYTES(WIDTH, HEIGHT), CameraDmaRecvIntr, NULL);
注意
本関数は通常、カメラのVSYNC割り込みコールバックから呼ばれることになりますが、カメラ設定(サイズとフレーム)やアプリケーションの状況によりカメラのVSYNC割り込みと本関数内で呼び出した新規DMAの割り込みがほぼ同時に発生する場合があります。
そのような場合、本来「カメラ割り込み→新規DMA割り込み→カメラ割り込み」という流れになるところが、「カメラ割り込み→カメラ割り込み→新規DMA割り込み」というように、連続してカメラ割り込みが発生してしまいます。
新規DMA割り込みコールバックに依存するようなアプリケーションは作成しないように注意してください。
CAMERA_DmaRecv、CAMERA_SetTransferLines、CAMERA_SetTrimmingParams、CAMERA_SetTrimming、CAMERA_I2CSize*、CAMERA_GetBytesAtOnce、CAMERA_GET_FRAME_BYTES、CAMERA_GET_MAX_LINES
2008/09/11 サンプルコードの変更
2008/03/26 カメラ割り込みと新規DMA割り込みがバッティングした場合についての説明追加
2007/11/14 横サイズの指定について説明修正
2007/10/22 説明追加
2007/10/02 初版