//C6xdskinit.c Init DSK,AD535,McBSP(includes functions provided with DSK)

#include <c6x.h>
#include "c6xdsk.h"
#include "c6xdskinit.h"
#include "c6xinterrupts.h"

char polling = 0;

void mcbsp0_init()    				 //set up McBSP0   
{
 *(unsigned volatile int *)McBSP0_SPCR = 0;	 //reset serial port 
 *(unsigned volatile int *)McBSP0_PCR = 0;       //set pin control reg
 *(unsigned volatile int *)McBSP0_RCR = 0x10040; //set rx control reg one 16 bit data/frame 
 *(unsigned volatile int *)McBSP0_XCR = 0x10040; //set tx control reg one 16 bit data/frame 
 *(unsigned volatile int *)McBSP0_DXR = 0;   
 *(unsigned volatile int *)McBSP0_SPCR = 0x12001;//setup SP control reg
}

void mcbsp0_write(int out_data)	 //function for writing
{
 int temp;
 
 if (polling)		 	 //bypass if interrupt-driven
 {  
  temp = *(unsigned volatile int *)McBSP0_SPCR & 0x20000;
  while ( temp == 0)
    temp = *(unsigned volatile int *)McBSP0_SPCR & 0x20000;
 }        
 *(unsigned volatile int *)McBSP0_DXR = out_data;
}

int mcbsp0_read()		 //function for reading
{
 int temp;

 if (polling)
 {
  temp = *(unsigned volatile int *)McBSP0_SPCR & 0x2;
  while ( temp == 0)
    temp = *(unsigned volatile int *)McBSP0_SPCR & 0x2;
 }  
 temp = *(unsigned volatile int *)McBSP0_DRR;
 return temp;
}
 
void TLC320AD535_Init()		//init AD535
{
  mcbsp0_read();		//setting up AD535 Register 3  
  mcbsp0_write(0); 
  mcbsp0_read();
  mcbsp0_write(0);
  mcbsp0_read();
  mcbsp0_write(0);
  mcbsp0_read();
  mcbsp0_write(1);       	//send bit for Secondary Communications 
  mcbsp0_read();
  mcbsp0_write(0x0386);  	//voice channel reset,pre-amps selected 
  mcbsp0_read();
  mcbsp0_write(0);       	//clear Secondary Communications 
  mcbsp0_read();
  mcbsp0_write(0);
  mcbsp0_read();
  mcbsp0_write(0);
  mcbsp0_read();
  mcbsp0_write(1);       	//send bit for Secondary Communications 
  mcbsp0_read();
  mcbsp0_write(0x0306);   	//voice channel clear reset,pre-amps selected 
  mcbsp0_read();
  mcbsp0_write(0);       	//clear Secondary Communications 
  mcbsp0_read();    
  
  mcbsp0_write(0);		//setting up AD535 Register 4 
  mcbsp0_read();
  mcbsp0_write(0);
  mcbsp0_read();
  mcbsp0_write(1);
  mcbsp0_read();
  mcbsp0_write(0x0400);  	//set microphone pre-amp gain to 20 dB 
  mcbsp0_read();
  mcbsp0_write(0);
  mcbsp0_read();

  mcbsp0_write(0);		//setting up AD535 Register 5 
  mcbsp0_read();
  mcbsp0_write(0);
  mcbsp0_read();
  mcbsp0_write(1);
  mcbsp0_read();
  mcbsp0_write(0x0502);  	//DAC PGA = 0 dB 
  mcbsp0_read();
  mcbsp0_write(0);
  mcbsp0_read();
}   

void c6x_dsk_init()       			     //dsp and peripheral init
{
 CSR=0x100;    	       				     //disable all interrupts             
 IER=1;                   			     //disable interrupts except NMI  
 ICR=0xffff;              			     //clear pending interrupts       
 *(unsigned volatile int *)EMIF_GCR = 0x3300; 	     //EMIF global control          
 *(unsigned volatile int *)EMIF_CE0 = 0x30;          //EMIF CE0 control              
 *(unsigned volatile int *)EMIF_CE1 = 0xffffff03;    //EMIF CE1 control,8bit async 
 *(unsigned volatile int *)EMIF_SDCTRL = 0x07117000; //EMIF SDRAM control           
 *(unsigned volatile int *)EMIF_SDRP = 0x61a;        //EMIF SDRM refresh period     
 *(unsigned volatile int *)EMIF_SDEXT = 0x54519;     //EMIF SDRAM extension        
 mcbsp0_init();
 TLC320AD535_Init();
}   

void comm_poll()			//for communication/init using polling
{
   polling = 1; 			//if polling
   c6x_dsk_init();			//call init DSK function
}  

void comm_intr()			//for communication/init using interrupt
{ 
  polling = 0;				//if interrupt-driven
  c6x_dsk_init();			//call init DSK function
  config_Interrupt_Selector(11, XINT0); //using transmit interrupt INT11
  enableSpecificINT(11);                //for specific interrupt
  enableNMI();              		//enable NMI
  enableGlobalINT(); 			//enable GIE for global interrupt
  mcbsp0_write(0);   			//write to SP0
}    

void output_sample(int out_data)        //added for output
{
  mcbsp0_write(out_data & 0xfffe);      //mask out LSB
}


int input_sample()                      //added for input
{
   return mcbsp0_read();		//read from McBSP0
}