Jetson Orin Nano - SONY imx415 camera驱动开发

article/2025/7/26 21:29:20

目录

前言:

调试准备工作:

修改内核默认打印等级

一、imx415驱动开发

1、硬件接线

2、设备树修改

2.1 创建 tegra234-p3767-camera-p3768-imx415-C-4lane.dtsi 文件

2.2 tegra234-p3767-camera-p3768-imx415-C-4lane.dtsi 添加到设备树

2.3 编译设备树

3、imx415驱动开发

3.1 imx415寄存器

1)mclk 时钟

2)lane数量

3)lane速率

4)分辨率

5)像素深度

6)Master/Slave模式

7)启流、停流相关

8)增益

​编辑

9)曝光

​编辑

10)All pixel模式 4lane 配置表

3.2 imx415驱动

1)Linux_for_Tegra/source/nvidia-oot/drivers/media/i2c/imx415_mode_tbls.h 源码

2)Linux_for_Tegra/source/nvidia-oot/include/media/imx415.h 源码

3)Linux_for_Tegra/source/nvidia-oot/drivers/media/i2c/nv_imx415.c 驱动文件

4)将 nv_imx415 添加到Makefile

二、编译调试

1、编译imx415驱动

2、安装 v4l-utils 并查看 /dev/video0信息

2.1 安装 v4l-utils

2.2 查看 /dev/video0 信息

3、抓拍

3.1 v4l2-ctl 命令验证vi抓拍

3.2 gstreamer英伟达命令抓拍

1)gst-launch-1.0 自动曝光、自动增益抓拍

2)gst-launch-1.0 设置曝光、增益抓拍

三、imx415驱动开发遇到的问题及解决方法

1、Jetson orin nano开发板的CAM0不支持4lane模式

2、使用 CSI0/1 时,需要将lane_polarity改为 6

3、v4l2-ctl 抓图命令报错

4、v4l2-ctl 抓图不成功,vi能收到数据,但数据不对

5、gstreamer抓图偏红色

四、曝光、增益、格式、焦距对拍照效果的影响


前言:

nvidia相机开发参考链接:相机软件开发解决方案 — NVIDIA Jetson Linux 开发者指南

可加载内核模块 (LKM)其实就是就是编译成ko模块。nvidia将所有模块都放在 nvidia-oot 目录下。参考链接:传感器软件驱动程序编程 — NVIDIA Jetson Linux 开发者指南

说明:博主使用野火的imx415摄像头模块,在 Jetson Orin Nano开发板上开发imx415驱动

调试准备工作:


修改内核默认打印等级

$ vi /etc/sysctl.conf
#
# /etc/sysctl.conf - Configuration file for setting system variables
# See /etc/sysctl.d/ for additional system variables.
# See sysctl.conf (5) for information.
##kernel.domainname = example.com# Uncomment the following to stop low-level messages on console
kernel.printk = 8 8 8 8                #打印等级###################################################################
# Functions previously found in netbase
## Uncomment the next two lines to enable Spoof protection (reverse-path filter)
# Turn on Source Address Verification in all interfaces to
# prevent some spoofing attacks
#net.ipv4.conf.default.rp_filter=1
#net.ipv4.conf.all.rp_filter=1# Uncomment the next line to enable TCP/IP SYN cookies
# See http://lwn.net/Articles/277146/

一、imx415驱动开发


1、硬件接线

imx415模块和 Jetson orin nano开发板的csi接口中间有转接板。2 lane模式下,仅 CSI_D0 P/N 和 CSI_D1 P/N 有数据。我使用的是 4 lane 模式。

硬件接上后,用 i2cdetect 工具探测 I2C通不通。cam_i2cmux挂在i2c3下,因此命令如下:

$ i2cdetect -r -y 2

可以看到 imx415 的设备地址为 0x1a

问题:如何知道 CAM1_I2C 挂在 i2c3下?

查看 Linux_for_Tegra/source/hardware/nvidia/t23x/nv-public/tegra234.dtsi

cam_i2c 为I2C3节点, 因此cam_i2cmux在I2C3节点下

2、设备树修改

设备树增加sensor参考文档:Sensor Software Driver Programming — NVIDIA Jetson Linux Developer Guide

2.1 创建 tegra234-p3767-camera-p3768-imx415-C-4lane.dtsi 文件

1)将 Linux_for_Tegra/source/hardware/nvidia/t23x/nv-public/overlay 目录下的 tegra234-p3767-camera-p3768-imx477-C.dts 作为模板拷贝一份 tegra234-p3767-camera-p3768-imx415-C-4lane.dtsi

imx415 模块 4 lane差分线接在CSI2上,CSI2对应"serial_c"(CSI0对应serial_a,依此类推),因此命名 "tegra234-p3767-camera-p3768-imx415-C-4lane.dtsi"

2)修改 tegra234-p3767-camera-p3768-imx415-C-4lane.dtsi

关键参数计算过程:

  • compatible = "ridgerun,imx415" 要和imx415驱动对应上

  • mclk_khz:imx415模块外接 37.125M晶振,因此 mclk_khz = "37125"

  • 4 lane模式:因此 num_lanes = "4", bus-width = <4>;

  • CSI2:因此 tegra_sinterface = "serial_c",port-index = <2>

  • 分辨率:根据 imx415分辨率设置 "active_w = 3864",active_h = "2192"

  • pixel_phase:像素格式,pixel_phase = "gbrg",调试时设置为 "rggb" 导致图像偏红色

  • csi_pixel_bit_depth:像素深度,imx415使用RAW12模式,因此 csi_pixel_bit_depth = "12"

  • pix_clk_hz:imx415 配置 lane频率为 891 Mbps,4lane,像素深度为12bit,pix_clk_hz = 891 Mbps × 4 / 12 = 297000000,我理解只要不小于此值即可。

  • mclk_multiplier :mclk_multiplier  ≥ pix_clk_hz / mclk = 297000000 / 37125000 = 8,因此mclk_multiplier = "8"。从nvidia官方手册可知,mclk_multiplier 必须大于等于pix_clk_hz / mclk,以确保ISP运行得足够快,能够处理来自传感器的数据。

  • 增益,查看imx415手册

 GAIN_PCG_0计算公式:GAIN_PCG_0 = Gain[dB] x 10 /3

GAIN_PCG_0 范围为 0 - 240d,因此 Gain范围为  0 - 72 [dB],我这里增益因子配置为 gain_factor = "10" ,Gain范围 0 - 72 [dB] 乘上增益因子,得到 min_gain_val = "0", max_gain_val = "720",step为 0.3dB 乘增益因子,因此 step_gain_val = "3"

  • 曝光:

曝光参数单位为us,需要根据帧率(30fps)、VMAX(2250)、 SHR0 值范围(8 到 Number oflines per frame - 4),按照下面公式倒推 exposure 最小值、最大值、step,我算得结果图下:

min_exp_time = "15";        /* 单位:us */
max_exp_time = "33214";     /* 单位:us */
step_exp_time = "15";       /* 单位:us */

  • embedded_metadata_height:根据imx415手册来配置为 "1",如下图

最终 tegra234-p3767-camera-p3768-imx415-C-4lane.dtsi 文件内容如下:

设备树描述了 VI(视频输入)、NvCSI 、传感器模块 的端口绑定关系

// SPDX-License-Identifier: GPL-2.0-only
// SPDX-FileCopyrightText: Copyright (c) 2023-2024, NVIDIA CORPORATION & AFFILIATES. All rights reserved.///dts-v1/;
///plugin/;#define CAM0_RST	TEGRA234_MAIN_GPIO(Q, 6)	/* add */
#define CAM0_PWDN	TEGRA234_MAIN_GPIO(H, 6)
#define CAM1_PWDN	TEGRA234_MAIN_GPIO(AC, 0)
#define CAM_I2C_MUX 	TEGRA234_AON_GPIO(CC, 3)#include <dt-bindings/tegra234-p3767-0000-common.h>/ {overlay-name = "Camera IMX415-C 4 lane";jetson-header-name = "Jetson 24pin CSI Connector";compatible = JETSON_COMPATIBLE_P3768;/*IMX415 connected on cam0 port */fragment@0 {target-path = "/";__overlay__ {tegra-capture-vi  {num-channels = <1>;ports {#address-cells = <1>;#size-cells = <0>;port@0 {reg = <0>;rbpcv3_imx415_vi_in1: endpoint {port-index = <2>;bus-width = <4>;remote-endpoint = <&rbpcv3_imx415_csi_out1>;};};};};tegra-camera-platform {compatible = "nvidia, tegra-camera-platform";/*** Physical settings to calculate max ISO BW** num_csi_lanes = <>;* Total number of CSI lanes when all cameras are active** max_lane_speed = <>;* Max lane speed in Kbit/s** min_bits_per_pixel = <>;* Min bits per pixel** vi_peak_byte_per_pixel = <>;* Max byte per pixel for the VI ISO case** vi_bw_margin_pct = <>;* Vi bandwidth margin in percentage** max_pixel_rate = <>;* Max pixel rate in Kpixel/s for the ISP ISO case** isp_peak_byte_per_pixel = <>;* Max byte per pixel for the ISP ISO case** isp_bw_margin_pct = <>;* Isp bandwidth margin in percentage*/num_csi_lanes = <4>;max_lane_speed = <1500000>;min_bits_per_pixel = <10>;vi_peak_byte_per_pixel = <2>;vi_bw_margin_pct = <25>;max_pixel_rate = <7500000>;isp_peak_byte_per_pixel = <5>;isp_bw_margin_pct = <25>;/*** The general guideline for naming badge_info contains 3 parts, and is as follows,* The first part is the camera_board_id for the module; if the module is in a FFD* platform, then use the platform name for this part.* The second part contains the position of the module, ex. "rear" or "front".* The third part contains the last 6 characters of a part number which is found* in the module's specsheet from the vendor.*/modules {module1 {badge = "jakku_rear_RBPCV3";position = "rear";orientation = "1";drivernode0 {pcl_id = "v4l2_sensor";sysfs-device-tree = "/sys/firmware/devicetree/base/bus@0/cam_i2cmux/i2c@1/rbpcv3_imx415_c@1a";};};};};bus@0 {host1x@13e00000 {nvcsi@15a00000 {num-channels = <1>;#address-cells = <1>;#size-cells = <0>;channel@0 {reg = <0>;ports {#address-cells = <1>;#size-cells = <0>;port@0 {reg = <0>;rbpcv3_imx415_csi_in1: endpoint@0 {port-index = <2>;bus-width = <4>;remote-endpoint = <&rbpcv3_imx415_out1>;};};port@1 {reg = <1>;rbpcv3_imx415_csi_out1: endpoint@1 {remote-endpoint = <&rbpcv3_imx415_vi_in1>;};};};};};};cam_i2cmux {status = "okay";compatible = "i2c-mux-gpio";#address-cells = <1>;#size-cells = <0>;mux-gpios = <&gpio_aon CAM_I2C_MUX GPIO_ACTIVE_HIGH>;i2c-parent = <&cam_i2c>;i2c@0 {rbpcv2_imx219_a@10 {status = "disabled";};};i2c@1 {status = "okay";reg = <1>;#address-cells = <1>;#size-cells = <0>;rbpcv2_imx219_c@10 {status = "disabled";};rbpcv3_imx415_c@1a {reset-gpios = <&gpio CAM1_PWDN GPIO_ACTIVE_HIGH>;compatible = "ridgerun,imx415";/* I2C device address */reg = <0x1a>;/* V4L2 device node location */devnode = "video0";/* Physical dimensions of sensor */physical_w = "9.3";physical_h = "4.65";sensor_model = "imx415";use_sensor_mode_id = "true";mode0 { /* IMX415_MODE_3864x2192 */mclk_khz = "37125";	//"24000";num_lanes = "4";tegra_sinterface = "serial_c";phy_mode = "DPHY";discontinuous_clk = "no";dpcm_enable = "false";cil_settletime = "0";		// 0表示自动校准 lane_polarity = "0";active_w = "3864";active_h = "2192";mode_type = "bayer";pixel_phase = "gbrg";	//"rggb";csi_pixel_bit_depth = "12";	//12readout_orientation = "0";	//90line_length = "4400";	//0x08CA "11200";inherent_gain = "1";mclk_multiplier = "8";		//pix_clk_hz / mclk_khz = 297000000 / 37125000 = 8pix_clk_hz = "297000000";	//891 Mbps × 4 / 12gain_factor = "10";framerate_factor = "1000000";exposure_factor = "1000000";min_gain_val = "0";	/* 0dB */max_gain_val = "720";	/* 72dB */step_gain_val = "3";	/* 0.3dB step */default_gain = "10";	/* 1dB */min_hdr_ratio = "1";max_hdr_ratio = "1";min_framerate = "2000000"; /* 2.0 fps */max_framerate = "60000000";	//"30000000"; /* 30.0 fps */step_framerate = "1";default_framerate = "30000000"; /* 30.0 fps */min_exp_time = "15";		/* us, 1H时间 = line_length / pix_clk_hz */max_exp_time = "33214";	//"33334";		/* us */step_exp_time = "15";default_exp_time = "5000";	/* us */embedded_metadata_height = "1";	set_mode_delay_ms = "500";                      //dongao 等待8帧};mode1 { /* IMX415_MODE_3864x2192 */mclk_khz = "37125";	//"24000";num_lanes = "4";tegra_sinterface = "serial_c";phy_mode = "DPHY";discontinuous_clk = "no";dpcm_enable = "false";cil_settletime = "0";		// 0表示自动校准 lane_polarity = "0";active_w = "3864";active_h = "2192";mode_type = "bayer";pixel_phase = "gbrg";	//"rggb";csi_pixel_bit_depth = "12";	//10readout_orientation = "0";	//90line_length = "4400";	//0x08CA "11200";inherent_gain = "1";mclk_multiplier = "8";pix_clk_hz = "297000000";		//"356400000";gain_factor = "10";framerate_factor = "1000000";exposure_factor = "1000000";min_gain_val = "0";	/* 0dB */max_gain_val = "720";	/* 72dB */step_gain_val = "3";	/* 0.3dB step */default_gain = "10";	/* 1dB */min_hdr_ratio = "1";max_hdr_ratio = "1";min_framerate = "2000000"; /* 2.0 fps */max_framerate = "60000000"; /* 60.0 fps */step_framerate = "1";default_framerate = "30000000"; /* 60.0 fps */min_exp_time = "15"; /* us */max_exp_time = "33214"; /* us */step_exp_time = "15";default_exp_time = "5000"; /* us */embedded_metadata_height = "1";};ports {#address-cells = <1>;#size-cells = <0>;port@0 {reg = <0>;rbpcv3_imx415_out1: endpoint {port-index = <2>;bus-width = <4>;remote-endpoint = <&rbpcv3_imx415_csi_in1>;};};};};};};gpio@2200000 {                  //addcamera-control-output-low {gpio-hog;output-low;gpios = <CAM0_RST 0>;label = "cam0-rst";};};gpio@6000d000 {camera-control-output-low {gpio-hog;output-low;gpios = <CAM1_PWDN 0  CAM0_PWDN 0>;label = "cam1-pwdn", "cam0-pwdn";};};};};};
};

2.2 tegra234-p3767-camera-p3768-imx415-C-4lane.dtsi 添加到设备树

在 tegra234-p3768-0000+p3767-0000-dynamic.dts 中新增 "#include "tegra234-p3767-camera-p3768-imx415-C-4lane.dtsi"",如下:

// SPDX-License-Identifier: GPL-2.0-only
// SPDX-FileCopyrightText: Copyright (c) 2023-2024, NVIDIA CORPORATION & AFFILIATES.  All rights reserved./dts-v1/;
/plugin/;/ {overlay-name = "Tegra234 p3768-0000+p3767-xxxx Dynamic Overlay";
};/** Include this file last in the device tree.  It manages run-time*

http://www.hkcw.cn/article/GDfTsnCUDE.shtml

相关文章

Linux ClearOS yum无法使用解决备忘

前述 一个长期未使用的系统ClearOS Linux系统&#xff0c;属于CentOS家族&#xff0c;该系统用于网络设备。现在继续使用时&#xff0c;发现通过yum命令无法更新或下载软件。在这里记录一下解决该问题的过程。 问题 SSL证书问题 问题描述 问题现象如下所示&#xff0c;执行…

Bonjour

Bonjour 是苹果的一套零配置网络协议&#xff0c;用于发现局域网内的其他设备并进行通信&#xff0c;比如发现打印机、手机、电视等。 一句话&#xff1a;发现局域网其他设备和让其他设备发现。 Bonjour 可以完成的工作 IP 获取名称解析搜索服务 实际应用场景示例&#xff0…

day16 数组的常见操作和形状

目录 Numpy数组基础知识 数组的维度 数组的秩 数组的简单创建 zeros创建数组 ones创建数组 arange创建数组 数组的随机化创建 数组的遍历 数组的运算 数组的索引 一维数组索引 二维数组索引 三维数组索引 SHAP值的深入理解 知识点&#xff1a; numpy数组的创建&#xff1a;简单…

利用 Synonyms 中文近义词库调优 RAG 服务,基于 Ollama, DeepSeek R1, Langchain

目录 比对代码对比结果Synonyms 中文近义词 EmbeddingsHuggingFaceEmbeddings GitHub https://github.com/hailiang-wang/llm-get-started/tree/master/003_rag_langchain 本文介绍&#xff0c;在基于 RAG 服务实现问答的过程中&#xff0c;使用两种 Embeddings 模式下&#…

HTML 文件反编译指南:优化与学习网页代码

原文&#xff1a;HTML 文件反编译指南&#xff1a;优化与学习网页代码 | w3cschool笔记 (请勿将文章标记为付费&#xff01;&#xff01;&#xff01;&#xff09; 一、何为 HTML 文件反编译&#xff1f; 反编译 HTML 文件即将其从可读代码转换为更精简的形式。实际上&#…

在 ODROID-H3+ 上安装 Win11 系统

在 ODROID-H3 上安装 Windows 11 系统。 以下是完整的步骤&#xff0c;包括 BIOS 设置、U 盘制作、安装和驱动处理&#xff0c;全程不保留之前的系统数据。 ✅ 准备工作 1. 准备一个 ≥8GB 的 USB 启动盘 用另一台电脑制作 Windows 11 安装盘。 &#x1f449; 推荐工具&…

大话软工笔记—分离之业务与管理

1. 业务与管理的定义 业务&#xff0c;指企业为达成某个目标而进行的一系列活动&#xff08;业务指的是“做事”&#xff09;。 管理&#xff0c;为实现业务目标而进行的决策、计划、组织、指导、实施、控制的过程&#xff08;管理是“管事”&#xff0c;“事”指的是业务&am…

DeepSeek R1 模型小版本升级,DeepSeek-R1-0528都更新了哪些新特性?

DeepSeek-R1‑0528 技术剖析&#xff1a;思维链再进化&#xff0c;推理性能飙升 目录 版本概览深度思考能力再升级基准测试成绩功能与体验更新API 变动与示例模型开源与下载结语 版本概览 DeepSeek 团队今日发布 DeepSeek‑R1‑0528 —— 基于 DeepSeek V3 Base&#xff08;2…

请求分页中的内存分配

最小物理块数的确定 最小物理块数是确保进程能够正常运行所需的最少物理块数量。它是一个基础保障值&#xff0c;若分配的物理块数少于这个值&#xff0c;进程可能因无法完整加载必要页面而无法正常执行。例如&#xff0c;一个简单程序可能至少需要 3 个物理块来存放关键代码和…

痉挛性斜颈相关内容说明

一、颈部姿态的异常偏移​ 痉挛性斜颈会打破颈部原本自然笔直的状态&#xff0c;让颈部像被无形的力量牵引&#xff0c;出现不自主的歪斜、扭转。它就像打乱了颈部原本和谐的 “平衡游戏”&#xff0c;使得颈部姿态偏离正常&#xff0c;影响日常的体态与活动。​ 二、容易察觉…

【C++】位图

位图&#xff08;Bitmap&#xff09;是一种用于高效表示集合的数据结构&#xff0c;其核心思想是使用二进制位来指示某个元素是否存在。在位图中&#xff0c;每个元素对应一个二进制位&#xff0c;若该元素存在&#xff0c;则对应的位为1&#xff1b;若不存在&#xff0c;则为0…

初学c语言21(文件操作)

一.为什么使用文件 之前我们写的程序的数据都是存储到内存里面的&#xff0c;当程序结束时&#xff0c;内存回收&#xff0c;数据丢失&#xff0c; 再次运行程序时&#xff0c;就看不到上次程序的数据&#xff0c;如果要程序的数据一直保存得使用文件 二.文件 文件一般可以…

回车键为什么叫做“回车键”?

Enter键&#xff0c;也就是 “回车键”&#xff0c; 大家应该都不陌生。 可你知道它为什么叫“回车键”&#xff0c; 而不叫“输入键”、“登记键”嘛&#xff1f; 这要从机械英文打字机说起 因为电脑的普及&#xff0c;打字机几乎消失匿迹。 有的小伙伴们也许在小时候用过…

以太联Intellinet 分享:PoE 技术在医疗保健行业的创新应用

在当今科技飞速发展的时代&#xff0c;物联网(IoT)在医疗领域的应用正呈现出蓬勃兴起的态势。全球各地的医院以及老年生活中心纷纷引入物联网智能医疗解决方案&#xff0c;以实现设施运营的高效化与智能化。而在这背后&#xff0c;以太网供电(PoE)技术发挥着关键作用&#xff0…

大语言模型的技术原理与应用前景:从Transformer到ChatGPT

目录 摘要 1. 引言 2. Transformer架构核心原理 2.1 自注意力机制 2.2 位置编码 2.3 前馈神经网络 3. 从GPT到ChatGPT的演进 3.1 GPT系列模型架构 3.2 训练流程优化 4. 应用场景与案例分析 4.1 代码生成 4.2 文本摘要 4.3 问答系统 5. 挑战与未来方向 5.1 当前技…

CSS Day06

1.定位-相对和绝对和固定 (1)相对定位 position: relative; top: 100px; left: 200px; &#xff08;2&#xff09;绝对定位 就是子选择则器要用绝对定位&#xff0c;父选择器要用相对定位。 如果没有遵守此规则&#xff0c;那么小标签会跑到浏览器最角落&#xff1a; &#…

2025年5月24号高项综合知识真题以及答案解析(第1批次)

2025年5月24号高项综合知识真题以及答案解析

PowerDesigner通过SQL反向生成类图

PowerDesigner通过SQL反向生成类图 背景操作步骤步骤1: 选择这个步骤2: 目前我是选择的这个步骤3: 选择这个 其他 背景 工作学习 操作步骤 步骤1: 选择这个 步骤2: 目前我是选择的这个 步骤3: 选择这个 其他 其他同事告诉我的, 我还没有亲自尝试, 应该问题不大. 尝试后再反…

驱动灯珠芯片LT3743手册理解

1.引脚功能 1.EN/UVLO EN/UVLO引脚用作启用引脚&#xff0c;可在1.55V时开启内部电流偏置核心和子稳压器。该引脚没有上拉或下拉功能&#xff0c;因此正常工作需要电压偏置。当电压降至约0.5V时&#xff0c;系统将完全关闭。即EN/UVLO引脚的输入电压在1.55V至6V之间即可。 2.…

在 Mac 下 VSCode 中的终端使用 option + b 或 f 的快捷键变成输入特殊字符的解决方案

前言 在终端里&#xff0c;我们可以使用 option b 和 option f 来在我们输入的命令中进行快速的前后调整光标&#xff0c;但是&#xff0c;在未设置的情况下&#xff0c;在 MacOS 中&#xff0c;会变成输入特殊字符。 普通键盘上是 alt b 和 alt f &#xff0c;只是叫法不…