📄 new_camif.c
字号:
#include "omap30.h"
#include "omap1510.h"
#include "new_camif.h"
#include "new_i2c.h"
#ifndef CAMERA_INT
#define CAMERA_INT 1
#endif
volatile unsigned long* pCAMIF_CTRLCLOCK = (unsigned long*)0xFFFB6800;
volatile unsigned long* pCAMIF_IT_STATUS = (unsigned long*)0xFFFB6804;
volatile unsigned long* pCAMIF_MODE = (unsigned long*)0xFFFB6808;
volatile unsigned long* pCAMIF_STATUS = (unsigned long*)0xFFFB680C;
volatile unsigned long* pCAMIF_CAMDATA = (unsigned long*)0xFFFB6810;
volatile unsigned long* pCAMIF_GPIO = (unsigned long*)0xFFFB6814;
volatile unsigned long* pCAMIF_PEAK_COUNTER = (unsigned long*)0xFFFB6818 ;
volatile unsigned char* pEpldCamPwr = (unsigned char*)0x0800020C;
// clock register
volatile unsigned short * pARM_IDLECT2 = (unsigned short *) 0xFFFECE08;
//ARM_IDLECT2
#define EN_XORPC_CK 0x002
//clock reset peripheral pin
volatile unsigned short * pARM_RSTCT2 = (unsigned short *) 0xFFFECE14;
volatile unsigned short * pDMA_GCR = (unsigned short *) 0xFFFEDC00 ;
//ARM_RSTCT2
#define PER_EN 0x01;
#define ImageWidth 176
#define ImageHeight 144
volatile unsigned short flgReady = 0x0000;
volatile unsigned short cdsa_u;
extern volatile short buffer_writable;
extern volatile short buffer_writen;
static int buf_one = 0;
static int buf_two = 0;
volatile unsigned char reg = 0, data;
/*---------------------------------------------------------------------------*/
void InitCamera(void)
{
//CameraSetPowerState(cam_PowerOn);
InitI2c();
camif_init();
dma_init();
camera_start() ;
CameraI2CSettings();
WaitForVsync();
cdsa_u = 0x1060;
dma_setupcamif();
}
/*---------------------------------------------------------------------------*/
#if 0
void CameraSetPowerState(unsigned char ucCamPwr)
{
if (ucCamPwr)
*pEpldCamPwr &= ~0x4;
else
*pEpldCamPwr |= 0x4;
}
#endif
/*---------------------------------------------------------------------------*/
void camif_init(void)
{
// Camera interrupt
INTH2_InitLevel(CAMERA_INT,
INTH_IRQ, // InterruptKind Irq or Fiq
INTH_HIGHEST_PRIORITY, // priority
INTH_LOW_LEVEL_SENSITIVE); // type level or edge
INTH2_EnableOneIT(CAMERA_INT, INTH_IRQ);
//enable peripheral reset
*pARM_RSTCT2 |= PER_EN;
//enable peripheral clock
*pARM_IDLECT2 |= EN_XORPC_CK;
// take camera out of reset
*pCAMIF_GPIO = 0x00000001;
{
int i;
for(i = 0; i < 1000; i++);
}
//asm("zzz: b zzz");
*pCAMIF_GPIO = 0x00000000;
// set mode register
//Enable Vsync interrupt, enable DMA, set FIFO trigger =1, QCIF, not swapped
//*pCAMIF_MODE = 0x00000312;
//Enable Vsync interrupt, enable DMA, set FIFO trigger =1, QVGA, not swapped
// QVGA: 320*240
*pCAMIF_MODE = 0x00000316;
//set clock control register
//*pCAMIF_CTRLCLOCK = 0x000000F6; //External 48Mhz / 6 = 8 MHz
// Enable LCLK, DPLL source(48M), internal interface clock, Disable EXCLK
*pCAMIF_CTRLCLOCK = 0x000000E5; //External 48Mhz / 2 = 24 MHz
//*pCAMIF_CTRLCLOCK = 0x000000F4; //External 48Mhz / 5 = 9.6 MHz
//*pCAMIF_CTRLCLOCK = 0x000000B2; //Internal 12Mhz / 2 = 6 MHz
//*pCAMIF_CTRLCLOCK = 0x000000A0; //Internal 12Mhz / 1 = 12 MHz
}
/*---------------------------------------------------------------------------*/
void camera_start(void)
{
// Enable EXCLK
*pCAMIF_CTRLCLOCK |= 0x00000010;
}
/*---------------------------------------------------------------------------*/
void CameraI2CSettings(void)
{
char ret_val;
while(ret_val=WriteI2c(CameraID, 0x12, 0xE0));
while(ret_val=WriteI2c(CameraID, 0x12, 0x60));
while(ret_val=WriteI2c(CameraID, 0x11, 0x81));//0x81
while(ret_val=WriteI2c(CameraID, 0x0c, 0x28));
while(ret_val=WriteI2c(CameraID, 0x2D, 0x2c))
while(ret_val=WriteI2c(CameraID, 0x2E, 0x00))
while(ret_val=WriteI2c(CameraID, 0x03, 0x40));
while(ret_val=WriteI2c(CameraID, 0x01, 0x80));
while(ret_val=WriteI2c(CameraID, 0x02, 0x80));
while(ret_val=WriteI2c(CameraID, 0x04, 0xf0));
while(ret_val=WriteI2c(CameraID, 0x09, 0x0e));
while(ret_val=WriteI2c(CameraID, 0x32, 0x00));
while(ret_val=WriteI2c(CameraID, 0x0d, 0x00));
while(ret_val=WriteI2c(CameraID, 0x13, 0xf7));
while(ret_val=WriteI2c(CameraID, 0x33, 0xc0));
while(ret_val=WriteI2c(CameraID, 0x35, 0x90));
while(ret_val=WriteI2c(CameraID, 0x36, 0x37));
while(ret_val=WriteI2c(CameraID, 0x15, 0x22));
/*
while(ret_val=WriteI2c(CameraID, 0x12, 0xE0));
while(ret_val=WriteI2c(CameraID, 0x12, 0x60));
while(ret_val=WriteI2c(CameraID, 0x11, 0xC0));//0x81
while(ret_val=WriteI2c(CameraID, 0x09, 0x03));
while(ret_val=WriteI2c(CameraID, 0x0d, 0x00));
while(ret_val=WriteI2c(CameraID, 0x13, 0x17));
while(ret_val=WriteI2c(CameraID, 0x33, 0xc0));
while(ret_val=WriteI2c(CameraID, 0x35, 0x90));
while(ret_val=WriteI2c(CameraID, 0x36, 0x37));
while(ret_val=WriteI2c(CameraID, 0x15, 0xA2));
// Reset chip,SVGA, MASTER,output only pixels defined by window registers
//2 channel ADC
while(ret_val=WriteI2c(CameraID, 0x12, 0xE0));
while(ret_val=WriteI2c(CameraID, 0x12, 0x60));
//SET USE EXCLK AND Clock divider AND DISABLE DPLL
while(ret_val=WriteI2c(CameraID, 0x11, 0xC0));
while(ret_val=WriteI2c(CameraID, 0x13, 0x10));
//while(ret_val=WriteI2c(CameraID, 0x12, 0x60));
//while(ret_val=WriteI2c(CameraID, 0x2D, 0x1));
while(ret_val=WriteI2c(CameraID, 0x15, 0xA2));
*/
//V START:0X5A /V END:0XD2
while(ret_val=WriteI2c(CameraID, 0x19, 0x10));
while(ret_val=WriteI2c(CameraID, 0x1A, 0x10+45));
//H START:0X1EF /H END:0X28F
while(ret_val=WriteI2c(CameraID, 0x17, 0x40));
while(ret_val=WriteI2c(CameraID, 0x18, 0x40+20));
// while(ret_val=WriteI2c(0x30,0x12,0x80)); //Reset register
// while(ret_val=WriteI2c(0x30,0x13,0xf7)); //Disable auto function
// while(ret_val=WriteI2c(0x30,0x0c,0x28)); //Avoid clock halt when change format
// while(ret_val=WriteI2c(0x30,0x11,0x87)); //15 fps VGA (0x81 for 30 fps)
// while(ret_val=WriteI2c(0x30,0x2D,0x2c));
// while(ret_val=WriteI2c(0x30,0x2E,0x00));
// while(ret_val=WriteI2c(0x30,0x12,0x60)); //SVGA format
// SetRegTG(0x60,0x35,0x0F); //Adjust internal reference voltage
// SetRegTG(0x60,0x37,0x07); //Adjust internal reference voltage
// SetRegTG(0x60,0x00,0x00);
// SetRegTG(0x60,0x04,0xf0);
// while(ret_val=WriteI2c(0x30,0x03,0x40));
// while(ret_val=WriteI2c(0x30,0x01,0x80));
// while(ret_val=WriteI2c(0x30,0x02,0x80));
// while(ret_val=WriteI2c(0x30,0x04,0xf0));
// while(ret_val=WriteI2c(0x30,0x09,0x0e));
// while(ret_val=WriteI2c(0x30,0x32,0x00));
// FOR OV7620 INIT
// char ret_val;
// Reset chip
// while(ret_val=WriteI2c(CameraID, 0x12, 0xa4));
/* select sync output polarity */
// while(ret_val=WriteI2c(CameraID, 0x11, 0x40));
/* Enable AGC, select 8 bit output format is YUYVYUYV
select YCbCr data signal as video output
also enable auto white balance. */
// while(ret_val=WriteI2c(CameraID, 0x12, 0x24));
/* Select 8 bit data format and enable auto adjust mode */
// while(ret_val=WriteI2c(CameraID, 0x13, 0x21));
/* Select QVGA(320*240) output and RGB gamma on */
// while(ret_val=WriteI2c(CameraID, 0x14, 0x24));
// while(ret_val=WriteI2c(CameraID, 0x15, 0x0));
// while(ret_val=WriteI2c(CameraID, 0x2d, 0x95));
// while(ret_val=WriteI2c(CameraID, 0x70, 0x83));
}
/*---------------------------------------------------------------------------*/
void dma_init(void)
{
// SystemDMA init
//DMA_SetupSystemDma(DMA_FREE_RUNNING);
*pDMA_GCR = 0x0004; // dma free running
/* INTH2_InitLevel(DMA_CH0_INT,
INTH_IRQ, // InterruptKind Irq or Fiq
INTH_LOWEST_PRIORITY, // priority
INTH_LOW_LEVEL_SENSITIVE); // type level or edge
INTH2_EnableOneIT(DMA_CH0_INT, INTH_IRQ); */
}
/*---------------------------------------------------------------------------*/
void dma_setupcamif(void)
{
if(buffer_writable&1)
{
cdsa_u = 0x1060;
buffer_writen &= 0xFFFE;
}
else if(buffer_writable&2)
{
cdsa_u = 0x1064;
buffer_writen &= 0xFFFD;
}
else
return;
*((unsigned short*)0xFFFED800) = 0x000E; //*DmaReg(0, DMA_CSDP) = 0x000E ;
*((unsigned short*)0xFFFED802) = 0x4054; //*DmaReg(0, DMA_CCR) = 0x4054 ;
*((unsigned short*)0xFFFED804) = 0x0020; //*DmaReg(0, DMA_CICR) = 0x0020 ;
*((unsigned short*)0xFFFED808) = 0x6810; //*DmaReg(0, DMA_CSSA_L) = 0x6810 ;
*((unsigned short*)0xFFFED80A) = 0xFFFB; //*DmaReg(0, DMA_CSSA_U) = 0xFFFB ;
*((unsigned short*)0xFFFED80C) = 0x0000; //*DmaReg(0, DMA_CDSA_L) = 0x0000 ;
*((unsigned short*)0xFFFED80E) = cdsa_u; //*DmaReg(0, DMA_CDSA_U) = 0x1006 ;
*((unsigned short*)0xFFFED810) =40; //*DmaReg(0, DMA_CEN) = 0x58 ; // 88 elements ;
*((unsigned short*)0xFFFED812) =180; //*DmaReg(0, DMA_CFN) = 0x90 ; // 144 frames
*((unsigned short*)0xFFFED814) = 0x0000; //*DmaReg(0, DMA_CFI) = 0x00 ; // frame index not used
*((unsigned short*)0xFFFED816) = 0x0000; //*DmaReg(0, DMA_CEI) = 0x00 ; // element index not used
//start dma
*((unsigned short*)0xFFFED802) |= 0x0080;//*DmaReg(0, DMA_CCR) |= 0x80 ;
}
/*---------------------------------------------------------------------------*/
void WaitForVsync(void)
{
unsigned long v ;
short i = 0 ;
while(((*pCAMIF_STATUS) & 0x1) == 0) ; // wait for VSYNC rising edge
while(((*pCAMIF_STATUS) & 0x1) != 0) ; // wait for VSYNC falling edge
for(i=0; i<128; i++)
v = *pCAMIF_CAMDATA ; // clean FIFO out
*pCAMIF_PEAK_COUNTER = 0; // clear FIFO peak counter
}
/*---------------------------------------------------------------------------*/
void CAMERA_Service(void)
{
unsigned long IntStatus = *pCAMIF_IT_STATUS ;
unsigned short dma_ccr;
int i, v;
if (IntStatus & 0x0001)
{
if (flgReady == 0x0000)
{
dma_ccr = *((unsigned short*)0xFFFED802);
if(!(dma_ccr&0x0080)) {
if(cdsa_u==0x1060)
{
buffer_writable &= 0xFFFE;
buffer_writen = 1;
buf_one ++;
}
else
{
buffer_writable &= 0xFFFD;
buffer_writen = 2;
buf_two ++;
}
// clean FIFO out, chenyue, 2004/07/12
for(i=0; i<128; i++)
v = *pCAMIF_CAMDATA ;
// clean FIFO out, chenyue, 2004/07/12
Mailbox_Write(ARM2DSP1, buffer_writen, 0);
dma_setupcamif();
flgReady = 0xFFFF;
}else
dma_ccr = *((unsigned short*)0xFFFED802);
}
}
return;
}
unsigned int change_i2c = 0;
unsigned char subaddress;
unsigned char i2c_data;
/*---------------------------------------------------------------------------*/
void CaptureImage(void)
{
int i = 0;
while(i < 0x1fffffff)
{
if (change_i2c) {
while(WriteI2c(CameraID, subaddress, i2c_data));
change_i2c = 0;
}
if (flgReady==0xFFFF)
{
// DisplayImage();
if(buffer_writable)
flgReady = 0x0000;
}
i++;
}
return;
}
/*---------------------------------------------------------------------------*/
#if 0
void DisplayImage(void)
{
short x, y ;
unsigned char *Src_Data;
unsigned short *Dst_Data;
unsigned char R, G1, G2, B ;
unsigned short p ;
Src_Data = (unsigned char*)0x10600000;
Dst_Data = (unsigned short*)0x10000000;
Dst_Data += 16 + 240*88 + 16;
for (y = 0 ; y < ImageHeight ; y++)
{
for (x = 0 ; x < ImageWidth/2 ; x++)
{
G2 = *Src_Data++ ;
B = *Src_Data++ ;
G1 = *Src_Data++ ;
R = *Src_Data++ ;
p = (R & 0xf8) << 8 ;
p |= (G1 & 0xFC) <<3 ;
p |= (B & 0xf8) >> 3 ;
Dst_Data[(2*x)] = p ;
p = ((R & 0xf8) << 8) ;
p |= ((G2 & 0xFC) <<3) ;
p |= ((B & 0xf8) >> 3) ;
Dst_Data[(2*x)+1] = p;
}
Src_Data += (320-176)*2;
Dst_Data += (240);
}
return;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -