platform:rk3399
OS:Android 7.1
Kernel:4.4
参考:
1. KrisFei https://blog.csdn.net/kris_fei/article/details/79298971

简介

​ RK平台抽象出了一个公共的camera驱动,给应用层提供通用的camera驱动注册和操作接口。这样将camera驱动和配置全部抽离到用户空间,不需要重新编译和调试内核,极大的简化了camera的移植和调试。

​ 除USB摄像头走v4l2之外,其余类型的摄像头均走RK自己定义的一套公共Camera驱动接口。

  • CameraUSBAdapter: USB接口类型的摄像头,走v4l2.
  • CameraIspSOCAdapter:dvp接口,isp控制器接收。
  • CameraIspAdapter:mipi接口,isp控制器接收,不走v4l2.
  • CameraSOCAdapter:dvp接口,VIP控制器接收。

重要数据结构

数据结构

//isp设备描述结构体
typedef struct camsys_dev_s {unsigned int          dev_id;camsys_irq_t          irq;camsys_devmems_t      devmems;struct miscdevice     miscdev;void                  *clk;camsys_phyinfo_t      *mipiphy;camsys_phyinfo_t      cifphy;camsys_exdevs_t       extdevs;struct list_head      list;struct platform_device *pdev;void                  *soc;camsys_meminfo_t     *csiphy_reg;camsys_meminfo_t     *dsiphy_reg;camsys_meminfo_t     *isp0_reg;unsigned long         rk_grf_base;unsigned long         rk_cru_base;unsigned long         rk_isp_base;atomic_t              refcount;struct iommu_domain *domain;camsys_dma_buf_t dma_buf[CAMSYS_DMA_BUF_MAX_NUM];int dma_buf_cnt;int (*clkin_cb)(void *ptr, unsigned int on);int (*clkout_cb)(void *ptr, unsigned int on, unsigned int clk);int (*reset_cb)(void *ptr, unsigned int on);int (*phy_cb)(camsys_extdev_t *extdev,camsys_sysctrl_t *devctl, void *ptr);int (*iomux)(camsys_extdev_t *extdev, void *ptr);int (*platform_remove)(struct platform_device *pdev);int (*flash_trigger_cb)(void *ptr, int mode, unsigned int on);int (*iommu_cb)(void *ptr, camsys_sysctrl_t *devctl);
} camsys_dev_t;//内存信息描述结构体
typedef struct camsys_meminfo_s {unsigned char name[32];unsigned long phy_base;unsigned long vir_base;unsigned int size;unsigned int vmas;struct list_head list;
} camsys_meminfo_t;//phy信息描述结构体
typedef struct camsys_phyinfo_s {unsigned int             phycnt;void                     *clk;camsys_meminfo_t         *reg;int (*clkin_cb)(void *ptr, unsigned int on);int (*ops)(void *ptr, camsys_mipiphy_t *phy);int (*remove)(struct platform_device *pdev);
} camsys_phyinfo_t;//中断连接描述结构体
typedef struct camsys_irqcnnt_s {int          pid;unsigned int timeout;             //usunsigned int mis;unsigned int icr;
} camsys_irqcnnt_t;

ioctl codes

IOCTL CODES 说明
CAMSYS_VERCHK 检查驱动版本和头文件版本
CAMSYS_I2CRD 读i2c寄存器
CAMSYS_I2CWR 写i2c寄存器
CAMSYS_SYSCTRL sysctl控制(vdd,gpio,clk,phyflash,iommu)
CAMSYS_REGRD
CAMSYS_REGWR
CAMSYS_REGISTER_DEVIO 注册camera
CAMSYS_DEREGISTER_DEVIO 注销camera
CAMSYS_IRQCONNECT 中断连接
CAMSYS_IRQWAIT 中断等待
CAMSYS_IRQDISCONNECT 中断断开
CAMSYS_QUREYMEM 查询i2c或寄存器映射
CAMSYS_QUREYIOMMU 查询是否是能IOMMU

rk_camsys

ISP

camsys_platform_probe(struct platform_device *pdev) //ISP probe-->camsys_soc_init(CHIP_TYPE);     //根据CHIP_TYPE 选择对应的配置函数-->camsys_soc_p->soc_cfg = camsys_rk3399_cfg;--->irq_id = irq_of_parse_and_map(dev->of_node, 0); //映射中断---->    INIT_LIST_HEAD(&camsys_dev->extdevs.list);   //初始化camera 链表(支持两个camera)---->  INIT_LIST_HEAD(&camsys_dev->extdevs.active);  //初始化打开设备链表---->  INIT_LIST_HEAD(&camsys_dev->list);   //初始化isp链表(支持两个isp)//注册mipiphy驱动if (camsys_mipiphy_probe_cb(pdev, camsys_dev) < 0) {camsys_err("Mipi phy probe failed!");}//注册camsys_marvin驱动camsys_mrv_probe_cb(pdev, camsys_dev);//初始化ext flash链表camsys_init_ext_fsh_module();

mipiphy

主要填充camsys_phyinfo_s结构体

//获取mipiphy数量
err = of_property_read_u32(dev->of_node,"rockchip,isp,mipiphy", &mipiphy_cnt);//初始化meminfo
camsys_dev->mipiphy[i].reg = meminfo;//初始化clk
camsys_dev->mipiphy[i].clk = (void *)phyclk;//初始化成员函数
camsys_dev->mipiphy[i].phycnt = mipiphy_cnt;
camsys_dev->mipiphy[i].clkin_cb = camsys_mipiphy_clkin_cb;
camsys_dev->mipiphy[i].ops = camsys_mipiphy_ops;
camsys_dev->mipiphy[i].remove = camsys_mipiphy_remove_cb;//获取cru基址
camsys_dev->rk_cru_base = (unsigned long)of_iomap(node, 0);//获取grf基址
camsys_dev->rk_grf_base = (unsigned long)of_iomap(node, 0);

camsys_marvin

struct file_operations camsys_fops = {.owner =         THIS_MODULE,.open =             camsys_open,.release =          camsys_release,.unlocked_ioctl =   camsys_ioctl,.mmap =          camsys_mmap,.compat_ioctl = camsys_ioctl_compat,
};
camsys_mrv_probe_cb-->err = request_irq(camsys_dev->irq.irq_id, camsys_mrv_irq,   //申请中断IRQF_SHARED, CAMSYS_MARVIN_IRQNAME,camsys_dev);---> pm_runtime_enable(&pdev->dev); //使能pm---> clk_set_rate(mrv_clk->isp, 210000000); //初始化clkclk_set_rate(mrv_clk->isp_jpe, 210000000); ---->domain = iommu_domain_alloc(&platform_bus_type); //根据bus type配domain-----> err = iommu_get_dma_cookie(domain);  //根据domain获取DMA-API资源--->group = iommu_group_alloc(); //分配一个group---->err = iommu_group_add_device(group, &pdev->dev); //将dev添加到IOMMU group----> camsys_dev->iommu_cb = camsys_mrv_drm_iommu_cb; // dma_buf map-----> err = misc_register(&camsys_dev->miscdev); //注册杂项设备camsys_marvin1---->camsys_dev->dev_id = CAMSYS_DEVID_MARVIN;   //初始化dev_idcamsys_dev->platform_remove = camsys_mrv_remove_cb;  //初始化probe_remove函数

ext_flash

重要结构体

struct rt8547_platform_data {int flen_gpio;int flen_active;int ctl_gpio;int ctl_active;int flset_gpio;int flset_active;unsigned char def_lvp:4;unsigned char def_tol:3;
};typedef struct ext_fsh_info_s{struct      platform_device pdev;char*       dev_model;    struct      list_head         list;
}ext_fsh_info_t;

注册flash dev(rt8547)

camsys_register_ext_fsh_dev  //CAMSYS_REGISTER_DEVIO 中注册--->platform_device_register(&new_dev->pdev) //注册rt8547平台驱动---->list_add_tail(&new_dev->list, &g_ext_fsh_devs.dev_list); //将flash设备添加到链表

flash ctrl

mode:0:  CAM_ENGINE_FLASH_OFF = 0x00,1:  CAM_ENGINE_FLASH_AUTO = 0x01,2:  CAM_ENGINE_FLASH_ON = 0x02,3:  CAM_ENGINE_FLASH_RED_EYE = 0x03,5:  CAM_ENGINE_FLASH_TORCH = 0x05

个人博客:www.letcos.top

[Camera]RK平台摄像头驱动相关推荐

  1. [AUDIO]RK平台声卡驱动和调试

    1.概述 一个声卡包含 cpu_dai, codec_dai, 以及 dai_link 组成,分别对应 cpu dai 的 dirver,比如 I²S driver, spdif driver: co ...

  2. 深入学习Linux摄像头(四)三星平台fimc驱动详解

    深入学习Linux摄像头系列 深入学习Linux摄像头(一)v4l2应用编程 深入学习Linux摄像头(二)v4l2驱动框架 深入学习Linux摄像头(三)虚拟摄像头驱动分析 深入学习Linux摄像头 ...

  3. WinCE平台USB摄像头驱动开发

    (转载)http://tech.e800.com.cn/articles/2009/116/1257487620781_1.html 由于良好的性能.低廉的价格和灵活方便的特性,USB 摄像头正被广泛 ...

  4. 浅谈WinCE平台USB摄像头驱动开发流程

    转自http://tech.e800.com.cn/articles/2009/116/1257487620781_1.html 由于良好的性能.低廉的价格和灵活方便的特性,USB 摄像头正被广泛的集 ...

  5. android ko 编译,如何把rtl8188EUS驱动编译生成ko模块并且下载到rk平台Android4.2.2上使用...

    下了rtl8188EUS_linux_v4.3.24_16705.20160509.tar.gz,看了里面的数据手册,发现有些看不懂,上网搜了一下,发现大部分博客都在扯淡...后来还是我把Makefi ...

  6. RK平台移植rtl8852bs wifi驱动

    RK平台 android 12的内核里面没有rtl8852bs wifi驱动,找模组原厂要了驱动,看了一下是其他平台的...要放RK平台是编译不过的,要做一下相应的修改,有点坑! 首先,修改kerne ...

  7. linux 渲染程序图层管理,Linux驱动多图层开发--lcdc/framebuffer的注册(RK平台)

    目录 一.引言 Android图形系统系统篇之HWC的介绍 二.源码分析 ------>framebuffer框架 ------>2.RK平台下多图层代码分析 三.多图层的硬件lcdc支持 ...

  8. Linux驱动学习--多图层开发(一)--lcdc/framebuffer的注册(RK平台)

    目录 一.引言 Android图形系统系统篇之HWC的介绍 二.源码分析 ------>framebuffer框架 ------>2.RK平台下多图层代码分析 三.多图层的硬件lcdc支持 ...

  9. android camera(二):摄像头工作原理、s5PV310 摄像头接口(CAMIF)

    关键词: android  camera CMM 模组 camera参数  CAMIF 平台信息: 内核: linux 系统: android 平台:S5PV310(samsung exynos 42 ...

最新文章

  1. iOS 标签自动布局
  2. 6月27日任务 配置Tomcat监听80端口、配置Tomcat虚拟主机、Tomcat日志
  3. JSON与JAVA数据的转换
  4. Java poi插件导出Excel文件合并多sheet页
  5. boost::safe_numerics模块相关的测试程序
  6. 一个短小精悍的在线jshint工具
  7. [C++STL]deque容器用法介绍
  8. [性能调优] mysql 优化变量
  9. linux svn与apache,linux下svn与apache整合搭建
  10. [it-ebooks]电子书列表v0.1.1
  11. 景点旅游信息系统——C/C++程序设计、Qt图形化界面
  12. 关于AD15中恢复默认菜单的快捷操作
  13. 手写reduce方法
  14. echarts贵州地图展示自定义贵安新区
  15. Windows配置万德(Wind)量化接口
  16. CentOS版本的Linux的安装
  17. 异常检测-统计学方法
  18. 弱校联萌十一大决战之如日中天-C. Cinderella
  19. maven明明本地仓库有依赖包,还会远程下载的问题
  20. android查询mysql并显示_Android操作SQLite数据库(增、删、改、查、分页等)及ListView显示数据的方法详解...

热门文章

  1. oracle 启动mrp进程,DataGuard MRP进程crash的处理案例 ORA-01111
  2. 财付通 商户证书pfx转pem(转)
  3. 计算机错误1327,错误:错误 1327。 无效驱动器
  4. 寻找亚马逊测评师邮箱_亚马逊测评中介怎么弄
  5. 2020年电赛 LMT70介绍和题目猜测
  6. 国企软件开发岗校招指南
  7. 即将出,多院校发布初试成绩查询通知-文都管联院
  8. 史上最厉害的“1+2”!这个270年前出现的大难题,已经60多年没有出现好消息了..........
  9. 用友r9怎样启动应用服务器,用友政务GRP/R9软件套打设置操作流程
  10. TensorFlow 从入门到精通(5)—— 多层神经网络与应用