这篇文章主要想介绍一下再RK3288平台上面调试BT656 video in的注意事项。以RN6752转接芯片,android10平台为例进行介绍。
目录
1. RK3288 VIDEO INPUT 并口
2. 驱动调试
2.1 RN6752 驱动实现
①rn6752_g_mbus_config总线相关配置
②rn6752_querystd配置制式
③rn6752_g_skip_top_lines可以设置跳过头部的几行
2.2 DTS配置
①rn6752配置
②cif节点的配置
③pinctrl配置:
3. 注册安卓camera
4. 调试手段
4.1 开启数据流
4.2 抓图像
4.3 查看是否注册camera成功
5. 总结
1. RK3288 VIDEO INPUT 并口
RK3288主控支持MIPI接口和DVP并口的图像输入,有ISP控制器和CIF控制器(RK356X以后该控制器改称为VICAP),ISP可以处理MIPI和DVP的图像,CIF只能支持DVP并口,DVP接口只能支持BT656或者BT601,不支持BT1120,feature如下:
2. 驱动调试
以Android10 kernel4.19平台,RN6752 CVBS转BT656为例介绍一下驱动调试的关键配置。
2.1 RN6752 驱动实现
RN6752驱动同样基于V4l2框架接口实现,输入数据是CVBS PAL制或者NTSC制,一般分辨率是720*576或者720*480,隔行输入,RK3288的CIF控制器支持接收P制或者N制数据,并将其奇偶场进行合并输出。驱动代码基于v4l2框架,这里仅介绍一下几个关键接口:
①rn6752_g_mbus_config总线相关配置
参考配置如下,需要设置总线类型,极性等等
static int rn6752_g_mbus_config(struct v4l2_subdev *sd,
struct v4l2_mbus_config *config)
{
config->type = V4L2_MBUS_PARALLEL;
config->flags = V4L2_MBUS_HSYNC_ACTIVE_HIGH |
V4L2_MBUS_VSYNC_ACTIVE_LOW |
V4L2_MBUS_PCLK_SAMPLE_RISING;
return 0;
}
②rn6752_querystd配置制式
该接口需要设置N制或者P制类型,CIF控制器会从这个接口获取制式,并设置到控制器。注意的是BT601不需要设置这个接口。参考如下:
static int rn6752_querystd(struct v4l2_subdev *sd, v4l2_std_id *std)
{
struct rn6752 *rn6752 = to_rn6752(sd);
struct i2c_client *client = rn6752->client;
dev_dbg(&client->dev, "%s(%d)\n", __func__, __LINE__);
if(rn6752->cvstd_index){
*std = V4L2_STD_NTSC;
dev_info(&client->dev, "V4L2_STD_NTSC\n");
}else{
*std = V4L2_STD_PAL;
dev_info(&client->dev, "V4L2_STD_PAL\n");
}
return 0;
}
③rn6752_g_skip_top_lines可以设置跳过头部的几行
该接口可以设置跳过行数,有的转接芯片传输的数据,有可能会先传几行异常的图像,直接收下会导致图像异常,这个接口可以设置跳过这些行,需要注意的是设置成偶数,不然有可能会导致奇偶场颠倒的问题。
#define RN6752_SKIP_TOP 0
static int rn6752_g_skip_top_lines(struct v4l2_subdev *sd, u32 *lines)
{
struct rn6752 *rn6752 = to_rn6752(sd);
*lines = RN6752_SKIP_TOP;
return 0;
}
其余接口与其他的camera sensor驱动基本一致,这里不再赘述。
2.2 DTS配置
dts关键配置主要有rn6752配置和iomux的引用。
①rn6752配置
rn6752注册为一个i2c设备,配置如下所示:
rn6752: rn6752@2d {
status = "okay";
compatible = "richnex,rn6752";
reg = <0x2d>;
clocks = <&cru SCLK_VIP_OUT>;
clock-names = "xvclk";
//pwdn-gpios = <&gpio2 RK_PB6 GPIO_ACTIVE_HIGH>;
rockchip,camera-module-index = <1>;
rockchip,camera-module-facing = "back";
rockchip,camera-module-name = "RN6752";
rockchip,camera-module-lens-name = "Largan";
port {
rn6752_out: endpoint {
remote-endpoint = <&dvp_in_fcam>;
bus-width = <8>;
pclk-sample = <0>;
};
};
};
hsync-active/vsync-active不要配置,否则v4l2框架异步注册时会识别为BT601,pclk-sample/bus-width可选;pinctrl需要正确引用,后面介绍一下。
②cif节点的配置
基于v4l2框架同样需要配置pipeline,这个case的pipeline就是RN6752->CIF,CIF节点配置如下:
&cif_new {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&isp_mipi &isp_dvp_d2d9 &isp_dvp_d10d11>;
port {
#address-cells = <1>;
#size-cells = <0>;
dvp_in_fcam: endpoint@0 {
// bus-type = <0>;
remote-endpoint = <&rn6752_out>;
vsync-active = <0>;
hsync-active = <1>;
pclk-sample = <1>;
// bus-width = <8>;
};
};
};
其中最关键的是pinctrl对应的io需要正确引用。
③pinctrl配置:
pinctrl-0 = <&isp_mipi &isp_dvp_d2d9 &isp_dvp_d10d11>;
这里配置的pinctrl如上,需要特别注意,pinctlr需要跟硬件原理图接法一致,需要核对清楚gpio,如果配置错任何一个,都可能导致无法接收数据。这里的配置是d2-d11,有其他的场景可能是d4-d14或者d0-d7等等。
3. 注册安卓camera
驱动完成之后同样需要注册camera,这里注意xml的配置。主要配置如下:
如果成功注册camera,就可以直接使用camera的apk打开预览。
4. 调试手段
4.1 开启数据流
v4l2-ctl --verbose -d /dev/video0 --set-fmt-video=width=720,height=576,pixelformat='NV12' --stream-mmap=4
4.2 抓图像
v4l2-ctl -d /dev/video0 --set-fmt-video=width=720,height=576,pixelformat='NV12' --stream-mmap=3 --stream-skip=4 --stream-to=/data/720x576_PAL_nv12.yuv --stream-count=5 --stream-poll
4.3 查看是否注册camera成功
dumpsys media.camera
5. 总结
希望这篇文章对RK3288 RN6752 CVBS的调试,对正在调试类似case的人有帮助。