porting hm5065 in imx8mm

cancel
Showing results for 
Search instead for 
Did you mean: 

porting hm5065 in imx8mm

936 Views
xcyhere
Contributor I

你好:

      我现在需要在imx8mm平台,移植hm5065驱动到Android 9.0系统。目前已经检测到hm5065输出mipi信号,但是在向Android 9.0系统HAL移植过程中,发现在vendor/nxp-opensource/imx/libcamera3/Camera.cpp中,pastedImage_1.png

传递的name为mx6s-csi,i.MX6S_CSI,但是我在kernel中关于没有找到指定name的位置,在

device/fsl/imx8m/evk_8mm/init.rc中设置的属性名称也没用:

pastedImage_2.png

请问应该怎么去匹配kernel驱动和Android应用中相机属性名称呢?

0 Kudos
14 Replies

593 Views
weidong_sun
NXP TechSupport
NXP TechSupport

Hi xcy,

See below, please!

As for porting camera sensor to android, you should follow these steps:

1. Devie tree

Below source code is for ov5640 mipi in device tree:
&mipi_csi_1 {
    #address-cells = <1>;
    #size-cells = <0>;
    status = "okay";
    port {
        mipi1_sensor_ep: endpoint1 {
            remote-endpoint = <&ov5640_mipi1_ep>;
            data-lanes = <2>;
            csis-hs-settle = <13>;
            csis-clk-settle = <2>;
            csis-wclk;
        };

        csi1_mipi_ep: endpoint2 {
            remote-endpoint = <&csi1_ep>;
        };
    };
};

&i2c3 {
    clock-frequency = <100000>;
    pinctrl-names = "default";
    pinctrl-0 = <&pinctrl_i2c3>;
    status = "okay";
......
    ov5640_mipi: ov5640_mipi@3c {
        compatible = "ovti,ov5640_mipi";
        reg = <0x3c>;
        status = "okay";
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_csi_pwn>, <&pinctrl_csi_rst>;
        clocks = <&clk IMX8MM_CLK_CLKO1_DIV>;
        clock-names = "csi_mclk";
        assigned-clocks = <&clk IMX8MM_CLK_CLKO1_SRC>,
                  <&clk IMX8MM_CLK_CLKO1_DIV>;
        assigned-clock-parents = <&clk IMX8MM_CLK_24M>;
        assigned-clock-rates = <0>, <24000000>;
        csi_id = <0>;
        pwn-gpios = <&gpio1 7 GPIO_ACTIVE_HIGH>;
        mclk = <24000000>;
        mclk_source = <0>;
        port {
            ov5640_mipi1_ep: endpoint {
                remote-endpoint = <&mipi1_sensor_ep>;
            };
        };
    };
......
}

you should change above source code to be your camera's.

2. Linux Kernel.
you should add your camera driver to path "~/android_build/vendor/nxp-opensource/kernel_imx/drivers/media/platform/mxc/capture"
(On i.MX8MM EVK board, ov5640 mipi is used, whose driver is ov5640_mipi_v2.c, and camera driver name is "ov5640_mipi")

If you have your camera's driver from provider or wrritten by yourself, you should check if settings in driver are in accordance with configurations in device tree.

3. Camera HAL in android
Our android BSP's source code for camera is ~/android_build/vendor/nxp-opensource/imx/libcamera3, Camera HAL code uses a modular design, it is very convenient to add a new camera.
So you can refer to the implementation of ov5640 Mipi to add your own camera.

for your question:
1. Sensor's name
./CameraUtils.h:62:#define OV5640MIPI_SENSOR_NAME "ov5640_mipi"
./ov5640_mipi_v2.c:433:    {"ov5640_mipi", 0},

So Sensor name in HAL should be the same as that of in camera driver.

2. Capture driver name

On i.MX8MM, capture driver is ~/android_build/vendor/nxp-opensource/kernel_imx/drivers/media/platform/mxc/capture/mx6s_capture.c, so defined in init.rc:
setprop back_camera_name mx6s-csi

so you don't need to modify it, even if you use other cameras, here name mx6s-csi shouldn't be modified.

Have a nice day!

BR,

Weidong

0 Kudos

593 Views
xcyhere
Contributor I

你好:

      我现在已经在设备上将ov5640摄像头在Android9.0系统上完整的跑起来了,我按照你说的,参照ov5640设想头驱动,修改hm5065摄像头驱动:

   (1)kernel层驱动已经移植结束,没有报错,并且使用示波器能够检测到MIPI信号了

   (2)Android HAL层新加了HM5065摄像头(参考ov5640 ),Android系统起来之后,运行相机程序,没有画面

   (3)打印Android 的log,打印:

            37:43.131 3125 4682 E Camera3-Stream: getBuffer: wait for output buffer return timed out after 3000ms (max_buffers 2)
            08-21 06:37:43.131 3125 4682 E Camera3-Device: RequestThread: Can't get output buffer, skipping request: Connection timed out (-110)

      我现在不知道应该从哪个方面入手去解决这个问题呢?

0 Kudos

593 Views
weidong_sun
NXP TechSupport
NXP TechSupport

Hi xcy,

1. 你要保证HM5065 driver能够正确加载上。

所以,可以在这个驱动的代码中加入跟踪代码,比如proble中。

2. 要看/dev/video0(如果只有一个camera,就是video0)是否正确生成。

3. Camera HAL中是否正确open /dev/video0这个设备。

4. 在HAL中加上你自己的跟踪代码,然后查看log。

从你的log情况来看,应该MIPI CSI-2没有收到数据流,有了MIPI CLOCK是第一步,你还要查看数据是否进来。

camera的数据流是这样的:

Camera(hm5065_mipi.c driver) --->mx6s_capture.c--->camera HAL----->Android application.

我做过一个OV5645的移植,只是在android4.2.2上做的,尽管版本有点旧了,但是思路上有参考价值。

https://community.nxp.com/docs/DOC-172999 

可以这样来debug试试:

camera HAL层,camera driver加入调试代码后,在HAL中选定一个分辨率比如720P的(必须是driver支持的),或者其他的,跑一下相机程序,你观察一下log,运行到了driver的什么位置,如果还是没有图像显示,你先检查camera chip的寄存器针对当前分辨率是否正确。

【注】I.MX8MM内部没有ISP模块,mx6s_capture.c能够接受RAW data数据流,但是不做处理。所以,你要看看hm5065的datasheet,是否支持YUV。如果只支持RAW data,那么是不能显示的。除非你软件上做RAW data to YUV的转换。

Weidong

0 Kudos

593 Views
xcyhere
Contributor I

你好:

         现在hm5065驱动已经能够在Linux 4.14.98内核上正常捕捉画面:使用mx6s_v4l2_capture.out工具保存的yuv视频在PC上正常播放。然后我将内核代码移植到Android 9.0系统,然后参照ov5640的HAL层代码,加入了hm5065的HAL层代码,现在出现新的问题:相机应用预览界面是纯绿屏界面,排出的照片花屏(绿的斑点特别多),不知道这个问题应该如何解决呢?

0 Kudos

593 Views
weidong_sun
NXP TechSupport
NXP TechSupport

这个问题,可能是HAL层参数配置不对。既然linux上已经OK,那么底层不要再动了。重点关注HAL层。

分享一下网上同行的经验给你:

Camera拍摄时,预览会变成绿屏 - qq_22945185的博客 - CSDN博客 

伟东

0 Kudos

593 Views
xcyhere
Contributor I

  是的,绿屏问题原因找到了,是因为相机下发的分辨率是1024*768但是Hal层给固化成了640*480。

  现在相机能够正常预览,但是屏幕上人影全是绿色,这个应该是相机图像数据解析格式的问题。但是我检查了hm5065相机寄存器,hm5065_mipi_v2.c驱动,Android HAL层,指定的格式都是一致的。请问我的思路还有哪些遗漏的吗?

  我在Linux系统用测试工具保存的yuv视频格式(uYVY)和hm5065_mipi_v2.c驱动中指定的(YUYV)就不一样。

0 Kudos

593 Views
weidong_sun
NXP TechSupport
NXP TechSupport

Hi xcy,

   你HAL层hm5065Mipi.cpp里,是不是没有改动原来的ov5640Mipi.cpp的hard code部分代码? 使用不同的sensor,这里是不同的,你参考ov5640Csi8MQ.cpp,使用注释“only support yuv422”,这部分代码,再试试。

   应该是HAL使用的格式有错误造成的。

weidong

0 Kudos

593 Views
xcyhere
Contributor I

你好:

         谢谢,问题找到了,kernel只支持YUYV格式,但是hm5065硬件寄存器配置的格式是UYUV,所以最后软件层全部按照YUYV格式处理的。但现在问题是我想在kernel里面加入对UYVY的支持,但是im8mm手册里mipi-csi支持的YUV只有一种:pastedImage_1.png

      能提供下思路吗?

0 Kudos

593 Views
weidong_sun
NXP TechSupport
NXP TechSupport

你linux下面,预览是完全好的,那么说明你kernel里的配置是没有问题的。那么说明你提到I.MX8MM的是没关系的。

你还是在HAL层找找问题吧。

伟东

0 Kudos

593 Views
xcyhere
Contributor I

发现,kernel执行到mx6s_vidioc_g_chip_ident接口之后,去调用v4l2_subdev_call(sd, core, g_chip_ident, chip);时候,由于sd->ops->core->g_chip_ident函数地址为NULL异常退出。这个问题是因为什么原因呢?

0 Kudos

593 Views
weidong_sun
NXP TechSupport
NXP TechSupport

Hi xcy,

   您的问题实际上已经超出我们的support范围,这个不是来自BSP的问题,是v4l2 debug,在内核中您没有选上。

pastedImage_1.png

你在网上百度一下g_chip_ident,就可以查到同行的经验。

伟东

0 Kudos

593 Views
xcyhere
Contributor I

你好:

          谢谢你的回复,问题已经解决了。另外有个新问题向你请教下,Linux BSP中本来是没有支持ioctl中VIDIOC_DBG_G_CHIP_IDENT命令的支持的,但是我现在需要在Android的HAL层去获取摄像头的ident,我在驱动中自己加入了对VIDIOC_DBG_G_CHIP_IDENT命令的支持,但却没有调用到我的函数:

           pastedImage_2.png

pastedImage_3.png

      v4l2_subdev_call(sd, core, g_chip_ident, chip);对应的就是函数hm5065_g_chip_ident:

      pastedImage_6.png

      在应用层程序硬调用了查询ident命令:

pastedImage_4.png

      执行后,打印结果一直到 mx6s_vidioc_g_chip_ident函数,但是在调用pastedImage_5.png

      出现了错误:

0 Kudos

593 Views
xcyhere
Contributor I

你好:

         这两天我使用/unit_tests/V4L2/mx6s_v4l2_capture.out测试工具,使用strace跟踪调用过程,发现停留在读取队列中的帧数据阶段(ioctl:VIDIOC_DQBUF),因此问题应该出现在从MIPI-CSI2获取数据上。但是我在修改ov5640摄像头驱动参照时,发现只是修改ov5640_s_stream接口(注释对ov5640内部0x4202寄存器修改代码),运行/unit_tests/V4L2/mx6s_v4l2_capture.out测试工具,ov5640出现了和hm5065一样的问题。我现在不知道究竟是因为mipi-csi驱动问题还是摄像头驱动的问题了。

0 Kudos

593 Views
weidong_sun
NXP TechSupport
NXP TechSupport

Hi xcy ,

This is the definitions of 0x4202 register:

pastedImage_1.png

According to your descriptions, it seems that ov5640's output is controlled by the register. You can re-configure it until Frame can normally output.

Have a nice day!

BR,

Weidong

0 Kudos