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)
可见是输出低电平的功能!