📄 dm642main.c
字号:
/********************************************************************/
/* Copyright 2004 by SEED Incorporated. */
/* All rights reserved. Property of SEED Incorporated. */
/* Restricted rights to use, duplicate or disclose this code are */
/* granted through contract. */
/* */
/********************************************************************/
#include <stdio.h>
//#include <std.h>
//#include <csl.h>
#include <csl_emifa.h>
//#include <csl_irq.h>
//#include <csl_chip.h>
#include <time.h>
#include <csl_cache.h>
#include <csl_dat.h>
#include "seeddm642.h"
#define WIDTH 800
#define HEIGHT 600
Uint32 id_InBuffA = DAT_XFRID_WAITALL,
id_OutBuffA = DAT_XFRID_WAITALL;
//#pragma DATA_ALIGN(InBuffA, L1D_LINESIZE)
//#pragma DATA_ALIGN(InBuffB, L1D_LINESIZE)
unsigned char ColumnA [WIDTH];
unsigned char ColumnB [WIDTH];
unsigned char ColumnC [WIDTH];
unsigned char Columndst [WIDTH];
//unsigned char Columncomp [WIDTH*WIDTH];
/* ------------------------------------------------------------------------ */
/* Source data to process in external memory */
/* Destination for processed data in external memory */
/* ------------------------------------------------------------------------ */
#pragma DATA_SECTION(src,".external")
#pragma DATA_SECTION(dst,".external")
#pragma DATA_SECTION(comp,".external")
unsigned char src[WIDTH*HEIGHT];
unsigned char dst[WIDTH*HEIGHT];
unsigned char comp[WIDTH*HEIGHT];
/*SEEDDM642的emifa的设置结构*/
EMIFA_Config Seeddm642ConfigA ={
EMIFA_FMKS(GBLCTL, EK2RATE, HALFCLK) |
EMIFA_FMKS(GBLCTL, EK2HZ, CLK) |
EMIFA_FMKS(GBLCTL, EK2EN, ENABLE) |
EMIFA_FMKS(GBLCTL, BRMODE, MRSTATUS) |
EMIFA_FMKS(GBLCTL, NOHOLD, DISABLE) |
EMIFA_FMKS(GBLCTL, EK1HZ, HIGHZ) |
EMIFA_FMKS(GBLCTL, EK1EN, ENABLE) |
EMIFA_FMKS(GBLCTL, CLK4EN, ENABLE) |
EMIFA_FMKS(GBLCTL, CLK6EN, ENABLE),
EMIFA_FMKS(CECTL, WRSETUP, DEFAULT) |
EMIFA_FMKS(CECTL, WRSTRB, DEFAULT) |
EMIFA_FMKS(CECTL, WRHLD, DEFAULT) |
EMIFA_FMKS(CECTL, RDSETUP, DEFAULT) |
EMIFA_FMKS(CECTL, TA, DEFAULT) |
EMIFA_FMKS(CECTL, RDSTRB, DEFAULT) |
EMIFA_FMKS(CECTL, MTYPE, SDRAM64) |
EMIFA_FMKS(CECTL, RDHLD, DEFAULT),
EMIFA_FMKS(CECTL, WRSETUP, OF(7)) |
EMIFA_FMKS(CECTL, WRSTRB, OF(14)) |
EMIFA_FMKS(CECTL, WRHLD, OF(2)) |
EMIFA_FMKS(CECTL, RDSETUP, OF(2)) |
EMIFA_FMKS(CECTL, TA, OF(2)) |
EMIFA_FMKS(CECTL, RDSTRB, OF(14)) |
EMIFA_FMKS(CECTL, MTYPE, ASYNC8) |
EMIFA_FMKS(CECTL, RDHLD, OF(1)),
EMIFA_FMKS(CECTL, WRSETUP, OF(2)) |
EMIFA_FMKS(CECTL, WRSTRB, OF(10)) |
EMIFA_FMKS(CECTL, WRHLD, OF(2)) |
EMIFA_FMKS(CECTL, RDSETUP, OF(2)) |
EMIFA_FMKS(CECTL, TA, OF(2)) |
EMIFA_FMKS(CECTL, RDSTRB, OF(10)) |
EMIFA_FMKS(CECTL, MTYPE, ASYNC32) |
EMIFA_FMKS(CECTL, RDHLD, OF(2)),
EMIFA_FMKS(CECTL, WRSETUP, OF(2)) |
EMIFA_FMKS(CECTL, WRSTRB, OF(10)) |
EMIFA_FMKS(CECTL, WRHLD, OF(2)) |
EMIFA_FMKS(CECTL, RDSETUP, OF(2)) |
EMIFA_FMKS(CECTL, TA, OF(2)) |
EMIFA_FMKS(CECTL, RDSTRB, OF(10)) |
EMIFA_FMKS(CECTL, MTYPE, SYNC32) |
EMIFA_FMKS(CECTL, RDHLD, OF(2)),
EMIFA_FMKS(SDCTL, SDBSZ, 4BANKS) |
EMIFA_FMKS(SDCTL, SDRSZ, 12ROW) |
EMIFA_FMKS(SDCTL, SDCSZ, 8COL) |
EMIFA_FMKS(SDCTL, RFEN, ENABLE) |
EMIFA_FMKS(SDCTL, INIT, YES) |
EMIFA_FMKS(SDCTL, TRCD, OF(1)) |
EMIFA_FMKS(SDCTL, TRP, OF(1)) |
EMIFA_FMKS(SDCTL, TRC, OF(5)) |
EMIFA_FMKS(SDCTL, SLFRFR, DISABLE),
EMIFA_FMKS(SDTIM, XRFR, OF(0)) |
EMIFA_FMKS(SDTIM, PERIOD, OF(2075)),
EMIFA_FMKS(SDEXT, WR2RD, OF(1)) |
EMIFA_FMKS(SDEXT, WR2DEAC, OF(3)) |
EMIFA_FMKS(SDEXT, WR2WR, OF(1)) |
EMIFA_FMKS(SDEXT, R2WDQM, OF(3)) |
EMIFA_FMKS(SDEXT, RD2WR, OF(2)) |
EMIFA_FMKS(SDEXT, RD2DEAC, OF(3)) |
EMIFA_FMKS(SDEXT, RD2RD, OF(1)) |
EMIFA_FMKS(SDEXT, THZP, OF(2)) |
EMIFA_FMKS(SDEXT, TWR, OF(2)) |
EMIFA_FMKS(SDEXT, TRRD, OF(0)) |
EMIFA_FMKS(SDEXT, TRAS, OF(6)) |
EMIFA_FMKS(SDEXT, TCL, OF(1)),
EMIFA_CESEC_DEFAULT,
EMIFA_CESEC_DEFAULT,
EMIFA_CESEC_DEFAULT,
EMIFA_FMKS(CESEC, SNCCLK, ECLKOUT2) |
EMIFA_FMKS(CESEC, RENEN, READ) |
EMIFA_FMKS(CESEC, CEEXT, ACTIVE) |
EMIFA_FMKS(CESEC, SYNCWL, 0CYCLE) |
EMIFA_FMKS(CESEC, SYNCRL, 3CYCLE)
};
void IMG_sobel1
(
unsigned char indata1[], /* Input image */
unsigned char indata2[], /* Input image */
unsigned char indata3[], /* Input image */
unsigned char outdata[], /* Output image */
int n /* width of input data*/
//int m /* height of input data*/
);
void IMG_sobel
(
unsigned char indata1[], /* Input image */
unsigned char outdata[], /* Output image */
int n, /* width of input data*/
int m /* height of input data*/
);
void main()
{
int i,j;
clock_t start;
clock_t overhead;
clock_t elapsed;
/* Return lower 8 bits of register */
/*-------------------------------------------------------*/
/* perform all initializations */
/*-------------------------------------------------------*/
//Initialise CSL,初始化CSL库*/
CSL_init();
/*----------------------------------------------------------*/
/*EMIFA的初始化,将CE0设为SDRAM空间,CE1设为异步空间
注,DM642支持的是EMIFA,而非EMIF*/
EMIFA_config(&Seeddm642ConfigA);
/*----------------------------------------------------------*/
CACHE_setL2Mode(CACHE_0KCACHE);
DAT_open(DAT_CHAANY, DAT_PRI_HIGH, 0);
/* Calculate the overhead from calling clock() */
start = clock();
overhead = clock()-start;
/* Calculate the elapsed time */
for (i=0; i<WIDTH*HEIGHT-1; i++)
{
src[i] = i % 255;
dst[i] = 0;
comp[i] = 4;
//Columncomp[i]= 3;
}
for (i=0; i<WIDTH; i++)
{
ColumnA[i] = 0;
ColumnB[i] = 0;
}
C_sobel(src,WIDTH,HEIGHT,comp);
//IMG_sobel(src,dst,WIDTH,HEIGHT);
start = clock();
for (i=0; i<HEIGHT-2; i=i+1)
{
id_InBuffA = DAT_copy(src+WIDTH*i, ColumnA, WIDTH);
DAT_wait(id_InBuffA);
id_InBuffA = DAT_copy(src+WIDTH*(i+1), ColumnB, WIDTH);
DAT_wait(id_InBuffA);
id_InBuffA = DAT_copy(src+WIDTH*(i+2), ColumnC, WIDTH);
DAT_wait(id_InBuffA);
IMG_sobel1(ColumnA,ColumnB,ColumnC,Columndst,WIDTH);
id_OutBuffA = DAT_copy(Columndst,dst+WIDTH*(i+2),WIDTH);
DAT_wait(id_OutBuffA);
}
elapsed = clock()-start-overhead;
printf("Time = %ld cycles\n",(long)elapsed);
for (i=1; i<HEIGHT-2; i++)
{
for (j=1; j<WIDTH-1; j++)
{
if (dst[(i+1)*WIDTH+j] != comp[i*WIDTH+j])
{
printf("Data Mismatch!\n");
printf("i=%d , j=%d \n",i,j);
DAT_close();
exit(0);
}
}
}
/*start = clock();
IMG_median_3x3(ColumnA,ColumnB,ColumnC,WIDTH,ColumnOUT);
elapsed = clock()-start-overhead;
printf("Time = %ld cycles\n",(long)elapsed);*/
printf("Successfully completed!\n");
DAT_close();
/*测试完成*/
for(;;){}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -