首页 > 系统 > Android > 正文

[RK3288][Android6.0] ION 驱动流程小结

2019-11-09 16:32:21
字体:
来源:转载
供稿:网友
Platform: RK3288OS: Android 6.0Kernel: 3.10.92之前Qualcomm平台有分析过ION, 可参考http://blog.csdn.net/kris_fei/article/details/8588661和http://blog.csdn.net/kris_fei/article/details/8618587因此这里就走下流程了.rk3288.dtsi中ion相关配置:ion {    compatible = "rockchip,ion";    #address-cells = <1>;    #size-cells = <0>;    ion_drm: rockchip,ion-heap@5 {        compatible = "rockchip,ion-heap";        rockchip,ion_heap = <5>;        reg = <0x00000000 0x00000000>;    };    ion_cma: rockchip,ion-heap@4 {        /* CMA HEAP */        compatible = "rockchip,ion-heap";        rockchip,ion_heap = <4>;        reg = <0x00000000 0x28000000>; /* 640MB */    };    rockchip,ion-heap@0 {         /* VMALLOC HEAP */        compatible = "rockchip,ion-heap";        rockchip,ion_heap = <0>;    };};

drm: 特意有和RK原开发者确认过,说是Digital Rights Management, 留给数字版权保护用的,目前没用到,但我的第一想法是Display Rendering Management,是给GPU用的.

cma: Contiguous Memory Allocator, 用于连续物理内存的分配,kernel里最终用dma实现.vmalloc: 物理内存非连续的情况.不过我看了它的allocate实现,最终调用的是alloc_pages(),说明它是物理连续的,这块有待再研究.

rk3288_reserve ->    rk3288.c    rockchip_ion_reserve ->    common.c        rockchip_ion_find_heap    -> rockchip_ion.c //解析dts中配置,主要第二个参数ion_pdata,dts的解析是存到此变量中的.            of_get_flat_dt_PRop    //获取rockchip,ion_heap 的值,也就是heap id.            rockchip_ion_populate_heap    //在ion_heap_meta保留了各个heap id对应的type和name, 如果id一样就赋值.            of_get_flat_dt_prop    //如果有,就读取head的base address和size    ion_reserve ->     //还是以ion_pdata为参数. 根据heap id或者base=0的分配对应的内存,如果size为0就不分配,这里只有cma的size不是0.另一方面,ion的初始化也会在init中调用ion_init -> rockchip_ion.c    platform_driver_register ->        rockchip_ion_probe ->            device_register ->    rockchip_ion_cma_dev此device在上面的rockchip_ion_populate_heap被用到            ion_device_create -> ion.c    //创建字符节点,名字是 /dev/ion, 用于上层调用.                misc_register    //对用fops是ion_fops                debugfs_create_file    //创建多个调试文件,在/sys/kernel/debug下可以看到            ion_heap_create     -> ion_heap.c //根据每个head信息依次创建struct ion_heap,用于管理heap.                ion_cma_heap_create    //cma类型的heap调用的是此接口.            ion_device_add_heap    //添加到树中管理.到此,用户空间可以正常的接口操作ion了,现成例子hardware/rockchip/librkvpu/common/vpu_mem_test.cion_mytest1 ->    ion_open ->    system/core/libion/ion.c        open("/dev/ion", O_RDWR); ->            ion_open -> ion.c //内核空间                ion_client_create    //标准创建client方法    ion_alloc -> //分配内存,会返回一个handle, heap_mask和len是关键参数,决定分配的head type以及size.        ion_ioctl(fd, ION_IOC_ALLOC, &data);    //本质是调用ioctl            ion_ioctl    -> //内核空间                ion_alloc ->                    ion_buffer_create    //标准创建ion buffer方法, 前面会判断只有heap id在内核里存在并且一致才可以创建,所以用户空间传参要注意.                    ion_handle_create    //标准创建handle, 系统用handle来管理buffer.                    ion_handle_add    //创建完成后添加.    ion_free       
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表