renesas vin的解析

        图像处理模块为SOC内部集成的一个针对Camera数据信号进行图像处理的硬件模块, 在不同芯片厂商中而不同, renesas rcar-m3的对应的就是VIN。主要作用是接收将CSI 或者 parallel digital信号,并进行图像数据进行格式转换,缩放,色域转换,DMA通道管理等, 然后映射到相应的内存上, 给用户使用。

RenesasSoC R-Car M3有2ch MIPI-CSI接口,一路4Lane,一路2Lane,1.5Gbps/Lane,因此MIPI接口可以支持到6路720P视频输入,加上2路Digital输入,配合内部的8ch VIN通道,可以实现同时接8路视频输入。输入接口和内部的VIN通道可以灵活配置,R-Car BSP已经集成了media-ctl配置工具。

用户需要使用MIPI-CSI接口进行4路视频输入的同时采集,使用media-ctl对MIPI-CSI和VIN通道匹配关系进行Link配置,具体配置如下:

    media-ctl -d /dev/media0 -r
    media-ctl -d /dev/media0 -l "'rcar_csi2 feaa0000.csi2':1 -> 'VIN0 output':0 [1]"
    media-ctl -d /dev/media0 -l "'rcar_csi2 feaa0000.csi2':2 -> 'VIN1 output':0 [1]"
    media-ctl -d /dev/media0 -l "'rcar_csi2 feaa0000.csi2':3 -> 'VIN2 output':0 [1]"
    media-ctl -d /dev/media0 -l "'rcar_csi2 feaa0000.csi2':4 -> 'VIN3 output':0 [1]"

然后对各个通道进行采集测试,发现当测试完VIN0后,VIN1和VIN2通道测试无法启动,VIN3通道测试可以执行,但是采集到的视频流非预期的输入视频,而是另一MIPI-CSI通道上的输入视频流。仔细检查配置log,看到有如下打印信息:

    ………

    [ 50.607186] rcar-vin e6ef0000.video: after vin 0, vnmc 0x0, set IFMD 0x6000000
    [ 88.768268] rcar-vin e6ef0000.video: before vin 0, chsel 3, vnmc 0x0, read IFMD 0x6000000
    [ 88.776505] rcar-vin e6ef0000.video: after vin 0, vnmc 0x0, set IFMD 0x6000003
    [ 88.783872] rcar-vin e6ef0000.video: before vin 0, chsel 3, vnmc 0x0, read IFMD 0x6000003

    ………

发现IFMD寄存器的低三位被置成了0x3,但是当VIN采集完毕close掉后,再配置Link配置时,发现IFMD寄存器的低三位又被置成了0x0,导致VIN1和VIN2采集失败。而先启动其他三路VIN采集,则所有通道都能正常运行。通过在源码rvin_set_channel_routing()函数中加打印,发现在除VIN0的Link配置时会调用该函数外,其他通道的Link配置并不会调用该函数。查阅RCAR手册描述,发现VIN模块分成两组,VIN0~VIN3一组,其中VIN0是Master,因此怀疑是不是因为VIN0是Master,其通道关闭时会有其它调用,导致该寄存器被改写。

    

进一步排查,在rcar-dma.c中的rvin_stop_streaming()函数中增加打印,发现在调用pm_runtime_put_sync()函数后IFMD寄存器值被改写,经过仔细分析该函数得出以下结论:

1、在测试中出现了在pm_runtime_put(vin->dev);之后读取VNCSI_IFMD_REG寄存器的值总是为0x0,这个是kernel下电源管理,对VNCSI_IFMD_REG的真实值没有影响,只是暂时读取不到VNCSI_IFMD_REG的值,所以是0x0。

2、在videox访问结束关闭的时候会调用到驱动代码rcar-dma.c中的rvin_stop_streaming()函数,其中有模块reset代码:

reset_control_assert(vin->rstc);
reset_control_deassert(vin->rstc);

以上代码会reset对应的vinx。

3、当关闭的是video0的时候reset的是vin0,vin0是master ,管理了寄存器VNCSI_IFMD_REG,所以就被清0了,如果其他的videox 最终不会清0 VNCSI_IFMD_REG。

    

在rcar_dma.c文件的rvin_stop_streaming()函数中将reset_control_assert(vin->rstc)和reset_control_deassert(vin->rstc)函数注释掉,同时加打印,会发现IFMD寄存器值低三位仍为0x0,这是如上述第一条结论,受到了pm_runtime_put(vin->dev)函数的影响,此时测试VIN视频流采集,会发现其他通道不再受到VIN0关闭的影响。但是注释掉源有驱动流程是否会带来其他风险无法预估,因此关于该问题的解决不建议这么做。

    

根据测试情况以及原因分析,对于该问题的解决方法建议如下:

1.可以不使用video0

2.video0可以最后启动,且不关闭

3.如果不同时使用,每次开启都设置一次link。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值