接口定义
整机接口定义
LPS3576 提供了丰富的车载及工业接口能力,支持多路视频输入、多总线通信及 AI 扩展能力。
注:
- 本文档适用于 LPS3576 全系列硬件版本
- 不同版本摄像头接口存在差异,请重点关注“摄像头接口说明”

| 丝印 | 设备节点 | 备注 |
|---|---|---|
| MIC | hw:0,0 | 音频输入 |
| SPK | hw:0,0 | 音频输出 |
| HDMI | card0-HDMI-A-1 | HDMI 输出 |
| LCD | MIPI-DSI | LCD 显示接口 |
| ETH0 | eth0 | 千兆网口 |
| ETH1 | eth1 | 千兆网口 |
| WIFI | wlan0 | 双频 WIFI6 |
| 4G/5G | ppp0/wwan0 | mini-PCIe 扩展 |
| USB1 | USB3.0 HOST | |
| USB2 | USB3.0 HOST | |
| CAN0 | can0 | CAN FD |
| CAN1 | can1 | CAN FD |
| RS485_1 | /dev/ttyS2 | RS485 |
| RS485_2 | /dev/ttyS8 | RS485 |
| RS485_3 | /dev/ttyS4 | RS485 |
| RS232_1 | /dev/ttyS6 | RS232 |
| RS232_2 | /dev/ttyS10 | RS232 |
| RTC | /dev/rtc0 | RTC 时钟 |
音频使用(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-RS485 | 148 | /dev/ttyS2 |
| TTY8-RS485 | 149 | /dev/ttyS8 |
| TTY4-RS485 | 50 | /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_CAN | 506 |
| VCC12V_OUT_232 | 503 |
| VCC12V_OUT_13 | 13 |
| VCC12V_OUT_19 | 19 |
| VCC12V_OUT_54 | 81 |
| VCC12V_OUT_69 | 69 |
# 以控制 CAN 接口 12V 输出为例
echo 506 > /sys/class/gpio/export
echo 1 > /sys/class/gpio/gpio506/value # 打开输出
VIN 输入检测
提示
GPIO 均已导出,直接读取状态即可。
| 网络名 | 状态GPIO / 节点 |
|---|---|
| INPUT_7 | 151 |
| INPUT_51 | 20 |
| INPUT_55 | 68 |
| INPUT_68 | 91 |
| EXT_VIN5 | ADC_VIN5 |
| EXT_VIN6 | ADC_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/video3 | gst-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/video2 | gst-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/video1 | gst-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/video0 | gst-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/video14 | gst-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/video13 | gst-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/video12 | gst-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/video11 | gst-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/video25 | gst-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/video24 | gst-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/video23 | gst-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/video22 | gst-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/video47 | gst-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/video46 | gst-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/video45 | gst-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/video44 | gst-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/video36 | gst-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/video35 | gst-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/video34 | gst-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/video33 | gst-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 摄像头测试流程
测试流程说明:
- 初始化芯片:根据摄像头颜色(黑/白)执行对应的初始化脚本。每个芯片对应两个摄像头,必须同色。
- 设置分辨率(仅 200W):若需 1080P 模式,需执行
media-ctl设置。 - 执行出图指令:使用
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 地址 | 摄像头类型 | 初始化命令 |
|---|---|---|---|---|
| U3000 | 1, 2 | i2c-10 | 两白 | ./max9296_config_x2_new.sh -s 10 -a 48 |
| U3000 | 1, 2 | i2c-10 | 两黑 | ./max9296_config.sh -s 10 -a 48 |
| U3100 | 5, 6 | i2c-11 | 两白 | ./max9296_config_x2_new.sh -s 11 -a 68 |
| U3100 | 5, 6 | i2c-11 | 两黑 | ./max9296_config.sh -s 11 -a 68 |
| U3200 | 3, 4 | i2c-12 | 两白 | ./max9296_config_x2_new.sh -s 12 -a 6c |
| U3200 | 3, 4 | i2c-12 | 两黑 | ./max9296_config.sh -s 12 -a 6c |
第二步:初始化分辨率
- 300W (1920x1536)
- 200W (1920x1080)
需执行以下 media-ctl 命令:
| Media 设备 | I2C 地址 | 硬件丝印 | 设置命令 (1920x1536) |
|---|---|---|---|
/dev/media1 | i2c-10 | U3000 | media-ctl -d /dev/media1 --set-v4l2 '"m00_b_max9296 10-0048":0[fmt:UYVY8_2X8/1920x1536 field:none]' |
/dev/media2 | i2c-11 | U3100 | media-ctl -d /dev/media2 --set-v4l2 '"m00_b_max9296 11-0068":0[fmt:UYVY8_2X8/1920x1536 field:none]' |
/dev/media0 | i2c-12 | U3200 | media-ctl -d /dev/media0 --set-v4l2 '"m00_b_max9296 12-006c":0[fmt:UYVY8_2X8/1920x1536 field:none]' |
需执行以下 media-ctl 命令:
| Media 设备 | I2C 地址 | 硬件丝印 | 设置命令 (1920x1080) |
|---|---|---|---|
/dev/media1 | i2c-10 | U3000 | media-ctl -d /dev/media1 --set-v4l2 '"m00_b_max9296 10-0048":0[fmt:UYVY8_2X8/1920x1080 field:none]' |
/dev/media2 | i2c-11 | U3100 | media-ctl -d /dev/media2 --set-v4l2 '"m00_b_max9296 11-0068":0[fmt:UYVY8_2X8/1920x1080 field:none]' |
/dev/media0 | i2c-12 | U3200 | media-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/video11 | gst-launch-1.0 -v v4l2src device=/dev/video11 ! video/x-raw, format=NV12, width=1920, height=1536, framerate=30/1 ! fpsdisplaysink |
| 丝印2 (J3001) | /dev/video12 | gst-launch-1.0 -v v4l2src device=/dev/video12 ! video/x-raw, format=NV12, width=1920, height=1536, framerate=30/1 ! fpsdisplaysink |
| 丝印3 (J3200) | /dev/video0 | gst-launch-1.0 -v v4l2src device=/dev/video0 ! video/x-raw, format=NV12, width=1920, height=1536, framerate=30/1 ! fpsdisplaysink |
| 丝印4 (J3201) | /dev/video1 | gst-launch-1.0 -v v4l2src device=/dev/video1 ! video/x-raw, format=NV12, width=1920, height=1536, framerate=30/1 ! fpsdisplaysink |
| 丝印5 (J3101) | /dev/video22 | gst-launch-1.0 -v v4l2src device=/dev/video22 ! video/x-raw, format=NV12, width=1920, height=1536, framerate=30/1 ! fpsdisplaysink |
| 丝印6 (J3100) | /dev/video23 | gst-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/video11 | gst-launch-1.0 -v v4l2src device=/dev/video11 ! video/x-raw, format=NV12, width=1920, height=1080, framerate=30/1 ! fpsdisplaysink |
| 丝印2 (J3001) | /dev/video12 | gst-launch-1.0 -v v4l2src device=/dev/video12 ! video/x-raw, format=NV12, width=1920, height=1080, framerate=30/1 ! fpsdisplaysink |
| 丝印3 (J3200) | /dev/video0 | gst-launch-1.0 -v v4l2src device=/dev/video0 ! video/x-raw, format=NV12, width=1920, height=1080, framerate=30/1 ! fpsdisplaysink |
| 丝印4 (J3201) | /dev/video1 | gst-launch-1.0 -v v4l2src device=/dev/video1 ! video/x-raw, format=NV12, width=1920, height=1080, framerate=30/1 ! fpsdisplaysink |
| 丝印5 (J3101) | /dev/video22 | gst-launch-1.0 -v v4l2src device=/dev/video22 ! video/x-raw, format=NV12, width=1920, height=1080, framerate=30/1 ! fpsdisplaysink |
| 丝印6 (J3100) | /dev/video23 | gst-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版本