sc350驱动框架

发布时间:2026/11/1 16:53:51

sc350驱动框架 为什么必须要通过container_of来获取自身结构体地址static inline struct sc350 *to_sc350(struct v4l2_subdev *sd) { return container_of(sd, struct sc350, subdev); } struct sc350 *sc350 to_sc350(sd);内核 V4L2 框架只“认识”struct v4l2_subdev这个通用的“身份证”而不“认识”你私有的struct sc350。它在调用你的驱动函数时给你的就只能是这个通用指针不会也不应该知道你私有的结构体长什么样。工作原理详解container_of是 Linux 内核中一个非常经典且基础的宏它的核心原理就是指针地址偏移计算。已知条件你有一个指针sd它精确地指向某个structsc350对象内部的成员变量subdev。计算偏移宏内部会计算subdev这个成员在structsc350内部的偏移量即从结构体起始地址到subdev成员地址之间隔了多少字节。反向运算用sd的地址值减去这个偏移量得到的结果就是它所属的整个tructsc350对象的起始内存地址。这个宏非常依赖于编译器的offsetof宏来精确计算偏移量并利用typeof来做类型检查确保操作是安全的。1. 标准框架的“通用性”与“私有数据”分离Linux 内核是一个庞大的系统它需要管理成千上万种不同的设备。为了应对这种复杂性内核采用了面向对象的设计思想。struct v4l2_subdev(通用父类): 这是 V4L2 框架为所有摄像头传感器定义的一个“标准接口”或“基类”。它定义了所有传感器驱动都必须遵守的通用属性和方法例如.s_power、.s_stream等回调函数指针。struct sc350(私有子类): 这是你为sc350这个具体硬件定义的“子类”或“私有数据”。它除了包含一个struct v4l2_subdev sd;作为“父类”成员外还包含了大量的硬件特定信息比如struct i2c_client *client;、寄存器配置表、锁、状态标志等。内核的 V4L2 框架设计得极其通用它只关心如何管理一个struct v4l2_subdev。它不关心也不应该关心它背后具体是哪个型号的传感器。1、sc350_i2c_driver结构体 { .driver { .name sc350_mipi, .of_match_table of_match_ptr(sc350_dt_id), .pm sc350_pm_ops, } .probe sc350_probe, .remove sc350_remove, }; 2、sc350_pm_ops结构体 SET_RUNTIME_PM_OPS运行时电源管理 SET_SYSTEM_SLEEP_PM_OPS系统休眠/唤醒 3、 static const struct v4l2_subdev_ops sc350_subdev_ops { .video sc350_subdev_video_ops .pad sc350_subdev_pad_ops, }; 4、.video视频流控制类操作 static const struct v4l2_subdev_video_ops sc350_subdev_video_ops { .s_stream sc350_set_stream, }; 5、.padPad和格式配置类操作 static const struct v4l2_subdev_pad_ops sc350_subdev_pad_ops { .enum_mbus_code sc350_enum_mbus_code, .enum_frame_size sc350_enum_frame_sizes, .get_fmt v4l2_subdev_get_fmt, .set_fmt sc350_set_format, .set_routing sc350_set_routing, .get_frame_desc sc350_get_frame_desc, .get_frame_interval sc350_get_frame_interval, .set_frame_interval sc350_set_frame_interval, }; 6、sc350_probe 1、分配驱动私有数据devm_kzalloc 2、读取设备树相机IDof_property_read_u32 3、获取并初始化GPIO(pwdnleds) 4、i2c寄存器访问接口初始化devm_regmap_init_i2c 5、初始化v4l2_subdevv4l2_i2c_subdev_init(sd, client, sc350_subdev_ops) 6、初始化media entity和source padmedia_entity_pads_init 7、初始化控制器和锁 8、启用runtime_pm 9、完成subdev初始化并注册到异步框架v4l2_subdev_init_finalize/v4l2_async_register_subdev_sensor 7、sc350_remove v4l2_async_unregister_subdev(sd); v4l2_subdev_cleanup(sc350); pm_runtime_disable(sc350-dev); imx415_power_off(sc350); pm_runtime_set_suspended(sc350-dev);基地址宏名称主要用途说明与例子V4L2_CID_USER_BASE标准用户控制这是最常见的一个等同于V4L2_CID_BASE为亮度、对比度等标准控制提供基址。V4L2_CID_BRIGHTNESS等标准控制ID都定义在此之上。V4L2_CID_CAMERA_CLASS_BASE摄像头类控制用于所有与摄像头传感器相关的专用控制。之前提到的曝光V4L2_CID_EXPOSURE、增益V4L2_CID_ANALOGUE_GAIN等控制ID都在此基址上定义。V4L2_CID_PRIVATE_BASE驱动私有控制已过时早期用于驱动自定义控制但因不同驱动可能使用相同ID导致冲突现已不推荐在新驱动中使用。芯片厂商自定义基址厂商特定扩展控制许多厂商会定义自己的基址宏用于其芯片特有的功能控制。例如Xilinx定义了V4L2_CID_XILINX_BASE联发科MediaTek也为其传感器驱动定义了V4L2_CID_USER_MTK_SENSOR_BASE等专用基址。# 查看 sensor 支持的所有 V4L2 控制 v4l2-ctl -d /dev/v4l-subdev0 --list-ctrls # 手动设置曝光时间 (假设驱动以行数为单位) v4l2-ctl -d /dev/v4l-subdev0 --set-ctrlexposure200 # 手动设置模拟增益 v4l2-ctl -d /dev/v4l-subdev0 --set-ctrlanalogue_gain16 # 获取当前参数值 v4l2-ctl -d /dev/v4l-subdev0 --get-ctrlexposure,analogue_gain # VCM设置对焦 v4l2-ctl -d /dev/v4l-subdevX --set-ctrlfocus_absolute0,10232. set_routing函数作用映射数据流到不同的DMA通道TDA4的CSI接收器有多个DMA通道可以同时接收来自同一路MIPI链路中不同虚拟通道VCVirtual Channel的数据。例如一个解串器如MAX9296可以同时传输4个摄像头的数据到同一个物理CSI接口通过VC0到VC3来区分。这时set_routing的作用就是配置“将VC0的数据路由到DMA通道0将VC1的数据路由到DMA通道1”从而实现单物理端口接收多路摄像头数据。如果没有set_routing所有VC的数据都会混在一起无法区分。实现动态数据流复用在环视系统这类复杂场景中你可能有6个摄像头但SoC只有4个CSI端口。通过硬件上的开关如解串器的复制功能set_routing可以控制哪些摄像头的数据在哪个CSI端口上输出。在环视系统的不同模式下如全景模式、单摄像头放大模式用户空间可以通过调用set_routing来切换不同摄像头的输出数据流让SoC在不同模式下看到不同的摄像头数据。物理连接是设备树定死的因此set_routing并不是用来“改变物理连接的CSI端口”而是用来“在已经固定好的物理链路上灵活地配置数据包该往哪里走”。
延伸阅读

更多相关文章

2026/10/31 19:40:17

PyTorch计算机视觉——cWGAN-GP实现可控图像生成

PyTorch计算机视觉——cWGAN-GP实现可控图像生成0. 前言1. cWGAN-GP 的核心思想2. 数据集2.1 数据集介绍2.2 数据集加载与预处理3. 模型架构3.1 条件生成器3.2 条件判别器3.3 梯度惩罚函数4. 模型训练小结相关链接0. 前言 我们已经学习了 WGAN-GP (Wasserstein GAN with Gradi…

2026/10/31 22:40:49

基于STM32的GPS智能公交报站系统:从原理到实车调试

简介:本资源是一套基于STM32F103C8T6最小系统板实现的智能公交报站系统完整嵌入式源码,面向嵌入式初学者、STM32课程设计学生及物联网应用开发爱好者,解决公交场景下自动定位、语音播报与站名显示等核心功能的软硬件协同实现问题。压缩包共10…

2026/11/1 1:56:42

MKVToolNix:无损混流工具,高效处理视频封装与合并

你是不是也遇到过这样的问题:下载了一部电影,结果视频和字幕是分开的;或者从不同来源收集了多段视频素材,想要合并成一个文件;又或者想给视频换个音轨,却发现常规的视频编辑软件要么操作复杂,要…

2026/11/1 2:01:37

1.c++入门篇

1.c中的关键字asmdoifreturntrycontinueautodoubleinlineshorttypedefforbooldynamic_castintsignedtypeidpublicbreakelselongsizeoftypenamethrowcaseenummutablestaticunionwchar_tcatchexplicitnamespacestatic_castunsigneddefaultcharexportnewstructusingfriendclassext…

2026/11/1 2:01:37

《江灯合声》:有可行的分框版,也仍可以选择连续鸣谢

武汉江岸区栎坡合唱团在免费节目册《江灯合声》中,以表格集中鸣谢资助者。各家共同要求改为独立小框,团里仍想保留表格。现有全名与支持事项清楚可见,双方此前未承诺具体排版。我支持保留表格。补充的试排材料让选择更具体:分框能…

2026/11/1 2:01:37

关于“贾子猜想”的数学地位、结构特征与讨论边界

关于“贾子猜想”的数学地位、结构特征与讨论边界摘要 本文对“贾子猜想”进行基于公开表述与现有数学事实的分析。该猜想主张:当正整数 n3m>5(即 n6,9,12,15,…)时,方程x₁ⁿ x₂ⁿ ⋯ xₙⁿ yⁿ不存在正整数解。文章首先…

2026/11/1 2:01:37

启动报Port 8088 was already in use?先查是谁占的

启动报Port 8088 was already in use?先查是谁占的 项目启动报 Port 8088 was already in use,意思很直白:这个端口已经有人占了。 先说原理:端口是"门牌号",一间房只住一个进程 端口就是一台机器上的门牌号…

2026/11/1 2:01:37

担心文档上云?本地运行的办公AI才敢放心用

单位上周开了个会,主题是"AI 提效",散会时领导补了一句:涉及客户资料的文档,不许往云端传。这话一出,会议室里本来跃跃欲试的同事全蔫了——大家平时用的那些在线 AI,文档一上传就不知道存哪儿去…

2026/11/1 1:56:37

华为OD机试真题 新系统 2026-10-28 JavaGoC【社交网络消息转发】

目录 题目 思路 Code 题目 题目内容: 在一个社交网络中,有 N 个用户(编号 0 到 N−1);每个用户都有一个「转发名单」(整数),该数二进制格式中的第 i 位为 1 表示此用户会把消息转发给第 i 个用户。 给定一个整数数组 forwardLists 和一个整数 initialSenders,请…

2026/11/1 0:01:26

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/1 1:01:33

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/1 0:01:26

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/1 1:01:33

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/1 0:01:26

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/1 1:01:33

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑