📄 image_s_m.c
字号:
/***************************************************
*
* Program for reg dsp image board
*
*============ image_s_m.c ============
*
* trasfer data width is 8 bit
*
***************************************************
*
*
* "BRIGHT" 0--16
* ( 16:max ,0:dark )
*
*
***************************************************/
#define BRIGHT 16 /*0--16 (0---dark, max 16) */
/*----------------------------------------------------------*/
#include <stdio.h>
#include <csl.h>
#include <csl_cache.h>
#include <csl_edma.h>
#include <csl_timer.h>
#include <csl_irq.h>
#define TCCINTNUM 10
#define IMAGE_WIDTH 280
#define IMAGE_HIGHT 140
#define EDMA_SOURCE_ADDR 0xa0000000 //edma source addr is dsk flash
#pragma DATA_ALIGN(line_buffer,128);
#pragma DATA_ALIGN(ImageBuffer,128);
unsigned char line_buffer[IMAGE_WIDTH];
far unsigned char ImageBuffer[IMAGE_WIDTH*IMAGE_HIGHT]; //IMAGE_WIDTH*IMAGE_HIGHT
#define FLASH_SIZE 0x40000
#define FLASH_START 0x90000000
#define FLASH_END (FLASH_START + FLASH_SIZE)
#define FLASH_ADR1 0x90000555
#define FLASH_ADR2 0x900002AA
#define FLASH_KEY1 0xAA
#define FLASH_KEY2 0x55
#define FLASH_KEY3 0xA0
#define FLASH_KEY4 0x80
#define FLASH_KEY5 0x10
void EraseFlash(void)
{
/* Code to erase AMD29LV400B
* 4MBit (256K X 8) Flash Memory
*/
*(volatile char *)FLASH_ADR1 = (char)FLASH_KEY1;
*(volatile char *)FLASH_ADR2 = (char)FLASH_KEY2;
*(volatile char *)FLASH_ADR1 = (char)FLASH_KEY4;
*(volatile char *)FLASH_ADR1 = (char)FLASH_KEY1;
*(volatile char *)FLASH_ADR2 = (char)FLASH_KEY2;
*(volatile char *)FLASH_ADR1 = (char)FLASH_KEY5;
/* Spin here 'til erasing completes
*/
// while(GetFlashVal(FLASH_START) != 0xff)
;/* Do Nothing!*/
return;
}
volatile int frame_counter;
volatile int line_counter ;
volatile int sampling_stop;
volatile int frame_sam_end=0;
volatile int get_sampling;
int i,j;
unsigned char *pixel_p;
FILE *file;
extern far void vectors();
void setupInterrupts(void);
void stopEdma(void);
EDMA_Handle hEdma;
EDMA_Config cfgEdma;
/* Create the EDMA configuration structure for line_buffer transfers */
EDMA_Config cfgEdma = {
EDMA_OPT_RMK(
EDMA_OPT_PRI_LOW,
EDMA_OPT_ESIZE_8BIT,
EDMA_OPT_2DS_NO,
EDMA_OPT_SUM_INC,
EDMA_OPT_2DD_NO,
EDMA_OPT_DUM_INC,
EDMA_OPT_TCINT_YES,
EDMA_OPT_TCC_OF(TCCINTNUM),
EDMA_OPT_LINK_NO,
EDMA_OPT_FS_YES
),
EDMA_SRC_OF(EDMA_SOURCE_ADDR),
EDMA_CNT_OF(IMAGE_WIDTH),
EDMA_DST_OF(line_buffer),
EDMA_IDX_OF(0x00000000),
EDMA_RLD_OF(0x00000000)
};
/*------------------------------------------------------
AD9814 parameters
------------------------------------------------------*/
unsigned short ad_init_com_w[8]={ //ad9814 control words
0x0040, //
0x10c0, // MUX
0x2015, // Red PGA
0x3000, // Green PGA
0x4000, // Blue PGA
0x51fe, //59 Red Offset
0x6000, // Green Offset
0x7000,}; // Blue Offset
#define AD_COM_ADDR0 (unsigned char *)0xb0000400; //wr clear
#define AD_COM_ADDR1 (unsigned char *)0xb0000440; //wr b7=1:sample b7=0 stop
// b6=1,AD0_LOAD=1;b6=0,AD_LOAD=0
// b5=1,AD1_LOAD=1;b5=0,AD_LOAD=0
#define AD_COM_ADDR2 (unsigned char *)0xb0000480; //wr b4--b0=0-10000; cis_led britness
#define AD_COM_ADDR3 (unsigned char *)0xb00004c0; //w ad_init
#define AD_COM_ADDR4 (unsigned char *)0xb0000500; //w ad_init
#define test_ (unsigned char *)0xb0000540; //test led4
extern far void vectors();
unsigned char *ad_com_addr_p;
unsigned char *ad_com_addr_p1;
union
{ unsigned short Tw;
unsigned char Tb[2];
} value;
#pragma DATA_ALIGN(temp,4);
#pragma DATA_ALIGN(tmp00,4);
volatile short temp;
//volatile
unsigned char tmp00;
/************************************************************
parameters and functions for dip and led control
**************************************************************
cis init functions for sampling control
********************************************************/
void cis_bright(unsigned char cis_led_bright) // cis_led_bright=0--16
{
tmp00=cis_led_bright;
ad_com_addr_p=AD_COM_ADDR2;
*ad_com_addr_p=tmp00;
}
void stop_sampling(){
tmp00=0x40;
ad_com_addr_p=AD_COM_ADDR1;
*ad_com_addr_p=tmp00;
get_sampling=0;
}
void start_sampling(){
tmp00=0xc0;
ad_com_addr_p=AD_COM_ADDR1;
*ad_com_addr_p=tmp00;
}
//-----------------------------------------
void clear_sampling(){
tmp00=0x0;
ad_com_addr_p=AD_COM_ADDR0;
*ad_com_addr_p=tmp00;
}
//-----------------------------------------
void ad_init(){
tmp00=0x40;
ad_com_addr_p=AD_COM_ADDR1;
*ad_com_addr_p=tmp00;
for( i=0;i<8;i++ )
{
//i=0;
tmp00=0x00; //laod=1
*ad_com_addr_p=tmp00; //SCLK=0
value.Tw=ad_init_com_w[i];
ad_com_addr_p=AD_COM_ADDR3
ad_com_addr_p1=AD_COM_ADDR4;
for( j=0; j<16; j++ )
{
tmp00=value.Tb[1];
tmp00=tmp00 & 0x80;
*ad_com_addr_p++=tmp00; //DATA=BIT 7
*ad_com_addr_p1++=tmp00; //SCLK
value.Tw=value.Tw<<1;
}
tmp00=0x40; //laod=0
ad_com_addr_p=AD_COM_ADDR1;
*ad_com_addr_p=tmp00;
}
}
/*****************************************/
void start_edma(){
sampling_stop=0;
line_counter=0;
frame_sam_end=0;
pixel_p=ImageBuffer;
setupInterrupts(); /* defined below */
EDMA_clearPram(0x00000000);
hEdma = EDMA_open(EDMA_CHA_EXTINT4, EDMA_OPEN_RESET);
/* EDMA event select int4 */
EDMA_config(hEdma, &cfgEdma);
EDMA_intDisable(TCCINTNUM);
EDMA_intClear(TCCINTNUM);
EDMA_intEnable(TCCINTNUM);
EDMA_enableChannel(hEdma);
IRQ_enable(IRQ_EVT_EDMAINT);
#ifdef TIMER_I
TIMER_start(hTimer);
#endif
}
/**************************************************
image preprocess
-------------------------------------------------*/
void pre_process(){
unsigned char *inbuff;
int x;
inbuff = line_buffer;
for (x=0; x<IMAGE_WIDTH; x++)
*pixel_p++ = *inbuff++;
inbuff=pixel_p-IMAGE_WIDTH;
CACHE_wbInvL2(inbuff, (IMAGE_WIDTH+1), CACHE_WAIT);
inbuff = line_buffer;
CACHE_clean(CACHE_L2,inbuff,(IMAGE_WIDTH+1));
}
/****************************************************
frame_process
----------------------------------------------------*/
void frame_process(){
/* add prog. to processing image */
{
}
}
/**************************************************/
void setupInterrupts(void)
{
IRQ_setVecs(vectors); /* point to the IRQ vector table */
IRQ_nmiEnable();
IRQ_globalEnable();
IRQ_map(IRQ_EVT_EDMAINT, 8);
IRQ_reset(IRQ_EVT_EDMAINT);
}
/*********************************************/
interrupt void
c_int08(void)
{
/* Clear the pending interrupt from the EDMA interrupt pending register */
EDMA_intClear(TCCINTNUM);
pre_process();
// printf("\n %2d - %2d ",line_counter,frame_sam_end);
line_counter++;
if (line_counter < IMAGE_HIGHT){
// EDMA_link(hEdma,hEdmaline_buffer);
}
else{
frame_sam_end=1;
stopEdma();
}
return;
}
//----------------------------------------------------
void stopEdma(void) {
/*Disable interrupts, close EDMA channel before exit of the program*/
IRQ_disable(IRQ_EVT_EDMAINT);
EDMA_RSET(CCER,0x00000000);
EDMA_disableChannel(hEdma);
EDMA_intDisable(TCCINTNUM);
EDMA_intClear(TCCINTNUM);
EDMA_close(hEdma);
EDMA_resetAll();
EDMA_RSET(CIPR,0xFFFFFFFF);
EDMA_RSET(ECR,0xFFFFFFFF);
}
#define PLL_BASE_ADDR 0x01b7c000
#define PLL_PID ( PLL_BASE_ADDR + 0x000 )
#define PLL_CSR ( PLL_BASE_ADDR + 0x100 )
#define PLL_MULT ( PLL_BASE_ADDR + 0x110 )
#define PLL_DIV0 ( PLL_BASE_ADDR + 0x114 )
#define PLL_DIV1 ( PLL_BASE_ADDR + 0x118 )
#define PLL_DIV2 ( PLL_BASE_ADDR + 0x11C )
#define PLL_DIV3 ( PLL_BASE_ADDR + 0x120 )
#define PLL_OSCDIV1 ( PLL_BASE_ADDR + 0x124 )
#define CSR_PLLEN 0x00000001
#define CSR_PLLPWRDN 0x00000002
#define CSR_PLLRST 0x00000008
#define CSR_PLLSTABLE 0x00000040
#define DIV_ENABLE 0x00008000
#define EMIF_GCTL 0x01800000
#define EMIF_CE1 0x01800004
#define EMIF_CE0 0x01800008
#define EMIF_CE2 0x01800010
#define EMIF_CE3 0x01800014
#define EMIF_SDRAMCTL 0x01800018
#define EMIF_SDRAMTIM 0x0180001C
#define EMIF_SDRAMEXT 0x01800020
#define EMIF_CCFG 0x01840000;
#define SDRAM_BASE_ADDRESS 0x80000000
#define SDRAM_SIZE 0x400000
void init_emif( void )
{
*(int *)EMIF_GCTL = 0x00000078;
*(int *)EMIF_CE0 = 0xffffff93; /* CE0 SDRAM */
*(int *)EMIF_CE1 = 0xffffff13; /* CE1 asyn Flash 16-bit */
*(int *)EMIF_CE2 = 0x02208802; /* CE2 PSD RAM 8-it */
*(int *)EMIF_CE3 = 0x02208802; /* CE3 I/O 8-bit */
// *(int *)EMIF_SDRAMCTL = 0x53115000; /* SDRAM control */
// *(int *)EMIF_SDRAMTIM = 0x00000578; /* SDRAM timing (refresh) */
// *(int *)EMIF_SDRAMEXT = 0x000a8529; /* SDRAM Extension register */
}
void init_pll( void )
{
*(int *)PLL_CSR &= ~CSR_PLLEN;
*(int *)PLL_CSR |= CSR_PLLRST;
*(int *)PLL_DIV0 = DIV_ENABLE + 0;
*(int *)PLL_MULT = 2; // CPU_CLK 50MHz
// *(int *)PLL_MULT = 4; // CPU_CLK 100MHz
// *(int *)PLL_MULT = 6; // CPU_CLK 150MHz
// *(int *)PLL_MULT = 8; // CPU_CLK 200MHz
*(int *)PLL_OSCDIV1 = DIV_ENABLE + 3;
*(int *)PLL_DIV3 = DIV_ENABLE + 1;
*(int *)PLL_DIV2 = DIV_ENABLE + 1;
*(int *)PLL_DIV1 = DIV_ENABLE + 1; //CUP clk = pll out
*(int *)PLL_CSR &= ~CSR_PLLRST;
*(int *)PLL_CSR |= CSR_PLLEN;
// while(*(int *)PLL_CSR &0x00000040==0x0) {}
}
void interrupt time( void );
void initInterrupt(void);
void save_image(){
char fname[20],frame[5];
// FILE *file;
strcpy(fname,"C:\\");
sprintf(frame, "%d", frame_counter);
strcat(fname,frame);
if((file=fopen(fname,"wb"))==NULL)
return;
fwrite(ImageBuffer,1,IMAGE_WIDTH*IMAGE_HIGHT,file);
fclose(file);
}
unsigned char *p00; //for test mem
unsigned char tmp001; //for test mem
test(void)
{
tmp001=0x80; //for test mem
p00=test_;
for(i=0;i<0x300000;i++)
{
*p00=tmp001; //write
if(i%2==0)tmp001=0x80;
else tmp001=0x0;
}
for(i=0;i<0x300000;i++)
{
*p00=tmp001; //write
if(i%2==0)tmp001=0x80;
else tmp001=0x80;
}
for(i=0;i<0x300000;i++)
{
*p00=tmp001; //write
if(i%2==0)tmp001=0x80;
else tmp001=0x0;
}
for(i=0;i<0x300000;i++)
{
*p00=tmp001; //write
if(i%2==0)tmp001=0x80;
else tmp001=0x80;
}
for(i=0;i<0x300000;i++)
{
*p00=tmp001; //write
if(i%2==0)tmp001=0x80;
else tmp001=0x0;
}
}
mem_test(void)
{
unsigned short *p00; //for test mem
short tmp001; //for test mem
tmp001=0xaaaa; //for test mem
while(1)
{
p00=(unsigned short *)0x90000000;
for(i=0;i<0x80000;i++)
{
// tmp001=*p00; //read
p00++;
*p00=tmp001; //write
tmp001++;
}
}
}
/* ---------------------------------------*/
void main(){
init_pll();
init_emif();
tmp00=0x40;
ad_com_addr_p=AD_COM_ADDR1;
*ad_com_addr_p=tmp00;
CSL_init();
// EraseFlash();
clear_sampling();
stop_sampling();
test();
// mem_test();
// while(1)
ad_init();
cis_bright(BRIGHT);
get_sampling=1;
sampling_stop=0;
frame_counter=0;
get_sampling=1;
while(1)
{
if( get_sampling==1 ){
while( sampling_stop==0 ){
start_sampling();
start_edma();
while( frame_sam_end==0 ) { }
stop_sampling();
frame_process();
printf("\nf= %2d",frame_counter);
// save_image();
frame_counter++;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -