☰
Jetson gmls2相机驱动安装全流程:从花屏到稳定出图
2026/10/17 14:55:56 网站建设 项目流程

简介:这份资源面向在英伟达Jetson平台上开发计算机视觉与ADAS应用的工程师,提供GMSL2相机驱动的完整ROS工作空间源码,用于解决高带宽、低延迟图像传输场景下相机驱动的编译、配置与集成问题。GMSL2相比传统MIPI CSI-2具备更高数据速率和更长线缆支持,适合远程部署的车载摄像头系统。资源包共281个文件,约104KB,以cmake与make构建脚本为主体,辅以sh、bash、zsh等环境配置脚本,以及py、cpp、c源码和launch启动文件,另含rosinstall依赖清单与catkin工作空间标记文件,构成可直接编译的ROS驱动工程。目前已有1583人学习下载。读者可据此完成驱动编译、参数配置与话题数据流验证,并进一步将相机数据接入目标检测、图像处理或SLAM节点,快速搭建Jetson上的实时图像处理链路。

1. 从一次花屏说起:jetson gmls2相机驱动到底该怎么装

第一次在 Jetson 上接 gmls2 相机,我遇到的是花屏。画面能出,但每隔几秒撕裂一次,像信号被谁掐了一把。当时以为是排线松了,换了三根线、重插了五次,问题照旧。后来才发现,是驱动版本和 L4T 内核版本没对上——这种坑在嵌入式和边缘计算里太常见了,尤其是 Jetson 平台,相机驱动不像 x86 上插个 USB 就能认,它牵扯到设备树、内核模块、I2C 地址、CSI 通道配置一整条链路。

gmls2 这类 MIPI CSI 相机在 Jetson 上跑,装不好轻则掉帧花屏,重则内核直接 panic 重启。它适合做机器人视觉、边缘 AI 推理、多路相机同步采集的开发者。这篇笔记按我实际部署的流程走一遍:先列环境、再装驱动、配设备树、验证出图,最后把踩过的坑摊开讲。你照着走,至少能少换三根排线。

2. 环境先列清:L4T 版本、内核头文件和相机模组怎么对

2.1 确认 L4T 与 JetPack 版本,别拿错驱动包

Jetson 的相机驱动和 L4T(Linux for Tegra)版本是强绑定的。gmls2 的驱动源码通常针对特定 L4T 分支编译,版本错了,insmod 时符号找不到,或者出图异常。我一般先跑这两条命令确认底账:

# 查看 L4T 版本,输出类似 # R35 (release), REVISION: 4.1 cat /etc/nv_tegra_release # 查看 JetPack 版本,确认是 5.x 还是 6.x cat /etc/nv_tegra_release | head -1 dpkg -l | grep nvidia-jetpack

逻辑说明:/etc/nv_tegra_release第一行给出 L4T 主版本和修订号,比如 R35.4.1 对应 JetPack 5.1.2,R36.x 对应 JetPack 6.x。gmls2 驱动包一般会标注支持的 L4T 范围,比如“for L4T 35.4.1”。参数上,R35 和 R36 的内核 API 有差异,尤其是 V4L2 子设备注册和 media controller 框架,不能混用。

提示:如果你拿到的驱动包只写了“Jetson Orin”,没写 L4T 版本,先问清楚,或者看包里的Makefile里KERNEL_DIR指向哪个版本。

2.2 装内核头文件和编译工具链

驱动要编译成.ko模块,必须要有对应内核的头文件。Jetson 上默认没装,得手动补:

# 安装编译依赖 sudo apt update sudo apt install -y build-essential bc flex bison libssl-dev # 安装与当前内核匹配的头文件包 sudo apt install -y linux-headers-$(uname -r) # 确认头文件路径存在 ls /usr/src/linux-headers-$(uname -r)/ | head

逻辑说明:linux-headers-$(uname -r)会自动匹配当前运行内核版本。如果 apt 源里没有对应版本(常见于自定义内核),需要从 NVIDIA 官方源码包手动解压到/usr/src。build-essential提供 gcc 和 make,bc、flex、bison是内核编译脚本依赖,libssl-dev在签名模块时用到。

参数说明:uname -r输出的是内核版本号,比如5.10.120-tegra。头文件目录必须和这个完全一致,否则编译出的模块 vermagic 不匹配,insmod 会报“invalid module format”。

2.3 相机模组硬件连接检查

软件之前先看硬件。gmls2 是 MIPI CSI 接口,接在 Jetson 的 CSI 排线座上。我一般按这个顺序查:

  • 排线方向:金手指朝向板子内侧还是外侧,不同载板不一样,插反了不烧但认不到。
  • CSI 通道号:Jetson Orin 有多个 CSI 口,驱动里配置的csi-port要和实际插的口一致。
  • I2C 地址:gmls2 通常挂在 I2C 总线上,用i2cdetect扫一下,确认地址能出来。
# 扫描 I2C 总线,假设相机挂在 i2c-1 sudo i2cdetect -y -r 1

如果地址不出现,先别急着改驱动,查供电和排线。我遇到过排线没插到底,I2C 时有时无,折腾半天以为是驱动问题。

3. 驱动编译与加载:从源码到 /dev/video0 的完整路径

3.1 获取驱动源码并检查目录结构

gmls2 驱动一般以源码包形式提供,解压后目录里通常有这些:

tar -xvf gmls2_driver_<version>.tar.gz cd gmls2_driver ls -R # 常见结构: # Makefile # gmls2.c # gmls2_mode_tbls.h # gmls2_regs.h # dts/ (设备树覆盖文件) # README

逻辑说明:Makefile里定义了模块名、内核路径、交叉编译选项。gmls2.c是主驱动,包含 V4L2 子设备注册、I2C 读写、CSI 流控制。dts/里是设备树覆盖(dtbo),用来告诉内核相机挂在哪、用哪个 CSI 口、时钟怎么配。

参数说明:打开Makefile,重点看KERNEL_DIR和TARGET_MODULE。KERNEL_DIR应指向/usr/src/linux-headers-$(uname -r),如果不是,手动改。

3.2 编译驱动模块

# 进入驱动目录,指定内核路径编译 make KERNEL_DIR=/usr/src/linux-headers-$(uname -r) # 编译成功后生成 gmls2.ko ls -l gmls2.ko

逻辑说明:make会调用内核的 kbuild 系统,把gmls2.c编译成.ko。如果报错“No such file or directory: /lib/modules/.../build”,说明头文件没装好或路径不对。常见做法是做个软链接:

sudo ln -s /usr/src/linux-headers-$(uname -r) /lib/modules/$(uname -r)/build

参数说明:KERNEL_DIR可以省略,如果/lib/modules/$(uname -r)/build存在且指向正确。我一般显式指定,避免多内核版本时搞混。

3.3 加载模块并确认设备节点

# 加载驱动模块 sudo insmod gmls2.ko # 查看内核日志,确认驱动注册成功 dmesg | tail -30 # 检查 video 设备节点 ls /dev/video*

逻辑说明:insmod加载模块后,驱动会向 V4L2 框架注册子设备,并创建/dev/videoX节点。dmesg里应该能看到类似gmls2: registered sensor或gmls2 1-0036: gmls2 probe success的输出。如果只有insmod没报错但/dev/video没新增,说明设备树没配好,驱动 probe 失败。

参数说明:insmod和modprobe的区别在于后者会处理依赖,但相机驱动一般没依赖,用insmod更直接。加载后可以用lsmod | grep gmls2确认模块在运行。

3.4 设备树覆盖配置:让内核认识相机

设备树是 Jetson 相机驱动最容易翻车的地方。gmls2 的 dts 文件需要编译成 dtbo 并加载:

# 编译设备树覆盖 cd dts dtc -@ -I dts -O dtb -o gmls2.dtbo gmls2.dts # 复制到 boot 目录 sudo cp gmls2.dtbo /boot/ # 修改 extlinux.conf,添加 OVERLAY sudo vi /boot/extlinux/extlinux.conf # 在 APPEND 行末尾添加: # OVERLAYS=gmls2.dtbo

逻辑说明:dtc是设备树编译器,-@支持符号引用,-I dts -O dtb指定输入输出格式。编译出的.dtbo放到/boot,然后在extlinux.conf的APPEND行加OVERLAYS=参数。重启后,内核会在启动时应用覆盖,把相机节点挂到 I2C 和 CSI 控制器下。

参数说明:extlinux.conf里APPEND行可能已有其他 OVERLAYS,用逗号分隔,比如OVERLAYS=gmls2.dtbo,other.dtbo。改完必须重启,不能热加载。

注意:改extlinux.conf前备份一份,写错格式会导致系统起不来。我一般cp extlinux.conf extlinux.conf.bak再改。

4. 避坑与排查:gmls2 驱动装完不出图的五种常见情况

4.1 现象:insmod 成功但 /dev/video 没新增

原因:设备树没加载或 probe 失败。驱动模块加载了,但内核没在设备树里找到匹配的 compatible 字符串,不会触发 probe。

解决:先dmesg | grep gmls2看有没有 probe 相关日志。如果没有,检查extlinux.conf的 OVERLAYS 是否生效,重启后cat /proc/device-tree/chosen/overlays/看覆盖列表。再确认 dts 里的compatible和驱动里of_match_table一致。

4.2 现象:出图但花屏、撕裂

原因:CSI 通道配置错误或时钟频率不匹配。常见于 dts 里csi-port写错,或者clock-frequency和相机实际输出不符。

解决:核对 dts 中port节点的csi-port与物理接口。用v4l2-ctl --list-devices确认设备。调整clock-frequency参数,gmls2 常见是 24MHz 或 27MHz,看模组规格。

4.3 现象:I2C 通信失败,dmesg 报 timeout

原因:I2C 地址不对或总线号错。gmls2 默认地址可能是 0x36,但有些模组可配。

解决:i2cdetect -y -r <bus>扫地址。确认 dts 里reg = <0x36>和实际一致。检查排线是否插紧,供电是否正常。

4.4 现象:编译报错“implicit declaration of function”

原因:内核 API 版本差异。R35 和 R36 的 V4L2 接口有变化,比如v4l2_subdev_init参数或media_entity_pads_init用法。

解决:看驱动包是否针对你的 L4T 版本。如果是旧版驱动在新内核上编译,需要手动改 API 调用。常见做法是找对应 L4T 分支的驱动源码,别硬改。

4.5 现象:系统启动卡在 logo 或反复重启

原因:设备树覆盖写错,导致内核启动时解析失败。

解决:进入 recovery 模式或串口控制台,把extlinux.conf里 OVERLAYS 那行注释掉,重启恢复。然后逐行检查 dts 语法,用dtc单独编译看报错。

5. 装完怎么验证:从 v4l2-ctl 抓帧到实际出图

驱动装完,别急着写应用。我一般先用v4l2-ctl走一遍完整链路,确认相机能出流、格式对、帧率稳。

# 列出所有 video 设备,确认 gmls2 对应的节点 v4l2-ctl --list-devices # 查看该设备支持的格式 v4l2-ctl -d /dev/video0 --list-formats-ext # 抓取 10 帧保存为 raw 文件 v4l2-ctl -d /dev/video0 --set-fmt-video=width=1920,height=1080,pixelformat=RG10 \ --stream-mmap --stream-count=10 --stream-to=test.raw # 查看帧率统计 v4l2-ctl -d /dev/video0 --stream-mmap --stream-count=100 --stream-poll

逻辑说明:--list-formats-ext会输出相机支持的像素格式和分辨率,gmls2 常见是RG10(10-bit Bayer)。--stream-mmap用内存映射方式抓流,--stream-count=10抓 10 帧,--stream-to存成 raw 文件。抓完后可以用ffmpeg或专用工具转成图片看效果。

参数说明:pixelformat必须和--list-formats-ext里的一致,写错会报VIDIOC_S_FMT: failed。width和height也要在支持列表里。如果抓流时报select timeout,多半是 CSI 通道没配对或时钟不对。

验证通过的标准:v4l2-ctl能稳定抓完指定帧数,dmesg无报错,test.raw文件大小符合预期(1920×1080×2 字节×10 帧≈41MB)。如果 raw 文件大小对但画面异常,用ffmpeg转一下:

# 将 raw RG10 转为 png,注意指定像素格式和分辨率 ffmpeg -f rawvideo -pix_fmt gray16le -s 1920x1080 -i test.raw -frames:v 1 output.png

逻辑说明:gray16le是 16 位小端灰度,RG10 数据按 16 位存储但有效位是 10 位,转出来偏暗是正常的,能看出轮廓就说明数据通路没问题。

从那以后我每次装完 Jetson 相机驱动,都强制走一遍v4l2-ctl抓帧,不看到 raw 文件生成不算完。这个习惯帮我省了很多“以为装好了结果应用层报错”的时间。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询