OV9650 移植

作者:冯利美,华清远见嵌入式学院讲师。

一、 移植环境:

【移植环境】

1、 主机:Ubuntu 10.10发行版

2、 目标机:FS_S5PC100平台

3、 交叉编译工具:arm-none-linux-gnueabi-4.5.1

4、 摄像头模块:OV9650

5、Linux文件系统:rootfs. cramfs.

6、内核:linux-2.6.35-farsigt

二、 内核配置

1.修改vi drivers/i2c/busses/Kconfig

(参考实验二十六 I2C驱动编写及测试)

修改

config I2C_S3C2410
                tristate "S3C2410 I2C Driver"
                depends on ARCH_S3C2410 || ARCH_S3C64XX
                help
                        Say Y here to include support for I2C controller in the
                        Samsung S3C2410 based System-on-Chip devices.

为:

config I2C_S3C2410
                tristate "S3C2410 I2C Driver"
                depends on ARCH_S3C2410 || ARCH_S3C64XX || ARCH_S5PC100
                help
                        Say Y here to include support for I2C controller in the
                        Samsung S3C2410 based System-on-Chip devices.

2.内核配置并重新编译内核
        $ make menuconfig
         Device Drivers --->
                <*> I2C support --->
                        <*> I2C device interface
                                I2C Hardware Bus support --->
                                        <*> S3C2410 I2C Driver

3.修改vi arch/arm/mach-s5pc100/mach-smdkc100.c

查看原理图可以知道我们的摄像头是接在I2C-1上所以修改i2c_devs1添加ov9650的内容,主要是ov9650的地址,这个在芯片手册上可以查到是0x30

修改:
        static struct i2c_board_info i2c_devs1[] __initdata = {
        };

为:
        static struct i2c_board_info i2c_devs1[] __initdata = {
                {
                I2C_BOARD_INFO("ov9650", 0x30),
                },
        };

添加s5pc100 摄像头控制器平台设备相关内容,这些内容我们可以通过查看S5PC100的芯片手册查到
        static struct resource s3c_camif_resource[] = {
                [0] = {
                        .start = 0xEE200000,
                        .end = 0xEE200000 + SZ_1M - 1,
                        .flags = IORESOURCE_MEM,
                },
                [1] = {
                        .start = IRQ_FIMC0,
                        .end = IRQ_FIMC0,
                        .flags = IORESOURCE_IRQ,
                }

};

static u64 s3c_device_camif_dmamask = 0xffffffffUL;

struct platform_device s3c_device_camif = {
                 .name = "s5pc100-camif",
                .id = 0,
                .num_resources = ARRAY_SIZE(s3c_camif_resource),
                 .resource = s3c_camif_resource,
                 .dev = {
                         .dma_mask = &s3c_device_camif_dmamask,
                         .coherent_dma_mask = 0xffffffffUL
                 }
         };

EXPORT_SYMBOL(s3c_device_camif);

注册摄像头控制平台设备:

在smdkc100_devices中添加s3c_device_camif
        static struct platform_device *smdkc100_devices[] __initdata = {
                &s3c_device_camif, //添加内容
        };

4. 添加驱动(video)
        Make menuconfig
         Device Drivers ---> 
                <*> Multimedia support --->
                         <*> Video For Linux 
         [*] Enable Video For Linux API 1 (DEPRECATED) (NEW)
         [*] Video capture adapters (NEW) --->
         [*] V4L USB devices (NEW) ---> 
        <*> USB Video Class (UVC) 
         [*] UVC input events device support (NEW)
         <*> USB ZC0301[P] webcam support (DEPRECATED)

三、 驱动编写

四、 网络视频服务器移植

对于内核linux-2.6.35,不能再使用servfox,如果要使用的需要修改大量的代码,在此选用新的方法来移植。需要两个文件jpeg,mjpg-stream.移植如下:

mkdir /source/rootfs/mjpg

1. jpeg库的移植

mkdir /home/linux/jpeg

jpeg源码包通过下面这个网址下载

http://www.ijg.org/files/jpegsrc.v8b.tar.gz

解压源码包

tar xvf jpegsrc.v8b.tar.gz

配置源码

cd jpeg-8b
        ./configure --prefix=/home/linux/jpeg --host=arm-none-linux-gnueabi
        ./configure --prefex=/home/linux/jpeg --host=arm-none-linux-gnueabi

(./configure 配置源代码树 
        安装目录:
        --prefix=PREFIX
        体系无关文件的顶级安装目录PREFIX ,也就Apache的安装目录。[/usr/local/apache2]

系统类型:
        --host=HOST

指定Apache HTTP服务器将要运行的目标系统类型HOST 。

[BUILD]

)

编译

make

安装

make install

拷贝库到文件系统中

cp /home/linux/jpeg/lib/libjpeg.so.8 /source/rootfs/lib

2. mjpg-stream的移植

mjpg-stream源码包通过下面这个网址下载
        http://sourceforge.net/projects/mjpg-streamer/

解压源码

tar xvf mjpg-streamer-r63.tar.gz

修改源码

cd mjpg-streamer-r63

修改顶层makefile及plugins目录中的各级makefile将所有 (注意这里需要修改的内容)

CC=gcc

修改为

cc=arm-none-linux-gnueabi-gcc

修改plugins/input_uvc/Makfile

修改

CFLAGS += -O2 -DLINUX -D_GNU_SOURCE -Wall -shared -fPIC

CFLAGS += -O2 -DLINUX -D_GNU_SOURCE -Wall -shared –fPIC –I/homw/linux/jpeg/include

修改

$(CC) $(CFLAGS) -ljpeg -o $@ input_uvc.c v4l2uvc.lo jpeg_utils.lo dynctrl.lo

$(CC) $(CFLAGS) -ljpeg -L/home/linux/jpeg/lib -o $@ input_uvc.c v4l2uvc.lo jpeg_utils.lo dynctrl.lo

3. 拍照功能的实现

由于mjpg_stream中output-file.so能实现连续拍照的功能,不能实现单拍或连拍几张的功能所以需要对output_file原码进行修改。
         # cd mjpg-streamer-rc63/plugins/output_file
        # vim output_file.c
        在96行 函数 void *worker_thread(void *arg) 体中加入以下代码:
        char buf[10]; //用于存放从管道读取的命令
        int flags = 0; //拍照标志,1:表示11张照片,2:表示1张照片
        int fd_com = 0; //打开管道的文件描述符

stop_num = 0; //拍照计数
        if ( access(“/tmp/webcom”,F_OK) < 0 ) //创建有名管道用于接收拍照命令
        {
        if ( mkfifo(“/tmp/webcom”,0666 ) < 0)
        {
        Printf(“ photo fifo create failed\n”);
        }
        }
        fd_com = open (“/tmp/webcom”,O_RDONLY,0666);
        if (fd < 0)
        {
        perror (“open the file webcom error”);
        }

在while( ok >= 0 && !pglobal->stop){ 后加入
        if (flags == 0)
        {
        while(1)
        {
        reade(fd_com,buf,sizeof(buf));
        if (strncmp(buf,”danger”,6) == 0) //拍11张照片
        {
        flags = 1;
        bzero(buf,sizeof(buf));
        break;
         }
        if (strncmp(buf,”one”,3) == 0) //拍1张照片
        {
        flags = 2;
        bzero(buf,sizeof(buf));
        break;
        }

}
        }

在if (delay > 0){
        usleep(1000*delay);
        }后加入
        stop_num++
        if (flags == 1) //判断拍照的数量
        {
         if ( stop_num > 9)
        {
        stop_num = 0;
        flsgs = 0;
        }
         }
         else if (flags == 2)
         {
         stop_num = 0;
         flags = 0;
        }

编译

(make clean)
        Make
        mkdir /source/rootfs/pice
        mkdir /source/rootfs/mjpg
        cp *.so /source/rootfs/mjpg
        cp mjpg_streamer /source/rootfs/bin
        cp /home/linux/newyizhi_first/toolchain/arm-2010.09/arm-none-linux-gnueabi/libc/lib/* /source/rootfs/lib/

4. 将摄像头驱动s5pc100_cam.ko拷贝到 /source/rootfs目录下

所以只要向有名管道/tmp/webcom写入danger就能连拍11张照片,写入one就拍一张照片。

执行命令:
        mjpg_streamer -i "/mjpg/input_uvc.so -y" -o "/mjpg/output_file.so -f /pice -d 1000 " &

拍照一张:
        echo one > /tmp/webcom

五、 文件系统的制作

支持U盘自动挂载,需做以下步骤:

1、下载UDEV源码udev-080.tar.bz2,网址:

http://www.us.kernel.org/pub/linux/utils/kernel/hotplug/,并解压。

2、交叉编译。

修改Makefile,具体修改如下:

CROSS = arm-none-linux-gnueabi-

保存退出。

修改udevmointer.c,添加 #include

执行命令:make 进行编译,然后执行arm-none-linux-gnueabi-strip udev udevd udevstart udevinfo udevtest。并拷贝这些文件到rootfs/bin目录下面。

3、修改/source/rootfs/etc/fstab为
         #device mount-point type options dump fsck order
        proc /proc proc defaults 0 0
        tmpfs /tmp tmpfs defaults 0 0
        sysfs /sys sysfs defaults 0 0 
        tmpfs /dev tmpfs defaults 0 0

4、修改/source/rootfs/etc/init.d/rcS,添加如下内容

/bin/udevd --daemon

/bin/udevstart

这样当我们插上U盘和SD卡的时候,就可以看到我们的设备节点而不需要手动创建设备节点。

5、SD卡或U盘自动挂载的实现

拷贝实验代码中udev目录到 /source/rootfs/etc

拷贝mount-sd.sh、 umount-sd.sh 、mount-usb.sh、lh到rootfs/sbin下

这个时候当插入U盘或SD卡时就会自动挂载在tmp下。可以通过修改mount-sd.sh和mount-usb.sh添加其他功能和修改挂载点。

六、 移植过程中出现的相关问题及解决:

1、 移植streamer的过程中 make出现 无法找到ljpeg库的问题

解决:查看 jpeg—lib 目录下 file libjpeg.so.8.0.2 是否是ARM体系

如果是386的,可能交叉编译工具链的问题,建议拷贝其他可用的jpeg库。

2、出现Init V4L2 failed opening V4L interface:NO such file

如果内核配置正确,一般都会支持V4L2, 我重启之后就再也没有出现这个问题

3.、streamer snapshot 未能正常显示

请确定加 –y 指令

如果在Window下正在使用viewer.exe 软件测试streamer,先关闭或者暂停该软件,然后再在浏览器中输入。。。。。测试

4、摄像头显示的内容是红色

因为内核里,没有配置I2C的驱动

5、拍照测试程序,拍摄前7张时不能正常显示

尚待解决

V4L2的使用说明

请参看 “相关资料”——“摄像头相关资料(v4l2)”

ov9650 的配置

经过4天的调试摄像头终于可以拍照片保存到电脑上来,ov9650的调试走了不少弯路,一些教训总结如下:
1:OV9650是OmniVision公司的COMS摄像头,号称有130万像素,但是实际效果感觉不如CCD的,特别是远处的背景更糟糕。
2:OV9650的datasheet上写的寄存器控制协议是Serial Camera Control Bus (SCCB),还给了个时序图,但是它用的是两线制  的SCCB协议;根据它的时序图是可以兼容I2C的,两者在细微之处有点差别,但不影响,但实际应用中,都是后端平台的  I2C接camera的SCCB。可惜我没有仔细分析,愣是用两个GPIO模拟SCCB通信协议。此乃一错
3:对于OV9650,OmniVision公司是提供了参考寄存器配置的!一定要找相关人员要!(可能是他们的datasheet写得太烂的原因吧),可以我过分相信自己,没有找技术支持沟通!此乃二错
4:ov9650复位后默认配置是不能收到图像的!(在我的这个模式下:YUV422,VGA),当我在用I2C配置时,有的像的轮廓但颜色偏绿,我以为是没有配置起寄存器,但是实际上是配置起寄存器了,是YUV的顺序有问题!此乃三错
5:我们用的是杰得提供的VIA模块控制API,杰得的API多、复杂、有错且没有系统的说明,又由于我没有调试摄像头的相关经验,也没有弄明白杰得的VIA模块API。所以调试的时候没有图像,到底是摄像头输出问题?还是Z228接收处理的问题?无法判断!调试完摄像头了才知道杰得的库是可以输入4:2:2,输出4:2:0的!


我觉得调试步骤应该如下:
一:先要保证硬件没有问题!
1:首先要看RESET脚和,PDN脚.的电平是否正确,RESET:高电平复位.PDN:低电平工作正常。
    2:第一次调试I2C总线的时候,把示波器放在数据线上,抓图分析看OV9650是否应答。地址应该是60H不要搞错了!
    3:测试关键信号(这一小步要寄存器配置正确芯片正常工作了才有的):
           时钟输入信号pin13: 24M正弦波(外部晶振的输入)。
           时钟输出信号(像素频率):24M,变形了的像正弦波的方波。
           场同步信号Vsync:形如:   ----_----------_-----  :两个低电平之间是20ms左右(我测试的是22ms)
           行同步信号Href: 形如:   ----_----------_-----   :两个低电平之间是64us左右(我测试的是15.9Khz)
           以上三个信号是电视信号标准,一定要对。但是,在测试的时候有时候信号不是这个值,比如Vsync=34ms,why?我还没有搞清楚,请高手指点.
二:OV寄存器配置:
1:如果没有测试硬件,千万不要妄想配置寄存器! 也是我的调试原则,可惜这次我又违背了!嘚反省!
2: 用I2C读取OV9650的ProducaitonID寄存器【0x0A】【0x0B】:读出来版本号应该是0x9652,这里也一定要对,特别是你手上有几个信号的OV芯片的时候,不同型号的oV芯片,RESET复位信号不同,(有高有低哦!有一个网友就犯了这个错误浪费了四天),datasheet上没有说的很明白Reset是高复位还是低复位,我的小窍门是reset引脚内部有上拉电阻的话应该是低电平复位,有内部下拉电阻的话应该是高电平复位。
3:证明能够通过I2C控制OV9650后,将厂家给的或者网上下的相应的配置写入到ov9650。
4:如果配置大体正确,现在摄像头的数据应该出来了。


==============
以下是厂家给的配置:共有三个VGA,CIF,SXVGA,输出都是YUV模式,如是时钟是24M,帧率是15fps,我只验证了VGA模式的,效果还可以!
;09032004
;OV9650
;VGA YUV
;15fps when 24MHz input clock
;Device Address(Hex)/Register(Hex)/Value(Hex)
;
60 12 80
60 11 81
60 6b 0a
60 6a 3e
60 3b 09
60 13 e0
60 01 80
60 02 80
60 00 00
60 10 00
60 13 e5
;
60 39 43 ;50 for 30fps
60 38 12 ;92 for 30fps
60 37 00
60 35 91 ;81 for 30fps
60 0e 20
60 1e 04
;
60 A8 80
60 12 40
60 04 00
60 0c 04
60 0d 80
60 18 c6
60 17 26
60 32 ad
60 03 00
60 1a 3d
60 19 01
60 3f a6
60 14 2e
60 15 02
60 41 02
60 42 08
;
60 1b 00
60 16 06
60 33 e2 ;c0 for internal regulator
60 34 bf
60 96 04
60 3a 00
60 8e 00
;
60 3c 77
60 8B 06
60 94 88
60 95 88
60 40 c1
60 29 3f ;2f for internal regulator
60 0f 42
;
60 3d 92
60 69 40
60 5C b9
60 5D 96
60 5E 10
60 59 c0
60 5A af
60 5B 55
60 43 f0
60 44 10
60 45 68
60 46 96
60 47 60
60 48 80
60 5F e0
60 60 8c ;0c for advanced AWB (related to lens)
60 61 20
60 a5 d9
60 a4 74
60 8d 02
60 13 e7
;
60 4f 3a
60 50 3d
60 51 03
60 52 12
60 53 26
60 54 38
60 55 40
60 56 40
60 57 40
60 58 0d
;
60 8C 23
60 3E 02
60 a9 b8
60 aa 92
60 ab 0a
;
60 8f df
60 90 00
60 91 00
60 9f 00
60 a0 00
60 3A 01
;
60 24 70
60 25 64
60 26 c3
;
60 2a 00 ;10 for 50Hz
60 2b 00 ;40 for 50Hz
;
;gamma
60 6c 40
60 6d 30
60 6e 4b
60 6f 60
60 70 70
60 71 70
60 72 70
60 73 70
60 74 60
60 75 60
60 76 50
60 77 48
60 78 3a
60 79 2e
60 7a 28
60 7b 22
60 7c 04
60 7d 07
60 7e 10
60 7f 28
60 80 36
60 81 44
60 82 52
60 83 60
60 84 6c
60 85 78
60 86 8c
60 87 9e
60 88 bb
60 89 d2
60 8a e6
;


==============
;09032004
;OV9650
;CIF YUV
;15fps when 24MHz input clock
;Device Address(Hex)/Register(Hex)/Value(Hex)
;
60 12 80
60 11 83
60 6b 0a
60 6a 30
60 3b 09
60 13 e0
60 01 80
60 02 80
60 00 00
60 10 00
60 13 e5
;
60 39 43
60 38 12
60 37 00
60 35 91
60 0e a0
60 1e 04
;
60 A8 80
60 12 20
60 04 00
60 0c 04
60 0d 80
60 18 7e
60 17 26
60 32 24
60 03 36
60 1a 24
60 19 00
60 14 2e
60 15 02
60 3f a6
60 41 02
60 42 08
;
60 1b 00
60 16 06
60 33 e2 ;c0 for internal regulator
60 34 bf
60 96 04
60 3a 00
60 8e 00
;
60 3c 77
60 8B 06
60 94 88
60 95 88
60 40 c1
60 29 3f ;2f for internal regulator
60 0f 42
;
60 3d 92
60 69 40
60 5C b9
60 5D 96
60 5E 10
60 59 c0
60 5A af
60 5B 55
60 43 f0
60 44 10
60 45 68
60 46 96
60 47 60
60 48 80
60 5F e0
60 60 8c ;0c for advanced AWB (related to lens)
60 61 20
60 a5 d9
60 a4 74
60 8d 02
60 13 e7
;
60 4f 3a
60 50 3d
60 51 03
60 52 12
60 53 26
60 54 38
60 55 40
60 56 40
60 57 40
60 58 0d
;
60 8C 23
60 3E 02
60 a9 b8
60 aa 92
60 ab 0a
;
60 8f df
60 90 00
60 91 00
60 9f 00
60 a0 00
60 3A 01
;
60 24 70
60 25 64
60 26 c3
;
60 2a 00 ;00 for 50Hz
60 2b 00 ;D2 for 50Hz
;
;gamma
60 6c 40
60 6d 30
60 6e 4b
60 6f 60
60 70 70
60 71 70
60 72 70
60 73 70
60 74 60
60 75 60
60 76 50
60 77 48
60 78 3a
60 79 2e
60 7a 28
60 7b 22
60 7c 04
60 7d 07
60 7e 10
60 7f 28
60 80 36
60 81 44
60 82 52
60 83 60
60 84 6c
60 85 78
60 86 8c
60 87 9e
60 88 bb
60 89 d2
60 8a e6
;


=================
;09032004
;OV9650
;SXGA YUV
;7.5fps when 24MHz input clock
;Device Address(Hex)/Register(Hex)/Value(Hex)
;
60 12 80
60 11 80
60 6b 0a
60 6a 41
60 3b 09
60 13 e0
60 01 80
60 02 80
60 00 00
60 10 00
60 13 e5
;
60 39 43 ;50 for 15fps
60 38 12 ;93 for 15fps
60 37 00
60 35 91 ;81 for 15fps
60 0e 20
60 1e 04
;
60 A8 80
60 12 00
60 04 00
60 0c 00
60 0d 00
60 18 bd
60 17 1d
60 32 ad
60 03 12
60 1a 81
60 19 01
60 14 2e
60 15 00
60 3f a6
60 41 02
60 42 08
;
60 1b 00
60 16 06
60 33 e2 ;c0 for internal regulator
60 34 bf
60 96 04
60 3a 00
60 8e 00
;
60 3c 77
60 8B 06
60 94 88
60 95 88
60 40 c1
60 29 3f ;2f for internal regulator
60 0f 42
;
60 3d 92
60 69 40
60 5C b9
60 5D 96
60 5E 10
60 59 c0
60 5A af
60 5B 55
60 43 f0
60 44 10
60 45 68
60 46 96
60 47 60
60 48 80
60 5F e0
60 60 8C ;0c for advanced AWB (Related to lens)
60 61 20
60 a5 d9
60 a4 74
60 8d 02
60 13 e7
;
60 4f 3a
60 50 3d
60 51 03
60 52 12
60 53 26
60 54 38
60 55 40
60 56 40
60 57 40
60 58 0d
;
60 8C 23
60 3E 02
60 a9 b8
60 aa 92
60 ab 0a
;
60 8f df
60 90 00
60 91 00
60 9f 00
60 a0 00
60 3A 01
;
60 24 70
60 25 64
60 26 c3
;
60 2a 00 ;10 for 50Hz
60 2b 00 ;34 for 50Hz
;
;gamma
60 6c 40
60 6d 30
60 6e 4b
60 6f 60
60 70 70
60 71 70
60 72 70
60 73 70
60 74 60
60 75 60
60 76 50
60 77 48
60 78 3a
60 79 2e
60 7a 28
60 7b 22
60 7c 04
60 7d 07
60 7e 10
60 7f 28
60 80 36
60 81 44
60 82 52
60 83 60
60 84 6c
60 85 78
60 86 8c
60 87 9e
60 88 bb
60 89 d2
60 8a e6
;
mini2440提供了一个摄像头接口,可以输出RGB24,RGB16的原始图像还可以输出编码的如YUV格式的图像,并提供了偏移翻转,放大缩小的功能。与开发板配套的摄像头模块为CAM130,采用ov9650的芯片。操作摄像头接口实现视频的采集与显示,主要配置两个部分的寄存器:ov9650的寄存器,摄像头接口寄存器。
        ov9650寄存器在模块的内部,s3c2440是以sccb总线来与ov9650通信。sccb总线类似iic总线,而且mini2440摄像头接口的sccb总线就接在了他的iic接口上,所以可以通过Iic来配置ov9650的寄存器,同样也可以用gpio来模拟sccb总线的时序。ov9650有大量的寄存器需要设置,但是一般不需要我们关心,厂商将一些常用的配置写成数组,直接赋值就可以了。需要我们关心的是厂商ID寄存器,这个一般在摄像头初始化之前用来判定摄像头是否正确安装。
        摄像头接口寄存器的配置比较麻烦,大体上需要配置三类的寄存器。第一类是摄像头接口输入视频格式寄存器CISRCFMT,功能是设置摄像头接口的输入数据的格式与长宽。s3c2440的摄像头接口提供了两个DMA通道,一个预览输出DMA,有四块DMA缓冲区,这个通道用于将采集到的视频图像直接显示到Lcd上。另外一个是编码输出DMA,也有四块DMA缓冲区,用于后期处理视频。所以第二类是预览输出视频格式寄存器。这类寄存器主要有以下几个:
CIPRTRGFMT      这个寄存器主要设置目标图像的长宽与是否进行旋转与镜像处理
CIPRCTRL        突发长度寄存器,这里的值与目标图像的宽度有关,有计算公式,不需要关许只需要调用函数计算然后赋值给它就可以了
CIPRSCPRERATIO
CIPRSCPREDST
CIPRSCCTRL        这三个寄存器主要是设置缩放比例以及与缩放偏移相关的参数,需要以原始图像以及目变图像的大小作为参数,通过一定的公式计算得出。公式是固定的直接用就可以了,不需要关心。CIPRSCCTRL这个寄存器尤其重要,因为第30位是视频输出的格式,1为RGB24,0为RGB16格式,需要根据LCD的类型设置。我的mini2440采用的T35的lcd就是RGB16的屏,所以这里需要设置成0,否则输出到lcd的图像颜色就不对,如果是RGB24的屏,则第30位要设置成1。
CIPRTAREA    目标图像面积寄存器,这个主要用于决定DMA一次传送的数据量
CIPRCLRSA1
CIPRCLRSA2
CIPRCLRSA3
CIPRCLRSA4   这四个寄存器是DMA目的寄存器,也就是摄像头接口输出存放数据的地方,如果直接显示的话就要都赋值成Lcd的帧缓冲首地址
        第三类寄存器是编码输出视频格式寄存器,与第二类相似。摄像头接口还有一些功能寄存器需要设置,如时钟寄存器CAMDIVN,与控制寄存器CIGCTRL,负责设置信号的极性以及摄像头的复位。综上所述,操作摄像头需要以下几个步骤:

    (1) 读取厂商ID,来判定摄像头是否安装正确,这首先需要正确操作sccb总线,这一步也可以用来判定sccb总线时序是否正确。   

    (2) 配置摄像头,事先将寄存器的地址以及对应的值写入数组,直接通过循环完成配置,配置完成之后就不需要操作sccb总线了,也就是不需要管ov9650这端了。以下的操作设置摄像头接口这端的寄存器就可以了。

    (3) 设置摄像头所需的时钟,设置控制寄存器,复位摄像头。
    (4) 根据lcd的类型以及需要显示视频的大小,设置源图像寄存器,预览输出寄存器等
        以上是使用摄像头接口的预览输出功能的基本操作步骤,还有每采集一帧图像,摄像头都会产生中断。具体程序在我的下载资源里:http://download.csdn.net/detail/yaozhenguo2006/4001720 是在ubuntu下用amr-linux-gcc编译的,如果安装了arm-linux-gcc并且将命令导入到了环境变量里,直接在代码目录下make就可以了,程序参考了http://blog.csdn.net/zhaocj/article/details/5653479,感谢博主对摄像头详尽的讲述。在mini2440开发板上(配套lcd为统宝3.5寸屏)程序是可以正确运行的,如果其他的屏幕需要改一下参数。


 

你可能感兴趣的:(linuxDriver)