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目录下的文件
在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是旋转的角度值
未完,后面持续完善

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/28710.html