📄 im8803.c
字号:
/**************************************** iMagic IM8803 Sensor Driver ***************************************/#include "khead.h"#include "mx1hw.h"#include "im8803.h"#include "i2c.h"//// GPIO control on sensor////// Enter Standby Mode//void ADS_standby_enable(void){ //PA23 = standby //Active high *(U32 *) PTA_GIUS |= 0x00800000; *(U32 *) PTA_DDIR |= 0x00800000; //output port *(U32 *) PTA_OCR2 |= 0x0000C000; *(U32 *) PTA_DR |= 0x00800000; return;}void ADS_standby_disable(void){ //PA23 = standby //Active high *(U32 *) PTA_GIUS |= 0x00800000; *(U32 *) PTA_DDIR |= 0x00800000; //output port *(U32 *) PTA_OCR2 |= 0x0000C000; *(U32 *) PTA_DR &= ~0x00800000; return;}//// Hard Reset//void ADS_sensor_reset(void){ U32 i; //PB18 = reset //Active low *(U32 *) PTB_GIUS |= 0x00040000; *(U32 *) PTB_DDIR |= 0x00040000; //output port *(U32 *) PTB_OCR2 |= 0x00000030; //assert reset *(U32 *) PTB_DR &= ~0x00040000; //delay for (i = 0; i < 1000000; i++); //negate reset *(U32 *) PTB_DR |= 0x00040000; return;}//// Auto-flickering Control//void ADS_RS_set_level(U32 level){ //PB19 = RS *(U32 *) PTB_GIUS |= 0x00080000; *(U32 *) PTB_DDIR |= 0x00080000; //output port *(U32 *) PTB_OCR2 |= 0x000000C0; if (level) *(U32 *) PTB_DR |= 0x00080000; else *(U32 *) PTB_DR &= ~0x00080000; return;}//// Enter Standby Mode//void standby_enable(void){ //PB16 = standby //Active high *(U32 *) PTB_GIUS |= 0x00010000; *(U32 *) PTB_DDIR |= 0x00010000; //output port *(U32 *) PTB_OCR2 |= 0x00000003; *(U32 *) PTB_DR |= 0x00010000; return;}void standby_disable(void){ //PA16 = standby //Active high *(U32 *) PTB_GIUS |= 0x00010000; *(U32 *) PTB_DDIR |= 0x00010000; //output port *(U32 *) PTB_OCR2 |= 0x00000003; *(U32 *) PTB_DR &= ~0x00010000; return;}//// Hard Reset//void sensor_reset(void){ U32 i; //PB17 = reset //Active low *(U32 *) PTB_GIUS |= 0x00020000; *(U32 *) PTB_DDIR |= 0x00020000; //output port *(U32 *) PTB_OCR2 |= 0x0000000C; //assert reset *(U32 *) PTB_DR &= ~0x00020000; //delay for (i = 0; i < 500000; i++); //negate reset *(U32 *) PTB_DR |= 0x00020000; return;}//// Auto-flickering Control//void RS_set_level(U32 level){ //PB18 = RS *(U32 *) PTB_GIUS |= 0x00040000; *(U32 *) PTB_DDIR |= 0x00040000; //output port *(U32 *) PTB_OCR2 |= 0x00000030; if (level) *(U32 *) PTB_DR |= 0x00040000; else *(U32 *) PTB_DR &= ~0x00040000; return;}//// VGA init (Landscape 640 x 480)//void IM8803_VGA_init(void){ U32 data; //hard init standby_disable(); sensor_reset(); RS_set_level(0); //set '0' for > 15fps //soft reset I2C_write(0x01, 0x0004); //select IC register I2C_write(0x0D, 0x0001); //reset IC I2C_write(0x0D, 0x0000); I2C_write(0x01, 0x0001); //select IFP register I2C_write(0x07, 0x0001); //reset IFP I2C_write(0x07, 0x0000); //read mode control I2C_write(0x01, 0x0004); //select IC register I2C_write(0x20, 0xD0A1); //read from top to bottom (rotate by 180 deg) //workaround for read mode control I2C_write(0x01, 0x0001); //select IFP register I2C_write(0x37, 0x0100); //fix for flickering //select RGB565 output I2C_write(0x01, 0x0001); //select IFP register I2C_read(0x08, &data); data |= 0x1000; //set bit 12 I2C_write(0x08, data); return;}//// QVGA init (320 x 240)// Subsampliing by Sensor//void IM8803_QVGA_init(void){ U32 data; //hard init standby_disable(); sensor_reset(); RS_set_level(0); //set '0' for > 15fps //soft reset I2C_write(0x01, 0x0004); //select IC register I2C_write(0x0D, 0x0001); //reset IC I2C_write(0x0D, 0x0000); I2C_write(0x01, 0x0001); //select IFP register I2C_write(0x07, 0x0001); //reset IFP I2C_write(0x07, 0x0000); //decimation control I2C_write(0x01, 0x0001); //select IFP register I2C_write(0x46, 0x0001); //QVGA //read mode control I2C_write(0x01, 0x0004); //select IC register I2C_write(0x20, 0xD0A1); //read from top to bottom (rotate by 180 deg) //workaround for read mode control I2C_write(0x01, 0x0001); //select IFP register I2C_write(0x37, 0x0100); //fix for flickering //select RGB565 output I2C_write(0x01, 0x0001); //select IFP register I2C_read(0x08, &data); data |= 0x1000; //set bit 12 I2C_write(0x08, data); return;}//// QQVGA init (160 x 120)// Subsampliing by Sensor//void IM8803_QQVGA_init(void){ U32 data; //hard init standby_disable(); sensor_reset(); RS_set_level(0); //set '0' for > 15fps //soft reset I2C_write(0x01, 0x0004); //select IC register I2C_write(0x0D, 0x0001); //reset IC I2C_write(0x0D, 0x0000); I2C_write(0x01, 0x0001); //select IFP register I2C_write(0x07, 0x0001); //reset IFP I2C_write(0x07, 0x0000); //decimation control I2C_write(0x01, 0x0001); //select IFP register I2C_write(0x46, 0x0004); //QQVGA //read mode control I2C_write(0x01, 0x0004); //select IC register I2C_write(0x20, 0xD0A1); //read from top to bottom (rotate by 180 deg) //workaround for read mode control I2C_write(0x01, 0x0001); //select IFP register I2C_write(0x37, 0x0100); //fix for flickering //select RGB565 output I2C_write(0x01, 0x0001); //select IFP register I2C_read(0x08, &data); data |= 0x1000; //set bit 12 I2C_write(0x08, data); return;}//// QVGA init// (Portrait 240 x 320)//// Window of interest by sensor// No subsampling//void IM8803_QVGA_init4(void){ U32 data; //hard init#ifdef MP3DSC standby_disable(); sensor_reset(); RS_set_level(0); //set '0' for > 15fps#endif#ifdef ADS ADS_standby_disable(); ADS_sensor_reset(); ADS_RS_set_level(0);#endif //soft reset I2C_write(0x01, 0x0004); //select IC register I2C_write(0x0D, 0x0001); //reset IC I2C_write(0x0D, 0x0000); I2C_write(0x01, 0x0001); //select IFP register//I2C_write(0x0A,0x4); I2C_write(0x07, 0x0001); //reset IFP// I2C_write(0x07, 0x000A); //reset IFP I2C_write(0x07, 0x0000); //Window of Interest (WOI) control I2C_write(0x01, 0x0004); //select IC register I2C_write(0x02, 200); //first col I2C_write(0x30, 20); //first row I2C_write(0x04, 247); //240 cols I2C_write(0x03, 327); //320 rows //read mode control I2C_write(0x01, 0x0004); //select IC register //I2C_write(0x20, 0xD0A1); //read from top to bottom (rotate by 180 deg) I2C_write(0x20, 0x90A1); //read from top to bottom (rotate by 180 deg) //workaround for read mode control I2C_write(0x01, 0x0001); //select IFP register I2C_write(0x37, 0x0100); //fix for flickering //select RGB565 output I2C_write(0x01, 0x0001); //select IFP register I2C_read(0x08, &data); data |= 0x1000; //set bit 12 I2C_write(0x08, data); //change saturation to 150% /*I2C_write(0x01, 0x0001); //select IFP register I2C_read(0x25, &data); data |= 0x2800; //set bit 11-13: 101(150%) I2C_write(0x25, data); */ //Red gain#if 0 //stop AWB I2C_write(0x01, 0x0001); //select IFP register I2C_read(0x06, &data); data &= 0xFFFE; //clear bit 1 I2C_write(0x06, data); //stop AE I2C_write(0x01, 0x0001); //select IFP register I2C_read(0x06, &data); data &= 0xBFFF; //clear bit 14 I2C_write(0x06, data); //double red gain I2C_write(0x01, 0x0004); //select IC register I2C_read(0x2D, &data); data |= 0x20; //set bit 12 I2C_write(0x2D, data);#endif //BTS settings I2C_write(0x01, 0x0001); //select IFP register I2C_read(0x08, &data); data |= 0x01; //clear bit 14 I2C_write(0x08, data); return;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -