wince5.0下Camera驱动程序分析

     1.camera采集动态图像以及显示的总流程:DMA从camera存放动态图像的寄存器将数据传输到memory,再由应用程序实时(通过DMA中断)从memory将数据copy到LCD的overlay2的framebuffer中去。
Camera-capturing------> Camera Data-reg------>Camera-dma-mem------>(App Copy to)Lcd-framebuffer------->Lcd overlay2 display
      2.驱动程序分析:Camera的驱动程序以流接口的形式提供,真正用到的导出的接口有CAM_INIT、CAM_IOCONTROL。初始化过程为:初始化硬件,注册中断。硬件初始化包括DMA的初始化,LCD的一些基本参数配置(但并不是overlay2的参数)。IOCONTROL部分包括overlay2的getaddress、enable、disable和camera的init、startcaputring、stopcaputring、deinit等。Camera的init的输入参数(CameraApp为一结构体)是由app提供的,驱动程序从该参数得到一些关于所要显示的图像的宽度和高度等信息;同时CameraApp也是输出参数,app通过该参数得到硬件的一些信息(camera-dma-mem的地址等)。(camera-dma-mem的地址用的是physical地址,所以在app中要用VirtualAllocCopyPhysical函数映射一下。)inti同时设置camera的寄存器,分配dma的通道,设置各descriptors的具体地址等工作。Camera的startcapturing主要启动DMA开始数据传输。Overlay2的相关操作:getaddress为overlay2的framedescriptors分配地址,配置DMA相关地址(该地址应该与LCD的对应地址相同,否则,overlay2根本不起来lcd并挂死),同时也要返回给app有关framebuffer的地址;enable为lcd相关寄存器为overlay2模式,并resumelcd。在整个的camera驱动程序中都有相关的CI(caputer interface)的操作,该本份为对pxa270的有关camera的寄存器的设置,有待进一步研究。
      3.camera的app的工作流程:open ----> getoverlay2addr -----> enableoverlay2 ----->startcaputering stopcaptuering ----> disableoverlay2
      总结:在lcd的驱动程序中,有关framebuffer的地址是HalAllocateCommonBuffer动态获取的内存地址,但是在camera的驱动程序中用的是固定的地址0xa3a00000,在bootloader中好像也是用的这个固定地址。但是我在camera中用这个固定地址的时候去无法正常工作,如上面所说,lcd中和camera中的相关的framebuffer的地址一定要一致。想从lcd中拿到framebuffer的地址值,但是lcd的驱动的加载要比camera的晚(不太清楚驱动加载的顺序是如何确定的),不过还是有办法解决:在系统加载camera驱动的时候不去初始化它,而是等到open它的时候去初始化。由于open要在app中调用,故然可以拿到lcd的framebuffer的地址了。拿到framebuffer的地址的方法可以通过读写注册表的值做到。

from:http://bluefish.blog.51cto.com/214870/58112

你可能感兴趣的:(工作,interface,WinCE,CAM)