无法同时使用UART和MIPI相机

RDK-S100 无法在同一个系统环境中使用UART和MIPI相机。

其中MIPI相机根据 RDK S100 MIPI扩展板 无法同时打开两个相机 可以使用multi_pipe_vin_isp_ynr_pym_gdc_vpu打开
而串口问题根据 串口开发问题 中使用Deb包临时使用UART,但安装deb包后mipi相机无法打开,表现为:

sunrise@ubuntu:/app/multimedia_samples/sample_pipeline/multi_pipe_vin_isp_ynr_pym_gdc_vpu$ ./multi_pipe_vin_isp_ynr_pym_gdc_vpu -c “sensor=0” -c “sensor=1 link=0”
Using index:0 sensor_name:imx219-30fps config_file:linear_1920x1080_raw10_30fps_1lane.c
sensor_type:0
mipi mclk is not configed.
Searching camera sensor on device: /proc/device-tree/soc/vcon@0 i2c bus: 1 mipi rx phy: 0
mipi rx used phy: 00000000
INFO: Found sensor_name:imx219-30fps on mipi rx csi 0, i2c addr 0x10, config_file:linear_1920x1080_raw10_30fps_1lane.c
MIPI host: 0x1
Host 0: Used
Using index:1 sensor_name:sc1336_gmsl-30fps config_file:linear_1280x720_raw10_30fps_2lane.c
sensor_type:1
MIPI host: 0x1
Host 0: Used
Pipeline index 0:
Sensor index: 0
Sensor name: imx219-30fps
Active mipi host: 0
PYM Channel: 0
Encode type: h264
Pipeline index 1:
Sensor index: 0
Sensor name: sc1336_gmsl-30fps
Active mipi host: 4
PYM Channel: 0
Encode type: h264
Verbose: 0

Pipeline Connect Param:
[0] use [isp + ynr].
isp [hw:1] [slot_id:4] [mode:1]
ynr [hw:1] [slot_id:4] [mode:1]
pym [hw:1] [slot_id:4] [mode:1]
[1] use [isp + ynr].
isp [hw:1] [slot_id:5] [mode:1]
ynr [hw:1] [slot_id:5] [mode:1]
pym [hw:1] [slot_id:5] [mode:1]
create_vin_node(583) failed, ret -10

该问题在kernel 4.0.4 和 4.0.5 中均存在,且4.0.5更严重,安装deb包后无法找到eMMC正常进入系统

2 个赞

问题分析与解决方案

根据您描述的问题和错误日志,这是一个典型的资源冲突问题。安装 UART 的 deb 包后,MIPI 相机初始化失败(create_vin_node(583) failed, ret -10),说明 deb 包修改了设备树或内核配置,导致 MIPI CSI 控制器资源被占用或配置冲突。

核心问题

  1. deb 包修改了设备树:临时 UART 方案通过修改设备树启用串口,但可能:

    • 复用了 MIPI CSI 的引脚资源
    • 修改了时钟配置(mipi mclk)
    • 占用了 ISP/VI 的硬件 slot
  2. 错误码 -10 含义:在 Horizon 多媒体框架中,-10 通常表示硬件资源不可用初始化失败

  3. 4.0.5 更严重:新版本内核可能对资源管理更严格,导致 eMMC 都无法正常挂载


解决方案

方案一:使用官方推荐的 UART 方案(推荐)

根据社区讨论,官方建议通过签署 NDA 获取完整 SDK来修改设备树,而不是使用临时 deb 包。

步骤:

  1. 申请 SDK 源码

  2. 正确修改设备树

    • 找到 UART 对应的节点(通常是 UART2 或 UART5)
    • 确保不占用 MIPI CSI 的引脚和时钟资源
    • 重新编译内核镜像
  3. 验证资源分配

    # 查看设备树中 MIPI 和 UART 的引脚配置
    cat /proc/device-tree/soc/vcon@0
    cat /proc/device-tree/soc/uart@*
    
    # 检查时钟配置
    cat /sys/kernel/debug/clk/clk_summary | grep -E "mipi|uart"
    

方案二:使用 UART5(MCU 透传方案)

根据文档,UART5 是通过 MCU 透传到 ACore 的,可能不与 MIPI 冲突。

步骤:

  1. 检查 UART5 是否可用

    ls -l /dev/ttyS*
    # 查看是否有 ttyS5
    
  2. 测试 UART5

    # 设置波特率
    stty -F /dev/ttyS5 921600
    
    # 使用 screen 测试
    screen /dev/ttyS5 921600
    
  3. 如果不可用,需要 MCU 固件支持

    • 联系官方获取支持 UART5 透传的 MCU 固件
    • 这种方式不需要修改 ACore 设备树,避免冲突

方案三:回退系统 + 分阶段调试

步骤:

  1. 刷回 4.0.4 原始镜像(确保 MIPI 相机正常工作)

    # 使用官方提供的镜像刷写工具
    ./flash_tool.sh -i rdk_s100_4.0.4.img
    
  2. 验证 MIPI 相机

    cd /app/multimedia_samples/sample_pipeline/multi_pipe_vin_isp_ynr_pym_gdc_vpu
    ./multi_pipe_vin_isp_ynr_pym_gdc_vpu -c "sensor=0" -c "sensor=1 link=0"
    # 确认能正常打开
    
  3. 尝试其他 UART 配置方式

    • 使用 40PIN 中默认就是 UART 的引脚(如 UART0/UART1)
    • 避免使用需要复用配置的 UART2
  4. 如果必须用 UART2

    • 联系官方 FAE 获取经过测试的 deb 包
    • 明确告知您的内核版本和相机配置

方案四:硬件层面解决

如果软件层面无法解决,考虑:

  1. 使用 USB 转 UART 模块

    • 通过 USB 接口扩展串口,避免内部资源冲突
    • 成本低,兼容性好
  2. 使用 GPIO 模拟 UART

    • 在应用层使用 bit-banging 方式
    • 适合低速通信场景

关键排查命令

# 1. 查看当前设备树配置
cat /proc/device-tree/soc/vcon@0
cat /proc/device-tree/soc/vcon@1

# 2. 查看 UART 设备状态
dmesg | grep -i uart
ls -l /dev/ttyS*

# 3. 查看 MIPI CSI 状态
dmesg | grep -i mipi
dmesg | grep -i sensor

# 4. 查看硬件资源占用
cat /sys/kernel/debug/hb_isp/resource
cat /sys/kernel/debug/hb_vin/status

# 5. 检查内核版本
uname -a

建议行动路径

  1. 短期:使用 USB 转 UART 模块临时解决开发需求
  2. 中期:申请 NDA 获取 SDK,正确修改设备树
  3. 长期:推动官方提供经过测试的 UART+MIPI 共存镜像

相关资源


建议您先尝试方案二(UART5)或方案四(USB 转 UART),避免使用未经验证的 deb 包导致系统不稳定。如需进一步协助,请提供:

  • 当前内核版本(uname -a
  • 使用的具体 UART 引脚编号
  • 相机传感器型号和连接方式

地瓜开发者您好!

您的问题已经收到,请补充一下信息。

内容要求:rdkos_info信息必须提供,其他信息根据问题类别选择提供

在附件中,提供 sudo rdkos_info 命令返回的结果,保存为 rdkos_info_xxxx.txt,以附件的形式放在帖子下。

详细描述预期结果和程序运行表现,描述与预期不符的地方

基础排查方式:升级所有软件包到最新

有时问题在新版本系统中已经解决,必须保证烧录的是最新的系统镜像,在最新的系统镜像的基础上 update upgrade

有时问题在新版本 miniboot 中已经解决,必须保证使用的是最新的 miniboot,在最新的系统镜像的基础上,使用 rdk-miniboot-update 命令将 miniboot 升级到最新。