瑞芯微 MIPI D-PHY 接收器(RX)驱动学习笔记

驱动文件位置 driver/phy/rockchip/phy-rockchip-mipi-rx.c

1 重要结构体

struct mipidphy_priv {struct device *dev;//表示与驱动程序关联的设备。它用于设备管理,如设备注册、注销等。struct regmap *regmap_grf;//用于映射和访问通用寄存器文件(General Register File,GRF)的寄存器。regmap 提供了一种灵活的寄存器访问接口const struct dphy_reg *grf_regs;//包含了GRF寄存器的定义和布局const struct txrx_reg *txrx_regs;//包含了TX/RX通道寄存器的定义和布局const struct csiphy_reg *csiphy_regs;//包含了CSI PHY寄存器的定义和布局void __iomem *csihost_base_addr;//这是一个指向内存映射I/O区域的指针,表示CSI主机接口的基地址struct clk *clks[MAX_DPHY_CLK];//这是一个指向时钟结构体数组的指针,用于管理设备的所有时钟资源。const struct dphy_drv_data *drv_data;//包含了驱动程序特定的数据和配置信息u64 data_rate_mbps;//表示设备支持的最大数据传输速率,单位是Mbps。struct v4l2_async_notifier notifier;//用于V4L2异步通知机制,允许设备在连接或断开时发送通知。struct v4l2_subdev sd;//表示一个V4L2子设备,用于V4L2框架中的设备管理和媒体流控制。struct mutex mutex; /* lock for updating protection */struct media_pad pads[MIPI_DPHY_RX_PADS_NUM];//表示媒体设备的连接端口。MIPI_DPHY_RX_PADS_NUM 是端口数量的宏定义。struct mipidphy_sensor sensors[MAX_DPHY_SENSORS];//用于存储和管理连接到MIPI DPHY的sensors信息int num_sensors;//表示当前连接到MIPI DPHY的sensors数量int phy_index;//bool is_streaming;//指示设备是否正在处理媒体流void __iomem *txrx_base_addr;//这是一个指向内存映射I/O区域的指针,表示TX/RX通道的基地址。int (*stream_on)(struct mipidphy_priv *priv, struct v4l2_subdev *sd);//该函数在开始媒体流传输时被调用int (*stream_off)(struct mipidphy_priv *priv, struct v4l2_subdev *sd);//该函数在停止媒体流传输时被调用
};

struct dphy_drv_data {const char * const *clks;//包含了设备所需的时钟名称。这些时钟名称用于在设备初始化时请求相应的时钟资源。int num_clks;//表示 clks 数组中时钟名称的数量。const struct hsfreq_range *hsfreq_ranges;//包含了设备支持的高速频率范围。这些范围定义了设备在不同工作模式下可以支持的时钟频率。int num_hsfreq_ranges;//表示 hsfreq_ranges 数组中高速频率范围的数量。const struct dphy_reg *grf_regs;//包含了设备通用寄存器(GRF)的定义和布局const struct txrx_reg *txrx_regs;//包含了设备TX/RX通道寄存器的定义和布局。const struct csiphy_reg *csiphy_regs;//包含了设备CSI PHY寄存器的定义和布局enum mipi_dphy_ctl_type ctl_type;//表示MIPI DPHY的控制类型。这个成员指示了设备应该如何被控制,例如,是通过硬件控制还是软件控制void (*individual_init)(struct mipidphy_priv *priv);//这个函数在设备初始化时被调用,用于执行设备特定的初始化操作。enum mipi_dphy_chip_id chip_id;//表示MIPI DPHY芯片的ID。这个成员用于标识设备的具体型号或版本
};

2 rockchip_mipidphy_probe(struct platform_device *pdev)函数

  

 1 分配内存,匹配设备树。

	priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);if (!priv)return -ENOMEM;priv->dev = dev;of_id = of_match_device(rockchip_mipidphy_match_id, dev);if (!of_id)return -EINVAL;

2 获取 GRF(全局复用寄存器)

尝试从父设备获取 GRF 寄存器映射。
如果失败,在当前设备的设备树节点中查找一个名为 "rockchip,grf" 的 phandle。
将找到的 regmap 保存到 priv->regmap_grf 中。

形如:

some_device: some-device@... {

rockchip,grf = <&grf>;

};

	grf = syscon_node_to_regmap(dev->parent->of_node);if (IS_ERR(grf)) {grf = syscon_regmap_lookup_by_phandle(dev->of_node,"rockchip,grf");if (IS_ERR(grf)) {dev_err(dev, "Can't find GRF syscon\n");return -ENODEV;}}priv->regmap_grf = grf;

3通过别名(alias)获取 D-PHY 的索引号(例如 dphy0, dphy1)

priv->phy_index = of_alias_get_id(dev->of_node, "dphy");
if (priv->phy_index < 0)priv->phy_index = 0;

4 获取时钟资源

5 设置寄存器指针

priv->grf_regs = drv_data->grf_regs;
priv->txrx_regs = drv_data->txrx_regs;
priv->csiphy_regs = drv_data->csiphy_regs;
priv->drv_data = drv_data;

6 根据控制类型选择操作函数和寄存器地址

CSI Host 模式:SoC 作为摄像头控制器,连接并读取摄像头数据;
TX/RX 模式:SoC 作为通用的 MIPI D-PHY 收发器,可能用于其他用途(比如显示、调试等);

if (drv_data->ctl_type == MIPI_DPHY_CTL_CSI_HOST) {res = platform_get_resource(pdev, IORESOURCE_MEM, 0);priv->csihost_base_addr = devm_ioremap_resource(dev, res);priv->stream_on = csi_mipidphy_stream_on;priv->stream_off = csi_mipidphy_stream_off;
} else {priv->stream_on = mipidphy_txrx_stream_on;priv->txrx_base_addr = NULL;res = platform_get_resource(pdev, IORESOURCE_MEM, 0);priv->txrx_base_addr = devm_ioremap_resource(dev, res);if (IS_ERR(priv->txrx_base_addr))priv->stream_on = mipidphy_rx_stream_on;priv->stream_off = NULL;
}

7 初始化 V4L2 子设备

sd = &priv->sd;
mutex_init(&priv->mutex);
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;

8 初始化媒体实体和电源管理

ret = rockchip_mipidphy_media_init(priv);
if (ret < 0)goto destroy_mutex;pm_runtime_enable(&pdev->dev);
drv_data->individual_init(priv);
return 0;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/bicheng/84846.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL从入门到DBA深度学习指南

目录 引言 MySQL基础入门 数据库基础概念 MySQL安装与配置 SQL语言进阶 数据库设计与规范化 数据库设计原则 表结构设计 MySQL核心管理 用户权限管理 备份与恢复 性能优化基础 高级管理与高可用 高可用与集群 故障诊断与监控 安全与审计 DBA实战与运维 性能调…

多个机器人同时加载在rviz及gazebo同一个场景中

1. 配置launch文件 gazebo的加载相对容易&#xff0c;但rviz中加载&#xff0c;需要构建完整的tf树&#xff08;world → map&#xff08;或map_merged&#xff09;→ odom → base_footprint → base_link → base_scan&#xff09;才能正常显示&#xff0c;launch文件主要是…

Text2SQL、Text2API基础

你有一个能力超强但“不太懂行”的助手&#xff08;大语言模型LLM&#xff09;。它能说会道&#xff0c;知识渊博&#xff0c;但它&#xff1a; 不懂你的数据库&#xff1a; 不知道你的数据库里有哪些表&#xff0c;表里有哪些字段&#xff0c;这些字段代表什么意思。不懂你的…

JDK 8u231安装教程 - Windows 64位下载安装及环境变量配置指南

下载安装包 把jdk-8u231-windows-x64.exe这个文件下载下来&#xff0c;下载链接&#xff1a;https://pan.quark.cn/s/a610ca7e5e9d&#xff0c;随便放哪儿&#xff0c;比如桌面或者下载文件夹。 双击运行安装 找到下载好的那个exe文件&#xff0c;直接双击打开。可能会弹个窗口…

LatentSync V8版 - 音频驱动视频生成数字人说话视频 更新V1.6版模型 支持50系显卡 支持批量 一键整合包下载

LatentSync 是字节跳动开源的一款"AI口型同步神器"&#xff0c;简单来说就是能让视频里的人物嘴巴动得和声音完美匹配的工具。比如你给一段配音&#xff0c;它能自动调整视频人物的嘴型&#xff0c;按照配音里的声音说出来&#xff0c;就像真人说话一样自然。简单说就…

从一组线段中得出四边形的算法

原始的需求是使用OpenCV的直线检测算法&#xff08;例如LSD&#xff09;之后&#xff0c;得到一组线段。然后需要从这些线段得到类似矩形的四边形&#xff0c;用于检测经过透视变换的矩形物体。这些线段不一定首尾相接&#xff0c;彼此之间可能相交或有一定距离。 以下是需求图…

提示词Prompts(2)

摘要&#xff1a; 本文介绍了langchain.prompts中基础的提示词模板的高级用法&#xff0c;包括利用PipelinePrompt组合Prompt使用&#xff0c;多模态场景、动态占位符的使用等进行了介绍。 文章目录 1. 背景2. PipelinePrompt2.1 组合两个Prompt模板2.2 多模态模板 3. 聊天提示…

服务器代码知识点补充

目录 UdpServer: 观察者模式: remove_if算法 管道补充: 文件的标准输出 ,标准输入,标准错误 UdpServer: 数据接收模块关心Adduser 和Deleuser 两个模块 线程池关心Route模块 将这三个方法注册进服务器 ,但是有临界区问题(线程池与数据接受模块可能同时访问用户管理模块,所…

R语言缓释制剂QBD解决方案之二

药物层优化研究 在药物层工艺中水溶剂蒸发起到重要的作用。湿的环境会使丸子聚集&#xff0c;而干的环境影响药物与MCC的粘合。输入变量如气流量&#xff0c;喷雾速率&#xff0c;雾化压力&#xff0c;和产品温度对MCC沉着和包衣溶剂蒸发的平衡有影响。进行了带3个中心点的24-…

Html实现图片上传/裁剪/马赛克/压缩/旋转/缩放

cropper下载 https://download.csdn.net/download/dongyan3595/90970115 前端代码 <!doctype html> <html lang"en"> <head><base href"/aishop/"><meta name"viewport" content"widthdevice-width, initial…

springboot项目中整合高德地图

一&#xff1a;高德开放平台的使用 高德开放平台 | 高德地图API 注册高德地图账号 认证填写个人信息&#xff1a; 认证方式选择“个人认证开发者”即可&#xff0c;然后完善信息 认证成功之后&#xff0c;再次进入控制台&#xff0c;创建关于地图的应用 创建Key&#xff08;y…

鸿蒙开发-视频学习及实用中的一些小结

1.extend 和 styles extend是在styles基础上进行了升级 使用的时候extend是全局的。 styles不加function 局部 加了就是全局。 2.builder 中要引用comp组件 需要在外层嵌套布局 3.ability之间的跳转 want需要加&#xff1b; 4. as 类型断言 &#xff01;跟在xxx! 表示…

网盘直链解析网页版

不支持百度网盘、阿里网盘。 123&#xff0c;蓝奏云&#xff0c;可道云什么的都可以 源码下载地址&#xff1a;https://www.123865.com/s/X91lVv-3l90v

AXI4-Stream Clock Converter IP

一、参考说明 1.没有专门对AXI4-Stream Clock Converter IP说明的文档&#xff1b; 2.可以参考PG085文档&#xff1b; 3.可以参考PG035文档&#xff1b; 二、IP的作用 1.用于stream数据流再不同的时钟域之间的可靠性传输&#xff1b; 2.支持跨时钟域的场景&#xff1b; 3.内部…

NineData 社区版 V4.2.0 发布!新增MySQL与PostgreSQL互相迁移,SQL管理Milvus,安装更高效

NineData 社区版 V4.2.0 正式发布&#xff01;本次更新通过镜像轻量化部署、新增 3 条迁移链路、新增支持 Milvus 向量数据库等核心升级&#xff0c;轻松实现数据库迁移容灾、实时数据集成分析、AI 向量数据管理等场景需求。社区版支持本地离线部署&#xff0c;严格保障数据隐私…

如何安装使用qmt脚本跟单聚宽策略

登录知识星球&#xff0c;下载获取 解压后&#xff0c;登录大qmt&#xff0c;将策略导入其中&#xff0c; 然后修改参数&#xff1a; 点击免密改参 totalcash&#xff1a;该策略使用资金总量 per&#xff1a;每只股票占比资金额 举例&#xff0c;当前出信号&#xff0c;每只…

什么是MongoDB

目录 主要特点 MongoDB概念解析 完整术语列表 MongoDB安装 MongoDB Shell 安装MongoDB Shell 数据库管理 查看数据库列表 创建数据库 删除数据库 默认数据库 系统内置数据库 集合管理 查看集合 创建集合 更新集合名 删除集合 文档操作 插入文档 查询文档 …

【Docker基础】Docker核心概念:容器(Container)与镜像(Image)的区别与联系

目录 引言 1 Docker镜像&#xff08;Image&#xff09; 1.1 镜像的定义 1.2 镜像的特点 1.3 镜像的创建 1.4 镜像的结构 1.5 镜像结构描述 2 Docker容器&#xff08;Container&#xff09; 2.1 容器的定义 2.2 容器的特点 2.3 容器的创建与运行 2.4 容器的生命周期…

从零到一:构建企业级 Vue.js 3 组件库

前言&#xff1a;为何要构建组件库&#xff1f; 在现代前端工程化体系中&#xff0c;组件库已不再是大型团队的专属。它是一个团队设计规范、开发模式和技术沉淀的核心载体。构建一个组件库&#xff0c;能够带来诸多优势&#xff1a; 提升效率&#xff1a;提供可复用的高质量…

【2025 CVPR-Backbone】Building Vision Models upon Heat Conduction

摘要 利用注意力机制的视觉表示模型在追求大感受野时面临着巨大的计算开销。在本研究中&#xff0c;我们通过引入基于物理热传导原理的热传导算子&#xff08;Heat Conduction Operator, HCO&#xff09;来缓解这一挑战这么高级咩(⊙o⊙)&#xff01;。HCO将图像块视为热源&am…