Подробное объяснение структуры разработки модуля камеры платформы Allwinner V853.
Подробное объяснение структуры разработки модуля камеры платформы Allwinner V853.

Camera

В этой главе представлена ​​разработка модуля камеры платформы V853.

V853 поддерживает параллельные порты CSI и MIPI и использует структуру драйверов камеры VIN.

Рамка доступа к камере

  • VIN поддерживает гибкую конфигурацию, одиночный/двойной вход, двойной ISP, многоканальные выходные характеристики.
  • Представляем медиарамку для реализации управления конвейером
  • Портирование libisp в пользовательское пространство решает проблемы GPL
  • Выделить буфер статистики в субдеве v4l2.
  • Модуль независимого масштабирования (vipp) в v4l2 subdev
  • Измените видеобуфер на режим mplane, чтобы пользовательскому уровню было удобнее делать снимки.
  • Использование v4l2-event для реализации управления событиями
  • Принять новые функции элементов управления v4l2.

Рамка VIN

Введение в структуру

VIN — это платформа драйверов камеры Allwinner, которая реализует собственную SoC на основе ядра Linux v4l2.

  • vin.cЭто основная реализация функции драйвера.,Включая регистрацию/отмену, Чтение параметров、С интерфейсом верхнего уровня v4l2、С нижним уровнем интерфейса каждого устройства、Обработка прерываний、Переключение буферных приложений и т. д.;
  • Процесс использования можно просто рассматривать как модуль vin + модуль устройства + драйвер + модуль управления флэш-памятью;
  • modules/sensorВнутри папки находятся различныеsensoр Реализация уровня устройства,Обычно включает включение и выключение питания, инициализацию,Переключение между разрешениями,yuv sensorвключая большинствоv4l2определенныйioctrlРеализация команд;иraw sensorБольшая часть словioctrlКоманда находится вvinвызов слояispРеализация библиотеки,Некоторые вещи, такие как регулировка экспозиции/усиления, будут передаваться через уровень vin на реальный уровень устройства;
  • modules/actuatorВ папке находятся различныеvcmводитель;
  • modules/flashВнутри папки лежит управление вспышкойинтерфейсвыполнить;
  • vin-csiиvin-mipiпо правуcsiинтерфейсиmipiинтерфейсуправляющий файл;
  • vin-ispПапкаispфайлы операций библиотеки;
  • vin-videoОсновное содержимое папки:videoФайлы работы устройства。
Структура исходного кода (linux4.9)

Путь движения находится по адресуlinux-4.9/drivers/media/platform/sunxi-vinВниз

Язык кода:javascript
копировать
sunxi-vin:
    │  vin.c                            ;v4l2 основная часть реализации драйвера (включая части видеоинтерфейса и ISP)
    │  vin.h                        ;v4l2 заголовочный файл драйвера
    │  top_reg.c                        ;вин для каждого v4l2 тема реализации интерфейса управления subdev
    │  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        ;файл заголовка общедоступной структуры камеры
    │       ├── Makefile
    │       ├── gc2053_mipi.c
    │       ├── ov2775_mipi.c
    │       ├── ov5640.c
    │       ├── sensor-compat-ioctl32.c
    │       ├── sensor_helper.c        ;Файл общей функции интерфейса датчика
    │       ├── 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 оснащена модулем двойной камеры GC2063, который повторно использует драйвер GC2053. Путь к коду драйвера:

Язык кода:javascript
копировать
tina/lichee/linux-4.9/drivers/media/platform/sunxi-vin/modules/sensor/gc2053_mipi.c

Здесь с модулем двойной камеры На примере GC2063 мы представляем V853. Файлы конфигурации, относящиеся к модулю камеры в системе Tina.

Конфигурация Тины

В Tina основная задача — изменить конфигурацию Modules.mk. Modules.mk в основном выполняет два аспекта:

  1. Скопируйте соответствующий модуль ko в rootfs небольшой машины.
  2. При запуске rootfs связанные модули ko автоматически загружаются по порядку.

Путь к файлу Modules.mk:

Язык кода:javascript
копировать
tina/target/allwinner/v853-vision/modules.mk

Конфигурация загрузки драйвера

Язык кода:javascript
копировать
 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

После завершения настройки elements.mk на платформе V853 также необходимо завершить настройку .ko-скрипта монтирования S00mpp, чтобы быстро запустить модуль камеры при загрузке.

Конфигурация S00mppпуть:

Язык кода:javascript
копировать
target/allwinner/v853-vision/busybox-init-base-files/etc/init.d

Скрипт заранее загружает драйвер камеры, поэтому приложение можно быстро настроить и запустить, когда его необходимо использовать.

Язык кода:javascript
копировать
#!/bin/sh
#
# Load mpp modules....
#

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

start() {
    printf "Load mpp modules\n"
    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 modules\n"
#   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:

Язык кода:javascript
копировать
tina/device/config/chips/v853/configs/vision

Конфигурация, связанная с камерой:

Язык кода:javascript
копировать
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 = <&reg_aldo2>;
        sensor0_iovdd_vol = <1800000>;
        sensor0_avdd-supply = <&reg_bldo2>;
        sensor0_avdd_vol = <2800000>;
        sensor0_dvdd-supply = <&reg_dldo2>;
        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 = <&reg_aldo2>;
        sensor1_iovdd_vol = <1800000>;
        sensor1_avdd-supply = <&reg_bldo2>;
        sensor1_avdd_vol = <2800000>;
        sensor1_dvdd-supply = <&reg_dldo2>;
        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.

При использовании двух камер двойные камеры используют двух интернет-провайдеров соответственно, поэтому ядру необходимо выбрать SUPPORT_ISP_TDMКонфигурация。

конфигурация менюконфигурации

Введите корневой каталог Tina в командной строке и выполните команду для входа в основной интерфейс конфигурации:

Язык кода:javascript
копировать
source build/envsetup.sh    (Подробнее см. 1)
lunch Номер плана                  (Подробнее см. 2)
make menuconfig                  (Подробнее см. 3)

Подробные примечания:
    1. Загрузите переменные среды и команды, предоставленные tina;
    2. Введите номер и выберите план;
    3. Войдите в основной интерфейс Конфигурации (для оболочки первые две команды необходимо выполнить только один раз).

make конфигурация менюконфигурациипуть:

Язык кода:javascript
копировать
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. Платформа использует csi vferamka. камера выбирает этот драйвер;
    2. Платформа использует csi винрамки камера выбирает этот драйвер;(Этот предмет относится кvfeрамка,На одной платформе появится только один из них)
    3.usb камера выбирает этот драйвер;

в завершении sensor Написание драйвера,modules.mkи板级Конфигурацияназад,проходитьmake menuconfig选上相应водитель,Камеру можно использовать в обычном режиме.

Отладка эффекта ISP

Пишите, пожалуйста, следите за обновлениями...

Часто задаваемые вопросы

Рекомендации по коду ядра

Обычно запрещено использовать в драйверах.mdelayилиmsleepвыполнить延时,Например, используяmsleepвыполнить10~20msиз延时,Обычно это становится более длительной задержкой из-за системного планирования.,Этот подход имеет низкую точность. Итак, если вам нужно использовать задержку уровня мс,затем используйтеusleep_range(a, b),Например, оказываетсяmdelay(1)mdelay(10)Можно изменить наusleep_range(1000, 2000)usleep_range(10000, 12000)。Если это так долго, как30msили以上из延时可选择использоватьmsleep();

Невозможно использовать во время перерываmsleepиusleep_range,За исключением особых обстоятельств, когда необходима отсрочка,mdelayОбычно не доступен。

Как отладить модуль камеры

Отладку модуля камеры обычно можно разделить на три этапа: (1) Используйте команду lsmod, чтобы проверить, загружен ли драйвер, и проверьте /lib/modules/内核版本号 目录Вниз是否存существовать相应изko,если не,подтверждатьmodules.mkПравильна ли модификация,Конфигурация Загружать автоматически при загрузке。如果存существовать相应из.ko,Вы можете вручную загрузить и проверить, в порядке ли Ко.,Ручная загрузка прошла успешно,Затем подтвердите, соответствует ли версия ядра.,导致开机时没有找到相应изko从и没有加载; (2)использоватьls /dev/v\*Проверьте, есть лиvideo0/1Генерация узлов; (3) В АБР shell используется в cat /proc/kmsgЗаказ,Или используйте последовательный порт для просмотра информации о печати ядра.,查看不能正常加载из原因。一般情况Вниз驱动加载不成功из原因有:一是读取изsys_config.fexдокументв Конфигурацияинформация与加载водитель不匹配,Второйprobe函数遇到某些错误没能正确из完成probeиз时候返回。

Какие операции необходимы для пересадки сенсора?

Для пересадки датчика камеры в основном выполняют следующие операции:

(1) Согласно принципиальной схеме материнской платы подтвердите sensor Проверьте согласованность интерфейсов модулей. Только согласованность может обеспечить нормальный прием конфигурации и данных. (2) В соответствии с потребностями продукта, пусть sensor Фабрика модуля предоставляет конфигурацию регистра разрешения и частоты кадров, необходимую для продукта. На этот шаг следует обратить внимание, и предоставленная конфигурация должна соответствовать модулю. Такие как модули mipi Интерфейс ведет только к 2lane, но предоставленная конфигурация регистра настроена как 4lane выход, то данную конфигурацию невозможно будет нормально использовать в модуле. Попросите производителя модуля предоставить правильную конфигурацию, которую модуль может использовать в обычном режиме. Обратите внимание, что этот регистр настраивает SOC На оригинальном заводе его нет, он нужен sensor Предусмотрено заводом. (3) После получения конфигурации реестра заполните ее в соответствии с конфигурацией модуля драйвера Tina и другими соответствующими документами. sensor Написание драйвера. (4)в После написания драйвера завершения заполните его в соответствии с руководством по разработке системного программного обеспечения Tina и другими сопутствующими документами. modules.mkиз修改。 (5) Завершите процесс в соответствии со схематической схемой платы и аппаратным подключением модуля, а также обратитесь к руководству по разработке системного программного обеспечения Tina и другим соответствующим документам. sys_config.fexили board.dtsиз修改。 (6)完成上述操作之назад,существоватьmenuconfigсерединаруководитьcameraСвязанный Конфигурация,и Конфигурацияcamera Выполните отладку и тестирование с помощью демо-версии, чтобы проверить, является ли трансплантация драйвера нормальной.

Как запустить отладку модуля камеры

Рекомендуется включить его для первоначальной отладки.deviceвDEV_DBG_ENдля1,Удобен для отладки.

Отладка типичных явлений камеры и проверка функций

(1)insmod之назад首先看内核打印,Проверьте, не выводятся ли какие-либо ошибки во время загрузки.,Некоторые драйверы выполняют операцию i2c при загрузке драйвера, а также при включении и выключении питания.,Если в это время сообщается об ошибке, нет необходимости повторно входить в камеру.,Сначала проверьте, есть ли io или источник питания Конфигурациянеправильный。или是существовать复用模组时候有可能是另外一个模组将i2cВытащил。

(2) Если нет проблем с чтением и записью i2c, в целом можно считать, что сенсорное управление в порядке. Вам нужно только указать полярность H/VREF и PCLK в соответствии с конфигурацией датчика, чтобы нормально получать изображения. В это время вы можете использовать осциллограф для измерения различных сигналов датчика после входа в приложение камеры, чтобы проверить, в норме ли h/vref, полярность и амплитуда pclk (2,8 В пик-пик).

(3) Если вы видите экран, но он выглядит зеленым и розовым, но есть контуры, это обычно из-за того, что порядок YUYV обратный. Вы можете проверить, правильно ли заполнены регистры yuyv. Во-вторых, посмотреть, правильно ли они заполнены. Заполнение того же регистра в другом месте конфигурации приводит к перезаписи регистра yuyv fmt.

(4) Если цвет изображения нормальный, но некоторые линии розовые или зеленые, это часто связано с плохим качеством сигнала датчика. Такая ситуация обычно возникает при использовании относительно длинных кабелей. При плохом качестве сигнала и неправильной последовательности юйв вы также увидите зеленый экран на весь экран.

(5) Когда возможностей драйвера недостаточно, можно расширить возможности драйвера ввода-вывода датчика для решения этой проблемы. В это время, если вы используете осциллограф для наблюдения за линиями pclk и данными, вы можете обнаружить, что размах формы сигнала pclk недостаточен для амплитуды IOVDD, или размах формы сигнала вывода данных иногда может достигать высокого уровня до амплитуды IOVDD. а иногда этого может быть недостаточно даже наполовину.

(6) Если два модуля повторно используют линии данных, нельзя исключить, что другой датчик не установил для своей линии данных высокое сопротивление при переходе в режим ожидания, что также повлияет на размах сигнала текущего модуля. Если разрешено, он может отключиться. еще один мод для подтверждения.

(7) Когда изображение будет нормальным, проверьте правильность вертикального направления передней камеры.,Отражается ли горизонтальное направление,Правильно ли установлено заднее горизонтальное и вертикальное положение?,неправильныйиз话可以调节sys_config.fexвhflipиvflipпараметры для решения,Но если изображение, видимое на экране, находится под углом 90 градусов к изображению, увиденному человеческим глазом,,Эту проблему можно решить только изменением направления модуля.

(8) После этого вы можете проверить, нормально ли переключение между разными разрешениями, и нет ли проблем с неудачным переключением, нормальна ли графика при съемке, и соответствуют ли яркость и цвет предварительному просмотру; там двойные камеры, нужно проверить нормально ли переключение передней и задней части.

(9) Если с вышеизложенным нет проблем, можно считать, что с драйвером нет серьезных проблем, и можно выполнять другие функции (смещение awb/exp/цветовой эффект и тестирование других функций).

(10) Проверьте функцию фокусировки. Одно касание экрана позволяет правильно сфокусироваться на объектах на разных расстояниях. Он может автоматически фокусироваться на объекте в центре экрана, не касаясь экрана. сделанный снимок будет четким.

(11) Включите функцию вспышки и убедитесь, что свет может быть включен во время одной фокусировки. После завершения фокусировки его можно выключить независимо от успеха или неудачи или времени ожидания. Его можно включить после нажатия кнопки «Сделать снимок». снимок, и его можно отключить после съемки.

(12) Если после загрузки модуля,Обнаружитьdev/videoXУзел не создается,Пожалуйста, проверьте следующие пункты:

Язык кода:javascript
копировать
a. Порядок загрузки модулей
    Обязательно загружайте модули в следующем порядке
    insmod videobuf-core.ko
    insmod videobuf-dma-contig.ko
    ;Если есть соответствующий vcm драйвер, загрузите его сюда, если нет, опустите его.
    insmod actuator.ko
    insmod ad5820_act.ko
    ;Ниже приведена загрузка драйвера камеры и драйвера vfe. Сначала установите некоторые общедоступные ресурсы.
    insmod vfe_os.ko
    insmod vfe_subdev.ko
    insmod cci.ko
    insmod ov5640.ko
    insmod gc0308.ko
    ;Если один csi подключен к двум камерам, то ko, соответствующий всем камерам, должен быть загружен перед vfe_v4l2.ko.
    insmod vfe_v4l2.ko

b. sys_config.fexКонфигурация
    vip_used             = 1            ;Убедитесь, что используется значение 1
    vip_dev_qty           = 2            ;Убедитесь, что количество csiинтерфейсов и камер такое же, как и при загрузке ko.
    vip_dev0_mname        = "ov5640"  ;Убедитесь, что модель камеры такая же, как при загрузке.
    vip_dev0_twi_id        = 1            ;Убедитесь, что идентификатор шины i2c, используемый камерой, такой же, как и в Конфигурации.

    vip_dev1_mname         = "gc0308"  ;Убедитесь, что модель камеры такая же, как при загрузке.
    vip_dev1_twi_id        = 1            ;Убедитесь, что идентификатор шины i2c, используемый камерой, такой же, как и в Конфигурации.
Распространенные аномальные явления и решения
  • Ошибка связи I2C Если есть проблемы с I2C, ядро ​​обычно сопровождается печатью. cci_write_aX_dX error! slave = 0xXX, addr = 0xXX, value = 0xXX"

если в то же время,Ядро, кажется, печатаетchip found is not an target chip.,Это означает, что перед инициализацией камеры,Не удалось прочитать идентификатор камеры.

В это время проблемы обычно возникают в следующих точках.

Язык кода:javascript
копировать
a. В первую очередь следует попробовать заменить модуль камеры.
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
    Обязательно соблюдайте схематический дизайн. При необходимости с помощью мультиметра проверьте, в норме ли напряжения каждого канала модуля камеры.
c. сброс и питание Вниз с ног
    Проверьте sys_config.fexКонфигурация
    vip_dev0_reset                = port:PH2<1><default><default><default>
    vip_dev0_pwdn                = port:PH1<1><default><default><default>
    Соответствует ли это схематическому проекту. При необходимости вам нужно с помощью осциллографа измерить контакты сброса и pwdn, чтобы увидеть, есть ли какие-либо действия при загрузке камеры.
d. mclk
    Проверьте sys_config.fexКонфигурация
    vip_csi_mck              = port:PE01<3><default><default><default>
    pinСоответствуют ли ножки схематическому дизайну?。когда необходимо,При загрузке камеры,Измерить mclk,Проверьте правильность выходного сигнала (обычно 24 МГц или 27 МГц).

Если идентификатор камеры можно прочитать правильно, но во время использования иногда возникают ошибки чтения и записи I2C, то вам необходимо проанализировать адрес ошибки и прочитать и записать значения с распечатки в сочетании с конкретной спецификацией камеры. Проблема вызвана. с помощью которых управляются регистры камеры.

Также может появиться следующее сообщение:

Язык кода:javascript
копировать
[    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.

Когда возникает описанная выше ошибка печати, вы можете выполнить ее пошаговую отладку, выполнив следующие операции.

(1) Подтвердите sys_config.fexсередина Конфигурацияиз sensor I2C Верен ли адрес (датчик datasheet Помечено, адрес чтения 0x6d, адрес записи 0x6c, тогда sys_config.fex Конфигурация sensor I2C Адрес 0x6c); (2)в Завершение После вышеперечисленных операций, в senor В функции включения питание при выключении экранируется и поддерживается. sensor Всегда включен, удобно debug; (3) Подтвердите I2C После того, как адрес правильный, измерьте sensor Правильно ли напряжение питания каждого канала и достигает ли амплитуда напряжения datasheet Указанные требования к напряжению; (4) Измерение MCLK Амплитуда и частота напряжения в норме; (5) Измерение senso р reset、pown уровень контактов. Правильная ли конфигурация, I2C приколоть SCK、SDA Подтянулся ли он аппаратно; (6) Подтвердите I2C Интерфейс используется корректно и включен (CCI / TWI); (7) Если еще I2C В случае возникновения ошибки координируйте свои действия с коллегами по аппаратному обеспечению, чтобы использовать такие инструменты, как логические анализаторы, для отладки;

I2C не имеет аппаратного подтягивания I2C не имеет аппаратного Подтягивание обычно сообщает об аномальной ошибке:

Язык кода:javascript
копировать
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

Вышеупомянутая проблема возникает из-за того, что SDA и SCK не подтягиваются, что приводит к невозможности отправки сигнала запуска во время связи I2C. Просто добавьте подтягивания для SDA и SCK.

I2C не включен I2C не включено обычно сообщает об аномальной ошибке:

Язык кода:javascript
копировать
[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

Вышеупомянутая ошибка возникает из-за того, что twi используется для связи I2C, но twi не включен. На данный момент вам необходимо подтвердить, установлено ли для twiX_used в [twiX] в sys_config.fex значение 1.

Как бороться с полностью черным изображением Аномальные явления:

Язык кода:javascript
копировать
когда camerademo Когда изображение было успешно собрано, выяснилось, что изображение было полностью черным.

Прежде всего, по крайней мере, весь путь к данным нормальный, но когда изображение оказывается полностью черным, обратите внимание на следующие моменты: (1) Компиляция camerademo Раньше я правильно подбирал исходя из платформы. Enable vin isp support,После выбора,Перекомпилироватьcamerademo(предположение cd package/allwinner/camerademo目录назад执行mm -B компилировать); (2)проходить上述操作之назад,Запустите только что скомпилированную исполняемую программу camerademo.,бегать Процесс должен выглядеть примерно так[ISP]create isp0 server thread!информация,тогда запустите провайдера правильно,这时再查看新抓取из图像数据; (3) Запуск cameraademo захватывает только 5 данных изображения. Поскольку провайдеру требуется определенное количество кадров для расчета соответствующей экспозиции изображения, могут возникнуть ситуации, когда первые несколько изображений будут черными. Измените рабочие параметры cameraademo, чтобы сделать больше изображений. Просмотр данных (20 фотографий); (4)если это не такпересадкаispиз环境,Затем вы можете изменить параметры воздействия группы регистров в драйвере датчика. Конфигурация,Увеличьте время экспозиции во время инициализации.,Это делает исходную яркость выходного изображения более подходящей.

** camerademo Цвет собранного изображения ненормальный** Аномальные явления:

Язык кода:javascript
копировать
бегать camerademo 采集图像之назад,Я обнаружил, что захваченный контур правильный, но цвет неправильный.,Например, аномалии цвета, такие как перестановка красного и синего, красноватый или синеватый оттенок общего изображения и т. д.

При возникновении такой проблемы в первую очередь следует учитывать неправильную последовательность данных RGB в разделе «Конфигурация» в драйвере датчика. В драйвере датчика есть что-то похожее на следующее:

Язык кода:javascript
копировать
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
    },
};

Приведенная выше конфигурация указывает на то, что данные изображения, выводимые датчиком, имеют формат RAW10.,Порядок сортировки RGB — BGGR.,При возникновении нарушений цвета,Обычно это вызвано неправильным расположением RGB.,Существует 4 вида порядка расположения RGB (MEDIA_BUS_FMT_SBGGR10_1X10/MEDIA_BUS_FMT_SGBRG10_1X10/MEDIA_BUS_FMT_SGRBG10_1X10/MEDIA_BUS_FMT_SRGGB10_1X10).,Изменить драйвервmbus_codeдля上述из4Один из видов,Подтвердите, какой цвет более нормальный,Тогда Конфигурация драйвера правильная. Если есть какие-либо незначительные проблемы с цветом, например, недостаточно яркий или недостаточно точный и т. д.,Необходимость отладки эффекта управления,Улучшить цвет изображения。 Вышеупомянутое основано на 10 битах. Датчик представлен в качестве примера. Другие 8-битные, 12-битные и 14-битные версии аналогичны. См. выше.

  • Общий контур изображения нормальный, появляются крупные зеленые и пурпурно-красные цвета.

Вообще это может бытьcsi采样到изЮйв заказПоявлятьсядислокация

Убедитесь, что настройка вывода последовательности yuyv камерой соответствует ее характеристикам.

Если нет проблем с выводом последовательности yuyv камерой, это может быть связано с проблемами проводки, которые вызывают несовпадение при выборке данных pclk. В это время можно отрегулировать границу выборки pclk. Конкретные шаги заключаются в следующем:

В соответствующем исходном коде драйвера Camara, например ov5640.c, найдите определение макроса #define. CLK_POL。Это определение макроса может иметь два значенияV4L2_MBUS_PCLK_SAMPLE_RISINGиV4L2_MBUS_PCLK_SAMPLE_FALLING。若原来是其середина一个值,затем измените его на другое значение,Край выборки PCLK может быть инвертирован.

  • Общий контур рисунка нормальный, но появляются неправильные зеленые и фиолетовые полосы.

Как правило, возможно, что возможности управления pclk недостаточны, что приводит к рассогласованию при выборке данных в определенный момент времени.

Решение:

  • Если на трассе pclk имеется последовательный резистор, попробуйте уменьшить номинал резистора.
  • Чтобы улучшить возможности управления pclk, вам необходимо настроить внутренний регистр камеры.
  • Картина похожа на картину маслом, с кругами и кругами в переходных зонах.

Обычно линия данных CSI подключена неправильно, закорочена или разомкнута.

  • Распространенные ошибки: [VFE_WARN] Никто не ожидает в этом видеобуфере.

Верхний уровень вернул все буферы, но не получил их снова.

  • Распространенные ошибки — [VFE_WARN] Осталось только три буфера для csi

Верхний уровень занимает большую часть буферов и не вернул их. В драйверной части имеется только три буфера. В это время драйвер больше не будет переключать буферы, пока не будет возвращен буфер.

Меры предосторожности для аппаратного интерфейса датчика

(1) Если используется модуль датчика с параллельным портом,Будет использоваться скорость 720p при 30 кадрах в секунду или выше.,必须существоватьmclk/pclk/data/vsync/hsyncшампуры выше33ohmсопротивление,Все датчики 5M имеют последовательные резисторы;

(2) При использовании модулей Mipi разводка печатной платы должна гарантировать, что дифференциальные пары clk/data имеют одинаковую длину, одинаковое количество переходных отверстий и характеристическое сопротивление 100 Ом;

(3) Если вы используете модуль с контактом повторного использования параллельного порта, не рекомендуется повторно использовать контакт сброса;

(4) Длина кабеля модуля параллельного порта плюс длина дорожек на печатной плате не должна превышать 10 см, а длина кабеля модуля MIPI плюс длина дорожек на печатной плате не должна превышать 20 см. Обычно. использование за пределами этого расстояния не гарантируется.

(5) Линия данных параллельного порта главного управления имеет в общей сложности 12 бит от D11 до D0. Выход датчика параллельного порта обычно составляет 8/10 бит. Схематическое соединение должно быть выровнено по старшим битам.

Camera demo

Система Tina может использовать пакет camerademo в SDK, чтобы проверить, успешно ли трансплантирован датчик камеры (USB-камера). Если данные изображения могут быть захвачены и сохранены нормально, базовый драйвер и оборудование платы работают нормально.

демонстрационная конфигурация камеры

Введите корневой каталог Tina в командной строке и выполните команду make. Menuconfig входит в основной интерфейс Конфигурации.,и按以Вниз Конфигурацияпуть操作:

Язык кода:javascript
копировать
Allwinner
    └─>camerademo

Ссылка на исходный пост:https://v853.docs.aw-ol.com/soft/soft_camera/

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose