跳到主要内容

接口定义

整机接口定义

LPS3576 提供了丰富的车载及工业接口能力,支持多路视频输入、多总线通信及 AI 扩展能力。

注:

  • 本文档适用于 LPS3576 全系列硬件版本
  • 不同版本摄像头接口存在差异,请重点关注“摄像头接口说明”

丝印设备节点备注
MIChw:0,0音频输入
SPKhw:0,0音频输出
HDMIcard0-HDMI-A-1HDMI 输出
LCDMIPI-DSILCD 显示接口
ETH0eth0千兆网口
ETH1eth1千兆网口
WIFIwlan0双频 WIFI6
4G/5Gppp0/wwan0mini-PCIe 扩展
USB1USB3.0 HOST
USB2USB3.0 HOST
CAN0can0CAN FD
CAN1can1CAN FD
RS485_1/dev/ttyS2RS485
RS485_2/dev/ttyS8RS485
RS485_3/dev/ttyS4RS485
RS232_1/dev/ttyS6RS232
RS232_2/dev/ttyS10RS232
RTC/dev/rtc0RTC 时钟

音频使用(SPK & MIC)

提示

声卡默认使用 card0,可通过 arecord -l / aplay -l 查看设备。

播放音频

# 播放音频配置
amixer -c 0 cset name='spk switch' on
amixer -c 0 cset name='SAI1 Transmit SDO2 Source Select' 0
amixer -c 0 cset name='SAI1 Transmit SDOx Select' 1
amixer -c 0 cset name='spk switch' on
amixer -c 0 cset name='Speaker Switch' on

aplay -D hw:0,0 test.wav

录制音频

# 录制音频配置
amixer -c 0 cset name='SAI1 Receive PATH2 Source Select' 0
amixer -c 0 cset name='SAI1 Receive SDIx Select' 1
amixer -c 0 cset name='Headset Mic Switch' on
amixer -c 0 cset name='Main Mic Switch' on

# mic1使能
amixer -c 0 cset name='Differential Mux' 0
amixer -c 0 cset name='Right channel of mic0 or mic1 enable' 0
# mic2使能
amixer -c 0 cset name='Differential Mux' 1
amixer -c 0 cset name='Right channel of mic0 or mic1 enable' 1

# 开始录音
# -D:指定录音设备,-Dhw:0,0表示card0,device0可以使用 arecord -l查看
# -d:指定录音时长,单位是s
# -f:指定录音格式,这里指定的是cd
# -r:指定采样率,单位hz
# -c:指定通道数量,指定的是双声道
# -t:指定生成文件的格式,这里是wav
arecord -Dhw:0,0 -d 10 -f cd -r 48000 -c 2 -t wav test.wav

HDMI / 显示说明

注:

  • RK3576 使用 DRM 显示架构
  • HDMI 插拔后建议重新执行 xrandr
xrandr

设备节点:

HDMI:/sys/class/drm/card0-HDMI-A-1/

网络说明

以太网

ifconfig -a

Wi-Fi

nmcli dev wifi list
sudo nmcli device wifi connect <ssid> password <password>

CAN FD 使用

警告

板载终端电阻开关,使⽤前需要和硬件确认终端电阻状态。

提示

推荐设置 CANFD 模式:仲裁速率 500Kbps,数据速率 5Mbps。

# 设置canfd模式,仲裁速率500Kbps,数据速率5Mbps
ip link set can0 down
ip link set can0 type can bitrate 500000 sample-point 0.8 dbitrate 5000000 sample-point 0.8 fd on
ip link set can0 up
echo 4096 > /sys/class/net/can0/tx_queue_len

ip link set can1 down
ip link set can1 type can bitrate 500000 sample-point 0.8 dbitrate 5000000 sample-point 0.8 fd on
ip link set can1 up
echo 4096 > /sys/class/net/can1/tx_queue_len

# 测试发送与接收
cansend can0 123#aabbccdd
candump can1

RS485 使用

信息

RS485 需�要 GPIO 控制收发方向:拉高发送,拉低接收。

端口名流控GPIO设备节点
TTY2-RS485148/dev/ttyS2
TTY8-RS485149/dev/ttyS8
TTY4-RS48550/dev/ttyS4

控制示例

# 设置流控,拉高发送,拉低接收
echo xxx > /sys/class/gpio/export
echo out > /sys/class/gpio/gpioxxx/direction
# 拉高发送
echo 1 > /sys/class/gpio/gpioxxx/value
# 拉低接收
echo 0 > /sys/class/gpio/gpioxxx/value

通信测试

# 设置串口属性 (以 9600 8N1 为例)
stty -F /dev/ttyS5 ispeed 9600 ospeed 9600 cs8 -cstopb -parenb min 1 time 1
# cs8 设置数据位为8
# -cstopb 设置停止位为1位
# -parenb 不使用奇偶校验位
# min 1 设置最小字符为1,阻塞等待直到有一个可以读取的字符
# time 1 设置读取超时时间为1s
# 发送数据
echo "xxxx" > /dev/ttyS5
# 接收数据
cat /dev/ttyS5 &

RS232 使用

端口名设备节点
RS232_1/dev/ttyS6
RS232_2/dev/ttyS10
# 设置串口属性
stty -F /dev/ttyS6 ispeed 9600 ospeed 9600 cs8 -cstopb -parenb min 1 time 1
stty -F /dev/ttyS10 ispeed 9600 ospeed 9600 cs8 -cstopb -parenb min 1 time 1

电源输出控制

信息

电源控制均为拉高控制 GPIO 输出电压,拉低控制 GPIO 关闭输出。

电源名称控制GPIO
VCC12V_OUT_CAN506
VCC12V_OUT_232503
VCC12V_OUT_1313
VCC12V_OUT_1919
VCC12V_OUT_5481
VCC12V_OUT_6969
# 以控制 CAN 接口 12V 输出为例
echo 506 > /sys/class/gpio/export
echo 1 > /sys/class/gpio/gpio506/value # 打开输出

VIN 输入检测

提示

GPIO 均已导出,直接读取状态即可。

网络名状态GPIO / 节点
INPUT_7151
INPUT_5120
INPUT_5568
INPUT_6891
EXT_VIN5ADC_VIN5
EXT_VIN6ADC_VIN6
# 读取 ADC 原始值
cat /sys/bus/iio/devices/iio:device0/in_voltage5_raw
cat /sys/bus/iio/devices/iio:device0/in_voltage6_raw

# 读取 GPIO 状态 (0 或 1)
cat /sys/class/gpio/gpio151/value

摄像头接口说明

⚠️ 重要: LPS3576 存在两个硬件版本,请务必确认后再开发


版本一:12 路 AHD 摄像头

AHD 节点映射与出图指令

硬件位号设备节点出图指令 (1280x720)
CAM1/dev/video3gst-launch-1.0 -v v4l2src device=/dev/video3 io-mode=2 ! video/x-raw, format=NV12, width=1280, height=720, framerate=30/1 ! fpsdisplaysink
CAM2/dev/video2gst-launch-1.0 -v v4l2src device=/dev/video2 io-mode=2 ! video/x-raw, format=NV12, width=1280, height=720, framerate=30/1 ! fpsdisplaysink
CAM3/dev/video1gst-launch-1.0 -v v4l2src device=/dev/video1 io-mode=2 ! video/x-raw, format=NV12, width=1280, height=720, framerate=30/1 ! fpsdisplaysink
CAM4/dev/video0gst-launch-1.0 -v v4l2src device=/dev/video0 io-mode=2 ! video/x-raw, format=NV12, width=1280, height=720, framerate=30/1 ! fpsdisplaysink
CAM5/dev/video14gst-launch-1.0 -v v4l2src device=/dev/video14 io-mode=2 ! video/x-raw, format=NV12, width=1280, height=720, framerate=30/1 ! fpsdisplaysink
CAM6/dev/video13gst-launch-1.0 -v v4l2src device=/dev/video13 io-mode=2 ! video/x-raw, format=NV12, width=1280, height=720, framerate=30/1 ! fpsdisplaysink
CAM7/dev/video12gst-launch-1.0 -v v4l2src device=/dev/video12 io-mode=2 ! video/x-raw, format=NV12, width=1280, height=720, framerate=30/1 ! fpsdisplaysink
CAM8/dev/video11gst-launch-1.0 -v v4l2src device=/dev/video11 io-mode=2 ! video/x-raw, format=NV12, width=1280, height=720, framerate=30/1 ! fpsdisplaysink
CAM9/dev/video25gst-launch-1.0 -v v4l2src device=/dev/video25 io-mode=2 ! video/x-raw, format=NV12, width=1280, height=720, framerate=30/1 ! fpsdisplaysink
CAM10/dev/video24gst-launch-1.0 -v v4l2src device=/dev/video24 io-mode=2 ! video/x-raw, format=NV12, width=1280, height=720, framerate=30/1 ! fpsdisplaysink
CAM11/dev/video23gst-launch-1.0 -v v4l2src device=/dev/video23 io-mode=2 ! video/x-raw, format=NV12, width=1280, height=720, framerate=30/1 ! fpsdisplaysink
CAM12/dev/video22gst-launch-1.0 -v v4l2src device=/dev/video22 io-mode=2 ! video/x-raw, format=NV12, width=1280, height=720, framerate=30/1 ! fpsdisplaysink

版本二:8 路 AHD + 6 路 GMSL

1. AHD 摄像头出图指令

壳体丝印设备节点出图指令 (1280x720)
CAM1 (#1ping角)/dev/video47gst-launch-1.0 -v v4l2src device=/dev/video47 io-mode=2 ! video/x-raw, format=NV12, width=1280,height=720, framerate=30/1 ! fpsdisplaysink
CAM2 (#2ping角)/dev/video46gst-launch-1.0 -v v4l2src device=/dev/video46 io-mode=2 ! video/x-raw, format=NV12, width=1280,height=720, framerate=30/1 ! fpsdisplaysink
CAM3 (#3ping角)/dev/video45gst-launch-1.0 -v v4l2src device=/dev/video45 io-mode=2 ! video/x-raw, format=NV12, width=1280,height=720, framerate=30/1 ! fpsdisplaysink
CAM4 (#4ping角)/dev/video44gst-launch-1.0 -v v4l2src device=/dev/video44 io-mode=2 ! video/x-raw, format=NV12, width=1280,height=720, framerate=30/1 ! fpsdisplaysink
CAM5 (#5ping角)/dev/video36gst-launch-1.0 -v v4l2src device=/dev/video36 io-mode=2 ! video/x-raw, format=NV12, width=1280,height=720, framerate=30/1 ! fpsdisplaysink
CAM6 (#6ping角)/dev/video35gst-launch-1.0 -v v4l2src device=/dev/video35 io-mode=2 ! video/x-raw, format=NV12, width=1280,height=720, framerate=30/1 ! fpsdisplaysink
CAM7 (#7ping角)/dev/video34gst-launch-1.0 -v v4l2src device=/dev/video34 io-mode=2 ! video/x-raw, format=NV12, width=1280,height=720, framerate=30/1 ! fpsdisplaysink
CAM8 (#8ping角)/dev/video33gst-launch-1.0 -v v4l2src device=/dev/video33 io-mode=2 ! video/x-raw, format=NV12, width=1280,height=720, framerate=30/1 ! fpsdisplaysink

2. GMSL 摄像头测试流程

测试流程说明:

  1. 初始化芯片:根据摄像头颜色(黑/白)执行对应的初始化脚本。每个芯片对应两个摄像头,必须同色。
  2. 设置分辨率(仅 200W):若需 1080P 模式,需执行 media-ctl 设置。
  3. 执行出图指令:使用 gst-launch-1.0 预览画面。

点击查看 max9296_config.sh 脚本源码

#!/bin/bash

if [ $# -ne 4 ]; then
echo "Error: Missing required parameters."
echo "Usage: $0 -s <i2c_switch> -a <i2c_addr>"
echo "Example: $0 -s 9 -a 48"
fi

while getopts "s:a:" opt; do
case $opt in
s) I2C_SWITCH="$OPTARG" ;;
a) I2C_ADDR="$OPTARG" ;;
*)
echo "Invalid option: -$OPTARG"
echo "Usage: $0 -s <i2c_switch> -a <i2c_addr>"
;;
esac
done

if [ -z "$I2C_SWITCH" ] || [ -z "$I2C_ADDR" ]; then
echo "Error: Both -s and -a parameters are required."
echo "Usage: $0 -s <i2c_switch> -a <i2c_addr>"
echo "Example: $0 -s 9 -a 48"
fi

if ! [[ "$I2C_SWITCH" =~ ^[0-9]+$ ]] || ! [[ "$I2C_ADDR" =~ ^[0-9]+$ ]]; then
echo "Error: I2C_SWITCH and I2C_ADDR must be positive integers."
echo "Usage: $0 -s <integer> -a <integer>"
fi

deser_addr=0x$I2C_ADDR

echo "I2C Switch: $I2C_SWITCH"
echo "I2C Address: $I2C_ADDR"
echo "Deser Address: $deser_addr"

ser_addr=0x40
ser_addr1=0x41
ser_addr2=0x42

i2ctransfer -y -f $I2C_SWITCH w3@$deser_addr 0x03 0x13 0x00
i2ctransfer -y -f $I2C_SWITCH w3@$deser_addr 0x00 0x03 0x40
i2ctransfer -y -f $I2C_SWITCH w3@$deser_addr 0x00 0x06 0xdf

i2ctransfer -y -f $I2C_SWITCH w3@$deser_addr 0x04 0x4a 0x50

sleep 0.5
i2ctransfer -y -f $I2C_SWITCH w3@$deser_addr 0x00 0x10 0x21 # Link A
sleep 0.5
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr 0x00 0x00 0x82

i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr1 0x00 0x57 0x12
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr1 0x00 0x5b 0x11
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr1 0x00 0x6b 0x16
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr1 0x00 0x73 0x17
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr1 0x00 0x7b 0x36
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr1 0x00 0x83 0x36
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr1 0x00 0x93 0x36
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr1 0x00 0x9b 0x36
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr1 0x00 0xa3 0x36
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr1 0x00 0xab 0x36
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr1 0x00 0x8b 0x36

i2ctransfer -y -f $I2C_SWITCH w3@$deser_addr 0x00 0x10 0x22 # Link B
sleep 0.5
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr 0x00 0x00 0x84
i2ctransfer -y -f $I2C_SWITCH w3@$deser_addr 0x00 0x10 0x23
sleep 0.5

# camera max9295-2 trigger MFP8
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr2 0x02 0xd6 0x85
i2ctransfer -y -f $I2C_SWITCH w3@$deser_addr 0x00 0x10 0x22
sleep 0.5
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr2 0x02 0xd6 0x84
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr2 0x02 0xd8 0x08

i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr2 0x00 0x57 0x12
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr2 0x00 0x5b 0x11

# Mainboard max9296 trigger MFP6
i2ctransfer -y -f $I2C_SWITCH w3@$deser_addr 0x00 0x10 0x23
sleep 0.5
i2ctransfer -y -f $I2C_SWITCH w3@$deser_addr 0x02 0xc2 0x83
i2ctransfer -y -f $I2C_SWITCH w3@$deser_addr 0x02 0xc3 0xa8
# camera max9295-1 trigger MFP8
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr1 0x02 0xd6 0x85
i2ctransfer -y -f $I2C_SWITCH w3@$deser_addr 0x00 0x10 0x21
sleep 0.5
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr1 0x02 0xd6 0x84
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr1 0x02 0xd8 0x08
# camera max9295-2,Pipe Y
i2ctransfer -y -f $I2C_SWITCH w3@$deser_addr 0x00 0x10 0x23
sleep 0.5
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr2 0x03 0x11 0x25
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr2 0x03 0x08 0x7f
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr2 0x03 0x14 0x62
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr2 0x03 0x16 0x5e
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr2 0x03 0x18 0x62
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr2 0x03 0x1a 0x62
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr2 0x00 0x02 0xf3
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr2 0x00 0x01 0x40 #MAX9295_2 , 3Gbps
# camera max9295-1,Pipe X
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr1 0x03 0x11 0x15
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr1 0x03 0x08 0x7f
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr1 0x03 0x14 0x5e
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr1 0x03 0x16 0x62
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr1 0x03 0x18 0x62
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr1 0x03 0x1a 0x62
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr1 0x00 0x02 0xf3
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr1 0x00 0x01 0x40 #MAX9295_1 , 3Gbps

i2ctransfer -y -f $I2C_SWITCH w3@$deser_addr 0x00 0x01 0x01 #MAX9296 , 3Gbps
i2ctransfer -y -f $I2C_SWITCH w3@$deser_addr 0x03 0x30 0x04
i2ctransfer -y -f $I2C_SWITCH w3@$deser_addr 0x00 0x02 0xf3

# PIPE Y YUV422 8bit VC1
i2ctransfer -y -f $I2C_SWITCH w3@$deser_addr 0x04 0x8b 0x07
i2ctransfer -y -f $I2C_SWITCH w3@$deser_addr 0x04 0xad 0x15
i2ctransfer -y -f $I2C_SWITCH w3@$deser_addr 0x04 0x8d 0x1e
i2ctransfer -y -f $I2C_SWITCH w3@$deser_addr 0x04 0x8e 0x5e
i2ctransfer -y -f $I2C_SWITCH w3@$deser_addr 0x04 0x8f 0x00
i2ctransfer -y -f $I2C_SWITCH w3@$deser_addr 0x04 0x90 0x40
i2ctransfer -y -f $I2C_SWITCH w3@$deser_addr 0x04 0x91 0x01
i2ctransfer -y -f $I2C_SWITCH w3@$deser_addr 0x04 0x92 0x41
# PIPE X YUV422 8bit VC0
i2ctransfer -y -f $I2C_SWITCH w3@$deser_addr 0x04 0x0b 0x07
i2ctransfer -y -f $I2C_SWITCH w3@$deser_addr 0x04 0x2d 0x15
i2ctransfer -y -f $I2C_SWITCH w3@$deser_addr 0x04 0x0d 0x1e
i2ctransfer -y -f $I2C_SWITCH w3@$deser_addr 0x04 0x0e 0x1e
i2ctransfer -y -f $I2C_SWITCH w3@$deser_addr 0x04 0x0f 0x00
i2ctransfer -y -f $I2C_SWITCH w3@$deser_addr 0x04 0x10 0x00
i2ctransfer -y -f $I2C_SWITCH w3@$deser_addr 0x04 0x11 0x01
i2ctransfer -y -f $I2C_SWITCH w3@$deser_addr 0x04 0x12 0x01

i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr1 0x00 0x01 0x04
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr2 0x00 0x01 0x04
i2ctransfer -y -f $I2C_SWITCH w3@$deser_addr 0x00 0x01 0x01

i2ctransfer -y -f $I2C_SWITCH w3@$deser_addr 0x00 0x10 0x33

点击查看 max9296_config_x2_new.sh 脚本源码

#!/bin/bash

if [ $# -ne 4 ]; then
echo "Error: Missing required parameters."
echo "Usage: $0 -s <i2c_switch> -a <i2c_addr>"
echo "Example: $0 -s 9 -a 48"

fi

while getopts "s:a:" opt; do
case $opt in
s) I2C_SWITCH="$OPTARG" ;;
a) I2C_ADDR="$OPTARG" ;;
*)
echo "Invalid option: -$OPTARG"
echo "Usage: $0 -s <i2c_switch> -a <i2c_addr>"
;;
esac
done

if [ -z "$I2C_SWITCH" ] || [ -z "$I2C_ADDR" ]; then
echo "Error: Both -s and -a parameters are required."
echo "Usage: $0 -s <i2c_switch> -a <i2c_addr>"
echo "Example: $0 -s 9 -a 48"
fi

if ! [[ "$I2C_SWITCH" =~ ^[0-9]+$ ]] || ! [[ "$I2C_ADDR" =~ ^[0-9]+$ ]]; then
echo "Error: I2C_SWITCH and I2C_ADDR must be positive integers."
echo "Usage: $0 -s <integer> -a <integer>"
fi

deser_addr=0x$I2C_ADDR

echo "I2C Switch: $I2C_SWITCH"
echo "I2C Address: $I2C_ADDR"
echo "Deser Address: $deser_addr"

ser_addr=0x40
ser_addr1=0x41
ser_addr2=0x42
# max9296 3Gbps
i2ctransfer -y -f $I2C_SWITCH w3@$deser_addr 0x00 0x01 0x01
i2ctransfer -y -f $I2C_SWITCH w3@$deser_addr 0x03 0x13 0x00
i2ctransfer -y -f $I2C_SWITCH w3@$deser_addr 0x00 0x03 0x40
i2ctransfer -y -f $I2C_SWITCH w3@$deser_addr 0x00 0x06 0xdf
i2ctransfer -y -f $I2C_SWITCH w3@$deser_addr 0x04 0x4a 0x50
sleep 1
i2ctransfer -y -f $I2C_SWITCH w3@$deser_addr 0x00 0x10 0x21 # Link A
sleep 0.5

i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr 0x00 0x00 0x82
sleep 0.2

i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr1 0x02 0xbe 0x00
sleep 0.2
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr1 0x00 0x06 0xb0
sleep 0.2
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr1 0x03 0xf0 0x59
sleep 0.2
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr1 0x00 0x03 0x03
sleep 0.2
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr1 0x02 0xd3 0x84
sleep 0.2
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr1 0x02 0xd5 0x08
sleep 0.2
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr1 0x03 0x18 0x5e
sleep 0.2
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr1 0x02 0xbe 0x10
sleep 0.2

i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr1 0x00 0x57 0x12
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr1 0x00 0x5b 0x11
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr1 0x00 0x6b 0x16
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr1 0x00 0x73 0x17
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr1 0x00 0x7b 0x36
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr1 0x00 0x83 0x36
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr1 0x00 0x93 0x36
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr1 0x00 0x9b 0x36
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr1 0x00 0xa3 0x36
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr1 0x00 0xab 0x36
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr1 0x00 0x8b 0x36

i2ctransfer -y -f $I2C_SWITCH w3@$deser_addr 0x00 0x10 0x22 # Link B
sleep 0.5
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr 0x00 0x00 0x84
sleep 0.2
i2ctransfer -y -f $I2C_SWITCH w3@$deser_addr 0x00 0x10 0x23
sleep 0.5

# camera max9295-2 trigger MFP8
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr2 0x02 0xd3 0x85

i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr2 0x02 0xbe 0x00
sleep 0.2
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr2 0x00 0x06 0xb0
sleep 0.2
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr2 0x03 0xf0 0x59
sleep 0.2
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr2 0x00 0x03 0x03
sleep 0.2
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr2 0x02 0xd3 0x84
sleep 0.2
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr2 0x02 0xd5 0x08
sleep 0.2
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr2 0x03 0x18 0x5e
sleep 0.2
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr2 0x02 0xbe 0x10
sleep 0.2

i2ctransfer -y -f $I2C_SWITCH w3@$deser_addr 0x00 0x10 0x22
sleep 0.5
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr2 0x02 0xd3 0x84
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr2 0x02 0xd5 0x08

i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr2 0x00 0x57 0x12
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr2 0x00 0x5b 0x11

# Mainboard max9296 trigger MFP6
i2ctransfer -y -f $I2C_SWITCH w3@$deser_addr 0x00 0x10 0x23
sleep 0.5
i2ctransfer -y -f $I2C_SWITCH w3@$deser_addr 0x02 0xc2 0x83
i2ctransfer -y -f $I2C_SWITCH w3@$deser_addr 0x02 0xc3 0xa8
# camera max9295-1 trigger MFP8
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr1 0x02 0xd3 0x85
i2ctransfer -y -f $I2C_SWITCH w3@$deser_addr 0x00 0x10 0x21
sleep 0.5
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr1 0x02 0xd3 0x84
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr1 0x02 0xd5 0x08
# camera max9295-2,Pipe Y
i2ctransfer -y -f $I2C_SWITCH w3@$deser_addr 0x00 0x10 0x23
sleep 0.5
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr2 0x03 0x11 0x25
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr2 0x03 0x08 0x7f
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr2 0x03 0x14 0x62
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr2 0x03 0x16 0x5e
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr2 0x03 0x18 0x62
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr2 0x03 0x1a 0x62
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr2 0x00 0x02 0xf3
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr2 0x00 0x01 0x40 #MAX9295_2 , 3Gbps
# camera max9295-1,Pipe X
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr1 0x03 0x11 0x15
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr1 0x03 0x08 0x7f
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr1 0x03 0x14 0x5e
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr1 0x03 0x16 0x62
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr1 0x03 0x18 0x62
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr1 0x03 0x1a 0x62
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr1 0x00 0x02 0xf3
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr1 0x00 0x01 0x40 #MAX9295_1 , 3Gbps

i2ctransfer -y -f $I2C_SWITCH w3@$deser_addr 0x00 0x01 0x01 #MAX9296 , 3Gbps
i2ctransfer -y -f $I2C_SWITCH w3@$deser_addr 0x03 0x30 0x04
i2ctransfer -y -f $I2C_SWITCH w3@$deser_addr 0x00 0x02 0xf3

# PIPE Y YUV422 8bit VC1
i2ctransfer -y -f $I2C_SWITCH w3@$deser_addr 0x04 0x8b 0x07
i2ctransfer -y -f $I2C_SWITCH w3@$deser_addr 0x04 0xad 0x15
i2ctransfer -y -f $I2C_SWITCH w3@$deser_addr 0x04 0x8d 0x1e
i2ctransfer -y -f $I2C_SWITCH w3@$deser_addr 0x04 0x8e 0x5e
i2ctransfer -y -f $I2C_SWITCH w3@$deser_addr 0x04 0x8f 0x00
i2ctransfer -y -f $I2C_SWITCH w3@$deser_addr 0x04 0x90 0x40
i2ctransfer -y -f $I2C_SWITCH w3@$deser_addr 0x04 0x91 0x01
i2ctransfer -y -f $I2C_SWITCH w3@$deser_addr 0x04 0x92 0x41
# PIPE X YUV422 8bit VC0
i2ctransfer -y -f $I2C_SWITCH w3@$deser_addr 0x04 0x0b 0x07
i2ctransfer -y -f $I2C_SWITCH w3@$deser_addr 0x04 0x2d 0x15
i2ctransfer -y -f $I2C_SWITCH w3@$deser_addr 0x04 0x0d 0x1e
i2ctransfer -y -f $I2C_SWITCH w3@$deser_addr 0x04 0x0e 0x1e
i2ctransfer -y -f $I2C_SWITCH w3@$deser_addr 0x04 0x0f 0x00
i2ctransfer -y -f $I2C_SWITCH w3@$deser_addr 0x04 0x10 0x00
i2ctransfer -y -f $I2C_SWITCH w3@$deser_addr 0x04 0x11 0x01
i2ctransfer -y -f $I2C_SWITCH w3@$deser_addr 0x04 0x12 0x01

i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr1 0x00 0x01 0x04
i2ctransfer -y -f $I2C_SWITCH w3@$ser_addr2 0x00 0x01 0x04
i2ctransfer -y -f $I2C_SWITCH w3@$deser_addr 0x00 0x01 0x01

i2ctransfer -y -f $I2C_SWITCH w3@$deser_addr 0x00 0x10 0x33
第一步:初始化 GMSL 摄像头芯片
硬件位号壳体丝印I2C 地址摄像头类型初始化命令
U30001, 2i2c-10两白./max9296_config_x2_new.sh -s 10 -a 48
U30001, 2i2c-10两黑./max9296_config.sh -s 10 -a 48
U31005, 6i2c-11两白./max9296_config_x2_new.sh -s 11 -a 68
U31005, 6i2c-11两黑./max9296_config.sh -s 11 -a 68
U32003, 4i2c-12两白./max9296_config_x2_new.sh -s 12 -a 6c
U32003, 4i2c-12两黑./max9296_config.sh -s 12 -a 6c
第二步:初始化分辨率
  • 300W (1920x1536)
  • 200W (1920x1080)

需执行以下 media-ctl 命令:

Media 设备I2C 地址硬件丝印设置命令 (1920x1536)
/dev/media1i2c-10U3000media-ctl -d /dev/media1 --set-v4l2 '"m00_b_max9296 10-0048":0[fmt:UYVY8_2X8/1920x1536 field:none]'
/dev/media2i2c-11U3100media-ctl -d /dev/media2 --set-v4l2 '"m00_b_max9296 11-0068":0[fmt:UYVY8_2X8/1920x1536 field:none]'
/dev/media0i2c-12U3200media-ctl -d /dev/media0 --set-v4l2 '"m00_b_max9296 12-006c":0[fmt:UYVY8_2X8/1920x1536 field:none]'

需执行以下 media-ctl 命令:

Media 设备I2C 地址硬件丝印设置命令 (1920x1080)
/dev/media1i2c-10U3000media-ctl -d /dev/media1 --set-v4l2 '"m00_b_max9296 10-0048":0[fmt:UYVY8_2X8/1920x1080 field:none]'
/dev/media2i2c-11U3100media-ctl -d /dev/media2 --set-v4l2 '"m00_b_max9296 11-0068":0[fmt:UYVY8_2X8/1920x1080 field:none]'
/dev/media0i2c-12U3200media-ctl -d /dev/media0 --set-v4l2 '"m00_b_max9296 12-006c":0[fmt:UYVY8_2X8/1920x1080 field:none]'
第三步:GMSL 出图指令
  • 300W (1920x1536)
  • 200W (1920x1080)
壳体丝印设备节点出图指令 (1920x1536)
丝印1 (J3000)/dev/video11gst-launch-1.0 -v v4l2src device=/dev/video11 ! video/x-raw, format=NV12, width=1920, height=1536, framerate=30/1 ! fpsdisplaysink
丝印2 (J3001)/dev/video12gst-launch-1.0 -v v4l2src device=/dev/video12 ! video/x-raw, format=NV12, width=1920, height=1536, framerate=30/1 ! fpsdisplaysink
丝印3 (J3200)/dev/video0gst-launch-1.0 -v v4l2src device=/dev/video0 ! video/x-raw, format=NV12, width=1920, height=1536, framerate=30/1 ! fpsdisplaysink
丝印4 (J3201)/dev/video1gst-launch-1.0 -v v4l2src device=/dev/video1 ! video/x-raw, format=NV12, width=1920, height=1536, framerate=30/1 ! fpsdisplaysink
丝印5 (J3101)/dev/video22gst-launch-1.0 -v v4l2src device=/dev/video22 ! video/x-raw, format=NV12, width=1920, height=1536, framerate=30/1 ! fpsdisplaysink
丝印6 (J3100)/dev/video23gst-launch-1.0 -v v4l2src device=/dev/video23 ! video/x-raw, format=NV12, width=1920, height=1536, framerate=30/1 ! fpsdisplaysink
壳体丝印设备节点出图指令 (1920x1080)
丝印1 (J3000)/dev/video11gst-launch-1.0 -v v4l2src device=/dev/video11 ! video/x-raw, format=NV12, width=1920, height=1080, framerate=30/1 ! fpsdisplaysink
丝印2 (J3001)/dev/video12gst-launch-1.0 -v v4l2src device=/dev/video12 ! video/x-raw, format=NV12, width=1920, height=1080, framerate=30/1 ! fpsdisplaysink
丝印3 (J3200)/dev/video0gst-launch-1.0 -v v4l2src device=/dev/video0 ! video/x-raw, format=NV12, width=1920, height=1080, framerate=30/1 ! fpsdisplaysink
丝印4 (J3201)/dev/video1gst-launch-1.0 -v v4l2src device=/dev/video1 ! video/x-raw, format=NV12, width=1920, height=1080, framerate=30/1 ! fpsdisplaysink
丝印5 (J3101)/dev/video22gst-launch-1.0 -v v4l2src device=/dev/video22 ! video/x-raw, format=NV12, width=1920, height=1080, framerate=30/1 ! fpsdisplaysink
丝印6 (J3100)/dev/video23gst-launch-1.0 -v v4l2src device=/dev/video23 ! video/x-raw, format=NV12, width=1920, height=1080, framerate=30/1 ! fpsdisplaysink

RTC时钟

LPS3576使用HYM8563作为RTC时钟。

如何修改RTC时钟为'2025-11-11 12:00:00'

  • Cmd
  • C
#关闭网络时间协议(NTP)的服务,使得RTC时钟不受网络时间的影响
timedatectl set-ntp false
#设置RTC时钟的时间为2025年11月11日12时00分00秒
timedatectl set-time '2025-11-11 12:00:00'
#将RTC时钟的时间同步到系统时钟,使得系统时钟和RTC时钟保持一致,可加在/etc/init.d/rockchip.sh中
hwclock --hctosys

create time_setter.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>

void exec_command(const char *cmd) {
int ret = system(cmd);
if (ret != 0) {
fprintf(stderr, "Command failed: %s\n", cmd);
exit(1);
}
}

// Set system time
void set_system_time(const char *time_str) {
char cmd[128];
snprintf(cmd, sizeof(cmd), "timedatectl set-time '%s'", time_str);
exec_command(cmd);
}

// Disable NTP
void disable_ntp() {
exec_command("timedatectl set-ntp false");
}

// Synchronize hardware clock to system clock
void sync_hwclock_to_system() {
exec_command("hwclock --hctosys");
}

// Print help information
void print_usage() {
printf("Usage: time_setter -t <time>\n");
printf(" -t <time> Set system time (format: 'YYYY-MM-DD HH:MM:SS')\n");
printf(" -h Show help\n");
}

int main(int argc, char *argv[]) {
if (argc != 3) {
print_usage();
return 1;
}

const char *time_str = NULL;

int opt;
while ((opt = getopt(argc, argv, "t:h")) != -1) {
switch (opt) {
case 't':
time_str = optarg;
break;
case 'h':
default:
print_usage();
return 0;
}
}

if (time_str == NULL) {
fprintf(stderr, "Error: Time argument is required\n");
print_usage();
return 1;
}

// 1. Disable NTP
disable_ntp();

// 2. Set system time
set_system_time(time_str);

// 3. Synchronize hardware clock to system clock
sync_hwclock_to_system();

printf("Time has been set to: %s\n", time_str);
return 0;
}
gcc -o time_setter time_setter.c
./time_setter -t "2025-11-11 12:00:00"

常见问题

Q: GMSL 摄像头是否支持热插拔?

A: 目前 GMSL 摄像头不支持热插拔,请在开机前连接好摄像头或在连接后重启设备。

Q: GMSL摄像头没有画面?

A:

  • 是否执行初始化脚本
  • I2C 地址是否正确
  • GMSL摄像头是否成对连接
  • 查看 dmesg 是否报错

版本识别方法

ls /dev/video*
  • 存在 video0/1 → GMSL版本
  • 全部为高编号 → AHD版本