[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会操作它.
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
- [RK3288][Android6.0] Camera HAL ION 使用小结
- [RK3288][Android6.0] Camera HAL ION 使用小结
- [RK3288][Android6.0] Camera HAL流程小结
- [RK3288][Android6.0] Camera HAL流程小结
- [RK3288][Android6.0] ION 驱动流程小结
- [RK3288][Android6.0] Camera HAL层拍照编码成JPEG流程小结
- [RK3288][Android6.0] 调试笔记 --- Camera HAL固定fps的方法
- [RK3288][Android6.0] Camera驱动初始化流程
- [RK3288][Android6.0] StageFright解码流程小结
- [RK3288][Android6.0] USB 枚举过程小结
- [RK3288][Android6.0] USB UVC 驱动小结
- [RK3288][Android6.0] USB 枚举过程小结
- [RK3288][Android6.0] 串口驱动流程小结
- [RK3288][Android6.0] USB ECHI 驱动小结
- [RK3288][Android6.0] SettingsProvider数据库小结
- [RK3288][Android6.0] 音频调试方法小结
- [RK3288][Android6.0] MediaCodec初始化过程小结
- [RK3288][Android6.0] 有线耳机驱动小结
- SFTP 上传下载 java
- HibernateSessionFactory 的使用!
- 不使用第三方变量,交换两个变量的值
- Jmeter第一次尝试
- How to change debian desktop wallpaper
- [RK3288][Android6.0] Camera HAL ION 使用小结
- 2017年2月规划
- redis执行Lua脚本报"attempt to compare number with string"错误的解决方法
- QTP自动化测试之VBScript基础(下)
- 流量控制与令牌桶算法
- WordPress 无法使用the_content()方法输出内容
- python重载
- 自定义view的构造方法和样式主题
- html技巧总结