概述
板子:rk3568
平台:android11
1. kernel修改
1.1设备树
在设备树文件添加如下节点:
&i2c2 {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&i2c2m1_xfer>;
ov5648: ov5648@36 {
status = "okay";
compatible = "ovti,ov5648";
reg = <0x36>;
clocks = <&cru CLK_CIF_OUT>;
clock-names = "xvclk";
/* avdd-supply = <&vcc2v8_dvp>; */
// dovdd-supply = <&vcc1v8_dvp>;
// dovdd-supply = <&vcc1v8_dvp>;
/* dvdd-supply = <&vcc1v8_dvp>; */
device_type = "v4l2-i2c-subdev";
power-domains = <&power RK3568_PD_VI>;
// pinctrl-names = "default";
pinctrl-names = "rockchip,camera_default";
pinctrl-0 = <&cif_clk>, <&ov5648_rst_gpio>, <&ov5648_pwdn_gpio>; //<&ov5648_power_gpio>,
//reset pin control by hardware,used this pin switch to mipi input
//1->2LANE(LANE 0&1) FRONT camera, 0->4LANE REAR camera
// power-gpios = <&gpio0 RK_PB0 GPIO_ACTIVE_HIGH>;
reset-gpios = <&gpio3 RK_PD4 GPIO_ACTIVE_HIGH>;
pwdn-gpios = <&gpio3 RK_PD5 GPIO_ACTIVE_HIGH>;
rockchip,camera-module-index = <0>;
rockchip,camera-module-facing = "back";
rockchip,camera-module-name = "THDS11073_Largan";
// rockchip,camera-module-lens-name = "default";
rockchip,camera-module-lens-name = "40122a1";
port {
ov5648_out: endpoint {
remote-endpoint = <&mipi_in_ucam0>;
data-lanes = <1 2>;
};
};
};
};
- 我这里的供电是硬件指定好的所以不需要自己配置,关于dovdd,avdd,dvdd说明如下:
- dovdd-supply: Digital I/O voltage supply,
- avdd-supply: Analog voltage supply,
- dvdd-supply: Digital core voltage supply,
-
power-domains = <&power RK3568_PD_VI>;这个是时钟的电源域
-
pwdn-gpios: 这个引脚的作用是复位设备寄存器
-
rockchip,camera-module-facing:指定前摄还是后摄
-
rockchip,camera-module-name,rockchip,camera-module-lens-name这两个参数决定使用哪一个IQ文件
-
remote-endpoint: mipi dphy 端的 port 名
-
data-lanes: mipi lane 数,1lane 为 <1>, 4lane 为 <1 2 3 4>
CSI设备树配置:
&csi2_dphy_hw {
status = "okay";
};
&csi2_dphy0 {
status = "okay";
ports {
#address-cells = <1>;
#size-cells = <0>;
port@0 {
reg = <0>;
#address-cells = <1>;
#size-cells = <0>;
mipi_in_ucam0: endpoint@1 {
reg = <1>;
remote-endpoint = <&ov5648_out>;
data-lanes = <1 2>;
};
};
port@1 {
reg = <1>;
#address-cells = <1>;
#size-cells = <0>;
csidphy_out: endpoint@0 {
reg = <0>;
remote-endpoint = <&isp0_in>;
};
};
};
};
isp图像控制器设备树配置:
&rkisp {
status = "okay";
};
&rkisp_mmu {
status = "okay";
};
&rkisp_vir0 {
status = "okay";
port {
#address-cells = <1>;
#size-cells = <0>;
isp0_in: endpoint@0 {
reg = <0>;
remote-endpoint = <&csidphy_out>;
};
};
};
添加编译:
CONFIG_VIDEO_OV5648=y
如果设备树配置没问题
代码相关目录:
Linux Kernel-4.19
|-- arch/arm/boot/dts #DTS配置文件
|-- drivers/phy/rockchip
|-- phy-rockchip-mipi-rx.c #mipi dphy驱动
|-- phy-rockchip-csi2-dphy-common.h
|-- phy-rockchip-csi2-dphy-hw.c
|-- phy-rockchip-csi2-dphy.c
|-- drivers/media
|-- platform/rockchip/cif #RKCIF驱动
|-- platform/rockchip/isp #RKISP驱动
|-- dev #包含 probe、异步注册、clock、pipeline、 iommu及media/v4l2 framework
|-- capture #包含 mp/sp/rawwr的配置及 vb2,帧中断处理
|-- dmarx #包含 rawrd的配置及 vb2,帧中断处理
|-- isp_params #3A相关参数设置
|-- isp_stats #3A相关统计
|-- isp_mipi_luma #mipi数据亮度统计
|-- regs #寄存器相关的读写操作
|-- rkisp #isp subdev和entity注册
|-- csi #csi subdev和mipi配置
|-- bridge #bridge subdev,isp和ispp交互桥梁
|-- platform/rockchip/ispp #rkispp驱动
|-- dev #包含 probe、异步注册、clock、pipeline、 iommu及media/v4l2 framework
|-- stream #包含 4路video输出的配置及 vb2,帧中断处理
|-- rkispp #ispp subdev和entity注册
|-- params #TNR/NR/SHP/FEC/ORB参数设置
|-- stats #ORB统计信息
|-- i2
整体的框架图:
各个节点的说明:
使用v4l2-ctl抓取camera数据帧
v4l2-ctl --verbose -d /dev/video0 --set-fmt-video=width=1920,height=1080,pixelformat='NV12' --stream-mmap=4 --set-selection=target=crop,flags=0,top=0,left=0,width=1920,height=1080 --stream-to=/data/out.yuv
把out.yuv文件拷贝出来通过ubuntu去查看:
ffplay -f rawvideo -video_size 1920x1080 -pix_fmt nv12 out.yuv
IQ文件
raw摄像头支持的iq文件路径external/camera_engine_rkaiq/iqfiles/isp21, 与以前不一样的地方是iq文件不再采用.xml的方式,而是采用.json的方式。虽有提供xml转json的工具, 但isp20的xml配置转换后也不适用isp21。
若使用raw摄像头sensor,请留意isp21目录所支持的iq文件
Android系统使用camera应用
Android系统使用camera的apk打开摄像头需要配置camera3_profiles*.xml,具体可参考Android SDK hardware/rockchip/camera/etc/camera目录下的文件
默认打开前置、后置摄像头:
packages/apps/Camera2/res/values/strings.xml里设置pref_camera_id_default为1即默认打开后摄,为0即默认打开前置
在hardware/rockchip/camera/etc/camera/camera3_profiles_rk356x.xml中
</Profiles>
<Profiles cameraId="0" name="ov5648" moduleId="m00">
....
<sensor.orientation value="90"/> 摄像头旋转的角度
只有1个摄像头所以moduleId为0 ,sensor.orientation是旋转的角度值
未完,后面持续完善
最后
以上就是迷路电灯胆为你收集整理的OV5648调试分享(mipi camera)的全部内容,希望文章能够帮你解决OV5648调试分享(mipi camera)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复