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会操作它.
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会操作它.