⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dma.asm

📁 基于ADI blackfin 的DMA 描述符方式的程序。便于你理解这种独特的dma搬送方式
💻 ASM
字号:
.section program;



#define MDMAS0_CONFIG		0xffc00f48

#define MDMAD0_CONFIG		0xffc00f08

#define MDMAS0_IRQ_STATUS	0xffc00f68

#define MDMAD0_IRQ_STATUS	0xffc00f28

#define MDMAS0_START_ADDR	0xffc00f44

#define MDMAD0_START_ADDR	0xffc00f04

#define MDMAS0_CURR_ADDR	0xffc00f64

#define MDMAS0_X_MODIFY		0xffc00f54

#define MDMAD0_X_MODIFY		0xffc00f14

#define MDMAS0_X_COUNT		0xffc00f50

#define MDMAD0_X_COUNT		0xffc00f10

#define MDMAS0_Y_COUNT		0xffc00f58

#define MDMAD0_Y_COUNT		0xffc00f18

#define MDMAS0_Y_MODIFY		0xffc00f5c

#define MDMAD0_Y_MODIFY		0xffc00f1c


#define SIC_IMASK		0xffc0010c

#define SIC_ISR			0xffc00120

#define IVG13			0xffe02034

#define CORE_IMASK		0xffe02104



.extern _counter;



dma_isr:
	
	[--sp] = r0;
	
	[--sp] = p0;
	
	[--sp] = r1;

	// Just for test, count the times of interrupt
	p0.l = lo(_counter);
	p0.h = hi(_counter);
	
	r0 = [p0];
	
	r0 += 1;
	
	[p0] = r0;

	
	p0.h = hi(MDMAS0_IRQ_STATUS);
	
	p0.l = lo(MDMAS0_IRQ_STATUS);
	
	r0 = w[p0](z);		// Get DMA_DONE flag
	
	r1 = 1;
	
	r1 = r1 & r0;
	
	cc = r1 == 1;
	
	if !cc jump JUDGE_DEST(bp);
	
	
	/* If DMA_DONE is set */
	
	w[p0] = r1;		// Clear DMA_DONE
	
	
	r0 >>= 3;		// Get DMA_RUN flag
	
	cc = r0;
	
	if cc jump JUDGE_DEST;
	
	/* if DMA_RUN is cleared */
	
	p0.h = hi(MDMAS0_CONFIG);
	
	p0.l = lo(MDMAS0_CONFIG);
	
	r0 = 0;
	
	w[p0] = r0;		// Disable MDMAS0


JUDGE_DEST:
	
	p0.h = hi(MDMAD0_IRQ_STATUS);
	
	p0.l = lo(MDMAD0_IRQ_STATUS);
	
	r0 = w[p0](z);		// Get DMA_DONE flag
	
	r1 = 1;
	
	r1 = r1 & r0;
	
	cc = r1 == 1;
	
	if !cc jump FINISH;
	
	/* If DMA_DONE is set */
	
	w[p0] = r1;			// Clear DMA_DONE

	
	r0 >>= 3;			// Get DMA_RUN flag
	
	cc = r0;
	
	if cc jump FINISH(bp);
	
	
	/* If DMA_RUN is cleared */
	
	p0.h = hi(MDMAD0_CONFIG);
	
	p0.l = lo(MDMAD0_CONFIG);
	
	r0 = 0;
	
	w[p0] = r0;			// Disable MDMAD0
	
	.extern _EnterResult;
	
	p0.h = hi(_EnterResult);
	
	p0.l = lo(_EnterResult);
	
	reti = p0;


FINISH:
	
	r1 = [sp++];
	
	p0 = [sp++];
	
	r0 = [sp++];

	rti;

dma_isr.end:



_config:

	.global _config;
	
	p0.h = hi(SIC_IMASK);
	
	p0.l = lo(SIC_IMASK);
	
	r0.h = 0x6000;
	
	r0.l = 0;
	
	r1 = [p0];
	
	r0 = r0 | r1;
	
	[p0] = r0;			// Enable MDMA interrupt
	
	p0.h = hi(IVG13);
	
	p0.l = lo(IVG13);
	
	r0.h = hi(dma_isr);
	
	r0.l = lo(dma_isr);
	
	[p0] = r0;			// Set DMA interrupt vector
	
	p0.h = hi(CORE_IMASK);
	
	p0.l = lo(CORE_IMASK);
	
	r0 = [p0];
	
	bitset(r0, 13);		// Enable EVT13
	
	[p0] = r0;
		
	rts;
	
_config.end:



/*

_dma_config:

	.global _dma_config;
	
	
	p0.h = hi(MDMAS0_START_ADDR);
	
	p0.l = lo(MDMAS0_START_ADDR);
	
	[p0] = r0;
	
	p0.h = hi(MDMAD0_START_ADDR);
	
	p0.l = lo(MDMAD0_START_ADDR);
	
	[p0] = r1;
	
	
	p0.h = hi(MDMAS0_X_COUNT);
	
	p0.l = lo(MDMAS0_X_COUNT);
	
	r2 = 10;
	
	w[p0] = r2;
	
	p0.h = hi(MDMAD0_X_COUNT);
	
	p0.l = lo(MDMAD0_X_COUNT);
	
	w[p0] = r2;
	
	
	p0.h = hi(MDMAS0_X_MODIFY);
	
	p0.l = lo(MDMAS0_X_MODIFY);
	
	r0 = 0x4;
	
	w[p0] = r0;
	
	p0.h = hi(MDMAD0_X_MODIFY);
	
	p0.l = lo(MDMAD0_X_MODIFY);
	
	w[p0] = r0;
	
	
	p0.h = hi(MDMAS0_Y_MODIFY);
	
	p0.l = lo(MDMAS0_Y_MODIFY);
	
	w[p0] = r0;
	
	p0.h = hi(MDMAD0_Y_MODIFY);
	
	p0.l = lo(MDMAD0_Y_MODIFY);
	
	w[p0] = r0;
	
	
	p0.h = hi(MDMAS0_Y_COUNT);
	
	p0.l = lo(MDMAS0_Y_COUNT);
	
	r0 = 3;
	
	w[p0] = r0;
	
	p0.h = hi(MDMAD0_Y_COUNT);
	
	p0.l = lo(MDMAD0_Y_COUNT);
	
	w[p0] = r0;
	
	
	p0.h = hi(MDMAS0_CONFIG);
	
	p0.l = lo(MDMAS0_CONFIG);
	
	r0 = 0x00b9;
	
	w[p0] = r0;
	
	r0 = 0x00bb;
	
	p0.h = hi(MDMAD0_CONFIG);
	
	p0.l = lo(MDMAD0_CONFIG);
	
	w[p0] = r0;
	
	rts;
	
_dma_config.end:

*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -