[Camera]RK平台摄像头驱动
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平台摄像头驱动相关推荐
- [AUDIO]RK平台声卡驱动和调试
1.概述 一个声卡包含 cpu_dai, codec_dai, 以及 dai_link 组成,分别对应 cpu dai 的 dirver,比如 I²S driver, spdif driver: co ...
- 深入学习Linux摄像头(四)三星平台fimc驱动详解
深入学习Linux摄像头系列 深入学习Linux摄像头(一)v4l2应用编程 深入学习Linux摄像头(二)v4l2驱动框架 深入学习Linux摄像头(三)虚拟摄像头驱动分析 深入学习Linux摄像头 ...
- WinCE平台USB摄像头驱动开发
(转载)http://tech.e800.com.cn/articles/2009/116/1257487620781_1.html 由于良好的性能.低廉的价格和灵活方便的特性,USB 摄像头正被广泛 ...
- 浅谈WinCE平台USB摄像头驱动开发流程
转自http://tech.e800.com.cn/articles/2009/116/1257487620781_1.html 由于良好的性能.低廉的价格和灵活方便的特性,USB 摄像头正被广泛的集 ...
- android ko 编译,如何把rtl8188EUS驱动编译生成ko模块并且下载到rk平台Android4.2.2上使用...
下了rtl8188EUS_linux_v4.3.24_16705.20160509.tar.gz,看了里面的数据手册,发现有些看不懂,上网搜了一下,发现大部分博客都在扯淡...后来还是我把Makefi ...
- RK平台移植rtl8852bs wifi驱动
RK平台 android 12的内核里面没有rtl8852bs wifi驱动,找模组原厂要了驱动,看了一下是其他平台的...要放RK平台是编译不过的,要做一下相应的修改,有点坑! 首先,修改kerne ...
- linux 渲染程序图层管理,Linux驱动多图层开发--lcdc/framebuffer的注册(RK平台)
目录 一.引言 Android图形系统系统篇之HWC的介绍 二.源码分析 ------>framebuffer框架 ------>2.RK平台下多图层代码分析 三.多图层的硬件lcdc支持 ...
- Linux驱动学习--多图层开发(一)--lcdc/framebuffer的注册(RK平台)
目录 一.引言 Android图形系统系统篇之HWC的介绍 二.源码分析 ------>framebuffer框架 ------>2.RK平台下多图层代码分析 三.多图层的硬件lcdc支持 ...
- android camera(二):摄像头工作原理、s5PV310 摄像头接口(CAMIF)
关键词: android camera CMM 模组 camera参数 CAMIF 平台信息: 内核: linux 系统: android 平台:S5PV310(samsung exynos 42 ...
最新文章
- iOS 标签自动布局
- 6月27日任务 配置Tomcat监听80端口、配置Tomcat虚拟主机、Tomcat日志
- JSON与JAVA数据的转换
- Java poi插件导出Excel文件合并多sheet页
- boost::safe_numerics模块相关的测试程序
- 一个短小精悍的在线jshint工具
- [C++STL]deque容器用法介绍
- [性能调优] mysql 优化变量
- linux svn与apache,linux下svn与apache整合搭建
- [it-ebooks]电子书列表v0.1.1
- 景点旅游信息系统——C/C++程序设计、Qt图形化界面
- 关于AD15中恢复默认菜单的快捷操作
- 手写reduce方法
- echarts贵州地图展示自定义贵安新区
- Windows配置万德(Wind)量化接口
- CentOS版本的Linux的安装
- 异常检测-统计学方法
- 弱校联萌十一大决战之如日中天-C. Cinderella
- maven明明本地仓库有依赖包,还会远程下载的问题
- android查询mysql并显示_Android操作SQLite数据库(增、删、改、查、分页等)及ListView显示数据的方法详解...
热门文章
- oracle 启动mrp进程,DataGuard MRP进程crash的处理案例 ORA-01111
- 财付通 商户证书pfx转pem(转)
- 计算机错误1327,错误:错误 1327。 无效驱动器
- 寻找亚马逊测评师邮箱_亚马逊测评中介怎么弄
- 2020年电赛 LMT70介绍和题目猜测
- 国企软件开发岗校招指南
- 即将出,多院校发布初试成绩查询通知-文都管联院
- 史上最厉害的“1+2”!这个270年前出现的大难题,已经60多年没有出现好消息了..........
- 用友r9怎样启动应用服务器,用友政务GRP/R9软件套打设置操作流程
- TensorFlow 从入门到精通(5)—— 多层神经网络与应用