打印
[i.MX]

明远智睿iMx6, IMx132 MIPI 调试,mipi csi2 can not receive sensor clk!

[复制链接]
10743|27
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wsh10010|  楼主 | 2015-11-19 11:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我采用明远智睿的IMX6q 的开发板

我在linux 3.0.35下修改了 ov5640_camera_mipi.c 的驱动用来适应我自己的摄像头 IMx132,

i2c 读写正常, 但当我配置完sensor的寄存器,并让它开始使能出图之后,IMX6却接收不到sensor的差分clk
程序提示:mipi csi2 can not receive sensor clk!
寄存器  MIPI_CSI_PHY_STATE一直是0x200!
我曾将lane通道数改成1.
我也读过了 Debug steps for customer MIPI sensor的文档
sensor的输入时钟mclk是 24Mhz, 我配置的差分输出时钟是 810Mhz.
我查看过 mxc_mipi_csi2.c中的命令
mipi_csi2_write(info, 0x00000014, CSI2_PHY_TST_CTRL1); 也是符合我配置的时钟周期范围的,如果我没理解错,这个有待核实。

经过查阅相关材料,网上说linux 3.0.35 的内核要打补丁 hdmi clk不使用的时候,mclk 24Mhz.会没有,但我按照提示打了补丁,其实打补丁之前和之后用示波器查看都能看到 mclk 24Mhz.的信号,虽然信号有些像锯齿,但仍能看出是24Mhz,(我之前在dvp并口的摄像头调试的时候,输入时钟也是这样,但可以出图)
我也尝试了 linux 3.10.17的内核, 这个版本的 hdmi clk的问题,官方已经修正了,但问题仍然没解决。

现在有些束手无策了,不知道还能尝试一些什么?

相关帖子

来自 2楼
wsh10010|  楼主 | 2015-11-19 13:59 | 只看该作者
补充,MIPI_CSI_ERR1,MIPI_CSI_ERR2 都是0

使用特权

评论回复
来自 3楼
wsh10010|  楼主 | 2015-11-28 15:17 | 只看该作者
mini1986 发表于 2015-11-23 22:06
引脚有没有复用?检查没有问题的话,直接找开发板的技术支持吧......


本帖最后由 wsh10010 于 2015-11-27 18:45 编辑


结果是我重新焊接了转接板,现在 ERR1 是 0, ERR2 在 0 和 0x100两个状态跳变. 寄存器是说 " Header error detected and corrected on Virtual Channel 0",  这会有问题吗?这是不是就是说我的CSI和IPU配置没有问题?
status寄存器在 0x300 和 0x310两个状态跳变, (IMX132 是 1 lane ).

另外,我的IMX132输出格式是 RAW8 or RAW10。使用官方的 unit_test 文件夹下的测试用例( mxc_v4l2_overlay.out &mxc_v4l2_capture.out&mxc_v4l2_still.out ), 图像不能正常显示。报错信息包括
mxc_v4l2_capture.out:
ERROR: v4l2 capture: mxc_v4l_dqueue timeout enc_counter 0
ERROR: v4l2 capture: VIDIOC_QBUF: buffer already queued
mxc_v4l2_still.out :
ERROR: v4l2 capture: mxc_v4l_read timeout counter 0
imx-ipuv3 imx-ipuv3.0: Not a CSI channel

我如何直接拿到数据,保存到一个文件?我甚至不需要任何处理和显示,我就想拿到数据看一下,在其他地方打开。

使用特权

评论回复
地板
mini1986| | 2015-11-23 22:06 | 只看该作者
引脚有没有复用?检查没有问题的话,直接找开发板的技术支持吧......

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
wsh10010 + 2 神马都是浮云
5
zhanzheng5350| | 2015-11-26 15:28 | 只看该作者
楼主你的问题解决了吗,我最近也在调试sensor 留个联系方式一起交流一下

使用特权

评论回复
6
wsh10010|  楼主 | 2015-11-27 18:42 | 只看该作者
本帖最后由 wsh10010 于 2015-11-27 18:45 编辑

结果是我重新焊接了转接板,现在 ERR1 是 0, ERR2 在 0 和 0x100两个状态跳变. 寄存器是说 " Header error detected and corrected on Virtual Channel 0",  这会有问题吗?这是不是就是说我的CSI和IPU配置没有问题?
status寄存器在 0x300 和 0x310两个状态跳变, (IMX132 是 1 lane ).

另外,我的IMX132输出格式是 RAW8 or RAW10。使用官方的 unit_test 文件夹下的测试用例( mxc_v4l2_overlay.out &mxc_v4l2_capture.out&mxc_v4l2_still.out ), 图像不能正常显示。报错信息包括
mxc_v4l2_capture.out:
ERROR: v4l2 capture: mxc_v4l_dqueue timeout enc_counter 0
ERROR: v4l2 capture: VIDIOC_QBUF: buffer already queued
mxc_v4l2_still.out :
ERROR: v4l2 capture: mxc_v4l_read timeout counter 0
imx-ipuv3 imx-ipuv3.0: Not a CSI channel

我如何直接拿到数据,保存到一个文件?我甚至不需要任何处理和显示,我就想拿到数据看一下,在其他地方打开。

使用特权

评论回复
7
zhanzheng5350| | 2015-11-27 18:46 | 只看该作者
wsh10010 发表于 2015-11-27 18:42
结果是我重新焊接了转接板,现在 ERR1 是 0, ERR2 在 0 和 0x100两个状态跳变. 寄存器是说 " Header error  ...

楼主,你的时钟问题是怎么解决的,我的sensor时钟频率也是800MHZ,但是DPHY_STATE 寄存器的值是0X230,ERR1  ERR2 都是0,感觉不对啊

使用特权

评论回复
8
wsh10010|  楼主 | 2015-11-27 18:48 | 只看该作者
zhanzheng5350 发表于 2015-11-26 15:28
楼主你的问题解决了吗,我最近也在调试sensor 留个联系方式一起交流一下

哦,对了,他们公司一句,我们没调试过mipi就把我打发了

使用特权

评论回复
9
far5810| | 2015-11-27 21:40 | 只看该作者
int mipi_csi2_reset(struct mipi_csi2_info *info, int mipi_lane_bps)
{
        int value;
       
        dev_info(&info->pdev->dev, "mipi_csi2_reset: mipi_lane_bps = %d Mbps\n", mipi_lane_bps);
        _mipi_csi2_lock(info);

        mipi_csi2_write(info, 0x0, CSI2_PHY_SHUTDOWNZ);
        mipi_csi2_write(info, 0x0, CSI2_DPHY_RSTZ);
        mipi_csi2_write(info, 0x0, CSI2_RESETN);

        mipi_csi2_write(info, 0x00000001, CSI2_PHY_TST_CTRL0);
        mipi_csi2_write(info, 0x00000000, CSI2_PHY_TST_CTRL1);
        mipi_csi2_write(info, 0x00000000, CSI2_PHY_TST_CTRL0);
        mipi_csi2_write(info, 0x00000002, CSI2_PHY_TST_CTRL0);
        mipi_csi2_write(info, 0x00010044, CSI2_PHY_TST_CTRL1);
        mipi_csi2_write(info, 0x00000000, CSI2_PHY_TST_CTRL0);
        if (mipi_lane_bps < 90)
                value = 0x00;
        else if (mipi_lane_bps < 100)
                value = 0x20;
        else if (mipi_lane_bps < 110)
                value = 0x40;
        else if (mipi_lane_bps < 125)
                value = 0x02;
        else if (mipi_lane_bps < 140)
                value = 0x22;
        else if (mipi_lane_bps < 150)
                value = 0x42;
        else if (mipi_lane_bps < 160)
                value = 0x04;
        else if (mipi_lane_bps < 180)
                value = 0x24;
        else if (mipi_lane_bps < 200)
                value = 0x44;
        else if (mipi_lane_bps < 210)
                value = 0x06;
        else if (mipi_lane_bps < 240)
                value = 0x26;
        else if (mipi_lane_bps < 250)
                value = 0x46;
        else if (mipi_lane_bps < 270)
                value = 0x08;
        else if (mipi_lane_bps < 300)
                value = 0x28;
        else if (mipi_lane_bps < 330)
                value = 0x48;
        else if (mipi_lane_bps < 360)
                value = 0x2a;
        else if (mipi_lane_bps < 400)
                value = 0x4a;
        else if (mipi_lane_bps < 450)
                value = 0x0c;
        else if (mipi_lane_bps < 500)
                value = 0x2c;
        else if (mipi_lane_bps < 550)
                value = 0x0e;
        else if (mipi_lane_bps < 600)
                value = 0x2e;
        else if (mipi_lane_bps < 650)
                value = 0x10;
        else if (mipi_lane_bps < 700)
                value = 0x30;
        else if (mipi_lane_bps < 750)
                value = 0x12;
        else if (mipi_lane_bps < 800)
                value = 0x32;
        else if (mipi_lane_bps < 850)
                value = 0x14;
        else if (mipi_lane_bps < 900)
                value = 0x34;
        else if (mipi_lane_bps < 950)
                value = 0x54;
        else
                value = 0x74;
        dev_info(&info->pdev->dev, "mipi_csi2_reset: value = 0x%x.\n", value);

        mipi_csi2_write(info, value, CSI2_PHY_TST_CTRL1);
        mipi_csi2_write(info, 0x00000002, CSI2_PHY_TST_CTRL0);
        mipi_csi2_write(info, 0x00000000, CSI2_PHY_TST_CTRL0);

        mipi_csi2_write(info, 0xffffffff, CSI2_PHY_SHUTDOWNZ);
        mipi_csi2_write(info, 0xffffffff, CSI2_DPHY_RSTZ);
        mipi_csi2_write(info, 0xffffffff, CSI2_RESETN);

        _mipi_csi2_unlock(info);

        return 0;
}


使用特权

评论回复
10
wsh10010|  楼主 | 2015-11-28 15:16 | 只看该作者

大神,你这个不是回复我的吧。。。我已经调试出了clk。。。


本帖最后由 wsh10010 于 2015-11-27 18:45 编辑


结果是我重新焊接了转接板,现在 ERR1 是 0, ERR2 在 0 和 0x100两个状态跳变. 寄存器是说 " Header error detected and corrected on Virtual Channel 0",  这会有问题吗?这是不是就是说我的CSI和IPU配置没有问题?
status寄存器在 0x300 和 0x310两个状态跳变, (IMX132 是 1 lane ).

另外,我的IMX132输出格式是 RAW8 or RAW10。使用官方的 unit_test 文件夹下的测试用例( mxc_v4l2_overlay.out &mxc_v4l2_capture.out&mxc_v4l2_still.out ), 图像不能正常显示。报错信息包括
mxc_v4l2_capture.out:
ERROR: v4l2 capture: mxc_v4l_dqueue timeout enc_counter 0
ERROR: v4l2 capture: VIDIOC_QBUF: buffer already queued
mxc_v4l2_still.out :
ERROR: v4l2 capture: mxc_v4l_read timeout counter 0
imx-ipuv3 imx-ipuv3.0: Not a CSI channel

我如何直接拿到数据,保存到一个文件?我甚至不需要任何处理和显示,我就想拿到数据看一下,在其他地方打开。

使用特权

评论回复
11
mini1986| | 2015-11-30 08:27 | 只看该作者
你用cat命令,抓一下fb试试......

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
wsh10010 + 2 神马都是浮云
12
wsh10010|  楼主 | 2015-11-30 17:38 | 只看该作者
反馈和still.out一样

ERROR: v4l2 capture: mxc_v4l_read timeout counter 0
imx-ipuv3 imx-ipuv3.0: Not a CSI channel

使用特权

评论回复
13
wsh10010|  楼主 | 2015-11-30 17:43 | 只看该作者
mini1986 发表于 2015-11-30 08:27
你用cat命令,抓一下fb试试......

反馈和still.out一样

ERROR: v4l2 capture: mxc_v4l_read timeout counter 0
imx-ipuv3 imx-ipuv3.0: Not a CSI channel

使用特权

评论回复
14
zhanzheng5350| | 2015-11-30 18:53 | 只看该作者
wsh10010 发表于 2015-11-30 17:43
反馈和still.out一样

ERROR: v4l2 capture: mxc_v4l_read timeout counter 0

你的时钟是怎么弄好的?  时钟800MHZ ,你使用值是0x14吗

使用特权

评论回复
15
mini1986| | 2015-12-1 09:23 | 只看该作者
wsh10010 发表于 2015-11-30 17:43
反馈和still.out一样

ERROR: v4l2 capture: mxc_v4l_read timeout counter 0

感觉你驱动没有调好......

使用特权

评论回复
16
wsh10010|  楼主 | 2015-12-1 10:03 | 只看该作者
zhanzheng5350 发表于 2015-11-30 18:53
你的时钟是怎么弄好的?  时钟800MHZ ,你使用值是0x14吗

是的,你示波器看一下是否出了24M的时钟,然后i2c给sensor配的是不是在800M的区间内

使用特权

评论回复
17
wsh10010|  楼主 | 2015-12-1 15:54 | 只看该作者
mini1986 发表于 2015-12-1 09:23
感觉你驱动没有调好......

修改了ipu和csi的设定,用mxc_v4l2_still.out现在拿到了,没有之前的csi的报错了,但数据不对,在mxc_v4l2_still.out的时候,提示imx-ipuv3 imx-ipuv3.0: IPU warning IPU_INT_STAT_10=0x00000001,
数据全是一大段0x41和一大段0x42交替,
用cat /dev/video1,就打印出来一大段A和一大段B交替。。。没其他报错了,很奇怪。

mxc_v4l2_capture.out仍然是:
ERROR: v4l2 capture: mxc_v4l_dqueue timeout enc_counter 0
ERROR: v4l2 capture: VIDIOC_QBUF: buffer already queued

使用特权

评论回复
18
zhanzheng5350| | 2015-12-2 14:29 | 只看该作者
mini1986 发表于 2015-12-1 09:23
感觉你驱动没有调好......

你好,mipi口要量24M 时钟吗?

使用特权

评论回复
19
zhanzheng5350| | 2015-12-2 14:30 | 只看该作者
wsh10010 发表于 2015-12-1 10:03
是的,你示波器看一下是否出了24M的时钟,然后i2c给sensor配的是不是在800M的区间内 ...

哦,不好意思 ,我们的时钟是晶振给的

使用特权

评论回复
20
zhanzheng5350| | 2015-12-2 14:38 | 只看该作者
wsh10010 发表于 2015-12-1 10:03
是的,你示波器看一下是否出了24M的时钟,然后i2c给sensor配的是不是在800M的区间内 ...

这么说,你的值设为 0x14 没问题吗,dphy_state 寄存器是多少? 我现在是0x230,感觉不正常啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

17

帖子

1

粉丝