色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

V853平臺Camera模塊開發(fā)框架詳解

汽車電子技術 ? 2022-12-05 14:30 ? 次閱讀

本章節(jié)介紹V853平臺 Camera 模塊的開發(fā)。

V853支持并口CSI、MIPI,使用VIN camera驅動框架。

Camera通路框架

在這里插入圖片描述
  • VIN支持靈活配置單/雙路輸入雙ISP多通路輸出的規(guī)格
  • 引入media框架實現(xiàn)pipeline管理
  • 將libisp移植到用戶空間解決GPL問題
  • 將統(tǒng)計buffer獨立為v4l2 subdev
  • 將的scaler(vipp)模塊獨立為v4l2 subdev
  • 將video buffer修改為mplane方式,使用戶層取圖更方便
  • 采用v4l2-event實現(xiàn)事件管理
  • 采用v4l2-controls新特性

VIN框架

框架簡介

VIN是全志基于linux 內核v4l2 框架實現(xiàn)自己Soc 的camera 驅動框架。

  • vin.c是驅動的主要功能實現(xiàn),包括注冊/注銷、參數(shù)讀取、與v4l2上層接口、與各device的下層接口、中斷處理、buffer申請切換等;
  • 使用過程中可簡單的看成是vin模塊+ device模塊 +af driver + flash控制模塊的方式;
  • modules/sensor文件夾里面是各個sensor的器件層實現(xiàn),一般包括上下電、初始化,各分辨率切換,yuv sensor包括絕大部分的v4l2定義的ioctrl命令的實現(xiàn);而raw sensor的話大部分ioctrl命令在vin層調用isp庫實現(xiàn),少數(shù)如曝光/增益調節(jié)會透過vin層到實際器件層;
  • modules/actuator文件夾內是各種vcm的驅動;
  • modules/flash文件夾內是閃光燈控制接口實現(xiàn);
  • vin-csivin-mipi為對csi接口和mipi接口的控制文件;
  • vin-isp文件夾為isp的庫操作文件;
  • vin-video文件夾內主要是video設備操作文件。
在這里插入圖片描述

源碼結構(linux4.9)

驅動路徑位于linux-4.9/drivers/media/platform/sunxi-vin

sunxi-vin:
    │  vin.c                            ;v4l2驅動實現(xiàn)主體(包含視頻接口和ISP部分)
    │  vin.h                        ;v4l2驅動頭文件
    │  top_reg.c                        ;vin對各v4l2 subdev管理接口實現(xiàn)主體
    │  top_reg.h                        ;管理接口頭文件
    │  top_reg_i.h                       ;vin模塊接口層部分結構體
    ├── modules
    │   ├── actuator            ;vcm driver
    │   │   ├── actuator.c
    │   │   ├── actuator.h
    │   │   ├── dw9714_act.c
    │   │   ├── Makefile
    │   ├── flash            ;閃光燈 driver
    │   │   ├── flash.c
    │   │   └── flash.h
    │   └── sensor                ;sensor driver
    │       ├── ar0144_mipi.c
    │       ├── camera_cfg.h        ;camera ioctl擴展命令頭文件
    │       ├── camera.h        ;camera公用結構體頭文件
    │       ├── Makefile
    │       ├── gc2053_mipi.c
    │       ├── ov2775_mipi.c
    │       ├── ov5640.c
    │       ├── sensor-compat-ioctl32.c
    │       ├── sensor_helper.c        ;sensor公用操作接口函數(shù)文件
    │       ├── sensor_helper.h
    ├── platform                ;平臺相關的配置接口
    ├── utility
    │   ├── bsp_common.c
    │   ├── bsp_common.h
    │   ├── cfg_op.c
    │   ├── cfg_op.h
    │   ├── config.c
    │   ├── config.h
    │   ├── sensor_info.c
    │   ├── sensor_info.h
    │   ├── vin_io.h
    │   ├── vin_os.c
    │   ├── vin_os.h
    │   ├── vin_supply.c
    │   └── vin_supply.h
    ├── vin-cci
    │   ├── sunxi_cci.c
    │   └── sunxi_cci.h
    ├── vin-csi
    │   ├── parser_reg.c
    │   ├── parser_reg.h
    │   ├── parser_reg_i.h
    │   ├── sunxi_csi.c
    │   └── sunxi_csi.h
    ├── vin-isp
    │   ├── sunxi_isp.c
    │   └── sunxi_isp.h
    ├── vin-mipi
    │   ├── sunxi_mipi.c
    │   └── sunxi_mipi.h
    ├── vin-stat
    │   ├── vin_h3a.c
    │   ├── vin_h3a.h
    │   ├── vin_ispstat.c
    │   └── vin_ispstat.h
    ├── vin_test
    ├── vin-video
    │   ├── vin_core.c
    │   ├── vin_core.h
    │   ├── vin_video.c
    │   └── vin_video.h
    └── vin-vipp
        ├── sunxi_scaler.c
        ├── sunxi_scaler.h
        ├── vipp_reg.c
        ├── vipp_reg.h
        └── vipp_reg_i.h

GC2063雙攝模組

V853開發(fā)板配套了GC2063雙攝像頭模組,其復用GC2053的驅動,驅動代碼路徑為:

tina/lichee/linux-4.9/drivers/media/platform/sunxi-vin/modules/sensor/gc2053_mipi.c

此處以GC2063雙攝模組為例,介紹V853 Tina系統(tǒng)下的攝像頭模塊相關配置文件。

Tina配置

Tina 中主要是修改平臺的modules.mk配置,modules.mk主要完成兩個方面:

  1. 拷貝相關的ko模塊到小機rootfs中
  2. rootfs啟動時,按順序自動加載相關的ko模塊。

modules.mk文件路徑:

tina/target/allwinner/v853-vision/modules.mk

驅動加載配置

define KernelPackage/vin-v4l2
   SUBMENU:=$(VIDEO_MENU)
   TITLE:=Video input support (staging)
   DEPENDS:=
   FILES:=$(LINUX_DIR)/drivers/media/v4l2-core/videobuf2-core.ko
   FILES+=$(LINUX_DIR)/drivers/media/v4l2-core/videobuf2-dma-contig.ko
   FILES+=$(LINUX_DIR)/drivers/media/v4l2-core/videobuf2-memops.ko
   FILES+=$(LINUX_DIR)/drivers/media/v4l2-core/videobuf2-v4l2.ko
   FILES+=$(LINUX_DIR)/drivers/media/platform/sunxi-vin/vin_io.ko
   FILES+=$(LINUX_DIR)/drivers/media/platform/sunxi-vin/modules/sensor/gc2053_mipi.ko
 #  FILES+=$(LINUX_DIR)/drivers/media/platform/sunxi-vin/modules/sensor_power/sensor_power.ko
   FILES+=$(LINUX_DIR)/drivers/media/platform/sunxi-vin/vin_v4l2.ko
   FILES+=$(LINUX_DIR)/drivers/input/sensor/da380/da380.ko
   AUTOLOAD:=$(call AutoProbe,videobuf2-core videobuf2-dma-contig videobuf2-memops videobuf2-v4l2 vin_io gc2053_mipi vin_v4l2 da380.ko)
 endef

 define KernelPackage/vin-v4l2/description
  Kernel modules for video input support
 endef

 $(eval $(call KernelPackage,vin-v4l2))

S00mpp配置

V853平臺在完成modules.mk配置后,還需要完成.ko掛載腳本S00mpp的配置,以便開機快速啟動攝像頭模塊。

S00mpp配置路徑:

target/allwinner/v853-vision/busybox-init-base-files/etc/init.d

腳本對攝像頭驅動進行了提前加載,應用需要使用的時候即可快速配置并啟動。

#!/bin/sh
#
# Load mpp modules....
#

MODULES_DIR="/lib/modules/`uname -r`"

start() {
    printf "Load mpp modulesn"
    insmod $MODULES_DIR/videobuf2-core.ko
    insmod $MODULES_DIR/videobuf2-memops.ko
    insmod $MODULES_DIR/videobuf2-dma-contig.ko
    insmod $MODULES_DIR/videobuf2-v4l2.ko
    insmod $MODULES_DIR/vin_io.ko
#   insmod $MODULES_DIR/sensor_power.ko
    insmod $MODULES_DIR/gc4663_mipi.ko
    insmod $MODULES_DIR/vin_v4l2.ko
    insmod $MODULES_DIR/sunxi_aio.ko
    insmod $MODULES_DIR/sunxi_eise.ko
#   insmod $MODULES_DIR/vipcore.ko
}

stop() {
    printf "Unload mpp modulesn"
#   rmmod $MODULES_DIR/vipcore.ko
    rmmod $MODULES_DIR/sunxi_eise.ko
    rmmod $MODULES_DIR/sunxi_aio.ko
    rmmod $MODULES_DIR/vin_v4l2.ko
    rmmod $MODULES_DIR/gc4663_mipi.ko
#   rmmod $MODULES_DIR/sensor_power.ko
    rmmod $MODULES_DIR/vin_io.ko
    rmmod $MODULES_DIR/videobuf2-v4l2.ko
    rmmod $MODULES_DIR/videobuf2-dma-contig.ko
    rmmod $MODULES_DIR/videobuf2-memops.ko
    rmmod $MODULES_DIR/videobuf2-core.ko
}

case "$1" in
    start)
    start
    ;;
    stop)
    stop
    ;;
    restart|reload)
    stop
    start
    ;;
  *)
    echo "Usage: $0 {start|stop|restart}"
    exit 1
esac

exit $?

DTS配置

DTS配置文件路徑:

tina/device/config/chips/v853/configs/vision

camera相關配置:

vind0:vind@0 {
    vind0_clk = <300000000>;
    status = "okay";

    csi2:csi@2 {
        pinctrl-names = "default","sleep";
        pinctrl-0 = <&ncsi_pins_a>;
        pinctrl-1 = <&ncsi_pins_b>;
        status = "disabled";
    };

    tdm0:tdm@0 {
        work_mode = <1>;
    };

    isp00:isp@0 {
        work_mode = <1>;
    };

    scaler00:scaler@0 {
        work_mode = <1>;
    };

    scaler10:scaler@4 {
        work_mode = <1>;
    };

    scaler20:scaler@8 {
        work_mode = <1>;
    };

    scaler30:scaler@12 {
        work_mode = <1>;
    };

    actuator0:actuator@0 {
        device_type = "actuator0";
        actuator0_name = "ad5820_act";
        actuator0_slave = <0x18>;
        actuator0_af_pwdn = <>;
        actuator0_afvdd = "afvcc-csi";
        actuator0_afvdd_vol = <2800000>;
        status = "disabled";
    };

    flash0:flash@0 {
        device_type = "flash0";
        flash0_type = <2>;
        flash0_en = <>;
        flash0_mode = <>;
        flash0_flvdd = "";
        flash0_flvdd_vol = <>;
        status = "disabled";
    };

    sensor0:sensor@0 {
        device_type = "sensor0";
        sensor0_mname = "gc2053_mipi";
        sensor0_twi_cci_id = <1>;
        sensor0_twi_addr = <0x6e>;
        sensor0_mclk_id = <0>;
        sensor0_pos = "rear";
        sensor0_isp_used = <1>;
        sensor0_fmt = <1>;
        sensor0_stby_mode = <0>;
        sensor0_vflip = <0>;
        sensor0_hflip = <0>;
        sensor0_iovdd-supply = ;
        sensor0_iovdd_vol = <1800000>;
        sensor0_avdd-supply = ;
        sensor0_avdd_vol = <2800000>;
        sensor0_dvdd-supply = ;
        sensor0_dvdd_vol = <1200000>;
        sensor0_power_en = <>;
        sensor0_reset = <&pio PA 18 1 0 1 0>;
        sensor0_pwdn = <&pio PA 19 1 0 1 0>;
        sensor0_sm_hs = <>;
        sensor0_sm_vs = <>;
        flash_handle = <&flash0>;
        act_handle = <&actuator0>;
        status  = "okay";
    };

    sensor1:sensor@1 {
        device_type = "sensor1";
        sensor1_mname = "gc2053_mipi_2";
        sensor1_twi_cci_id = <0>;
        sensor1_twi_addr = <0x7f>;
        sensor1_mclk_id = <1>;
        sensor1_pos = "front";
        sensor1_isp_used = <1>;
        sensor1_fmt = <1>;
        sensor1_stby_mode = <0>;
        sensor1_vflip = <0>;
        sensor1_hflip = <0>;
        sensor1_iovdd-supply = ;
        sensor1_iovdd_vol = <1800000>;
        sensor1_avdd-supply = ;
        sensor1_avdd_vol = <2800000>;
        sensor1_dvdd-supply = ;
        sensor1_dvdd_vol = <1200000>;
        sensor1_power_en = <>;
        sensor1_reset = <&pio PA 20 1 0 1 0>;
        sensor1_pwdn = <&pio PA 21 1 0 1 0>;
        sensor1_sm_hs = <>;
        sensor1_sm_vs = <>;
        flash_handle = <>;
        act_handle = <>;
        status  = "okay";
    };

    vinc00:vinc@0 {
        vinc0_csi_sel = <0>;
        vinc0_mipi_sel = <0>;
        vinc0_isp_sel = <0>;
        vinc0_isp_tx_ch = <0>;
        vinc0_tdm_rx_sel = <0>;
        vinc0_rear_sensor_sel = <0>;
        vinc0_front_sensor_sel = <0>;
        vinc0_sensor_list = <0>;
        work_mode = <0x1>;
        status = "okay";
    };

    vinc01:vinc@1 {
        vinc1_csi_sel = <1>;
        vinc1_mipi_sel = <1>;
        vinc1_isp_sel = <1>;
        vinc1_isp_tx_ch = <0>;
        vinc1_tdm_rx_sel = <1>;
        vinc1_rear_sensor_sel = <1>;
        vinc1_front_sensor_sel = <1>;
        vinc1_sensor_list = <0>;
        status = "okay";
    };

    vinc02:vinc@2 {
        vinc2_csi_sel = <2>;
        vinc2_mipi_sel = <0xff>;
        vinc2_isp_sel = <2>;
        vinc2_isp_tx_ch = <2>;
        vinc2_tdm_rx_sel = <2>;
        vinc2_rear_sensor_sel = <0>;
        vinc2_front_sensor_sel = <0>;
        vinc2_sensor_list = <0>;
        status = "disabled";
    };

    vinc03:vinc@3 {
        vinc3_csi_sel = <0>;
        vinc3_mipi_sel = <0xff>;
        vinc3_isp_sel = <0>;
        vinc3_isp_tx_ch = <0>;
        vinc3_tdm_rx_sel = <0>;
        vinc3_rear_sensor_sel = <1>;
        vinc3_front_sensor_sel = <1>;
        vinc3_sensor_list = <0>;
        status = "disabled";
    };

    vinc10:vinc@4 {
        vinc4_csi_sel = <0>;
        vinc4_mipi_sel = <0>;
        vinc4_isp_sel = <0>;
        vinc4_isp_tx_ch = <0>;
        vinc4_tdm_rx_sel = <0>;
        vinc4_rear_sensor_sel = <0>;
        vinc4_front_sensor_sel = <0>;
        vinc4_sensor_list = <0>;
        work_mode = <0x1>;
        status = "okay";
    };

    vinc11:vinc@5 {
        vinc5_csi_sel = <1>;
        vinc5_mipi_sel = <1>;
        vinc5_isp_sel = <1>;
        vinc5_isp_tx_ch = <0>;
        vinc5_tdm_rx_sel = <1>;
        vinc5_rear_sensor_sel = <1>;
        vinc5_front_sensor_sel = <1>;
        vinc5_sensor_list = <0>;
        status = "okay";
    };

    vinc12:vinc@6 {
        vinc6_csi_sel = <2>;
        vinc6_mipi_sel = <0xff>;
        vinc6_isp_sel = <0>;
        vinc6_isp_tx_ch = <0>;
        vinc6_tdm_rx_sel = <0>;
        vinc6_rear_sensor_sel = <0>;
        vinc6_front_sensor_sel = <0>;
        vinc6_sensor_list = <0>;
        status = "disabled";
    };

    vinc13:vinc@7 {
        vinc7_csi_sel = <2>;
        vinc7_mipi_sel = <0xff>;
        vinc7_isp_sel = <0>;
        vinc7_isp_tx_ch = <0>;
        vinc7_tdm_rx_sel = <0>;
        vinc7_rear_sensor_sel = <0>;
        vinc7_front_sensor_sel = <0>;
        vinc7_sensor_list = <0>;
        status = "disabled";
    };

    vinc20:vinc@8 {
        vinc8_csi_sel = <0>;
        vinc8_mipi_sel = <0x0>;
        vinc8_isp_sel = <0>;
        vinc8_isp_tx_ch = <0>;
        vinc8_tdm_rx_sel = <0>;
        vinc8_rear_sensor_sel = <0>;
        vinc8_front_sensor_sel = <0>;
        vinc8_sensor_list = <0>;
        work_mode = <0x1>;
        status = "okay";
    };

    vinc21:vinc@9 {
        vinc9_csi_sel = <2>;
        vinc9_mipi_sel = <0xff>;
        vinc9_isp_sel = <0>;
        vinc9_isp_tx_ch = <0>;
        vinc9_tdm_rx_sel = <0>;
        vinc9_rear_sensor_sel = <0>;
        vinc9_front_sensor_sel = <0>;
        vinc9_sensor_list = <0>;
        status = "disabled";
    };

    vinc22:vinc@10 {
        vinc10_csi_sel = <2>;
        vinc10_mipi_sel = <0xff>;
        vinc10_isp_sel = <0>;
        vinc10_isp_tx_ch = <0>;
        vinc10_tdm_rx_sel = <0>;
        vinc10_rear_sensor_sel = <0>;
        vinc10_front_sensor_sel = <0>;
        vinc10_sensor_list = <0>;
        status = "disabled";
    };

    vinc23:vinc@11 {
        vinc11_csi_sel = <2>;
        vinc11_mipi_sel = <0xff>;
        vinc11_isp_sel = <0>;
        vinc11_isp_tx_ch = <0>;
        vinc11_tdm_rx_sel = <0>;
        vinc11_rear_sensor_sel = <0>;
        vinc11_front_sensor_sel = <0>;
        vinc11_sensor_list = <0>;
        status = "disabled";
    };

    vinc30:vinc@12 {
        vinc12_csi_sel = <0>;
        vinc12_mipi_sel = <0x0>;
        vinc12_isp_sel = <0>;
        vinc12_isp_tx_ch = <0>;
        vinc12_tdm_rx_sel = <0>;
        vinc12_rear_sensor_sel = <0>;
        vinc12_front_sensor_sel = <0>;
        vinc12_sensor_list = <0>;
        work_mode = <0x1>;
        status = "okay";
    };

    vinc31:vinc@13 {
        vinc13_csi_sel = <2>;
        vinc13_mipi_sel = <0xff>;
        vinc13_isp_sel = <0>;
        vinc13_isp_tx_ch = <0>;
        vinc13_tdm_rx_sel = <0>;
        vinc13_rear_sensor_sel = <0>;
        vinc13_front_sensor_sel = <0>;
        vinc13_sensor_list = <0>;
        status = "disabled";
    };

    vinc32:vinc@14 {
        vinc14_csi_sel = <2>;
        vinc14_mipi_sel = <0xff>;
        vinc14_isp_sel = <0>;
        vinc14_isp_tx_ch = <0>;
        vinc14_tdm_rx_sel = <0>;
        vinc14_rear_sensor_sel = <0>;
        vinc14_front_sensor_sel = <0>;
        vinc14_sensor_list = <0>;
        status = "disabled";
    };

    vinc33:vinc@15 {
        vinc15_csi_sel = <2>;
        vinc15_mipi_sel = <0xff>;
        vinc15_isp_sel = <0>;
        vinc15_isp_tx_ch = <0>;
        vinc15_tdm_rx_sel = <0>;
        vinc15_rear_sensor_sel = <0>;
        vinc15_front_sensor_sel = <0>;
        vinc15_sensor_list = <0>;
        status = "disabled";
    };
};

修改該文件之后,需要重新編譯固件再打包,才會更新到 dts。

使用雙攝像頭時,雙攝分別使用到兩個ISP,那么內核需要選上SUPPORT_ISP_TDM配置。

menuconfig配置

在命令行進入Tina根目錄,執(zhí)行命令進入配置主界面:

source build/envsetup.sh    (詳見1)
lunch 方案編號                  (詳見2)
make menuconfig                  (詳見3)

詳注:
    1.加載環(huán)境變量及tina提供的命令;
    2.輸入編號,選擇方案;
    3.進入配置主界面(對一個shell而言,前兩個命令只需要執(zhí)行一次)

make menuconfig配置路徑:

Kernel modules
    └─>Video Support
                └─>kmod-sunxi-vfe(vfe框架的csi camera)                (詳見1)
                └─>kmod-sunxi-vin(vin框架的csi camera)                (詳見2)
                └─>kmod-sunxi-uvc(uvc camera)                      (詳見3)

詳注:
    1.平臺使用vfe框架的csi camera選擇該驅動;
    2.平臺使用vin框架的csi camera選擇該驅動;(該項與vfe框架,在同一個平臺只會出現(xiàn)其中一個)
    3.usb camera選擇該驅動;

在完成 sensor 驅動編寫,modules.mk和板級配置后,通過make menuconfig選上相應的驅動,camera即可正常使用。

ISP效果調試

正在撰寫,敬請期待……

常見問題

內核代碼注意事項

驅動中一般禁止使用mdelay或者msleep實現(xiàn)延時,例如使用msleep實現(xiàn)10~20ms的延時,通常會因為系統(tǒng)調度而變成延時更長的時間,這種做法精度較差。所以如果需要使用ms級別延時,則使用usleep_range(a, b),比如原來mdelay(1)mdelay(10)可改為usleep_range(1000, 2000)usleep_range(10000, 12000)。如果是長達30ms或以上的延時可選擇使用msleep();

中斷過程中不能使用msleepusleep_range,除了特殊情況必須加延時之外,mdelay一般也不可使用。

如何進行Camera模塊調試

Camera模塊調試一般可以分為三步:
(1)使用lsmod命令查看驅動是否加載,查看/lib/modules/內核版本號 目錄下是否存在相應的ko,如果沒有,確認modules.mk是否修改正確,配置了開機自動加載。如果存在相應的.ko,可手動加載測試確認ko是否正常,手動加載成功,則確認內核的版本是否一致,導致開機時沒有找到相應的ko從而沒有加載;
(2)使用ls /dev/v*查看是否有video0/1節(jié)點生成;
(3)在adb shell 中使用cat /proc/kmsg命令,或者是使用串口查看內核的打印信息,查看不能正常加載的原因。一般情況下驅動加載不成功的原因有:一是讀取的sys_config.fex文件中的配置信息與加載的驅動不匹配,二是probe函數(shù)遇到某些錯誤沒能正確的完成probe的時候返回。

移植一款 sensor 需要進行哪些操作

移植 camera sensor,主要進行以下操作:

(1)根據(jù)主板的原理圖,確認與 sensor 模組的接口是否一致,一致才可以保證配置和數(shù)據(jù)的正常接收。
(2)根據(jù)產品的需求,讓 sensor 模組廠提供產品所需的分辨率、幀率的寄存器配置,這一步需要注意,提供的配置需要是和模組匹配的。比如模組的 mipi 接口只引出 2lane,而提供的寄存器配置卻是配置為 4lane 輸出的,那么該配置在該模組無法正常使用,讓模組廠提供該模組可以正常使用的正確配置。注意,該寄存器配置 SOC 原廠沒有,需要 sensor 廠提供。
(3)拿到寄存器配置之后,按照Tina驅動模塊配置等相關文檔完成 sensor 驅動的編寫。
(4)在完成驅動的編寫之后,按照Tina系統(tǒng)軟件開發(fā)指南等相關文檔等完成modules.mk的修改。
(5)根據(jù)板子的原理圖與模組的硬件連接,參照Tina系統(tǒng)軟件開發(fā)指南等相關文檔完成sys_config.fex或者board.dts的修改。
(6)完成上述操作之后,在menuconfig中進行camera相關配置,并配置camera demo進行調試測試,測試驅動移植是否正常。

如何開始camera模塊調試

初次調試建議打開device中的DEV_DBG_EN為1,方便調試。

調試camera常見現(xiàn)象和功能檢查

(1)insmod之后首先看內核打印,看加載有無錯誤打印,部分驅動在加載驅動進行上下電時候會進行i2c操作,如果此時報錯的話就不需要再進入camera了,先檢查是否io或電源配置不對。或者是在復用模組時候有可能是另外一個模組將i2c拉住了。

(2)如果i2c讀寫沒有問題的話,一般就可以認為sensor控制是ok的,只需要根據(jù)sensor的配置填好H/VREF、PCLK的極性就能正常接收圖像了。這個時候可以在進入camera應用之后用示波器測量sensor的各個信號,看h/vref、pclk極性、幅度是否正常(2.8V的vpp)。

(3)如果看到畫面了,但是看起來是綠色和粉紅色的,但是有輪廓,一般是YUYV的順序設置反了,可檢查yuyv那幾個寄存器是否填寫正確配置,其次,看是否是在配置的其他地方有填寫同一個寄存器的地方導致將yuyv fmt的寄存器被改寫。

(4) 如果畫面顏色正常,但是看到有一些行是粉紅或者綠色的,往往是sensor信號質量不好所致,通常在比較長的排線中出現(xiàn)這個情況。在信號質量不好并且yuyv順序不對的時候也會看見整個畫面的是綠色的花屏。

(5)當驅動能力不足的時候增強sensor的io驅動能力有可能解決這個問題。此時用示波器觀察pclk和數(shù)據(jù)線可能會發(fā)現(xiàn):pclk波形擺幅不夠IOVDD的幅度,或者是data輸出波形擺幅有時候能高電平達到IOVDD的幅度,有時候可能連一半都不夠。

(6)如果是兩個模組復用數(shù)據(jù)線的話,不排除是另外一個sensor在進入standby時候沒有將其數(shù)據(jù)線設置成高阻,也會影響到當前模組的信號擺幅,允許的話可以剪斷另一個模組來證實。

(7)當畫面都正常之后檢查前置攝像頭垂直方向是否正確,水平方向是否是鏡像,后置水平垂直是否正確,不對的話可以調節(jié)sys_config.fex中的hflip和vflip參數(shù)來解決,但如果屏幕上看到的畫面與人眼看到的畫面是成90度的話,只能是通過修改模組的方向來解決。

(8)之后可以檢查不同分辨率之間的切換是否ok,是否有切換不成功的問題;以及拍照時候是否圖形正常,亮度顏色是否和預覽一致;雙攝像頭的話需要檢查前后切換是否正常。

(9)如果上述都沒有問題的話,可認為驅動無大問題,接下來可以進行其他功能(awb/exp bias/color effect等其他功能的測試)。

(10) 測試對焦功能,單次點觸屏幕,可正確對上不同距離的物體;不點屏幕時候可以自動對焦對上畫面中心物體,點下拍照后拍出來的畫面能清晰。

(11)打開閃光燈功能,檢查在單次對焦時候能打開燈,對完之后無論成功失敗或者超時能夠關閉,在點下拍照之后能打開,拍完之后能關閉。

(12)如果加載模塊后,發(fā)現(xiàn)dev/videoX節(jié)點沒有生成,請檢查下面幾點:

a. 模塊加載的順序
    一定要按照以下順序加載模塊
    insmod videobuf-core.ko
    insmod videobuf-dma-contig.ko
    ;如果有對應的vcm driver,在這里加載,如果沒有,請省略。
    insmod actuator.ko
    insmod ad5820_act.ko
    ;以下是camera驅動和vfe驅動的加載,先安裝一些公共資源。
    insmod vfe_os.ko
    insmod vfe_subdev.ko
    insmod cci.ko
    insmod ov5640.ko
    insmod gc0308.ko
    ;如果一個csi接兩個camera,所有camera對應的ko都要在vfe_v4l2.ko之前加載。
    insmod vfe_v4l2.ko

b. sys_config.fex配置
    vip_used             = 1            ;確保used為1
    vip_dev_qty           = 2            ;確保csi接口上接的camera數(shù)量與ko加載情況相同
    vip_dev0_mname        = "ov5640"  ;確保camera型號與ko加載情況相同
    vip_dev0_twi_id        = 1            ;確保camera使用的i2c總線id與配置一樣

    vip_dev1_mname         = "gc0308"  ;確保camera型號與ko加載情況相同
    vip_dev1_twi_id        = 1            ;確保camera使用的i2c總線id與配置一樣

常見異常現(xiàn)象與處理方法

  • I2C通信出錯
    I2C出現(xiàn)問題內核一般會伴隨打印cci_write_aX_dX error! slave = 0xXX, addr = 0xXX, value = 0xXX"

如果與此同時,內核出現(xiàn)打印chip found is not an target chip.,則說明在初始化camera前,讀取camera的ID已經失敗。

此時,一般是如下幾點出現(xiàn)問題。

a. 最先考慮應該是更換一個camera模組試試。
b. 電源
    檢查sys_config.fex
    vip_dev0_iovdd               = "axp22_eldo3"
    vip_dev0_iovdd_vol            = 2800000
    vip_dev0_avdd                = "axp22_dldo4"
    vip_dev0_avdd_vol            = 2800000
    vip_dev0_dvdd                = "axp22_eldo2"
    vip_dev0_dvdd_vol            = 1500000
    一定要與原理圖設計保持一致。必要時,需要用萬用表測量camera模組的各路電壓是否正常。
c. reset和power down腳
    檢查sys_config.fex配置
    vip_dev0_reset                = port:PH2<1>
    vip_dev0_pwdn                = port:PH1<1>
    是否與原理圖設計保持一致。必要時,需要用示波器測量reset,pwdn腳,在camera加載時,是否有動作。
d. mclk
    檢查sys_config.fex配置
    vip_csi_mck              = port:PE01<3>
    pin腳是否與原理圖設計保持一致。必要時,在加載camera時,測量mclk,看是否有正確輸出(一般是24MHz或27MHz)

如果已經能夠正確通過camera的id讀取,只是在使用過程當中,偶爾出現(xiàn)I2C的讀寫錯誤,此時需要從打印里面,將報錯的地址和讀寫值,結合camera具體的spec來分析,到底是操作了camera哪些寄存器帶來的問題。

還有可能出現(xiàn)如下信息:

[    5.556579] sunxi_i2c_do_xfer()1942 - [i2c1] incomplete xfer (status: 0x20, dev addr: 0x30)
[    5.566234] sunxi_i2c_do_xfer()1942 - [i2c1] incomplete xfer (status: 0x20, dev addr: 0x30)
[    5.575963] sunxi_i2c_do_xfer()1942 - [i2c1] incomplete xfer (status: 0x20, dev addr: 0x30)
[    5.585375] [VIN_DEV_I2C]sc031gs_mipi sensor read retry = 2
[    5.591666] [sensorname_mipi] error, chip found is not an target chip.

出現(xiàn)上述錯誤打印時,可按以下操作逐步debug。

(1)確認sys_config.fex中配置的 sensor I2C 地址是否正確(sensor datasheet 中標注,讀地址為 0x6d,寫地址為 0x6c,那么 sys_config.fex 配置 sensor I2C 地址為 0x6c);
(2)在完成以上操作之后,在 senor 上電函數(shù)中,將掉電操作屏蔽,保持 sensor 一直上電狀態(tài),方便 debug;
(3)確認 I2C 地址正確之后,測量 sensor 的各路電源電壓是否正確且電壓幅值達到 datasheet 標注的電壓要求;
(4)測量 MCLK 的電壓幅值與頻率,是否正常;
(5)測量 senso r的 reset、pown 引腳電平配置是否正確,I2C 引腳 SCK、SDA 是否已經硬件上拉;
(6)確認 I2C 接口使用正確并使能(CCI / TWI);
(7)如果還是 I2C 出錯,協(xié)調硬件同事使用邏輯分析儀等儀器進行debug;

I2C沒有硬件上拉
I2C沒有硬件上拉時一般會異常報錯:

twi_start()450 - [i2c2] START can't sendout!
twi_start()450 - [i2c2] START can't sendout!
twi_start()450 - [i2c2] START can't sendout!
[VFE_DEV_I2C_ERR]cci_write_a16_d16 error! slave = 0x1e, addr = 0xa03e, value = 0x1

出現(xiàn)上述的問題是因為 SDA、SCK 沒有拉上,導致在進行 I2C 通信時,發(fā)送開始信號失敗,SDA、SCK 添加上拉即可。

I2C沒有使能
I2C沒有使能時一般會異常報錯:

[VFE]Sub device register "ov2775_mipi" i2c_addr = 0x6c start!
[VFE_ERR]request i2c adapter failed!
[VFE_ERR]vfe sensor register check error at input_num = 0

出現(xiàn)上述的錯誤,是因為使用 twi 進行 I2C 通信但沒有使能 twi 導致的錯誤,此時需要確認 sys_config.fex 中,[twiX] 中的 twiX_used 是否已經設置為 1。

圖像全黑如何處理
異常現(xiàn)象:

當 camerademo 成功采集到圖像時,發(fā)現(xiàn)圖像是全黑的

首先最起碼整條數(shù)據(jù)通路已經正常,而發(fā)現(xiàn)圖像時全黑的,注意以下幾點:
(1)在編譯 camerademo 之前,是根據(jù)平臺正確的選上了Enable vin isp support,選上之后,重新編譯camerademo(建議cd package/allwinner/camerademo目錄后執(zhí)行mm -B編譯);
(2)通過上述操作之后,執(zhí)行新編譯的camerademo可執(zhí)行程序,運行過程應可看到類似[ISP]create isp0 server thread!信息,則正確運行isp,這時再查看新抓取的圖像數(shù)據(jù);
(3)執(zhí)行運行camerademo只會抓取5張圖像數(shù)據(jù),由于isp計算合適的圖像曝光需要一定的幀數(shù),所以可能存在前面幾張圖像黑的情況,修改camerademo運行參數(shù),抓取多幾張圖像數(shù)據(jù)查看(20張);
(4)如果是沒有移植isp的環(huán)境,則可修改sensor驅動中寄存器組中的曝光參數(shù)配置,增加初始化時曝光時間,從而使初始輸出的圖像亮度較合適。

** camerademo 采集的圖像顏色異常**
異常現(xiàn)象:

運行 camerademo 采集圖像之后,發(fā)現(xiàn)拍攝得到的輪廓正確但顏色不對,比如紅藍互換、畫面整體偏紅或偏藍等顏色異常的情況

出現(xiàn)這樣的問題,首先考慮是sensor驅動中配置的RAW數(shù)據(jù)RGB順序錯誤導致的。在sensor驅動中有類似以下的配置:

static struct sensor_format_struct sensor_formats[] = {
    {
        .desc = "Raw RGB Bayer",
        .mbus_code = MEDIA_BUS_FMT_SBGGR10_1X10,
        .regs = sensor_fmt_raw,
        .regs_size = ARRAY_SIZE(sensor_fmt_raw),
        .bpp = 1
    },
};

以上配置表明sensor輸出的圖像數(shù)據(jù)是RAW10,RGB排列順序是BGGR,出現(xiàn)顏色異常時,一般就是RGB的排列順序配置錯誤導致的,RGB排列順序一共有4種 (MEDIA_BUS_FMT_SBGGR10_1X10/MEDIA_BUS_FMT_SGBRG10_1X10/MEDIA_BUS_FMT_SGRBG10_1X10/MEDIA_BUS_FMT_SRGGB10_1X10),修改驅動中的mbus_code為上述的4種之一,確認哪一種顏色比較正常,則驅動配置正確。如果顏色還有細微的不夠艷麗、準確等問題,需要進行isp效果調試,改善圖像色彩。
上述是以10bit sensor為例進行介紹,其他的8bit、12bit、14bit類似,參考上述即可。

  • 畫面大體輪廓正常,顏色出現(xiàn)大片綠色和紫紅色

一般可能是csi采樣到的yuyv順序出現(xiàn)錯位

確認camera輸出的yuyv順序的設置與camera的spec一致

若camera輸出的yuyv順序沒有問題,則可能是由于走線問題,導致pclk采樣data時發(fā)生錯位,此時可以調整pclk的采樣沿。具體做法如下:

在對應的camara驅動源碼,如ov5640.c里面,找到宏定義#define CLK_POL。此宏定義可以有兩個值V4L2_MBUS_PCLK_SAMPLE_RISINGV4L2_MBUS_PCLK_SAMPLE_FALLING。若原來是其中一個值,則修改成另外一個值,便可將PCLK的采樣沿做反相。

  • 畫面大體輪廓正常,但出現(xiàn)不規(guī)則的綠色紫色條紋

一般可能是pclk驅動能力不足,導致某個時刻采樣data時發(fā)生錯位。

解決辦法:

  • 若pclk走線上有串聯(lián)電阻,嘗試將電阻阻值減小。
  • 增強pclk的驅動能力,需要設置camera的內部寄存器。
  • 畫面看起來像油畫效果,過渡漸變的地方有一圈一圈

一般是CSI的data線沒有接好,或短路,或斷路。

  • 常見報錯: [VFE_WARN] Nobody is waiting on this video buffer

上層還回來所有的buffer,但是沒有再來取buffer。

  • 常見報錯 - [VFE_WARN] Only three buffer left for csi

上層占用了大部分buffer,沒有還回,驅動部分只有三個buffer此時驅動不再進行buffer切換,直到有buffer還回為止。

sensor的硬件接口注意事項

(1)如果是使用并口的sensor模組,會使用到720p@30fps或更高速度的,必須在mclk/pclk/data/vsync/hsync上面串33ohm電阻,5M的sensor一律串電阻;

(2)使用Mipi模組時候PCB layout需要盡量保證clk/data的差分對等長,過孔數(shù)相等,特征阻抗100ohm;

(3)如果使用并口復用pin的模組時候,不建議reset腳的復用;

(4)并口模組的排線長度加上pcb板上走線長度不超過10cm, mipi模組排線長度加上pcb板上走線長度不超過20cm,超過此距離不保證能正常使用。

(5)主控并口數(shù)據(jù)線有D11~D0共12bit,并口的sensor輸出一般為8/10bit,原理圖連接需要做高位對齊。

Camera demo

Tina系統(tǒng)可以通過 SDK 中的 camerademo 包來驗證 camera sensor(usb camera) 是否移植成功,如果可以正常捕獲保存圖像數(shù)據(jù),則底層驅動、板子硬件正常。

camerademo配置

在命令行中進入Tina根目錄,執(zhí)行make menuconfig進入配置主界面,并按以下配置路徑操作:

Allwinner
    └─>camerademo
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 開發(fā)
    +關注

    關注

    0

    文章

    370

    瀏覽量

    40836
  • MIPI
    +關注

    關注

    11

    文章

    310

    瀏覽量

    48613
  • CSI
    CSI
    +關注

    關注

    1

    文章

    36

    瀏覽量

    50982
  • Camera
    +關注

    關注

    0

    文章

    79

    瀏覽量

    20807
  • V853
    +關注

    關注

    2

    文章

    19

    瀏覽量

    2152
收藏 人收藏

    評論

    相關推薦

    全志V853開發(fā)板原理圖

    本章節(jié)將對開發(fā)板幾個主要的部件的原理圖進行說明,方便快速上手開發(fā)板的硬件資料。 開發(fā)板硬件框圖如下: 模塊介紹GPIO 分配此表格為 V853
    發(fā)表于 01-12 09:48

    【免費試用04期】全志V853開發(fā)板試用活動

    本期試用名單:mameng lingxin-yuhe春天一滿屋 大菠蘿AlphaALSET試用報告:mameng【全志V853開發(fā)板試用】國產之光——全志V853開發(fā)硬件介紹【全志
    發(fā)表于 07-21 10:27

    【全志V853開發(fā)板試用】全志V853開發(fā)板試用測評報告

    的嵌入式開發(fā)平臺,在電子愛好者平臺偶然看到一款全志新推出的非常高性能的具備AI能力的開發(fā)板,在報名截止時間內,提交了試用申請。又非常幸運的抽中了試用的幸運名額,因而就非常幸運的拿到這塊
    發(fā)表于 08-29 02:09

    【全志V853開發(fā)板試用】國產之光——全志V853開發(fā)硬件介紹

    開發(fā)板硬件:V853架構: 開發(fā)板亮點全志V853,搭載玄鐵e907-r1s1架構。STM32F103一般大小。功能卻異常強大。V853內置
    發(fā)表于 08-29 20:38

    一鍵實現(xiàn)V853開發(fā)板攝像頭自由

    視頻中所實現(xiàn)的攝像頭UI控制效果,是通過在全志V853開發(fā)板上使用InoneGUI+mpp+Aiinone-IDE方案快速搭建而成的,該demo打通了UI界面與攝像頭的通路,可以通過UI控制攝像頭
    發(fā)表于 09-08 13:41

    5分鐘開啟全志V853平臺GUI “Hello World!”之旅

    INONE-EXAMPLE-8D例程里提供的源文件,來實現(xiàn)5分鐘快速開啟全志V853平臺GUI的“Hello World”之旅。體驗前置條件硬件前置條件:電腦*1;全志V853*1;USB數(shù)據(jù)線*1軟件
    發(fā)表于 10-11 09:35

    全志V853平臺Camera模塊開發(fā)框架詳解

    V853開發(fā)板購買鏈接:https://www.hqchip.com/p/KFB-V853.htmlCamera本章節(jié)介紹V853平臺
    發(fā)表于 12-05 09:58

    全志V853開發(fā)板參數(shù)規(guī)格概述

    全志推出了V853開發(fā)板搭載了全新的AI視覺處理的AIoT芯片V853,全志V853芯片是全志推出的面向邊緣AI視覺處理的AIoT芯片,適用于各類有AI視覺需求的AIoT終端設備,比如
    的頭像 發(fā)表于 07-22 18:39 ?5124次閱讀
    全志<b class='flag-5'>V853</b><b class='flag-5'>開發(fā)</b>板參數(shù)規(guī)格概述

    全志科技v853芯片性能怎么樣 v853芯片基本參數(shù)規(guī)格

    全志科技v853是2022年5月發(fā)布的多目異構AI視覺芯片產品。 V853 是一顆面向智能視覺領域推出的新一代高性能、低功耗的處理器SOC,芯片采用三核異構設計,同時搭配了全志自研的新一代視覺處理
    發(fā)表于 08-26 15:58 ?9342次閱讀

    v853v853s的差別

    v853v853s的差別 V853V853s是兩款相似的智能手機,它們在許多方面非常相似,但是它們之間也有一些顯著的差異。在本文中,我將分析這兩款智能手機之間的差異,并為您提供更深
    的頭像 發(fā)表于 08-17 11:28 ?1179次閱讀

    v853v851參數(shù)對比

    v853v851參數(shù)對比 v853v851是兩款Wi-Fi模塊,由于它們都是同一家公司出品,所以有些參數(shù)相似,但是它們之間也存在一些不同
    的頭像 發(fā)表于 08-17 11:28 ?1910次閱讀

    全志v853參數(shù) v853v853s的差別 全志v853是什么封裝的

    全志v853參數(shù) v853v853s的差別 全志v853是什么封裝的? 全志V853是一款高性能、低功耗的集成電路處理器芯片,由全志科技研
    的頭像 發(fā)表于 08-21 17:33 ?3995次閱讀

    全志科技v853芯片性能怎么樣

    全志科技v853芯片性能怎么樣? 全志科技是一家專注于智能硬件領域的芯片設計公司,其V853芯片是其旗下一款性能強大的芯片。在本文中,我們將詳細介紹全志科技V853芯片的各方面性能。 1. CPU
    的頭像 發(fā)表于 08-21 17:33 ?4195次閱讀

    全志V853開發(fā)板雙目攝像頭模組原理圖20220624

    全志V853開發(fā)板雙目攝像頭模組原理圖20220624
    發(fā)表于 10-19 15:11 ?25次下載

    全志V853開發(fā)板原理圖20220624

    全志V853開發(fā)板原理圖20220624
    發(fā)表于 10-19 15:11 ?20次下載
    主站蜘蛛池模板: 国产婷婷色一区二区三区在线| 久久99r66热这里只有精品| 男人桶爽女人| 在线欧美 精品 第1页| 国产精品麻豆AV| 日韩精品亚洲专区在线电影不卡 | 中文字幕亚洲乱码熟女在线| 国产亚洲欧美日韩综合综合二区| 青草影院天堂男人久久| 97在线超碰免费视频| 寂寞护士中文字幕 mp4| 亚洲高清中文字幕| 国产精品7777人妻精品冫| 肉色欧美久久久久久久蜜桃| gogogo视频在线观看| 农村脱精光一级| 99久久国语露脸精品国产| 伦理片天堂eeuss影院| 92午夜理论第1000集 app| 美国兽皇zoo在线播放| 91桃色污无限免费看| 嫩草影院在线观看精品| 99免费视频观看| 日日夜夜撸 在线影院| 国产h视频免费观看| 校草让我脱了内裤给全班看| 国产亚洲精品欧洲在线视频| 野花韩国高清完整版在线观看5 | 日韩视频中文在线一区| 国产成人综合在线观看| 亚洲黄色录像片| 久久综合给合久久狠狠狠…| 99国产亚洲精品无码成人| 日本丝袜护士| 国产主播AV福利精品一区| 伊人成色综合人网| 免费人成网站在线观看10分钟| 绑着男军人的扒开内裤| 四虎国产精品永久免费入口 | 国产ZZJJZZJJ视频全免费| 欧美巨大xxxx做受高清|