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

来源:互联网 发布:手柄要下载什么软件 编辑:程序博客网 时间:2024/04/30 23:20
Platform: RK3288
OS: Android 6.0
Kernel: 3.10.92

CameraHal的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来创建
createVideoEncBuffer
createPreviewBuffer
createRawBuffer
createJpegBuffer

CameraHal::CameraHal() ->    CameraHal.cpp
    mCamMemManager = new IonDmaMemManager() ->
        IonDmaMemManager::IonDmaMemManager -> CameraHal_Mem.cpp
            ion_open ->
                open("/dev/ion", O_RDWR); ->
                    ion_open ->    ion.c
                        ion_client_create
BufferProvider::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会操作它.


1 0
原创粉丝点击