#include <defBF532.h>

#include "ppi.h"
#include "const.h"
#include "flag.h"
	
unsigned short ppi_control_value ;
unsigned short dma_config;

//#define ANALOG_CAM 1
//int get_camera_type(void);
void
PPI_Interface_Enable(unsigned long no_of_lines)
{	
	unsigned short ppi_flag_input;
	unsigned short ACTV_FIELD;

// program flags 12, 13, 14 and 15 are configured 
// to take in PPI databits 7, 6, 5 and 4 resp.

	ppi_flag_input = (unsigned short) (PPI_PF12 | PPI_PF13 | PPI_PF14 | PPI_PF15 );
	Flag_Setting(ppi_flag_input,INPUT);
//	if(get_camera_type()==ANALOG_CAM)
//	{
//		ACTV_FIELD = (ACTV_FIELD_1 << FLD_SEL_SHIFT)|(PORT_CFG_INVALID << PORT_CFG_SHIFT);
//	}
//	else
//	{
	    	ACTV_FIELD = (ACTV_FIELD_1_2 << FLD_SEL_SHIFT)|(PORT_CFG_INVALID << PORT_CFG_SHIFT);
//	}



// to hold the number of lines expected per frame
	*(unsigned short *)	PPI_FRAME = (unsigned short)(no_of_lines);
// setting the ppi control value
	ppi_control_value = (unsigned short)((POL_NON_INV << POL_SHIFT)|(DLEN_8 << DLENGTH_SHIFT)|
						(INVALID_SKIP << SKIP_EO_SHIFT)|(SKIP_DISABLE << SKIP_EN_SHIFT)|
						(DMA32_ENABLE << DMA32_SHIFT)|(PACK_ENABLE << PACK_EN_SHIFT)|
						ACTV_FIELD|	
//						(INVALID_ACTV << FLD_SEL_SHIFT)|(PORT_CFG_INVALID << PORT_CFG_SHIFT)|
						(ACTIVE_FIELD << XFR_TYPE_SHIFT)|(PPI_RECEIVE << PORT_DIR_SHIFT)|
//						(ENTIRE_FIELD << XFR_TYPE_SHIFT)|(PPI_RECEIVE << PORT_DIR_SHIFT)|
						(PPI_ENABLE << PORT_EN_SHIFT));
						
	ppi_control_value=0xC1AC|(PPI_ENABLE << PORT_EN_SHIFT);						 // For Micron
	
		
	*(unsigned short *)PPI_COUNT=640*2 -1;
	*(unsigned short *)PPI_DELAY = 0x13e;//0x02;
	*(unsigned short *)PPI_FRAME = 480;

	*(unsigned short *) PPI_CONTROL = (unsigned short)ppi_control_value;
	
}

// Enabling the DMA channel 0 for PPI
void
PPI_DMA_Enable(unsigned long PPI_Dma_Adress,unsigned long x_count, unsigned long y_count)
{
	
	dma_config = ( DI_EN | /*DI_SEL |*/ DMA2D | WDSIZE_16 | WNR | DMAEN );
	
	*(unsigned short *)DMA0_PERIPHERAL_MAP  = (unsigned short)0x0000 ;
	asm("ssync;");
 	*(unsigned long *)DMA0_START_ADDR	=(unsigned long)PPI_Dma_Adress;
	asm("ssync;");
 	*(unsigned short *)DMA0_X_COUNT	= (unsigned short)x_count;
	asm("ssync;");
// 	*(unsigned short *)DMA0_X_MODIFY = (unsigned short)X_MODIFY_VALUE;
 	*(unsigned short *)DMA0_X_MODIFY = (unsigned short)2;
	asm("ssync;");
 	*(unsigned short *)DMA0_Y_COUNT	= (unsigned short)y_count;
	asm("ssync;");
// 	*(unsigned short *)DMA0_Y_MODIFY = (unsigned short)Y_MODIFY_VALUE;	
 	*(unsigned short *)DMA0_Y_MODIFY = (unsigned short)2;	
	asm("ssync;");
 	
 	*(unsigned short *)DMA0_CONFIG	= (unsigned short) dma_config;
	asm("ssync;");

}

extern unsigned int last_interrupt_number;

void
PPI_Interface_Disable()
{	
	last_interrupt_number = 812;

	*(unsigned short *)PPI_CONTROL = 0;
	*(unsigned short *)DMA0_CONFIG	= 0;
	last_interrupt_number = 813;
}

void
Enable_PPI_DMA_Interface()
{
 	*(unsigned short *)DMA0_CONFIG	= (unsigned short) dma_config;
	asm("ssync;");
	
	*(unsigned short *)PPI_COUNT=640*2 -1;
	*(unsigned short *)PPI_DELAY = 0x13e;//0x02;
	*(unsigned short *)PPI_FRAME = 480;
	
	
	*(unsigned short *)PPI_CONTROL = (unsigned short)ppi_control_value;
	asm("ssync;");
}

void
Enable_PPI_DMA(unsigned long PPI_Dma_Adress)
{
  	*(unsigned long *)DMA0_START_ADDR	=(unsigned long)PPI_Dma_Adress;
	asm("ssync;");
	*(unsigned short *)DMA0_CONFIG	= (unsigned short) dma_config;
	asm("ssync;");
	*(unsigned short *)PPI_CONTROL = (unsigned short)ppi_control_value;
	asm("ssync;");
	
}


