ADSP-BF561のメモリー間DMAです。BF533のMDMAを書き換えただけですので説明は省きます。
#include <cdefBF53x.h>
#include <sys/exception.h>
char srcBuf[20] = "Chiba City Blues";
char dstBuf[20];
// DMA descriptor
struct {
void * ndp; // next descriptor
void * sa; // start address
unsigned short config;
unsigned short xcnt;
short xmod;
}src, dst;
EX_INTERRUPT_HANDLER(intHandler);
main(void)
{
*pSICA_IMASK0 = 0xffffffff;
*pSICA_IMASK1 = 0xffffffff;
register_handler( ik_ivg8, intHandler );
// デスクリプタ・アドレス指定
*pMDMA1_D0_NEXT_DESC_PTR = &dst;
*pMDMA1_S0_NEXT_DESC_PTR = &src;
// デスティネーション
// 転送後、DMAを終了
dst.ndp = 0;
dst.sa = dstBuf;
dst.xcnt = 20;
dst.xmod = 1;
dst.config = DI_EN | DMAEN | WNR | WDSIZE_8;
// ソース
// 転送後DMAを終了
src.ndp = 0;
src.sa = srcBuf;
src.xcnt = 20;
src.xmod = 1;
src.config = DMAEN | WDSIZE_8;
// キックスタート
// ラージ・デスクリプタ・リンク&デスクリプタサイズ=7
*pMDMA1_S0_CONFIG = DMAEN | WDSIZE_8 | 0x7700;
*pMDMA1_D0_CONFIG = DMAEN | WNR | WDSIZE_8 | 0x7700;
while(1)
;
}
// 割り込みハンドラ
EX_INTERRUPT_HANDLER(intHandler)
{
*pMDMA1_D0_IRQ_STATUS = DMA_DONE; // 割り込みクリア
}