赞
踩
图像处理模块为SOC内部集成的一个针对Camera数据信号进行图像处理的硬件模块, 在不同芯片厂商中而不同, renesas rcar-m3的对应的就是VIN。主要作用是接收将CSI 或者 parallel digital信号,并进行图像数据进行格式转换,缩放,色域转换,DMA通道管理等, 然后映射到相应的内存上, 给用户使用。
Renesas的SoC 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。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。