#include "gpp.h"
#include "gpt.h"
#include "dma.h"
#include "ppi.h"
#include "cam.h"
#include "lcd.h"
#include "sic.h"
#include "kbd.h"
#include "campreview.h"
#include "stdio.h"
#include "tws.h"
#define MAX_DMA_BLOCK 24 * 1280 //30k
#define MAX_DMA_BLOCK_240_320 23232 /*25*1024*/ /*30720*/ //siol.yu add to test 240*320 preview 8/30/2005 17:59 ,change to 30K to verify the DMA destination address
//=====================================================
//function declare
//=====================================================
static void DMA_Initialise( unsigned long startAddr, unsigned long block_size );
void PPI_DMARxHandler(void);
void DMA_Initalise_QVGA( unsigned long startAddr, unsigned long block_size );
void PPI_DMARxHandler_240_320(void);
static void CamInitialization(void);
void PPI_Configure( void );
void PPISEOF_InterruptHandler();
void CamPreview(void);
UINT16 CamCheckStatus();
UINT16 CamCheckRead();
UINT32 GetCapFrameLength();
void JpegEOFAdd(UINT8* JPEGRawStart, UINT32 rawDataLen);
void CamTestStatus();
void CamDelFocus();
UINT16 SensorWorkState;
/* Buffer Initialisation */
//two buffers in System SRAM
UINT8 * rxData1 = (UINT8 * ) 0x40060000;//64k
UINT8 * rxData2 = (UINT8 * ) 0x40070000;
//one buffer in External SRAM
//UINT8 * rxData3 = (UINT8 * ) 0x08004000;
UINT8 * rxData3 = (UINT8 * ) 0x40060000;
UINT8 * rxJpegData = (UINT8*)0x40060000/*0x08003000*/;
UINT8 * pJPEGCompleteFile=(UINT8*)0x08007000;//this buffer is used to store the complete JPEG file temporarily
/* Flag indicating DMA transfer finish, and this flag indicate that one preview frame finishes */
UINT16 rxDMAComplete = 0;
UINT32 g_j;
UINT32 displayPtr,displayPtr1;
UINT32 MAX_WORDS;//flag indicating how many data will be transderred
PPI_CONFIGURATION ppiConfig;
CAM_INFO cameraInfo;
CAM_FRAMERATE QCIF_FPS = FPS30;
#if ( defined (LIBERATOR_BYPASS) || defined (LIBERATOR_ISP) )
CAM_FRAMERATE SXGA_FPS = FPS8;
#else
CAM_FRAMERATE SXGA_FPS = FPS2;
#endif
//=====================================================
//function define
//=====================================================
void TsDelay(UINT8 delayms)
{
UINT16 i,j;
for(j=0;j<delayms;j++)
{
for(i=0;i<9000;i++)
i++;
}
}
/*****************************************************************************
Function: CamPreCfg
Description: pre configure the DMA channel and PPI relevant to preview
*****************************************************************************/
void micronSensor_Mono();
static void Blackfin_DMA_PPI_Configure (void)
{
GPP_PIN_INSTANCE pin;
PPI_INTERRUPT_STATUS status;
/*set the DMA channel's parameters, such as start address, */
DMA_Initialise( (unsigned long) & rxData3[0], MAX_WORDS * 2);
/* Enable DMA */
DMA_WriteChannelSetup(1, DMA_CHANNEL_ENABLE);
TsDelay(100);
CamInitialization();
TsDelay(300);
CamCheckStatus();
/* Configure PPI, PPI configuration register */
PPI_Configure();
PPI_SetupInterface(PPI_DISABLE);
/*Check the SEOF*/
PPI_WriteInterruptSetup ( PPI_INT_SEOF, PPI_INT_ENABLE );
}
static void DMA_Initialise( unsigned long startAddr, unsigned long block_size )
{
DMA_CHANNEL_CONFIG rxDMA;
DMA_CHANNEL_CONFIG chainRxDMA;
SIC_INTERRUPT_INSTANCE inst;
inst.group=1;
inst.priority=7;
inst.handler = PPI_DMARxHandler;
inst.setup= SIC_INT_ENABLE;
//diDISble DMA channel1, write 0 to address ChanEnable+0x40 to clear bit1(0x80000784+0x40)
DMA_WriteChannelSetup( 1, DMA_CHANNEL_DISABLE );//0x800007C4=0x02
if ((MAX_WORDS * 2) <= MAX_DMA_BLOCK)
{
/* Fill up the Rx DMA channel configuration parameters. */
rxDMA.id = 1;
rxDMA.sourceAddr = (unsigned long)( (PPI_RegisterList[PPI_PPIFIFOREG].addr));
rxDMA.destAddr = (unsigned long) rxData1;
rxDMA.notifyAddr = (unsigned long)(rxData1 + (block_size - 4));
rxDMA.transferMode = DMA_TM_LINEAR_FIX_INCR_STOP;//linear, Fix-to-Increment stop mode
rxDMA.transferSize = DMA_TS_32BIT;//transfer uint: Byte,HalfWord,Word,Unefined
rxDMA.transferOnestop = DMA_TO_NO_ONESTOP;//
DMA_ConfigureChannel( &rxDMA );
/* Map DMA Channel 1 interrupt source to DMA_INT_SPIRXI. */
DMA_MapInterruptSource( 1, DMA_INT_PPI );
/* Setup the DMA channel 1 interrupt. */
DMA_WriteInterruptSetup( DMA_INT_PPI, DMA_INT_ENABLE );//this sentence is to configure the DMAHWMask register
DMA_InstallChannelInterruptHandler(1,PPI_DMARxHandler);
}
else if ((MAX_WORDS*2 > MAX_DMA_BLOCK) && (MAX_WORDS < MAX_DMA_BLOCK))
{
/* Fill up the Rx DMA channel configuration parameters. */
rxDMA.id = 1;
rxDMA.sourceAddr = (unsigned long)( (PPI_RegisterList[PPI_PPIFIFOREG].addr));
rxDMA.destAddr = (unsigned long) rxData1; //buffer exist in sysrem SRAM
rxDMA.notifyAddr = (unsigned long)rxData1 + (MAX_DMA_BLOCK - 4);//maximum 32K bytes ,but we used 30k bytes as threshold
rxDMA.transferMode = DMA_TM_LINEAR_FIX_INCR_STOP; //
rxDMA.transferSize = DMA_TS_32BIT;
rxDMA.transferOnestop = DMA_TO_NO_ONESTOP;
DMA_ConfigureChannel( &rxDMA );
/* Fill up Chaining DMA Channel Configuration Parameters */
chainRxDMA.id = 17;
chainRxDMA.sourceAddr = (unsigned long)((PPI_RegisterList[PPI_PPIFIFOREG].addr));//FIFO read register
chainRxDMA.destAddr = (unsigned long)rxData1 + MAX_DMA_BLOCK;
chainRxDMA.notifyAddr = (unsigned long)rxData1 + block_size - 4;
chainRxDMA.transferMode = DMA_TM_LINEAR_FIX_INCR_STOP;
chainRxDMA.transferSize = DMA_TS_32BIT;
chainRxDMA.transferOnestop = DMA_TO_NO_ONESTOP;
DMA_ConfigureChannel( & chainRxDMA );
/* Map DMA Channel 1 interrupt source to DMA_INT_SPIRXI. */
DMA_MapInterruptSource( 1, DMA_INT_PPI );//IRQChan1Config[4:0](0x80000702)=0x1F.configure the DMA section of interrupt controller to be PPI
/* Setup the DMA channel 1 interrupt. */
DMA_WriteInterruptSetup( DMA_INT_PPI, DMA_INT_ENABLE ); //unmask the PPI interrupt--(0x80000780+0x20)=0x8000
/* Enable Chaing channel 1. */
DMA_WriteChainingSetup( 1, DMA_CM_ENABLE );
/* Install Channel Interrupt handler. */
DMA_InstallChannelInterruptHandler(1,PPI_DMARxHandler);
}
else
{
/* Fill up the Rx DMA channel configuration parameters. */
rxDMA.id = 1;
rxDMA.sourceAddr = (unsigned long)( (PPI_RegisterList[PPI_PPIFIFOREG].addr));
rxDMA.destAddr = (unsigned long) startAddr;
rxDMA.notifyAddr = (unsigned long) startAddr + (MAX_DMA_BLOCK - 2);
rxDMA.transferMode = DMA_TM_LINEAR_FIX_INCR_STOP;
rxDMA.transferSize = DMA_TS_32BIT;
rxDMA. transferOnestop = DMA_TO_NO_ONESTOP;
DMA_ConfigureChannel( &rxDMA );
/* Fill up Chaining DMA Channel Configuration Parameters */
chainRxDMA.id = 17;
chainRxDMA.sourceAddr = (unsigned long)((PPI_RegisterList[PPI_PPIFIFOREG].addr));
chainRxDMA.destAddr = (unsigned long) startAddr + MAX_DMA_BLOCK;
chainRxDMA.notifyAddr = (unsigned long) startAddr + (2 * (MAX_DMA_BLOCK - 1));
chainRxDMA.transferMode = DMA_TM_LINEAR_FIX_INCR_STOP;
chainRxDMA.transferSize = DMA_TS_32BIT;
chainRxDMA.transferOnestop = DMA_TO_NO_ONESTOP;
DMA_ConfigureChannel( & chainRxDMA );
/* Map DMA Channel 1 interrupt