目前打算用Jetson Orin NX套件,接线如下,但想把自带摄像头换成索尼相机,由于相机的输出是HDMI,套件自带的是CSI口的输入,所有准备了一个TC358743转接模块,接下来将抒写完整的TC358743 驱动程序并且将其集成到 Jetson Orin NX 的 Linux 内核中。

一、编写驱动程序

首先准备好tc358743的驱动程序,包括:

- tc358743.c - 驱动程序实现
- tc358743.h - 头文件,包含常量和结构体定义
- tc358743.dtsi - 设备树配置文件
- Makefile - 编译配置文件

然后梳理好他们的结构、和功能,接下来开始编辑驱动程序元源码,这里我直接将驱动程序放到最后,有需要的可以直接下载

通过网盘分享的文件:驱动
链接: https://pan.baidu.com/s/1UChvICYBPJnzCmYOgn5BhQ?pwd=4560 提取码: 4560 
--来自百度网盘超级会员v4的分享

驱动程序文件结构
1、tc358743.c - 主驱动程序文件,包含:

- 芯片初始化和寄存器配置
- I2C 通信接口
- V4L2 子设备操作
- 媒体控制器集成
- 视频流捕获功能

2、tc358743.h 头文件包含了以下内容:

1. I2C 地址定义 :TC358743 的 I2C 地址为 0x0f
2. 寄存器定义 :包括芯片 ID、系统控制、复位、HDMI 控制、MIPI 控制等寄存器地址
3. 芯片 ID :TC358743 的芯片 ID 为 0x358743
4. 控制掩码和常量 :包括复位掩码、HDMI 使能、MIPI 使能、通道数和数据速率等
5. 驱动结构体 :定义了 tc358743_dev 结构体,包含设备的所有必要信息
6. 函数原型 :声明了所有内部函数的原型

3、tc358743.dtsi - 设备树配置文件,包含:

- I2C 设备配置
- GPIO 复位引脚配置
- MIPI CSI-2 连接配置
- 时钟和数据通道配置

4、Makefile - 编译配置文件,用于编译和加载驱动程序

驱动程序的功能
1、芯片检测和初始化 :

- 读取芯片 ID 进行识别
- 硬件复位和初始化
- 寄存器配置和状态检查

2、HDMI 接收配置 :

- 启用 HDMI 输入
- 检测 HDMI 信号状态

3、MIPI CSI-2 传输配置 :

- 配置数据通道(2  lanes)
- 设置时钟频率(1.5GHz)
- 启用 MIPI 传输

4、视频流控制 :

- 支持 V4L2 子设备接口
- 实现流开启/关闭操作
- 集成媒体控制器框架

# 编译驱动程序
make

# 加载驱动程序
sudo insmod tc358743.ko

# 检查驱动程序
modinfo tc358743.ko

# 卸载驱动程序
sudo rmmod tc358743

二、设备树集成

步骤 1、找到 Jetson Orin NX 的设备树文件

位于/boot 目录下

步骤 2、创建设备树覆盖文件

创建一个名为 tc358743-overlay.dts 的文件,内容基于之前的 tc358743.dtsi 文件。

步骤 3:编译设备树覆盖文件

使用 dtc 工具编译设备树覆盖文件:

dtc -I dts -O dtb -o tc358743-overlay.dtbo tc358743-overlay.dts

步骤 4:安装设备树覆盖文件

将编译好的设备树覆盖文件复制到 Jetson 的设备树目录:

sudo cp tc358743-overlay.dtbo /boot/extlinux/

步骤 5:配置设备树覆盖

编辑 /boot/extlinux/extlinux.conf 文件,在 APPEND 行添加设备树覆盖配置:

# 尝试使用不同的设备树加载方式
sudo vim /boot/extlinux/extlinux.conf
#修改 APPEND 行,确保设备树覆盖路径正确:
of_overlay=/boot/extlinux/tc358743-overlay.dtbo

三、驱动程序安装

步骤 1:编译驱动程序

sudo depmod -a
make

步骤 2:安装驱动程序

sudo cp tc358743.ko /lib/modules/$(uname -r)/kernel/drivers/media/i2c/

步骤 3:更新模块依赖

sudo depmod -a

步骤4:配置驱动程序自动加载

创建一个名为 /etc/modules-load.d/tc358743.conf 的文件,添加以下内容:

tc358743

步骤 5:重启系统

sudo reboot

步骤 6:检查驱动程序加载状态

# 检查驱动是否加载
lsmod | grep tc358743

# 查看详细的驱动加载日志
dmesg | grep -A 30 -B 5 tc358743

# 尝试重新加载驱动
sudo rmmod tc358743 2>/dev/null
sudo insmod tc358743.ko
dmesg | tail -40

步骤 7:检查 I2C 通信

使用 i2cdetect 命令检查 TC358743 是否在 I2C 总线上被检测到:

sudo i2cdetect -y 2

步骤 8:检查 V4L2 设备

# 安装 V4L2 工具包
sudo apt update
sudo apt install v4l-utils

# 检查设备信息
v4l2-ctl --list-devices
#查是否创建了 V4L2 设备节点
ls -la /dev/video*

步骤9:测试视频捕获

#使用 v4l2-ctl 命令测试视频捕获功能:
v4l2-ctl --list-devices
v4l2-ctl -d /dev/video0 --list-formats-ext
v4l2-ctl -d /dev/video0 --stream-mmap --stream-count=10

结果:
我们需要看到:

1. 驱动成功加载并初始化 TC358743 芯片
2. 识别到 HDMI 信号
3. 生成 /dev/video0 设备
4. 能够通过 V4L2 接口捕获视频

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐