⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 demone-6201.c

📁 瑞泰公司ICETEK-YUV图像子系统设计范例
💻 C
字号:
#include <stdio.h>
#include <c6x.h>
#include "flash.h"
#define BASE_ADDR		0x01400000
#define	I2C_REG			0x1600004
#define SYSRREG			0x160000c
#define	VIDEO_ADD		BASE_ADDR
#define GBLCTL			0x01800000
#define CE2CTL			0x01800010
#define EVM_CPLD_CTRL	0x0178001c


#define	Y_ADD			0x80100000
#define U_ADD			0x80200000
#define V_ADD			0x80280000

unsigned int * y_ptr;
unsigned int * u_ptr;
unsigned int * v_ptr;
unsigned int * cv_ptr;
unsigned int * video_ptr;
unsigned int * lut;
/*******************************************************************************
* Function prototypes
*******************************************************************************/
void led_blink(int count, int ms_period);
void delay_msec(short msec);
int  timer0_read();
void timer0_start();
void timer0_init();
unsigned int get_ioport(void);

unsigned int 	count; 
int ms_period = 1;                                   

unsigned int get_ioport(void);
#define		COLORBAR	0xc7;
#define		WORKCOLOR	0x47;

/*******************************************************************************
* IIC Function prototypes
*******************************************************************************/
void start_i2c(void);
void stop_i2c(void);
void ack_i2c(void);
void write_i2c(unsigned char data);

void Init_7111(void);
void Init_7190(void);
unsigned char val713_1[25] = {	
				     0xf8,0xc0,0x33,0x00,0x00,0xe9,0x0d,
				0xb8,0x01,0x80,0x47,0x40,0x00,0x01,0x2a,
				0x00,0x0c,0x38,0x00,0x00};
unsigned char val713_2[4] = {
				0x00,0x00,0x00,0x00};

unsigned char val713_3[0x21] = {
				0x1f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,							
				0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,							
				0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,							
				0x00,0x54,0x07,0x83,0xff,0xff,0x00,0x00};							

unsigned char val76[0x36] = {	
				0x11,0x20,0x62,0x00,0x00,0x00,0x00,0x00,
				0x04,0x00,0x08,0x00,0xcb,0x8a,0x09,0x2a,
				0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
				0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
				0x00,0x00,0x00,0x44,0x20,0x00,0xff,0xff,
				0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
				0xff,0xff,0xff,0xff,0xff,0x70};
	
				
/*******************************************************************************
* Video Function prototypes
*******************************************************************************/
void WriteAPIC(int pixel);								                             
unsigned int chip_id;
unsigned int temp;
                                
/*******************************************************************************
* FUNCTION : main
*******************************************************************************/
int main()
{
//	unsigned int io_port_values;//,user_dip_settings;
	int i,j,ii,y_dat,u_dat,v_dat,temp[4],t;
/* DSP initialization                                      		*/
	CSR=0x100;			/* Disable all interrupts            	*/
	IER=1;				/* Disable all interrupts except NMI 	*/
	ICR=0xffff;			/* Clear all pending interrupts      	*/

	//*(unsigned volatile int *)EMIF_GCR = 0x3300;    	/* EMIF global control      		*/
	*(unsigned volatile int *)EMIF_CE1 = CE1_32;    	/* EMIF CE1 control, 32bit  		*/
	//*(unsigned volatile int *)EMIF_SDCTRL = 0x07126000; 	/* EMIF SDRAM control   		*/
	//*(unsigned volatile int *)EMIF_CE0 = 0x30;      	/* EMIF CE0 control         		*/
	//*(unsigned volatile int *)EMIF_SDRP = 0x61a;    	/* EMIF SDRM refresh period 		*/
	//*(unsigned volatile int *)EMIF_SDEXT= 0x54529;  	/* EMIF SDRM extension      		*/
/* Read space 	*/
/*	*(unsigned volatile int *)EMIF_CE2 = 0x00904323;	*/	/* EMIF CE2 control         		*/
	//*(unsigned volatile int *)EMIF_CE2 = CE2_32_max;            
/* Write space */	
	//*(unsigned volatile int *)EMIF_CE3 = CE3_32;		/* EMIF CE3 control			*/
	*(unsigned int *)GBLCTL=0x3378;
	*(unsigned int *)CE2CTL=0xffff3f23;
	*(unsigned int *)EVM_CPLD_CTRL=0x2;
	
	delay_msec(ms_period/2);
	
	for(i=0;i<0xff;i++){
	//for(;;){
		start_i2c();
		stop_i2c();
		delay_msec(5);
		}	    
//for(;;)
	Init_7190();
	for(j=0;j<0x5;j++)
		for(ii=0;ii<0x5;ii++);
	Init_7111();
	while(1){
		video_ptr = (unsigned int *)VIDEO_ADD;
		for(i=0;i<0x7fffff;i++);
		*(unsigned volatile int *)SYSRREG = 0x9;
		for(i=0;i<0x7fffff;i++);
		*(unsigned volatile int *)SYSRREG = 0xc;
		for(i=0;i<0x7fffff;i++);
		*(unsigned volatile int *)SYSRREG = 0xa;
		cv_ptr = (unsigned int *)VIDEO_ADD;
		y_ptr = (unsigned int *)Y_ADD;
		u_ptr = (unsigned int *)U_ADD;
		v_ptr = (unsigned int *)V_ADD;
		for(i=0;i<576;i++){
			cv_ptr += 2048;
			for(j=0;j<720/4;j++){
				for(ii=0;ii<4;ii++)
					temp[ii] = *(cv_ptr + j*4 + ii);
				u_dat = temp[3] & 0xff;
				u_dat <<= 8;
				u_dat |= temp[2] & 0xff;
				u_dat <<= 8;
				u_dat |= temp[1] & 0xff;
				u_dat <<= 8;
				u_dat |= temp[0] & 0xff;
				*u_ptr++ = u_dat;
				t = temp[3] & 0xff0000;
				t >>= 16;
				v_dat = t;
				v_dat <<= 8;
				t = temp[2] & 0xff0000;
				t >>= 16;
				v_dat |= t;
				v_dat <<= 8;
				t = temp[1] & 0xff0000;
				t >>= 16;
				v_dat |= t;
				v_dat <<= 8;
				t = temp[0] & 0xff0000;
				t >>= 16;
				v_dat |= t;
				*v_ptr++ = v_dat;
				t = temp[1] & 0xff000000;
				t >>= 24;
				y_dat = t;
				y_dat <<= 8;
				t = temp[1] & 0xff00;
				t >>= 8;
				y_dat |= t;
				y_dat <<= 8;
				t = temp[0] & 0xff000000;
				t >>= 24;
				y_dat |= t;
				y_dat <<= 8;
				t = temp[0] & 0xff00;
				t >>= 8;
				y_dat |= t;
				*y_ptr++ = y_dat;
				t = temp[3] & 0xff000000;
				t >>= 24;
				y_dat = t;
				y_dat <<= 8;
				t = temp[3] & 0xff00;
				t >>= 8;
				y_dat |= t;
				y_dat <<= 8;
				t = temp[2] & 0xff000000;
				t >>= 24;
				y_dat |= t;
				y_dat <<= 8;
				t = temp[2] & 0xff00;
				t >>= 8;
				y_dat |= t;
				*y_ptr++ = y_dat;
			}
		}
		video_ptr = (unsigned int *)VIDEO_ADD;
		for(i=0;i<576;i++)
			for(j=0;j<1024;j++){
				ii = *video_ptr;
			//	ii &= 0xff00ff00;
			//	ii |= 0x00800080;
				ii=0x10801080;
				*video_ptr = ii;
				video_ptr++;
				}
		*(unsigned volatile int *)SYSRREG = 0xc;
 		for(i=0;i<0x7fffff;i++);
		for(i=0;i<0x7fffff;i++);
		*(unsigned volatile int *)SYSRREG = 0xa;
		video_ptr = (unsigned int *)VIDEO_ADD;
		for(i=0;i<576;i++)
			for(j=0;j<1024;j++){
				ii = *video_ptr;
				t = ii >>24;
				t &= 0x0ff;
				if ((t > 0x20)&&(t < 0xc0)){
					ii &= 0x00ffffff;
					ii |= 0x1000000;
					}
				t = ii >> 8;
				t &= 0x0ff;
				if ((t > 0x20)&&(t < 0xc0)){
					ii &= 0xffff00ff;
					ii |= 0x0000100;
					 					}
				*video_ptr = ii;
				video_ptr++;
				}
		*(unsigned volatile int *)SYSRREG = 0xc;
		for(i=0;i<0x7fffff;i++);
		for(i=0;i<0x7fffff;i++);
		*(unsigned volatile int *)SYSRREG = 0xa;
		video_ptr = (unsigned int *)VIDEO_ADD;
		for(i=0;i<576;i++)
			for(j=0;j<1024;j++){
				ii = *video_ptr;
				ii &= 0x80ff80ff;
				*video_ptr = ii;
				video_ptr++;
				}
		*(unsigned volatile int *)SYSRREG = 0xc;
		for(i=0;i<0x7fffff;i++);
		for(i=0;i<0x7fffff;i++);
		
		video_ptr = (unsigned int *)VIDEO_ADD;
		cv_ptr = (unsigned int *)Y_ADD;
		for(i=0;i<576;i++)
			for(j=0;j<1024;j++){
				temp[0] = *video_ptr++;
				temp[1] = *video_ptr++;
				t = temp[1] & 0xff000000;
				t >>= 24;
				y_dat = t;
				y_dat <<= 8;
				t = temp[1] & 0xff00;
				t >>= 8;
				y_dat |= t;
				y_dat <<= 8;
				t = temp[0] & 0xff000000;
				t >>= 24;
				y_dat |= t;
				y_dat <<= 8;
				t = temp[0] & 0xff00;
				t >>= 8;
				y_dat |= t;
				*cv_ptr++ = y_dat;
				}
		}
			
/*	i = 0xf;//i = 0xf cpld write video data,i = 0x7 dsk read video data. bit3
	for(ii=0;ii<0x10;ii++)
		*(unsigned volatile int *)I2C_REG = i;
	while(1){
		for(ii=0;ii<8;ii++)
		if (i==15)
				*(unsigned volatile int *)I2C_REG = i;
		else{		
			j = *(unsigned volatile int *)SYSRREG;
		if((j&0x1)==1)
			for(ii=0;ii<0x10;ii++)
				*(unsigned volatile int *)I2C_REG = i;
			}
		}
*/
}

/*******************************************************************************
* FUNCTION : led_blink
*
* ARGUMENTS :
*   INT count             <-- Number of times to blink the LEDs
*   INT ms_period         <-- Time the LED(s) is(are) active (illuminated)
*
* DESCRIPTION :
*   Toggles the user LEDs for a given count and period (in milliseconds).
*
* OUTPUTS :
*   VOID
*
*******************************************************************************/
void led_blink(int count, int ms_period)
{
  int i;

  for (i=0;i<count;i++)
  {
    *(unsigned volatile int *)IO_PORT = 0x02000000;        /* Turn on all user LEDs */
    delay_msec(ms_period/2);
    *(unsigned volatile int *)IO_PORT = 0x05000000; /* Turn off all user LEDs*/
    delay_msec(ms_period/2);
  }
  *(unsigned volatile int *)IO_PORT = 0x7000000;   /* Turn off all user LEDs */
}

/*******************************************************************************
* FUNCTION : delay_msec
*
* ARGUMENTS :
*   SHORT msec            <-- Period to delay in milliseconds
*
* DESCRIPTION :
*
*
* OUTPUTS :
*   VOID
*
*******************************************************************************/
void delay_msec(short msec)
{
  /* Assume 150 MHz CPU, timer peirod = 4/150 MHz */
/*  int timer_limit = (msec*9375)<<2;			*/
  /*int timer_limit = (msec*9375);
  int time_start;

  timer0_start();
  time_start = timer0_read();
  while ((timer0_read()-time_start) < timer_limit);*/
  int i;
  for(i=0;i<0x1000;i++);
}

/*******************************************************************************
* FUNCTION : timer0_read
*
* ARGUMENTS :
*   VOID
*
* DESCRIPTION :
*   Read and return the count in timer 0.
*
* OUTPUTS :
*   INT                   <-- Returns the count in timer 0
*
*******************************************************************************/
int timer0_read()
{
  int i;

  i = *(unsigned volatile int *)TIMER0_COUNT;
  return i;
}

/*******************************************************************************
* FUNCTION : timer0_start
*
* ARGUMENTS :
*   VOID
*
* DESCRIPTION :
*   Start timer 0 after initializing it for 32-bit count and no interrupt.
*
* OUTPUTS :
*   VOID
*
*******************************************************************************/
void timer0_start()
{
  /* Hold the timer */
  *(unsigned volatile int *)TIMER0_CTRL &= 0xff3f;

  /* Use CPU CLK/4 */
  *(unsigned volatile int *)TIMER0_CTRL |= 0x200;

  /* Set for 32 bit counter */
  *(unsigned volatile int *)TIMER0_PRD  |= 0xffffffff;

  /* Start the timer */
  *(unsigned volatile int *)TIMER0_CTRL |= 0xC0;
}

/*******************************************************************************
* FUNCTION : timer0_init
*
* ARGUMENTS :
*   VOID
*
* DESCRIPTION :
*   Start timer 0 after initializing it for a short period (~13.7 micro seconds)
*   with interrupt.
*
* OUTPUTS :
*   VOID
*
*******************************************************************************/
void timer0_init()
{
  /* Hold the timer */
  *(unsigned volatile int *)TIMER0_CTRL &= 0xff3f;

  /* Use CPU CLK/4 */
  *(unsigned volatile int *)TIMER0_CTRL |= 0x200;

  /* Set for a short period */
  *(unsigned volatile int *)TIMER0_PRD   = 0x200;

  /* Start the timer, enable timer0 int */
  *(unsigned volatile int *)TIMER0_CTRL |= 0x3C0;
}
unsigned int get_ioport(void)
{
  return(*(unsigned volatile int *)IO_PORT);
}

void start_i2c(void)
{
	*(unsigned volatile int *)I2C_REG = 0x025;		/*	"00100101":sda,scl = '1' */
	delay_msec(1);
	*(unsigned volatile int *)I2C_REG = 0x024;		/*	"00100100":sda= '0',scl = '1' */
	delay_msec(1);
}
void stop_i2c(void)
{	
	*(unsigned volatile int *)I2C_REG = 0x024;		/*	"00100101":sda = '0',scl = '1' */
	delay_msec(1);
	*(unsigned volatile int *)I2C_REG = 0x025;		/*	"00100101":sda,scl = '1' */
	delay_msec(1);
}		
void ack_i2c(void)
{
	*(unsigned volatile int *)I2C_REG = 0x020;		/*	"00100101":sda='z',scl = '0' */
	*(unsigned volatile int *)I2C_REG = 0x022;		/*	"00100101":sda='z',scl = '0' */
	delay_msec(1);
	*(unsigned volatile int *)I2C_REG = 0x026;		/*	"00100101":sda='z',scl = '1' */
	delay_msec(1);
	*(unsigned volatile int *)I2C_REG = 0x022;		/*	"00100101":sda='z',scl = '0' */
	delay_msec(1);
	*(unsigned volatile int *)I2C_REG = 0x021;		/*	"00100101":sda='1',scl = '0' */
	delay_msec(1);
}	
void write_i2c(unsigned char data)
{
	unsigned char BitCounter = 8;
	unsigned char temp;
	unsigned int reg_val;
	
	reg_val = 0x020;
	*(unsigned volatile int *)I2C_REG = 0x20;		/*SCL 置低 sda 置低*/
	delay_msec(1);						/*延时*/
	do{
		temp = data;
		reg_val &= 0x0fffffffb;
		*(unsigned volatile int *)I2C_REG = reg_val;		/*SCL 置低*/
		delay_msec(1);						/*延时*/
		
		if((temp&0x80)==0x80)
			reg_val |= 0x01;	/*如果最高位是1*/
		else
			reg_val &= 0x0fffffe;
		*(unsigned volatile int *)I2C_REG = reg_val;		/*设置SDA*/
		delay_msec(1);						/*延时*/

		reg_val |= 0x004;
		*(unsigned volatile int *)I2C_REG = reg_val;		/*SCL 置高*/
		delay_msec(1);						/*延时*/

		temp = data<<1;
		data = temp;
		BitCounter --;
	}while(BitCounter);

	reg_val &= 0x0fffffffb;
	*(unsigned volatile int *)I2C_REG = reg_val;		/*SCL 置低*/
	delay_msec(3);						/*延时*/
}	

void Init_7111(void)
{
	int i;
	
	start_i2c();
	write_i2c(0x4a);			
	ack_i2c();
	write_i2c(0x01);
	ack_i2c();
	for(i=0;i<0x14;i++){
		write_i2c(val713_1[i]);
		ack_i2c();
		}
	stop_i2c();
	delay_msec(1);

	start_i2c();
	write_i2c(0x4a);			
	ack_i2c();
	write_i2c(0x15);
	ack_i2c();
	for(i=0;i<4;i++){
		write_i2c(val713_2[i]);
		ack_i2c();
		}
	stop_i2c();
	delay_msec(1);
	
	start_i2c();
	write_i2c(0x4a);			
	ack_i2c();
	write_i2c(0x40);
	ack_i2c();
	for(i=0;i<0x20;i++){
		write_i2c(val713_3[i]);
		ack_i2c();
		}
	stop_i2c();
	delay_msec(1);
	
}
void Init_7190(void)
{
	int i;

	start_i2c();
	write_i2c(0xd6);	
	ack_i2c();
	write_i2c(0x00);	
	ack_i2c();
	for(i=0x0;i<0x36;i++){
		write_i2c(val76[i]);
		ack_i2c();
	}
	stop_i2c();
	delay_msec(5);
}

/* END OF FILE */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -