首页 > 系统 > Android > 正文

[RK3288][Android6.0] Camera HAL ION 使用小结

2019-11-09 15:21:31
字体:
来源:转载
供稿:网友
Platform: RK3288OS: Android 6.0Kernel: 3.10.92CameraHal的ION实现主要在文件 CameraHal_Mem.cpp中, 提供了三种实现#define CAMERA_MEM_PMEM 0#define CAMERA_MEM_ION  1#define CAMERA_MEM_IONDMA  2目前定义的是CAMERA_MEM_IONDMA,也就是用的IonDmaMemManager类, video/PReview/jpeg/raw buffer都会调用ion来创建createVideoEncBuffercreatePreviewBuffercreateRawBuffercreateJpegBufferCameraHal::CameraHal() ->    CameraHal.cpp    mCamMemManager = new IonDmaMemManager() ->        IonDmaMemManager::IonDmaMemManager -> CameraHal_Mem.cpp            ion_open ->                open("/dev/ion", O_RDWR); ->                    ion_open ->    ion.c                        ion_client_createBufferProvider::createBuffer ->    CameraBuffer.cpp    mCamBuffer->createPreviewBuffer    -> //假设是创建preview buffer.        IonDmaMemManager::createPreviewBuffer ->            mPreviewData = (camera_ionbuf_t*)malloc(...)    //后面用于存储ion相关信息            createIonBuffer ->                ion_alloc     -> //这里的alloc分两种情况,一种是开启了iommu的,那么这时候可以使用ION_VMALLOC_HEAP_ID类型的方式分配,否则使用ION_CMA_HEAP_ID类型的.                     ion_ioctl(fd, ION_IOC_ALLOC, &data);                        ion_ioctl -> ion.c                            ion_alloc ->    //heap id是ION_VMALLOC_HEAP_ID                                ion_buffer_create ->                                    heap->ops->allocate ->    //对应的是system_heap_ops, rockchip_ion.c中的ion_heap_meta定义.                                        ion_system_heap_allocate ->    ion_system_heap.c                                            alloc_largest_available ->                                                alloc_buffer_page ->                                                    alloc_pages    //分配了n个order的物理连续的pages.                                            sg_alloc_table    //分配一个sg table,定义可参考 http://blog.sina.com.cn/s/blog_43f909fd010008xm.html                                    heap->ops->map_dma                                        ion_system_heap_map_dma //返回刚才分配得到的sg table.                ion_share ->                    ion_ioctl(fd, ION_IOC_SHARE, &data); ->                        ion_ioctl ->    ion.c                            ion_share_dma_buf_fd ->                                ion_share_dma_buf -> //创建一个dma_buf, 把ion_buffer的信息给它.                                    dma_buf_export    //dma_buf_ops变量后面在mmap将会被用到.                                dma_buf_fd    //得到的fd传到用户空间.                mmap(...., map_fd);    -> //用到刚才生成的fd                    ion_mmap ->    ion.c //调用dma_buf_ops的mmap函数指针                        buffer->heap->ops->map_user    ->                             ion_heap_map_user ->    ion_heap.c                                remap_pfn_range    //用前面生成的pages利用sg table来填充vma线性地址,这样就映射到了用户空间地址.应用实例:CameraAdapter::previewThread ->    CameraAdapter.cpp    reprocessFrame(tmpFrame); ->        phy_addr = mPreviewBufProvider->getBufShareFd(frame->frame_index);    //iommu enabled的情况            share_fd = mBufInfo[bufindex].share_fd;    //在BufferProvider::createBuffer()的时候share_fd从ion share出来得到,接下来MjpegDecoder会操作它.
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表