/*********************************
版 权:
文 件 名:ov7725.c
作 者:狄兰兰
创建日期:20090213
版 本:02.00.01
功能描述:cmos图像传感器驱动程序,
完成VGA、QVGA、QQVGA、CIF、QCIF
修改历程:1、20090213 创建
*********************************/
#include <linux/string.h>
#include <linux/slab.h>
#include <linux/module.h>
#include <linux/config.h>
#include <linux/errno.h>
#include <linux/miscdevice.h>
#include <linux/fcntl.h>
#include <linux/init.h>
#include <linux/delay.h>
#include <linux/proc_fs.h>
#include <linux/workqueue.h>
#include <linux/moduleparam.h>
#include <asm/uaccess.h>
#include <asm/system.h>
#include <asm/io.h>
#include "ov7725.h"
#include "gpio_i2c.h"
#define SCCB_OV7725_ADDR 0x42
/*
* size = 0: VGA
* size = 1: QVGA
* size = 2: QQVGA
* size = 3: CIF
* size = 4: QCIF
*/
static int size = 0;
/* set output drive capability
* param:multi = 0/1/2/3
* return 0:set success, return 1:set error
*/
static unsigned int set_output_drivecap(unsigned char multi )
{
switch(multi)
{
case 0:
gpio_i2c_write(SCCB_OV7725_ADDR, DC_COM2, 0x00);
break;
case 1:
gpio_i2c_write(SCCB_OV7725_ADDR, DC_COM2, 0x01);
break;
case 2:
gpio_i2c_write(SCCB_OV7725_ADDR, DC_COM2, 0x02);
break;
case 3:
gpio_i2c_write(SCCB_OV7725_ADDR, DC_COM2, 0x03);
break;
default:
return 1;
}
return 0;
}
/* set output video data format
* param: mode = 0/1/2/3/4
* return 0:set success, return 1:set error
*/
static unsigned int set_output_format(output_format form)
{
unsigned char regval;
switch(form)
{
case YUV:
gpio_i2c_write(SCCB_OV7725_ADDR, DC_COM3, 0x10);//swap Y/UV output sequence
gpio_i2c_write(SCCB_OV7725_ADDR, 0x66, 0x00); //U0Y0,V1Y1,U2Y2,V3Y3,....
regval = gpio_sccb_read(SCCB_OV7725_ADDR, DC_COM7);
SET_BIT(regval, 0x20);
gpio_i2c_write(SCCB_OV7725_ADDR, DC_COM7, regval);//BT.656 protocol on,YUV output
break;
case GBR422:
regval = gpio_sccb_read(SCCB_OV7725_ADDR, DC_COM7);
SET_BIT(regval, 0x02);
gpio_i2c_write(SCCB_OV7725_ADDR, DC_COM7, regval);
break;
case RGB565:
regval = gpio_sccb_read(SCCB_OV7725_ADDR, DC_COM7);
SET_BIT(regval, 0x06);
gpio_i2c_write(SCCB_OV7725_ADDR, DC_COM7, regval);
break;
case RGB555:
regval = gpio_sccb_read(SCCB_OV7725_ADDR, DC_COM7);
SET_BIT(regval, 0x0a);
gpio_i2c_write(SCCB_OV7725_ADDR, DC_COM7, regval);
break;
case RGB444:
regval = gpio_sccb_read(SCCB_OV7725_ADDR, DC_COM7);
SET_BIT(regval, 0x0e);
gpio_i2c_write(SCCB_OV7725_ADDR, DC_COM7, regval);
break;
case PROBRAW:
gpio_i2c_write(SCCB_OV7725_ADDR, 0x67, 0x4a);//DSP output RAW8
regval = gpio_sccb_read(SCCB_OV7725_ADDR, DC_COM7);
SET_BIT(regval, 0x01);
gpio_i2c_write(SCCB_OV7725_ADDR, DC_COM7, regval);
break;
case BRAW:
gpio_i2c_write(SCCB_OV7725_ADDR, 0x67, 0x4a);
regval = gpio_sccb_read(SCCB_OV7725_ADDR, DC_COM7);
SET_BIT(regval, 0x03);
gpio_i2c_write(SCCB_OV7725_ADDR, DC_COM7, regval);
break;
default:
return 1;
}
return 0;
}
static void set_vga(void)
{
unsigned char regval;
gpio_i2c_write(SCCB_OV7725_ADDR, DC_HSTART, 0x22);
gpio_i2c_write(SCCB_OV7725_ADDR, DC_HSIZE, 0xa4);//sensor size is larger than VGA
gpio_i2c_write(SCCB_OV7725_ADDR, DC_VSTART, 0x07);
gpio_i2c_write(SCCB_OV7725_ADDR, DC_VSIZE, 0xf0);
gpio_i2c_write(SCCB_OV7725_ADDR, DC_HREF, 0x00);
regval = gpio_sccb_read(SCCB_OV7725_ADDR, DC_COM7);
CLEAR_BIT(regval, 0x40);//VGA
gpio_i2c_write(SCCB_OV7725_ADDR, DC_COM7, regval);
gpio_i2c_write(SCCB_OV7725_ADDR, DC_HOUTSIZE, 0xa0);
gpio_i2c_write(SCCB_OV7725_ADDR, DC_VOUTSIZE, 0xf0);
gpio_i2c_write(SCCB_OV7725_ADDR, DC_EXHCH, 0x00);
// gpio_i2c_write(SCCB_OV7725_ADDR, DC_CLKRC, 0x01);//00/01/03/07 for 60/30/15/7.5fps
}
static void set_qvga(void)
{
unsigned char regval;
gpio_i2c_write(SCCB_OV7725_ADDR, DC_HSTART, 0x3f);
gpio_i2c_write(SCCB_OV7725_ADDR, DC_HSIZE, 0x50);
gpio_i2c_write(SCCB_OV7725_ADDR, DC_VSTART, 0x03);
gpio_i2c_write(SCCB_OV7725_ADDR, DC_VSIZE, 0x78);
gpio_i2c_write(SCCB_OV7725_ADDR, DC_HREF, 0x00);
regval = gpio_sccb_read(SCCB_OV7725_ADDR, DC_COM7);
SET_BIT(regval, 0x40);
gpio_i2c_write(SCCB_OV7725_ADDR, DC_COM7, regval);
gpio_i2c_write(SCCB_OV7725_ADDR, DC_HOUTSIZE, 0x50);
gpio_i2c_write(SCCB_OV7725_ADDR, DC_VOUTSIZE, 0x78);
gpio_i2c_write(SCCB_OV7725_ADDR, DC_EXHCH, 0x00);
// gpio_i2c_write(SCCB_OV7725_ADDR, DC_CLKRC, 0x01);//00/01/03/07 for 60/30/15/7.5fps
}
static void set_qqvga(void)
{
unsigned char regval;
gpio_i2c_write(SCCB_OV7725_ADDR, DC_HSTART, 0x3f);
gpio_i2c_write(SCCB_OV7725_ADDR, DC_HSIZE, 0x50);
gpio_i2c_write(SCCB_OV7725_ADDR, DC_VSTART, 0x03);
gpio_i2c_write(SCCB_OV7725_ADDR, DC_VSIZE, 0x78);
gpio_i2c_write(SCCB_OV7725_ADDR, DC_HREF, 0x00);
regval = gpio_sccb_read(SCCB_OV7725_ADDR, DC_COM7);
SET_BIT(regval, 0x40);
gpio_i2c_write(SCCB_OV7725_ADDR, DC_COM7, regval);
// 1/2 down sampling
gpio_i2c_write(SCCB_OV7725_ADDR, DC_SCAL0, HALF);
gpio_i2c_write(SCCB_OV7725_ADDR, DC_SCAL1, 0x80);
gpio_i2c_write(SCCB_OV7725_ADDR, DC_SCAL2, 0x80);
gpio_i2c_write(SCCB_OV7725_ADDR, DC_HOUTSIZE, 0x50);
gpio_i2c_write(SCCB_OV7725_ADDR, DC_VOUTSIZE, 0x78);
gpio_i2c_write(SCCB_OV7725_ADDR, DC_EXHCH, 0x00);
gpio_i2c_write(SCCB_OV7725_ADDR, 0x65, 0x2f);//vertical and horizontal zoom out enable
// gpio_i2c_write(SCCB_OV7725_ADDR, DC_CLKRC, 0x01);//00/01/03/07 for 60/30/15/7.5fps
}
static void set_cif(void)
{
// unsigned char regval;
gpio_i2c_write(SCCB_OV7725_ADDR, DC_HSTART, 0x22);
gpio_i2c_write(SCCB_OV7725_ADDR, DC_HSIZE, 0xa4);
gpio_i2c_write(SCCB_OV7725_ADDR, DC_VSTART, 0x07);
gpio_i2c_write(SCCB_OV7725_ADDR, DC_VSIZE, 0xf0);
gpio_i2c_write(SCCB_OV7725_ADDR, DC_HREF, 0x00); //sensor size is VGA
gpio_i2c_write(SCCB_OV7725_ADDR, DC_HOUTSIZE, 0x5a);
gpio_i2c_write(SCCB_OV7725_ADDR, DC_VOUTSIZE, 0x90);
gpio_i2c_write(SCCB_OV7725_ADDR, DC_EXHCH, 0x00);
gpio_i2c_write(SCCB_OV7725_ADDR, 0x65, 0x2f);//vertical and horizontal zoom out enable
// gpio_i2c_write(SCCB_OV7725_ADDR, DC_CLKRC, 0x01);//00/01/03/07 for 60/30/15/7.5fps
}
static void set_qcif(void)
{
// unsigned char regval;
gpio_i2c_write(SCCB_OV7725_ADDR, DC_HSTART, 0x22);
gpio_i2c_write(SCCB_OV7725_ADDR, DC_HSIZE, 0xa4);
gpio_i2c_write(SCCB_OV7725_ADDR, DC_VSTART, 0x07);
gpio_i2c_write(SCCB_OV7725_ADDR, DC_VSIZE, 0xf0);
gpio_i2c_write(SCCB_OV7725_ADDR, DC_HREF, 0x00);
// gpio_i2c_write(SCCB_OV7725_ADDR, DC_SCAL0, HALF);
gpio_i2c_write(SCCB_OV7725_ADDR, DC_HOUTSIZE, 0x5a);
gpio_i2c_write(SCCB_OV7725_ADDR, DC_VOUTSIZE, 0x90);
gpio_i2c_write(SCCB_OV7725_ADDR, DC_EXHCH, 0x00);
gpio_i2c_write(SCCB_OV7725_ADDR, 0x65, 0x2f);//vertical and horizontal zoom out enable
// gpio_i2c_write(SCCB_OV7725_ADDR, DC_SCAL1, 0x80);
// gpio_i2c_write(SCCB_OV7725_ADDR, DC_SCAL2, 0x80);
// gpio_i2c_write(SCCB_OV7725_ADDR, DC_CLKRC, 0x01);//00/01/03/07 for 60/30/15/7.5fps
}
/* set luma
* param: bri: 0x00 ~ 0xff
*/
static void set_bright(unsigned char bri)
{
gpio_i2c_write(SCCB_OV7725_ADDR, DC_SDE, 0x04); //contrast/bright enable
gpio_i2c_write(SCCB_OV7725_ADDR, 0x9B, bri);
}
/* set contrast
* param: con > 0x20, enhance Y
con < 0x20, weaken Y
*/
static void set_contrast(unsigned char con)
{
gpio_i2c_
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
ov7725-driver.rar (1个子文件)
ov7725-driver.c 17KB
共 1 条
- 1
资源评论
小波思基
- 粉丝: 72
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- html动态爱心代码一(附源码)
- c40539bc-071a-486c-9d52-9d0c18d62dac 4.html
- 基于物理的非视域成像(NLOS)算法,利用了nerf+python源码+文档说明
- yuluer知更鸟.7z(1).001
- 基于Qt实现医院信息管理系统c++源码+文档说明+数据库(期末大作业)
- 基于python实现的医院信息管理系统完整源码+sql数据库+详细注释(高分课程设计)
- 基于python的眼底图像视杯视盘分割项目源码+文档说明+截图演示+详细注释(高分课程设计)
- ImageBasedModellingEdu-贰壹贰叁零
- DFFmeasurement-数据预处理
- ImageBasedModellingEdu-回文素数c语言
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功