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

📄 blinkdevhost.asm

📁 基于ADSP 的PCI 代码
💻 ASM
字号:

#include "defBF535.h"
#include "pci_ids.h"
#include "My_Header.h"

.GLOBAL DMA_TO_TARGET;


.SECTION program2;
.align 4;
DMA_TO_TARGET:

[--SP] = RETS; // push return address

/********* write to MBAP with the address of the host's intended destination  ****************/
P4.H = HI(PCI_MBAP); P4.L = LO(PCI_MBAP);
R0.H = HI(L2_BASE);  R0.L = LO(L2_BASE);  
[P4] = R0; // Load PCI_MBAP with the base address of the targeted device
ssync;


R0.L = START;
R1.L = END;
R0 = R1 - R0;

//r0 = 0x1000;  1k words (each word = 4 bytes)
P0.L = READ;
P0.H = READ;
P1.L = WRITE;
P1.H = WRITE;
P2.L = LO(MDR_DND);
P2.H = HI(MDR_DND);	//sDMA Memory DMA Next Descriptor Pointer Register
P3.L = LO(DB_NDBP);
P3.H = HI(DB_NDBP);	//DMA Next Descriptor Base Pointer Register
P4.L = LO(MDW_DND);			
P4.H = HI(MDW_DND);	//pDMA Memory DMA Next Descriptor Pointer Register
P5.L = LO(MDR_DCFG);
P5.H = HI(MDR_DCFG);	//sDMA Memory Config Register
I0.L = LO(MDW_DCFG);
I0.H = HI(MDW_DCFG);	//pDMA Memory Config Register
I1.L = LO(MDR_DSAH);
I1.H = HI(MDR_DSAH);	//sDMA Memory Start Address High Register
I2.L = LO(MDR_DSAL);
I2.H = HI(MDR_DSAL);	//sDMA Memory Start Address Low Register

/***********************DMA to L1 Code***********************************************************/
//R0.H = 0x9009;						//sDMA Config Word (8-bit transfers)
//R0.H = 0x8001;						//sDMA Config Word (16-bit transfers)
R0.H = 0x8009;						//sDMA Config Word (32-bit transfers)
 R1.L = START;						//sDMA Start Address Low
 R1.H = START;						//sDMA Start Address High
// r1.l = buff; r1.h = buff;

R2.L = END_DMA;						//sDMA Next Descriptor Pointer

//R2.H = 0x900B;						//pDMA Config Word (8-bit transfers)
//R2.H = 0x8003;						//pDMA Config Word (16-bit transfers)
R2.H = 0x800B;						//pDMA Config Word (32-bit transfers)
R3.L = LO(Memory_Window);			//pDMA Start Address Low = PCI MEM WINDOW
R3.H = HI(Memory_Window);				//pDMA Start Address High = PCI MEM WINDOW
R4.L = END_DMA;




CALL Setup_TCB;
CALL Enable_DMA;
/************************************************************************************************/


DMA_TO_TARGET.END: RETS = [SP++]; // Pop return address
RTS;  

IDLE;
SSYNC;

/********TCB Setup**********/
Setup_TCB:

W[P0+0x2] = R0;						//sDMA Count
[P0+0x4] = R1;						//sDMA Start Address
W[P0+0x8] = R2; 					//sDMA Next Descriptor Pointer

W[P1+0x2] = R0;						//pDMA Count
[P1+0x4] = R3;						//pDMA Start Address
W[P1+0x8] = R4;						//pDMA Next Descriptor Pointer

W[P0] = R0.H;						//sDMA Config Word
W[P1] = R2.H;						//pDMA Config Word
RTS;
/***************************/

/********Enable DMA*********/
Enable_DMA:
R6 = P0;
W[P2] = R6.L;						//sDMA Memory DMA Next Descriptor Pointer Register = FLASH_READ
W[P3] = R6.H;						//DMA Next Descriptor Base Pointer Register

R6 = P1;
W[P4] = R6.L;						//pDMA Memory DMA Next Descriptor Pointer Register = FLASH_WRITE

R6 = W[P5];
BITSET(R6,0);						//Enable DMA for sDMA

R7.L = W[I0];
BITSET(R7,0);						//Enable DMA for pDMA

W[P5] = R6;
.ALIGN 4;
W[I0] = R7.L;
.ALIGN 4;
DMA_WAIT:							//Wait for DMA to Complete
R6 = W[P1];
cc = bittst(R6,15);
IF cc JUMP DMA_WAIT;

RTS;
/***************************/

/*******************************Application Code to be DMAed**********************/
START:
 	
	
	P0.L = LO(FIO_DIR);
	P0.H = HI(FIO_DIR);

	R0 = W[P0];
	R1.L = 0xF800;
	R0 = R0 | R1;
	W[P0] = R0;					//Set PF 15 - PF 11 as Outputs

	P1.L = LO(FIO_FLAG_S);
	P1.H = HI(FIO_FLAG_S);
	P2.L = LO(FIO_FLAG_C);
	P2.H = HI(FIO_FLAG_C);

	P5.H = 0x0353;
	P5.L=0x4600;			//Count to Generate Interrupt Every 2sec for 300MHz
	
	R1.L = 0xA800;			//Affect PF15, PF13, and PF11
	R2.L = 0x5000;			//Affect PF14 and PF 12

	LIGHT:
	W[P1] = R1;			//Set PF15, PF13, and PF11
	CSYNC;
	W[P2] = R2;			//Clear PF14 and PF12
	CSYNC;

	CALL DELAY_LOOP;
 
	W[P1] = R2;			//Set PF14 and PF12
	CSYNC;
	W[P2] = R1;			//Clear PF15, PF13, and PF11
	CSYNC;

	CALL DELAY_LOOP;

	JUMP LIGHT;

	DELAY_LOOP:        
	LSETUP(L_BEGIN, L_END) LC0 = P5;
	L_BEGIN:
	L_END: NOP;    
	RTS;         
END:	NOP; 
/************************************************************************************/

.align 4;
.BYTE2 READ[5];
.align 4;
.BYTE2 WRITE[5];
.align 4;
.BYTE2 END_DMA[1] = 0x0;

⌨️ 快捷键说明

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