slt 测试camera总线

以下是我在任务中所遇到的问题,怎么解决的,以及在问题中学到了什么东西。
一.不了解从camera获取colorbar的具体的流程。解决:问人,上网查,看之前的c++代码。总结:从无到有,没有概念时,要多看前人的代码。最后确定流程为:
1.open dev/cim1
2.CIMIO_SET_PREVIEW_FMT(参数存疑,待说);
3.CIMIO_SET_PREVIEW_SIZE(SIZE大小应符合sensor内尺寸,待说);
4.malloc内存(这时对内存分配没有理解,具体内存分配,待说);
5.CIMIO_SET_PREVIEW_MEM(对参数理解有问题);
6.CIMIO_START_PREVIEW
7.CIMIO_GET_FRAME(对流程理解不深入,不知道这步干什么,没有和SET_PREVIEW_MEM联系起来);
8.CIMIO_SHUTDOWN
9.close /dev/cim


二.遇到的问题
1.本任务最大的问题:
内存分配,set_mem、get_frame的问题
本想只是用简单的malloc就得到640*480*2(*2的原因是ov5640采用的是YUV_422_I的format(参考前人代码得出),一个pixel大小为16bit)大小的用户空间内存,结果不行,闫政汀建议使用pmem的方式进行内存分配,并从网上搜集资料,搜集的资料结果如下:
pmem是为实现共享大尺寸连续的物理内存而开发的一种机制。
pmem相当于把系统内存分出一部分单独管理,即不被mm管理(内核内存在uboot中的include/configs/gemini.h中设置,pmem的大小及基地址在kernel-3.0.8/arch/mips/xburst/soc-4775/board/gemini中设置);
pmem驱动的调用流程
1.open--》driver/misc/pmem.c:pmem_open(注意将device driver->MIsc devices->android pmem allocater编入内核);
2.mmap-》drivers/misc/pmem.c:pmem_allocate、drivers/misc/pmem.c:pmem_map_pfn_range 


MMAP:
mmap(void *start,size_t length,int prot,int flags,int fd,off_t offset)
start:映射区的开始地址,设置为0时表示由系统决定映射区的起始地址。
mmap返回被映射区的指针。
mmap操作提供了一种机制,应用程序直接访问设备内存


所返回的是虚拟地址,通过SET_PREVIEW_MEM传给cim(SET_PREVIEW_MEM的参数结构体中传的是虚拟地址+物理地址(通过pmem中的ioctl、GET_PHYS得到))

2.如何把内存给colorbar使用的:

通过pmem申请到一块连续的物理内存-》通过mmap把这块物理内存映射到用户空间,供用户空间使用,返回映射的虚拟地址-》把这个地址及其他包在一个结构体中当做set_preview_mem的参数,传给cim,此时,start_camera,通过get_frame这个ioctl把colorbar放入指定的这个虚拟地址之中。

3.在应用程序中set_preview_size中要传的size_w、size_h的大小要符合ov5640的要求,ov5640识别的尺寸是(320*240、640*480、1280*720),这里设置的是640*480.

4.colorbar在驱动中 的ov5640_init 把ret |= ov5640_reg_writes(client, ov5640_colorbar);打开(原为注掉)编的时候把#ifdef CONFIG_OV5640_RAW_BAYER选上。这样就能得到colorbar的数据了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值