最新消息: USBMI致力于为网友们分享Windows、安卓、IOS等主流手机系统相关的资讯以及评测、同时提供相关教程、应用、软件下载等服务。

CMOS摄像头驱动解析

IT圈 admin 28浏览 0评论

2024年3月21日发(作者:后悦乐)

我们解析一下

MINI2440

开发板的

CMOS

摄像头的驱动。该驱动总共

包括以下文件:sccb.c、sccb.h、s3c2440_ov9650.c、s3c2440camif.h、

s3c2440camif.c五个文件!

s3c2440camif.c

用于从

cmos

接口获取图像数据和将数据传输到进程

空间(在有app读取时)。

s3c2440_ov9650.c读取和配置ov9650寄存器。通过iic接口传输数据。

设备地址是

60(#defineOV9650_SCCB_ADDR

始化和

productid

获取

.

sccb.c定义了去读ov9650的寄存器的具体方法,是时序模拟的iic。

而s3c2440_ov9650.c里是调用这些具体方法去读写ov9650的寄存器

的。

所以我们先分析sccb.c!

首先看看它的结构:

0x60).

比如进行初

可以看到该程序是处理读写数据到ov9650的过程。

首先我们应该知道

OV9650

内部有大量的寄存器需要配置,这就需

要另外的数据接口。

OV9650

的数据接口称为

SCCB(

串行摄像控制

总线

)

,它由两条数据线组成:一个是用于传输时钟信号的

SIO_C

另一个是用于传输数据信号的SIO_D。SCCB的传输协议与IIC的

极其相似,只不过IIC在每传输完一个字节后,接收数据的一方要发

送一位的确认数据,而

SCCB

一次要传输

9

位数据,前

8

位为有用数

据,而第9位数据在写周期中是Don’t-Care位(即不必关心位),在

读周期中是NA位。SCCB定义数据传输的基本单元为相(phase),

即一个相传输一个字节数据。

SCCB

只包括三种传输周期,即

3

相写

传输周期(三个相依次为设备从地址,内存地址,所写数据),

2

写传输周期(两个相依次为设备从地址,内存地址)和2相读传输周

期(两个相依次为设备从地址,所读数据)。当需要写操作时,应用

3

相写传输周期,当需要读操作时,依次应用

2

相写传输周期和

2

读传输周期。因此SCCB一次只能读或写一个字节。下面我们就用

s3c244的IIC总线接口分别与OV9650的SIO_C和SIO_D相连接来

实现

SCCB

的功能。

接下来对一些重要的函数讲一讲。

staticvoid__inline__sccb_start(void)

{

CFG_WRITE(SIO_D);

批注[A1]:这个函数原型是:

#defineCFG_WRITE(x)

do{s3c2410_gpio_cfgpin(x,S3

C2410_GPIO_OUTPUT);smp

_mb();}while(0)

。通过这个宏

定义可以看出它是配置

Low(SIO_D);

WAIT_STABLE();//延时一会,保持一定的低电平,以此代表sccb

总线开始传输数据

GPE14为输出管脚。

批注

[A2]:

这个函数的原型

是:#defineLow(x)

do{s3c2410_gpio_setpin(x,0)

;smp_mb();}while(0)

可见是输出低电平的功能!

2024年3月21日发(作者:后悦乐)

我们解析一下

MINI2440

开发板的

CMOS

摄像头的驱动。该驱动总共

包括以下文件:sccb.c、sccb.h、s3c2440_ov9650.c、s3c2440camif.h、

s3c2440camif.c五个文件!

s3c2440camif.c

用于从

cmos

接口获取图像数据和将数据传输到进程

空间(在有app读取时)。

s3c2440_ov9650.c读取和配置ov9650寄存器。通过iic接口传输数据。

设备地址是

60(#defineOV9650_SCCB_ADDR

始化和

productid

获取

.

sccb.c定义了去读ov9650的寄存器的具体方法,是时序模拟的iic。

而s3c2440_ov9650.c里是调用这些具体方法去读写ov9650的寄存器

的。

所以我们先分析sccb.c!

首先看看它的结构:

0x60).

比如进行初

可以看到该程序是处理读写数据到ov9650的过程。

首先我们应该知道

OV9650

内部有大量的寄存器需要配置,这就需

要另外的数据接口。

OV9650

的数据接口称为

SCCB(

串行摄像控制

总线

)

,它由两条数据线组成:一个是用于传输时钟信号的

SIO_C

另一个是用于传输数据信号的SIO_D。SCCB的传输协议与IIC的

极其相似,只不过IIC在每传输完一个字节后,接收数据的一方要发

送一位的确认数据,而

SCCB

一次要传输

9

位数据,前

8

位为有用数

据,而第9位数据在写周期中是Don’t-Care位(即不必关心位),在

读周期中是NA位。SCCB定义数据传输的基本单元为相(phase),

即一个相传输一个字节数据。

SCCB

只包括三种传输周期,即

3

相写

传输周期(三个相依次为设备从地址,内存地址,所写数据),

2

写传输周期(两个相依次为设备从地址,内存地址)和2相读传输周

期(两个相依次为设备从地址,所读数据)。当需要写操作时,应用

3

相写传输周期,当需要读操作时,依次应用

2

相写传输周期和

2

读传输周期。因此SCCB一次只能读或写一个字节。下面我们就用

s3c244的IIC总线接口分别与OV9650的SIO_C和SIO_D相连接来

实现

SCCB

的功能。

接下来对一些重要的函数讲一讲。

staticvoid__inline__sccb_start(void)

{

CFG_WRITE(SIO_D);

批注[A1]:这个函数原型是:

#defineCFG_WRITE(x)

do{s3c2410_gpio_cfgpin(x,S3

C2410_GPIO_OUTPUT);smp

_mb();}while(0)

。通过这个宏

定义可以看出它是配置

Low(SIO_D);

WAIT_STABLE();//延时一会,保持一定的低电平,以此代表sccb

总线开始传输数据

GPE14为输出管脚。

批注

[A2]:

这个函数的原型

是:#defineLow(x)

do{s3c2410_gpio_setpin(x,0)

;smp_mb();}while(0)

可见是输出低电平的功能!

发布评论

评论列表 (0)

  1. 暂无评论