基于RV1126平台imx291分析 --- mipi-csi-phy注册
Linux v4l2架构学习总链接
mipi-csi-phy源码
dts配置如下
csi_dphy0: csi-dphy@ff4b0000 {compatible = "rockchip,rv1126-csi-dphy";... status = "okay";...ports {#address-cells = <1>;#size-cells = <0>;port@0 {reg = <0>;#address-cells = <1>;#size-cells = <0>;mipi_in_ucam0: endpoint@1 {reg = <1>;/* imx291 */remote-endpoint = <&ucam_out2>;data-lanes = <1 2 3 4>;};};port@1 {reg = <1>;#address-cells = <1>;#size-cells = <0>;csidphy0_out: endpoint@0 {reg = <0>;remote-endpoint = <&mipi_csi2_input>;};};};
};
其实这里可以看出来和imx291直接的联系,imx291注册中dts有这样一句话 remote-endpoint = <&mipi_in_ucam0>;
代码中对remote-enpoint的解析后面也会分析,所以这里也可以知道下一遍文章要分析的subdev是有mipi_csi2_input的port的节点
开始驱动分析
struct mipidphy_priv {struct device *dev;...struct v4l2_async_notifier notifier;struct v4l2_subdev sd;...struct mipidphy_sensor sensors[MAX_DPHY_SENSORS];int num_sensors;...bool is_streaming;...int (*stream_on)(struct mipidphy_priv *priv, struct v4l2_subdev *sd);int (*stream_off)(struct mipidphy_priv *priv, struct v4l2_subdev *sd);
};static int rockchip_mipidphy_probe(struct platform_device *pdev)
{struct device *dev = &pdev->dev;struct v4l2_subdev *sd;struct mipidphy_priv *priv;struct regmap *grf;struct resource *res;const struct of_device_id *of_id;const struct dphy_drv_data *drv_data;int i, ret;priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);if (!priv)return -ENOMEM;priv->dev = dev;...priv->stream_on = csi_mipidphy_stream_on;priv->stream_off = csi_mipidphy_stream_off;...sd = &priv->sd;/** 同样的* sd->ops = &mipidphy_subdev_ops;* sd->flags = V4L2_SUBDEV_FL_HAS_DEVNODE;* sd->v4l2_dev = NULL*/v4l2_subdev_init(sd, &mipidphy_subdev_ops);sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;snprintf(sd->name, sizeof(sd->name), "rockchip-mipi-dphy-rx");sd->dev = dev;platform_set_drvdata(pdev, &sd->entity);ret = rockchip_mipidphy_media_init(priv);if (ret < 0)goto destroy_mutex;return 0;...
}static int rockchip_mipidphy_media_init(struct mipidphy_priv *priv)
{int ret;/** 下面这几行代码,个人认为加个CONFIG_MEDIA_CONTROLLER控制比较好* 同样是media,暂时忽略*/
//#if defined(CONFIG_MEDIA_CONTROLLER)+++++++++++++++++++++++++++++++++++++priv->pads[MIPI_DPHY_RX_PAD_SOURCE].flags =MEDIA_PAD_FL_SOURCE | MEDIA_PAD_FL_MUST_CONNECT;priv->pads[MIPI_DPHY_RX_PAD_SINK].flags =MEDIA_PAD_FL_SINK | MEDIA_PAD_FL_MUST_CONNECT;priv->sd.entity.function = MEDIA_ENT_F_VID_IF_BRIDGE;ret = media_entity_pads_init(&priv->sd.entity,MIPI_DPHY_RX_PADS_NUM, priv->pads);if (ret < 0)return ret;
//#endif -----------------------------------------------------------------/** 对于v4l2_async_notifier_parse_fwnode_endpoints_by_port* 看专题分析* https://blog.csdn.net/ldl617/article/details/115526542* 回调函数rockchip_mipidphy_fwnode_parse* 这里也不再分析,太细节和v4l2关系不大*/ret = v4l2_async_notifier_parse_fwnode_endpoints_by_port(priv->dev, &priv->notifier,sizeof(struct sensor_async_subdev), 0,rockchip_mipidphy_fwnode_parse);if (ret < 0)return ret;if (!priv->notifier.num_subdevs)return -ENODEV; /* no endpoint */priv->sd.subdev_notifier = &priv->notifier;/* 注意notifier的ops不为NULL*/priv->notifier.ops = &rockchip_mipidphy_async_ops;/** 具体的看v4l2_async_subdev_notifier_register 分析* https://blog.csdn.net/ldl617/article/details/115548594* 这个执行后 mipi csi pht的notifier->wait上会挂载asd* 这个asd就是notifier->subdevs[0]* 也就是imx291在dts中的节点* 最后将mipi csi pht的notifier挂载到notifier_list上*/ret = v4l2_async_subdev_notifier_register(&priv->sd, &priv->notifier);if (ret) {dev_err(priv->dev,"failed to register async notifier : %d\n", ret);v4l2_async_notifier_cleanup(&priv->notifier);return ret;}/** 这里会有v4l2_dev = NULL不执行* 只是将subdev挂载到subdev_list*/return v4l2_async_register_subdev(&priv->sd);
}
这样mipi-csi-phy就注册完了
结合之前的imx291注册
可以知道
- notifier_list上有2个notifier,分别是imx291的和mipi-csi-phy的
- subdev_list上有2个subdev,分别是imx291的和mipi-csi-phy的
其中mipi-csi-phy的notifier->subdevs[0]中记录了imx291 dts节点的信息
这样就关联起来了
imx291 --> mipi csi phy
基于RV1126平台imx291分析 --- mipi-csi-phy注册相关推荐
- 产品分享:Qt+Arm基于RV1126平台的内窥镜软硬整套解决方案(实时影像、冻结、拍照、录像、背光调整、硬件光源调整,其他产品也可使用该平台,如视频监控,物联网产品等等)
若该文为原创文章,转载请注明原文出处 本文章博客地址:[https://hpzwl.blog.csdn.net/article/details/118887440 长期持续带来更多项目与技术分享,咨 ...
- 基于RV1126 Video分析-----图像处理模块所代表的V4L2设备注册
工作: 以设备通知器为线索,从顶向下,依次找到下一级设备,添加到V4L2设备种,循环处理.将全部的子设备整理到 V4L2设备中,这样可以通过V4L2设备直接管理所包含的各个子设备. 即这样 所有设备注 ...
- 基于RV1126 Video分析-----驱动各模块总览
一 通用理论 硬件链接: 一般情况下,Camera和SOC有两个接口进行连接,分为为MIPI接口和I2C接口,其中MIPI接口用来传输图像的数据,数据传输路径为从Sensor传输到SOC.另一个接口为 ...
- 基于边缘计算平台的分析与研究
摘 要:边缘计算作为万物互联时代的关键技术,具有广泛的应用场景.文章首先分析了边缘计算平台在推广中面临的问题:随后从架构出发分析了典型边缘计算平台,并列举了边缘计算应用场景的需求参数,最后提出了一种边 ...
- android手机舆情分析,基于Android平台的环境公共舆情监督系统研究
摘要: 近年来,随着我国社会经济的持续发展和人民生活水平的不断提高,人们的环境保护意识也在不断增长,其中城市环境质量问题逐渐成为了人们普遍关注的焦点,也成为环保部门和环保从业人员的重点研究方向.环境监 ...
- 浅谈基于物联网技术的地下综合管廊智慧管控平台建设分析
摘要:本文以物联网.GIS等技术为基础,采用文献研究等方法,在探究我国地下综合管廊管廊现状及相关技术飾基础上,对其智慧管控平台的建设展开了研究,希望能为相关研究及建设提供有价值的参考. 关键词:物联网 ...
- 基于SOA的区域卫生信息平台案例分析(转)
这篇文章是在学习过程中baidud到得,觉得在学习阶段可以看看,用的是ESB做的系统集成. 以下是原文: 一.政策与现状 国务院在<关于深化医药卫生体制改革意见>中明确提出要大力推进医药卫 ...
- linux内核usb驱动框架,基于S3C2440平台的linux2.6.22内核版本的USB驱动框架分析
基于S3C2440平台的linux2.6.22内核版本的USB驱动框架分析 发布时间:2014-07-18 16:47:31来源:红联作者:linux08071151 driver/usb/host/ ...
- MTK平台 更换前后camera的MIPI CSI接口
MTK平台 更换前后camera的MIPI CSI接口 在vendor目录下面,有一个文件"cfg_setting_imgsensor.cpp",这个文件里面有一个函数" ...
- MIPI CSI和DSI接口标准简介
MIPI CSI和DPI是MIPI标准的一种,因为MIPI在移动领域应用范围太广了,各种外围设备都可以用它来传输信息,所以,MIPI联盟给不同的外设接口定义了版本名,CSI是for Camera的,D ...
最新文章
- linux批处理mysql数据库_使用批处理对MySQL进行数据批量操作
- ​70行Go代码打败C
- spring26-1: bean的实例方式
- 多媒体计算机技术论文结束语,论述多媒体计算机技术在广播电视工程中的应用成果论文...
- 打印系统所有维护了sales area的BP id
- python前n项和存为一个数组_在Python中存储多个数组
- Python学习笔记--8.6 函数--递归
- discuz NT!整合
- 读者福利:复盘2018上半年精选文章,还有礼品等着你!
- 计算机串口程序配置,串口设置软件 串口调试工具如何使用
- python开三次方_python 三次方
- 程序员转项目管理之考证PMP
- 工作记录软件app,可以写工作记录的便签软件
- Image Caption 常用评价指标
- 如何在不清空原有配置的情况下修改路由器密码??????
- 大数据量查询大杀器之Mybatis 流式查询
- 计算机无法传输文件,手机连接电脑无法互传文件怎么办
- 多条ADSL线路合并叠加效果测试,多WAN口聚合
- docker容器化部署
- ubuntu下安装摄像头应用程序xawtv