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

📄 im8803.c

📁 这是嵌入式usb驱动的源码,仅供参考,可花费了好长时间才调通的
💻 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 + -