📄 imageprocessing.c
字号:
/*******************************************************************************
*
* DESCRIPTION
* DSP Program intended for
* C6416 Board developed by Zhangjian to
* display captured images with VGA formate. *
*******************************************************************************/
#include "c64cfg.h"
#include <csl.h>
#include <csl_timer.h>
#include <csl_edma.h>
#define OutputRAM 0x60000000 //定义输入输出地址
#define InputRAM 0xA0000000
#define PingRAM 0x00020000
#define PangRAM 0x80000000
#define time1_ctl 0x01980000
//add code here
#define Direct_Display 0 //直接显示
#define ROBERTS 0 //罗伯特交叉边缘检测算子
#define PREWITT 0 //蒲瑞维特边缘检测算子3x3
#define H1PREWITT 0 //蒲瑞维特边缘方向梯度检测算子H1东
#define H2PREWITT 0 //蒲瑞维特边缘方向梯度检测算子H2东北
#define H3PREWITT 0 //H3北
#define H4PREWITT 0 //H4西北
#define H5PREWITT 0 //H5西
#define H6PREWITT 0 //H6西南
#define H7PREWITT 0 //H7南
#define H8PREWITT 0 //H8东南
#define HPREWITT 0 //综合方向
#define PREWITTx5_1 1 //prewitt5x5
#define PREWITT5x5_2 0 //prewitt5x5扩展
#define PREWITT7x7_1 0 //preiwtt7x7
//add code end
/*********************************************************************
系统初始化
********************************************************************/
void ini();
void int4_handle();
void edma_int_handle();
void bigpingpang(Uint32 hEdma0Opt,Uint32 hEdma1Opt,Uint32 InputBuffer,Uint32 OutputBuffer,Uint32 PingBuffer,Uint32 PangBuffer,Uint32 TrsanferNum,Uint32 EFIndex,Uint32 RLoadLink);
unsigned int field = 1;
main() //主函数
{
*(volatile int *)time1_ctl = 0x00000300;
ini();
field = 1;
IRQ_globalEnable();
IRQ_enable(IRQ_EVT_EXTINT4);
IRQ_reset(IRQ_EVT_EDMAINT);
EDMA_intDisable(8);
EDMA_intClear(8);
IRQ_enable(IRQ_EVT_EDMAINT);
EDMA_intEnable(8);
*(int *)OutputRAM =0x0000;// 0x4080;
*(volatile int *)time1_ctl = 0x00000304;
}
void ini() //定义系统寄存器
{
IRQ_globalEnable();
IRQ_nmiEnable();
#define EMIFA_GCTL 0x01800000
#define EMIFA_CE1 0x01800004
#define EMIFA_CE0 0x01800008
#define EMIFA_CE2 0x01800010
#define EMIFA_CE3 0x01800014
#define EMIFA_SDRAMCTL 0x01800018
#define EMIFA_SDRAMREF 0x0180001c
#define EMIFA_SDRAMEXT 0x01800020
#define EMIFA_CE1SECCTL 0x01800044
#define EMIFA_CE0SECCTL 0x01800048
#define EMIFA_CE2SECCTL 0x01800050
#define EMIFA_CE3SECCTL 0x01800054
#define EMIFB_GCTL 0x01A80000
#define EMIFB_CE1 0x01A80004
#define EMIFB_CE0 0x01A80008
#define EMIFB_CE2 0x01A80010
#define EMIFB_CE3 0x01A80014
#define EMIFB_SDRAMCTL 0x01A80018
#define EMIFB_SDRAMREF 0x01A8001c
#define EMIFB_SDRAMEXT 0x01A80020
#define EMIFB_CE1SECCTL 0x01A80044
#define EMIFB_CE0SECCTL 0x01A80048
#define EMIFB_CE2SECCTL 0x01A80050
#define EMIFB_CE3SECCTL 0x01A80054
*(int *)EMIFA_GCTL = 0x000120a4;
*(int *)EMIFA_CE2 = 0x1091c211;// change 0x1091c211,old :0x1091c221
*(int *)EMIFA_CE0 = 0xffffffdf;
*(int *)EMIFA_SDRAMCTL = 0x47116000;
*(int *)EMIFA_SDRAMREF = 0x00000600;
*(int *)EMIFA_SDRAMEXT = 0x00054549;
*(int *)EMIFB_GCTL = 0x000120a4;
*(int *)EMIFB_CE0 = 0x1091c211; // change 0x1091c211
}
void int4_handle()
{
bigpingpang(0x61380001,0x21200001,InputRAM,OutputRAM,PingRAM,PangRAM,0x00004000,0x00000000,0x0000ffff);
}
void bigpingpang(Uint32 hEdma0Opt,Uint32 hEdma1Opt,
Uint32 InputBuffer,Uint32 OutputBuffer,Uint32 PingBuffer,Uint32 PangBuffer,
Uint32 TrsanferNum,Uint32 EFIndex,Uint32 RLoadLink)
{
Uint32 tempinputbuffer,tempoutputbuffer,temppingbuffer,temppangbuffer;
IRQ_disable(IRQ_EVT_EXTINT4);
switch(field)
{
case 1:
tempinputbuffer = InputBuffer ;
tempoutputbuffer = OutputBuffer+0x00010000;
temppingbuffer = PingBuffer;
temppangbuffer = PangBuffer+0x00010000;
break;
case 2:
tempinputbuffer = InputBuffer+0x00010000 ;
tempoutputbuffer = OutputBuffer+0x00000004;
temppingbuffer = PingBuffer+0x00010000;
temppangbuffer = PangBuffer+0x00020004;
break;
case 3:
tempinputbuffer = InputBuffer ;
tempoutputbuffer = OutputBuffer+0x00010000;
temppingbuffer = PingBuffer+0x00020000;
temppangbuffer = PangBuffer+0x00030000;
break;
case 4:
tempinputbuffer = InputBuffer+0x00010000 ;
tempoutputbuffer = OutputBuffer+0x00000004;
temppingbuffer = PingBuffer+0x00030000;
temppangbuffer = PangBuffer+0x00040004;
break;
case 5:
tempinputbuffer = InputBuffer ;
tempoutputbuffer = OutputBuffer+0x00010000;
temppingbuffer = PingBuffer+0x00040000;
temppangbuffer = PangBuffer+0x00050000;
break;
case 6:
tempinputbuffer = InputBuffer+0x00010000 ;
tempoutputbuffer = OutputBuffer+0x00000004;
temppingbuffer = PingBuffer+0x00050000;
temppangbuffer = PangBuffer+0x00060004;
break;
case 7:
tempinputbuffer = InputBuffer ;
tempoutputbuffer = OutputBuffer+0x00010000;
temppingbuffer = PingBuffer+0x00060000;
temppangbuffer = PangBuffer+0x00070000;
break;
case 8:
tempinputbuffer = InputBuffer+0x00010000 ;
tempoutputbuffer = OutputBuffer+0x00000004;
temppingbuffer = PingBuffer+0x00070000;
temppangbuffer = PangBuffer+0x00000004;
// temppangbuffer = PingBuffer+0x00000004;
field = 0;
break;
default: break;
}
EDMA_configArgs(hEdmaCha0,
hEdma0Opt, // opt
tempinputbuffer, // src
TrsanferNum, // cnt
temppingbuffer, // dst
EFIndex, // idx
RLoadLink // rld
);
EDMA_configArgs(hEdmaCha1,
hEdma1Opt, // opt
temppangbuffer, //
TrsanferNum, // cnt
tempoutputbuffer, // dst
EFIndex, // idx
RLoadLink // rld
);
EDMA_setChannel(hEdmaCha1);
EDMA_setChannel(hEdmaCha0);
field = field + 1;
IRQ_enable(IRQ_EVT_EXTINT4);
}
void edma_int_handle()
{
unsigned long i,j;
Uint16 *inputbuffer16,*outputbuffer16,*temp16;
Uint32 *inputbuffer32,*outputbuffer32,*tempin32,*tempout32;
EDMA_intDisable(8);
EDMA_intClear(8);
switch(field)
{
case 2:
inputbuffer16 = (Uint16 *)(PingRAM);
outputbuffer16 = (Uint16 *)(PangRAM);
inputbuffer32 = (Uint32 *)(PingRAM);
outputbuffer32 = (Uint32 *)(PangRAM);
break;
case 3:
inputbuffer16 = (Uint16 *)(PingRAM+0x00010000);
outputbuffer16 = (Uint16 *)(PangRAM+0x00010000);
inputbuffer32 = (Uint32 *)(PingRAM+0x00010000);
outputbuffer32 = (Uint32 *)(PangRAM+0x00010000);
break;
case 4:
inputbuffer16 = (Uint16 *)(PingRAM+0x00020000);
outputbuffer16 = (Uint16 *)(PangRAM+0x00020000);
inputbuffer32 = (Uint32 *)(PingRAM+0x00020000);
outputbuffer32 = (Uint32 *)(PangRAM+0x00020000);
break;
case 5:
inputbuffer16 = (Uint16 *)(PingRAM+0x00030000);
outputbuffer16 = (Uint16 *)(PangRAM+0x00030000);
inputbuffer32 = (Uint32 *)(PingRAM+0x00030000);
outputbuffer32 = (Uint32 *)(PangRAM+0x00030000);
break;
case 6:
inputbuffer16 = (Uint16 *)(PingRAM+0x00040000);
outputbuffer16 = (Uint16 *)(PangRAM+0x00040000);
inputbuffer32 = (Uint32 *)(PingRAM+0x00040000);
outputbuffer32 = (Uint32 *)(PangRAM+0x00040000);
break;
case 7:
inputbuffer16 = (Uint16 *)(PingRAM+0x00050000);
outputbuffer16 = (Uint16 *)(PangRAM+0x00050000);
inputbuffer32 = (Uint32 *)(PingRAM+0x00050000);
outputbuffer32 = (Uint32 *)(PangRAM+0x00050000);
break;
case 8:
inputbuffer16 = (Uint16 *)(PingRAM+0x00060000);
outputbuffer16 = (Uint16 *)(PangRAM+0x00060000);
inputbuffer32 = (Uint32 *)(PingRAM+0x00060000);
outputbuffer32 = (Uint32 *)(PangRAM+0x00060000);
break;
case 1:
inputbuffer16 = (Uint16 *)(PingRAM+0x00070000);
outputbuffer16 = (Uint16 *)(PangRAM+0x00070000);
inputbuffer32 = (Uint32 *)(PingRAM+0x00070000);
outputbuffer32 = (Uint32 *)(PangRAM+0x00070000);
break;
default: break;
}
#if Direct_Display
for( i = 0; i < 0x4000; i++ )
{
*((Uint32 *)outputbuffer32 + i) = *((Uint32 *)inputbuffer32 + i);
}
#endif
//add code here
#if ROBERTS
roberts((Uint16 *)( inputbuffer16),(Uint16 *)( outputbuffer16),512,64);
#endif //ROBERTS
#if PREWITT
prewitt((Uint16 *)( inputbuffer16),(Uint16 *)( outputbuffer16),512,64);
#endif //prewitt
#if H1PREWITT
h1prewitt((Uint16 *)( inputbuffer16),(Uint16 *)( outputbuffer16),512,64);
#endif //h1prewitt
#if H2PREWITT
h2prewitt((Uint16 *)( inputbuffer16),(Uint16 *)( outputbuffer16),512,64);
#endif //h2prewitt
#if H3PREWITT
h3prewitt((Uint16 *)( inputbuffer16),(Uint16 *)( outputbuffer16),512,64);
#endif //h3prewitt
#if H4PREWITT
h4prewitt((Uint16 *)( inputbuffer16),(Uint16 *)( outputbuffer16),512,64);
#endif //h4prewitt
#if H5PREWITT
h5prewitt((Uint16 *)( inputbuffer16),(Uint16 *)( outputbuffer16),512,64);
#endif //h5prewitt
#if H6PREWITT
h6prewitt((Uint16 *)( inputbuffer16),(Uint16 *)( outputbuffer16),512,64);
#endif //h6prewitt
#if H7PREWITT
h7prewitt((Uint16 *)( inputbuffer16),(Uint16 *)( outputbuffer16),512,64);
#endif //h7prewitt
#if H8PREWITT
h8prewitt((Uint16 *)( inputbuffer16),(Uint16 *)( outputbuffer16),512,64);
#endif //h8prewitt
#if HPREWITT
hprewitt((Uint16 *)( inputbuffer16),(Uint16 *)( outputbuffer16),512,64);
#endif //hprewitt
#if PREWITT5x5_1
prewitt5x5_1((Uint16 *)(inputbuffer16),(Uint16 *)(outputbuffer16),512,64);
#endif // PREWITT5x5_1
#if PREWITT5x5_2
prewitt5x5_2((Uint16 *)(inputbuffer16),(Uint16 *)(outputbuffer16),512,64);
#endif //PREWITT5x5_2
#if PREWITTx7_1
pit7x7_1((Uint16 *)(inputbuffer16),(Uint16 *)(outputbuffer16),512,64);
#endif // PREWITT7x7_1
#if PREWITT7x7_1
prewitt7x7_1((Uint16 *)(inputbuffer16),(Uint16 *)(outputbuffer16),512,64);
#endif // PREWITT
//add code end
EDMA_intEnable(8);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -