首页 / 资讯中心 / 文章详情

Jetson gmls2相机驱动安装全流程:从花屏到稳定出图

Jetson gmls2相机驱动安装全流程:从花屏到稳定出图 ★ FEATURED ARTICLE
简介这份资源面向在英伟达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 的相机驱动和 L4TLinux 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.2R36.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 和 makebc、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 行末尾添加 # OVERLAYSgmls2.dtbo逻辑说明dtc是设备树编译器-支持符号引用-I dts -O dtb指定输入输出格式。编译出的.dtbo放到/boot然后在extlinux.conf的APPEND行加OVERLAYS参数。重启后内核会在启动时应用覆盖把相机节点挂到 I2C 和 CSI 控制器下。参数说明extlinux.conf里APPEND行可能已有其他 OVERLAYS用逗号分隔比如OVERLAYSgmls2.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-videowidth1920,height1080,pixelformatRG10 \ --stream-mmap --stream-count10 --stream-totest.raw # 查看帧率统计 v4l2-ctl -d /dev/video0 --stream-mmap --stream-count100 --stream-poll逻辑说明--list-formats-ext会输出相机支持的像素格式和分辨率gmls2 常见是RG1010-bit Bayer。--stream-mmap用内存映射方式抓流--stream-count10抓 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 文件生成不算完。这个习惯帮我省了很多“以为装好了结果应用层报错”的时间。希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?
咨询建站