📄 nb_perph_ping.c
字号:
/********************************************************************************/
/* nb_perph_ping.c */
/* written by David Bell */
/* on 01/09/01 */
/* */
/* nb_perph_ping uses two EDMA channels to service McBSP0. Channel 12 is used */
/* to transmit frames of data from L2 to the DXR. Channel 13 is used to trans- */
/* mit frames of data from the DRR to L2. After each frame is transferred, the */
/* input/output buffers toggle between ping and pong. This allows the CPU to */
/* access one buffer while the EDMA accesses the other. After the frames are */
/* transmitted 10 times the channels are disabled and the data is verified. */
/********************************************************************************/
#include <csl.h>
#include <csl_edma.h>
#include <csl_mcbsp.h>
/* definitions */
#define PING_SRC 0x80000000 /* Ping source address for transfer */
#define PONG_SRC 0x80001000 /* Pong source address for transfer */
#define PING_DST 0x0000D000 /* Ping dest address for transfer */
#define PONG_DST 0x0000E000 /* Pong dest address for transfer */
#define EL_COUNT 0x0100 /* Element count for transfer */
#define ITERATE 10 /* Number of frames to iterate */
/* prototypes */
void cfg_data(void);
Int32 cfg_edma(EDMA_Handle *hEdma_ch12, EDMA_Handle *hEdma_ch13);
void wait(void);
Int32 check_data(void);
extern void cfg_mcbsp(MCBSP_Handle *hMcbsp_ch0);
extern void start_mcbsp(MCBSP_Handle *hMcbsp_ch0);
/************************************cfg_data************************************/
/* Store a data ramp in the source memory space. This data will be transferred */
/* by the EDMA. */
/********************************************************************************/
void
cfg_data()
{
unsigned short *pingval;
unsigned short *pongval;
unsigned short i = 0;
pingval = (unsigned short *)PING_SRC;
pongval = (unsigned short *)(PONG_SRC + (EL_COUNT<<1));
/* Set up transfer data */
for (i = 0; i < (EL_COUNT<<1); i++){
*pingval++ = i;
*--pongval = i;
} /* end for */
} /* end cfg_data */
/*************************************cfg_edma***********************************/
/* Program EDMA channels 12 and 13 to service McBSP0. Four sets must be used */
/* from the PaRAM reload space to allow ping pong operation. */
/********************************************************************************/
Int32
cfg_edma(EDMA_Handle *hEdma_ch12, EDMA_Handle *hEdma_ch13)
{
Uint32 link_ping_xmt;
Uint32 link_ping_rcv;
Uint32 link_pong_xmt;
Uint32 link_pong_rcv;
EDMA_Config config;
EDMA_Handle hEdma_ping_xmt;
EDMA_Handle hEdma_ping_rcv;
EDMA_Handle hEdma_pong_xmt;
EDMA_Handle hEdma_pong_rcv;
if (!EDMA_allocTableEx(1, &hEdma_pong_xmt)) return(-1);
link_pong_xmt = EDMA_getTableAddress(hEdma_pong_xmt);
if (!EDMA_allocTableEx(1, &hEdma_ping_xmt)) return(-1);
link_ping_xmt = EDMA_getTableAddress(hEdma_ping_xmt);
if (!EDMA_allocTableEx(1, &hEdma_pong_rcv)) return(-1);
link_pong_rcv = EDMA_getTableAddress(hEdma_pong_rcv);
if (!EDMA_allocTableEx(1, &hEdma_ping_rcv)) return(-1);
link_ping_rcv = EDMA_getTableAddress(hEdma_ping_rcv);
*hEdma_ch12 = EDMA_open(12, EDMA_OPEN_RESET);
*hEdma_ch13 = EDMA_open(13, EDMA_OPEN_RESET);
/* Configure the transmit channel (13) */
config.opt = (Uint32)
((EDMA_OPT_PRI_HIGH << _EDMA_OPT_PRI_SHIFT )
| (EDMA_OPT_ESIZE_32BIT << _EDMA_OPT_ESIZE_SHIFT )
| (EDMA_OPT_2DS_NO << _EDMA_OPT_2DS_SHIFT )
| (EDMA_OPT_SUM_INC << _EDMA_OPT_SUM_SHIFT )
| (EDMA_OPT_2DD_NO << _EDMA_OPT_2DD_SHIFT )
| (EDMA_OPT_DUM_NONE << _EDMA_OPT_DUM_SHIFT )
| (EDMA_OPT_TCINT_YES << _EDMA_OPT_TCINT_SHIFT )
| (EDMA_OPT_TCC_OF(12) << _EDMA_OPT_TCC_SHIFT )
#if (C64_SUPPORT)
| (EDMA_OPT_TCCM_DEFAULT << _EDMA_OPT_TCCM_SHIFT )
| (EDMA_OPT_ATCINT_NO << _EDMA_OPT_ATCINT_SHIFT)
| (EDMA_OPT_ATCC_DEFAULT << _EDMA_OPT_ATCC_SHIFT )
| (EDMA_OPT_PDTS_DISABLE << _EDMA_OPT_PDTS_SHIFT )
| (EDMA_OPT_PDTD_DISABLE << _EDMA_OPT_PDTD_SHIFT )
#endif
| (EDMA_OPT_LINK_YES << _EDMA_OPT_LINK_SHIFT )
| (EDMA_OPT_FS_NO << _EDMA_OPT_FS_SHIFT ));
config.src = (Uint32)PING_SRC; /* 0x80000000 */
config.cnt = (Uint32)EL_COUNT; /* 0x00000100 */
config.dst = (Uint32)_MCBSP_DXR0_ADDR; /* 0x30000000 */
config.idx = (Uint32)0; /* 0x00000000 */
config.rld = (Uint32)link_pong_xmt & 0xffff; /* &pong */
EDMA_config(*hEdma_ch12, &config);
EDMA_config(hEdma_ping_xmt, &config);
config.src = (Uint32)PONG_SRC; /* 0x80001000 */
config.rld = (Uint32)link_ping_xmt & 0xffff; /* &ping */
EDMA_config(hEdma_pong_xmt, &config);
config.opt = (Uint32)
((EDMA_OPT_PRI_HIGH << _EDMA_OPT_PRI_SHIFT )
| (EDMA_OPT_ESIZE_32BIT << _EDMA_OPT_ESIZE_SHIFT )
| (EDMA_OPT_2DS_NO << _EDMA_OPT_2DS_SHIFT )
| (EDMA_OPT_SUM_NONE << _EDMA_OPT_SUM_SHIFT )
| (EDMA_OPT_2DD_NO << _EDMA_OPT_2DD_SHIFT )
| (EDMA_OPT_DUM_INC << _EDMA_OPT_DUM_SHIFT )
| (EDMA_OPT_TCINT_YES << _EDMA_OPT_TCINT_SHIFT )
| (EDMA_OPT_TCC_OF(13) << _EDMA_OPT_TCC_SHIFT )
#if (C64_SUPPORT)
| (EDMA_OPT_TCCM_DEFAULT << _EDMA_OPT_TCCM_SHIFT )
| (EDMA_OPT_ATCINT_NO << _EDMA_OPT_ATCINT_SHIFT)
| (EDMA_OPT_ATCC_DEFAULT << _EDMA_OPT_ATCC_SHIFT )
| (EDMA_OPT_PDTS_DISABLE << _EDMA_OPT_PDTS_SHIFT )
| (EDMA_OPT_PDTD_DISABLE << _EDMA_OPT_PDTD_SHIFT )
#endif
| (EDMA_OPT_LINK_YES << _EDMA_OPT_LINK_SHIFT )
| (EDMA_OPT_FS_NO << _EDMA_OPT_FS_SHIFT ));
config.src = (Uint32)_MCBSP_DRR0_ADDR; /* 0x30000000 */
config.cnt = (Uint32)EL_COUNT; /* 0x00000100 */
config.dst = (Uint32)PING_DST; /* 0x0000D000 */
config.idx = (Uint32)0; /* 0x00000000 */
config.rld = (Uint32)link_pong_rcv & 0xffff; /* &pong */
EDMA_config(*hEdma_ch13, &config);
EDMA_config(hEdma_ping_rcv, &config);
config.dst = (Uint32)PONG_DST; /* 0x0000E000 */
config.rld = (Uint32)link_ping_rcv & 0xffff; /* &ping */
EDMA_config(hEdma_pong_rcv, &config);
return(0);
} /* end cfg_edma */
/**************************************wait**************************************/
/* Wait until the transfer completes, as indicated by bit 13 of the Channel */
/* Interrupt Pending Register (CIPR). */
/********************************************************************************/
void
wait(void)
{
while (1){
if ((Uint32)EDMA_RGET(CIPR) & (1 << 13)){
EDMA_RSET(CIPR, (1 << 13));
break;
} /* end if */
} /* end while */
} /* end wait */
/***********************************check_data***********************************/
/* Verify that the data was properly transferred by comparing the source data */
/* to the destination data. */
/********************************************************************************/
int
check_data(void)
{
Uint16 *src,
*dst,
source = 0,
dest = 0,
i;
Uint32 err = 0;
src = (Uint16 *)PING_SRC;
dst = (Uint16 *)PING_DST;
for (i = 0; i < (EL_COUNT<<1); i++){
dest = *dst++;
source = *src++;
if (dest != source){
/* Set error value if incorrect data */
err = i + 0x1000;
break;
} /* end if */
} /* end for i */
src = (Uint16 *)PONG_SRC;
dst = (Uint16 *)PONG_DST;
for (i = 0; i < (EL_COUNT<<1); i++){
dest = *dst++;
source = *src++;
if (dest != source){
/* Set error value if incorrect data */
err = i + 0x2000;
break;
} /* end if */
} /* end for i */
return(err);
} /* end check_data */
/**************************************main**************************************/
/* Main code body. */
/********************************************************************************/
void
main(void)
{
Uint16 i;
Uint32 error = 0;
EDMA_Handle hEdma_ch12;
EDMA_Handle hEdma_ch13;
MCBSP_Handle hMcbsp_ch0;
cfg_data();
error = cfg_edma(&hEdma_ch12, &hEdma_ch13);
if (!error){
cfg_mcbsp(&hMcbsp_ch0);
EDMA_enableChannel(hEdma_ch12);
EDMA_enableChannel(hEdma_ch13);
start_mcbsp(&hMcbsp_ch0);
for(i=0; i<ITERATE; i++) wait();
EDMA_disableChannel(hEdma_ch12);
EDMA_disableChannel(hEdma_ch13);
EDMA_close(hEdma_ch12);
EDMA_close(hEdma_ch13);
MCBSP_close(hMcbsp_ch0);
} /* end if !error */
if (!error) error = check_data();
while(error);
while(!error);
} /* end main */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -