Руководство по разработке Linux MIPI CSI
Руководство по разработке Linux MIPI CSI

Каталог статей

Руководство по разработке Linux MIPI CSI

1 Предисловие

1.1 Введение в документ

Представьте конфигурацию драйвера VIN (видеовход), интерфейс API и использование верхнего уровня.

1.2 Целевые читатели

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

1.3 Область применения

Таблица 1-1: Список применимой продукции

Версия ядра

файл драйвера

Linux-4.9

drivers/media/platform/sunxi_vin/*.c

Linux-5.4

drivers/media/platform/sunxi_vin/*.c

2 Введение в модуль

2.1 Знакомство с функциями модуля

  1. Video input В основном состоит из интерфейсной части (CSI/MIPI) и блока обработки изображений (ISP/VIPP);
  2. CSI/MIPI Часть основных настроек видеоданных захвачена;
  3. ISP выполнить sensor raw data обработка данных, в том числе lens Компенсация, удаление битых пикселей, усиление, гамма, демозаика, шумоподавление, цвет. matrix и т. д. и некоторые 3A статистика;
  4. VIPP Он может уменьшить и поставить водяной знак Волякартина. VIPP поддерживать bayer raw data пройти ISP После обработки и последующей усадки он также подходит для общего использования. YUV Формат sensor Изображение картины напрямую уменьшено.

2.2 Введение в связанные термины

Таблица 2-1: Терминология программного обеспечения

Связанные термины

Объяснение

ISP

Процессор сигналов изображения Обработка сигналов изображения

VIPP

Постпроцессор видеовхода Постобработка входного изображения

MIPI

Интерфейс процессора для мобильной промышленности Интерфейс процессора для мобильной промышленности

CCI

Интерфейс управления камерой Интерфейс управления камерой

TDM

Мультиплексирование с временным разделением каналов ISP

MCLK

Главные часы (от точки доступа к камере) Главные часы камеры

PCLK

Пиксельная частота (от камеры к точке доступа, частота дискретизации для шины данных) Пиксельная частота

YUV

Color Presentation(Y for luminance,U&V for Цветность) формат данных изображения.

2.3 Введение в структуру драйверов

Рисунок 2-1: Блок-схема драйвера

Драйвер VIN можно разделить на уровень ядра, структуру видеоввода и уровень драйвера устройства.

2.3.1 Уровень ядра
  1. V4l2 Framework;
  2. Видеодрайвер ядра Linux версии 2 (Видео для Linux Two);
  3. Подходит для радио, видеокодеков, оборудования видеозахвата и вывода видео. машину;
  4. Служить /dev/videoX узел, применяющий Долженузел для выполнения соответствующего видеопотока и операций управления;
  5. Media Device Framework;
  6. Платформа мультимедийных устройств Linux;
  7. Подходит для управления топологией устройства;
  8. Обслуживать /dev/mediaX узел, применять Приложение Долженузел может получать топологию медиа-устройства и передавать API Управляйте направлением потока между подустройствами.
2.3.2 Уровень инфраструктуры ввода видео
  1. Video Control : Обработка видеокоманд (согласование разрешения, обработка формата данных, буфер менеджмент и др.);
  2. Runtime Handle : Управление временем выполнения (конвейер Управление, управление системными ресурсами, настройка прерываний и т.д.);
  3. Event Process : Управление событиями (такими как вызовы начальства, прерывания и другие события приема и распределения);
  4. Config Handle : Управление конфигурацией (например, топология оборудования, адаптивный список модулей, поверхность).
2.3.3 Уровень драйвера устройства
  1. Camera Modules : модульводить машина (картина датчика изображения, мотор фокусировки, вспышка и т.д. привод машину);
  2. Интерфейс камеры: драйвер интерфейса (MIPI, Sub-Lvds, HiSpi, Bt656, Bt601, Bt1120, DC и т. д.);
  3. Image Signal Processor : картинакак процессорводить машину(базовая обработкамодульводить машину,3A Статистические данные);
  4. Постпроцессор видеовхода: постобработка видеовхода (скалер, экранное меню и т. д.).

2.4 Введение в настройку модуля

2.4.1 Конфигурация меню конфигурации ядра
  1. Сначала введите Device Драйверы, выберите Multimedia support , а затем откройте Cameras/video grabbers support 、Media Controller support и SUNXI platform devices, Как показано ниже. ​

Рисунок 2-2: Конфигурация опции драйверов устройств

  1. Во-вторых, введите SUNXI platform устройства, выберите sunxi video input (camera csi/mipi isp vipp)driver и v4l2 new driver for SUNXI,Как показано ниже.

Рисунок 2-3: Конфигурация опции драйверов устройств

  1. Наконец, Суньси video input (camera csi/mipi isp vipp)driver Другие параметры в каталоге необходимо переключать в соответствии с фактическими требованиями к продукту, например: использование вспышки, мотор фокусировки, включение vin войти, использовать IOMMU Как показано ниже.

Рисунок 2-4: Конфигурация опции драйверов устройств

2.4.2 Инструкции по настройке дерева устройств

Конфигурация файла дерева устройств SoC Общая конфигурация для всех сценариев, для ARM64 CPU Например, путь в дереве устройств: kernel/{KERNEL_VERSION}/arch/arm64/boot/dts/sunxi/sun*.dtsi.

Конфигурация файла дерева устройств SoC Общая конфигурация для всех сценариев, для ARM32 CPU Например, путь в дереве устройств: kernel/{KERNEL_VERSION}/arch/arm/boot/dts/sun*.dtsi.

Дерево устройств уровня платы (board.dts) путь:

/device/config/chips/{IC}/configs/{BOARD}/KERNEL_VERSION/board.dts。

существовать sun*.dtsi* файл, SoC из CSI Общие сведения о конфигурации контроллера, которые, как правило, не рекомендуется изменять, CSI водить Специалист по обслуживанию машины поддерживает, если необходимо изменить Конфигурацию, пожалуйста, измените Дерево устройств уровня платы board.dts,Дерево устройств уровня платы Внутриконтент будет закрытsun.dtsi Соответствующая информация.

vind Конфигурация

Язык кода:javascript
копировать
&vind0 {
    vind0_clk = <336000000>;
    vind0_isp = <300000000>;
    status = "okay";
    
    tdm0:tdm@0 {
    	work_mode = <0>;
    };
    
    isp00:isp@0 {
    	work_mode = <0>;
    };
    
    scaler00:scaler@0 {
    	work_mode = <0>;
    };
    
    scaler10:scaler@4 {
    	work_mode = <0>;
    };
    
    scaler20:scaler@8 {
    	work_mode = <0>;
    };
    
    scaler30:scaler@12 {
    	work_mode = <0>;
    };
    
    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 = "imx386_mipi_2";
        sensor1_twi_cci_id = <0>;
        sensor1_twi_addr = <0x20>;
        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 = <0x0>;
        status = "okay";
    };
    vinc01:vinc@1 {
        vinc1_csi_sel = <2>;
        vinc1_mipi_sel = <0xff>;
        vinc1_isp_sel = <1>;
        vinc1_isp_tx_ch = <1>;
        vinc1_tdm_rx_sel = <1>;
        vinc1_rear_sensor_sel = <0>;
        vinc1_front_sensor_sel = <0>;
        vinc1_sensor_list = <0>;
        status = "disabled";
    };
    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";
    };
    …………
};

в:

status да vin водить Главный выключатель машиныиз, соответствующий изда media оборудование, использование vin должен быть установлен на okay; vind0_clk да vin модуль часов, вы действительно можете использовать его в соответствии с sensor из Частота кадров и Разрешение выставить; vind0_isp да isp Часы модуля при фактическом использовании могут основываться на sensor из Частота кадров и Разрешение выставить; vind0_clk выражать csi clk, формула расчета: частота кадров x (vts)x (hts)x 1(wdr Тогда это 2) / 8 / 1 (двойной pixelТогда это 2) / 1000000, округляется в большую сторону, единица измерения MH;vind0_isp выражать isp clk, формула расчета: частота кадров x Ширина x высокий x 1.2 / 1000000, округляется в большую сторону, единица измерения МХ; некоторые из них; ic да Нет isp_clk,csi_clk и isp_clk Вседанастраиватьсуществовать винд0_clk. Так vind0_clk установлен на csi_clk и isp_clk Максимальное из значения в;

work_mode: 0:online mode 1:offline mode, В соответствии с потребностями использования Конфигурация;

flash0_type: 0:FLASH_RELATING, 1:FLASH_EN_INDEPEND, 2:FLASH_POWER flash0_en: flash enable gpio, type = 0 of 1 flash0_mode: flash mode gpio, type = 0 of 1 flash0_flvdd: flash module io power handle string, pmu power supply, type = 2 flash0_flvdd_vol: flash module io power voltage, pmu power supply, type = 2 status: да Не использовать flash, disable От имени Гуана, окей представляет собой открытие

actuator0_name: vcm name actuator0_slave: vcm iic slave address actuator0_af_pwdn: vcm power down gpio actuator0_afvdd: vcm power handle string, pmu power supply actuator0_afvdd_vol: vcm power voltage, pmu power supply status: vcm if used, disable От имени Гуана, окей представляет собой открытие

device_type: sensor type sensor0_mname: sensor name sensor0_twi_cci_id:sensor Использовал twi или cci из id。 sensor0_twi_addr:sensor из twi адрес sensor0_mclk_id:sensor Использовал mclk из id。 sensor0_pos:sensor Из положения спереди или сзади в основном используйте плоскую пластину. sensor0_isp_used: not use isp 1:use isp sensor0_fmt: 0:yuv 1:bayer raw rgb sensor0_stby_mode: not shut down power at standby 1:shut down power at standby sensor0_vflip: flip in vertical direction 0:disable 1:enable sensor0_hflip: flip in horizontal direction 0:disable 1:enable sensor0_iovdd-supply: camera module io power handle string, pmu power supply sensor0_iovdd_vol: camera module io power voltage, pmu power supply sensor0_avdd-supply: camera module analog power handle string, pmu power supply sensor0_avdd_vol: camera module analog power voltage, pmu power supply sensor0_dvdd-supply: camera module core power handle string, pmu power supply sensor0_dvdd_vol: camera module core power voltage, pmu power supply sensor0_power_en: camera module power enable gpio sensor0_reset: camera module reset gpio sensor0_pwdn: camera module pwdn gpio sensor0_sm_hs: camera module sm_hs gpio sensor0_sm_vs: camera module sm_vs gpio status: open or close sensor de vice flash/actautor/sensor узел используется для соответствия изPeripheral изSwitch и Конфигурация. Данные узлы Конфигурация вообще требуют участия Проверьте соответствующую схему на изображении периферийных устройств. data sheet завершить.

vinc0_csi_sel:выражать Должен pipeline начальство parser из id, должен быть Конфигурация, и значение для действительно. id。 vinc0_mipi_sel:выражать Должен pipeline начальство mipi(sublvds/hispi)из идентификатор, когда он не используется 0xff。 vinc0_isp_sel:выражать Должен pipeline начальство isp из идентификатор, реквизит Конфигурация, когда isp Когда оно пусто, это isp Только давыражать маршрутизацию не делается isp из обработки эффектов. vinc0_isp_tx_ch выражать Должен pipeline начальство isp из ch,должен Конфигурация,по умолчаниюдля 0. когда sensor да bt656 многоканальный WDR вне RAW когда, ch Может Конфигурация 0~3 изценить。 vinc0_tdm_rx_sel: выражать Должен pipeline начальство tdm rx из ch,должен Конфигурация,по умолчаниюдля 0. когда не использует функция tdm, для настройки 0xff; vinc0_rear_sensor_sel выражать Должен pipeline начальствоиспользовать изпост sensor из id。 vinc0_front_sensor_sel выражать Должен pipeline начальное использование из префикса sensor из id。 vinc0_sensor_list выражатьда Не использовать sensor_list Поставляется адаптированным к различным модулям, 1 выражатьиспользовать,0 выражать Нетиспользовать。 work_mode: 0:online mode 1:offline mode, В соответствии с потребностями использования Конфигурация;Толькоиметь vinc0/4/8/12 Может Конфигурация。 status:vipp из включения переключателя, окей or disable。

2.5 Структура модуля исходного кода

Путь к драйверу находится в каталоге driver/media/platform/sunxi-vin.

Язык кода:javascript
копировать
sunxi-vin:.
├── Kconfig
├── Makefile
├── modules
│   ├── actuator
│   │   ├── actuator.c     ;vcm драйвериз общей линиидля
│   │   ├── actuator.h     ;vcm драйвер — заголовочный файл
│   │   ├── ad5820_act.c   ;Конкретный vcm driverмодельвыполнить
│   │   ├── an41908a_act.c ;Конкретный vcm driverмодельвыполнить
│   │   ├── dw9714_act.c   ;Конкретный vcm driverмодельвыполнить
│   │   ├── Makefile       ;Компилировать файл
│   ├── flash
│   │   ├── flash.c ; управление заполняющим светодиодным освещением восстанавливается;
│   │   ├── flash.h ;Светодиодный заполняющий свет привод заголовочный файл машины
│   └── sensor
│   ├── ar0238.c      ;специфическийизsensorводить машину
│   ├── camera_cfg.h  ;camera Файл заголовка расширенной команды ioctl
│   ├── camera.h      ;файл заголовка общедоступной структуры камеры
│   ├── gc030a_mipi.c ;специфическийизsensorводить машину
│   ├── gc0310_mipi.c ;специфическийизsensorводить машину
│   ├── gc5024_mipi.c ;специфическийизsensorводить машину
│   ├── imx179_mipi.c ;специфическийизsensorводить машину
│   ├── imx214.c      ;специфическийизsensorводить машину
│   ├── imx219.c      ;специфическийизsensorводить машину
│   ├── imx317_mipi.c ;специфическийизsensorводить машину
│   ├── Makefile      ;водить машинуизкомпилировать файл
│   ├── nvp6134     ;Специальный издвп sensorводить машину
│   │   ├── acp.c
│   │   ├── acp_firmup.c
│   │   ├── acp_firmup.h
│   │   ├── acp.h
│   │   ├── common.h
│   │   ├── csi_dev_nvp6134.c
│   │   ├── csi_dev_nvp6134.h
│   │   ├── eq.c
│   │   ├── eq_common.c
│   │   ├── eq_common.h
│   │   ├── eq.h
│   │   ├── eq_recovery.c
│   │   ├── eq_recovery.h
│   │   ├── Makefile
│   │   ├── nvp6134c.c ;специфическийизsensorводить машинувыполнить
│   │   ├── type.h
│   │   ├── video.c
│   │   └── video.h
│   ├── nvp6158 ;Специальный издвп sensorводить машину
│   │   ├── audio.c ;Аудио часть восстанавливается
│   │   ├── audio.h ;Интерфейс файла заголовка аудиочасти
│   │   ├── coax_protocol.c
│   │   ├── coax_protocol.h
│   │   ├── coax_table.h
│   │   ├── common.h
│   │   ├── Makefile
│   │   ├── modules.builtin
│   │   ├── modules.order
│   │   ├── motion.c
│   │   ├── motion.h
│   │   ├── nvp6158c.c ;специфическийизsensorводить машинувыполнить
│   │   ├── nvp6158_drv.c
│   │   ├── nvp6158_drv.h
│   │   ├── nvp6168_eq_table.h
│   │   ├── video_auto_detect.c
│   │   ├── video_auto_detect.h
│   │   ├── video.c
│   │   ├── video_eq.c
│   │   ├── video_eq.h
│   │   ├── video_eq_table.h
│   │   ├── video.h
│   ├── rn6854m_mipi.c ;специфическийизsensorводить машинувыполнить
│   ├── sensor-compat-ioctl32.c
│   ├── sensor_helper.c ;водить машину Функциональный интерфейсизвыполнить
│   ├── sensor_helper.h ;водить Интерфейс функции машины из определения
├── modules.builtin
├── modules.order
├── platform
│   ├── platform_cfg.h ;vin Platform Файл конфигурации
│   ├── sun50iw10p1_vin_cfg.h ; Конфигурационные файлы для разных платформ;
│   ├── sun50iw3p1_vin_cfg.h ; Конфигурационные файлы для разных платформ;
│   ├── sun50iw6p1_vin_cfg.h ; Конфигурационные файлы для разных платформ;
│   ├── sun50iw9p1_vin_cfg.h ; Конфигурационные файлы для разных платформ;
│   ├── sun8iw12p1_vin_cfg.h ; Конфигурационные файлы для разных платформ;
│   ├── sun8iw15p1_vin_cfg.h ; Конфигурационные файлы для разных платформ;
│   ├── sun8iw16p1_vin_cfg.h ; Конфигурационные файлы для разных платформ;
│   └── sun8iw19p1_vin_cfg.h ; Конфигурационные файлы для разных платформ;
├── top_reg.c
├── top_reg.h
├── top_reg_i.h
├── top_reg.o
├── utility
│   ├── bsp_common.c
│   ├── bsp_common.h
│   ├── bsp_common.o
│   ├── cfg_op.c ;Читать ini-файл, выполнить функцию
│   ├── cfg_op.h ;Читать ini-файл, выполнить функцию
│   ├── config.c ;Напряжение датчика, выбор канала, адрес i2c и другие функции считывания информации
│   ├── config.h ;Напряжение датчика, выбор канала, адрес i2c и другие функции считывания информационный заголовочный файл
│   ├── vin_io.h ;винмодуль заголовочный файл операции регистрации
│   ├── vin_os.c
│   ├── vin_os.h
│   ├── vin_supply.c
│   ├── vin_supply.h
├── vin.c
├── vin-cci
│   ├── bsp_cci.c Нижний слой bsp-функция
│   ├── bsp_cci.h Нижний слой заголовочный файл bsp-функции
│   ├── cci_helper.c ;cci Функция помощи для сенсорного привода машинувызов
│   ├── cci_helper.h ;cci Заголовочный файл функции справки
│   ├── csi_cci_reg.c cci аппаратную базу слоявыполнить;
│   ├── csi_cci_reg.h cci аппаратную базу слойвыполнить;заголовочный файл
│   ├── csi_cci_reg_i.h ;cci Зарегистрировать файл заголовка ресурса
│   ├── Kconfig
│   ├── sunxi_cci.c ;cci платформаводить исходный файл машины
│   ├── sunxi_cci.h ;cci платформаводить заголовочный файл машины
├── vin-csi
│   ├── parser_reg.c   ;Функция управления CSI
│   ├── parser_reg.h   ;Функция управления Заголовочный файл CSI
│   ├── parser_reg_i.h ;CSI Регистрируемое значение
│   ├── sunxi_csi.c    ;csi ребенокмодульводить исходный файл машины
│   ├── sunxi_csi.h    ;csi ребенокмодульводить заголовочный файл машины
├── vin.h
├── vin-isp
│   ├── isp500
│   │   ├── isp500_reg_cfg.c
│   │   ├── isp500_reg_cfg.h
│   │   ├── isp500_reg_cfg.o
│   │   └── isp500_reg.h
│   ├── isp520
│   │   ├── isp520_reg_cfg.c
│   │   ├── isp520_reg_cfg.h
│   │   └── isp520_reg.h
│   ├── isp521
│   │   ├── isp521_reg_cfg.c
│   │   ├── isp521_reg_cfg.h
│   │   └── isp521_reg.h
│   ├── isp522
│   │   ├── isp522_reg_cfg.c
│   │   ├── isp522_reg_cfg.h
│   │   └── isp522_reg.h
│   ├── isp_default_tbl.h
│   ├── sunxi_isp.c
│   ├── sunxi_isp.h
│   └── sunxi_isp.o
├── vin-mipi
│   ├── bsp_mipi_csi.c Нижний слоймипи bsp-функция
│   ├── bsp_mipi_csi.h Нижний слоймипи заголовочный файл bsp-функции
│   ├── bsp_mipi_csi_null.c Нижний слоймипи пустая функция bsp
│   ├── bsp_mipi_csi_v1.c   Нижний слоймипи bsp-функция--v1
│   ├── combo_common.h
│   ├── combo_csi
│   │   ├── combo_csi_reg.c
│   │   ├── combo_csi_reg.h
│   │   └── combo_csi_reg_i.h
│   ├── combo_rx
│   │   ├── combo_rx_reg.c
│   │   ├── combo_rx_reg.h
│   │   ├── combo_rx_reg_i.h
│   │   └── combo_rx_reg_null.c
│   ├── dphy
│   │   ├── dphy.h ;mipi заголовочный файл dphy
│   │   ├── dphy_reg.c ;mipi dphy базовый слойвыполнить функцию
│   │   ├── dphy_reg.h ;mipi dphy базовый слойвыполнить файл functionHeader
│   │   └── dphy_reg_i.h ;mipi dphy Зарегистрировать файл заголовка ресурса
│   ├── protocol
│   │   ├── protocol.h ;файл заголовка слоя протокола mipi
│   │   ├── protocol_reg.c ;mipiпротоколслойконецслойвыполнить
│   │   ├── protocol_reg.h ;базовый слой слоя протокола MIPIвыполнить заголовочный файл
│   │   └── protocol_reg_i.h
│   ├── protocol.h
│   ├── sunxi_mipi.c
│   ├── sunxi_mipi.h
├── vin-stat
│   ├── vin_h3a.c ;3A функция интерфейса управления
│   ├── vin_h3a.h ;3A функция интерфейса управлениязаголовочный файл
├── vin-tdm
│   ├── tdm_reg.c ;Функция управления регистром TDM
│   ├── tdm_reg.h
│   ├── tdm_reg_i.h
│   ├── vin_tdm.c
│   └── vin_tdm.h
├── vin_test
│   ├── mplane_image
│   │   ├── csi_test_mplane.c ;cameraПонятькартинатествариант использования
│   │   └── Makefile ;проверить файл компиляции вариантов использования
│   ├── sunxi_camera_v2.h
│   └── sunxi_display2.h
├── vin-video
│   ├── dma_reg.c ;csi функция управления регистром dma
│   ├── dma_reg.h ;csi функция управления регистром dma
│   ├── dma_reg_i.h ;csi dma Регистрируемое значениеопределениезаголовочный файл
│   ├── vin_core.c ;винмодулькор
│   ├── vin_core.h ;винмодулькорзаголовочный файл
│   ├── vin_video.c ; обработка формата данных, выбор канала канала, управление буфером и другие функции
│   ├── vin_video.h ;обработка формата данных, выбор канала канала, управление буфером и другие функциизаголовочный файл
└── vin-vipp
    ├── sunxi_scaler.c ;картинаподобная функция обработки сжатия
    ├── sunxi_scaler.h ;картинаподобная функция обработки сжатиязаголовочный файл
    ├── vipp_reg.c ;vipp функция управления регистром
    ├── vipp_reg.h ;vipp функция управления регистромзаголовочный файл
    ├── vipp_reg_i.h ; vipp файл заголовка описания конкретного регистра

3 Описание интерфейса V4L2

3.1 VIDIOC_QUERYCAP

3.1.1 Parameters
Язык кода:javascript
копировать
Capability of csi driver(struct v4l2_capability * capability)
struct v4l2_capability {
    __u8 driver[16];    /* i.e. "bttv" */
    __u8 card[32];      /* i.e. "Hauppauge WinTV" */
    __u8 bus_info[32];  /* "PCI:" + pci_name(pci_dev) */
    __u32 version;      /* should use KERNEL_VERSION() */
    __u32 capabilities; /* Device capabilities */
    __u32 reserved[4];
};
3.1.2 Returns

Success:0; Fail: Failure Number

3.1.3 Description

получатьводить машинуизимя、Версия、поддерживатьиз capabilities и т. д., например V4L2_CAP_STREAMIN,V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE ждать.

3.2 VIDIOC_ENUM_INPUT

3.2.1 Parameters
Язык кода:javascript
копировать
input(struct v4l2_input *inp)
struct v4l2_input {
    __u32 index;    /* Which input */
    __u8 name[32];  /* Label */
    __u32 type;     /* Type of input */
    __u32 audioset; /* Associated audios (bitfield) */
    __u32 tuner;    /* Associated tuner */
    v4l2_std_id std;
    __u32 status;
    __u32 capabilities;
    __u32 reserved[3];
};
3.2.2 Returns

Success:0; Fail: Failure Number

3.2.3 Description

получатьводить машинуподдерживатьиз input индекс. На данный момент драйвер поддерживает только input index = 0 или index = 1。

Index = 0 выражать primary csi device

Index = 1 выражать secondary csi device

Приложение вводит параметр индекса, а драйвер возвращает тип. Для устройств VIN введите V4L2_INPUT_TYPE_CAMERA.

3.3 VIDIOC_S_INPUT

3.3.1 Parameters
Язык кода:javascript
копировать
input(struct v4l2_input *inp)
The same as VIDIOC_ENUM_INPUT
3.3.2 Returns

Success:0; Fail: Failure Number

3.3.3 Description

проходить inp.index Установить текущий доступ к из csi device для primary device Ну давай же secondary device。

Index = 0 (Конфигурация двойной камеры в целом соответствует задней камере. Мориться имеет только одно устройство камеры, то index Исправлено для0)

Индекс = 1 (конфигурация двойной камеры, обычно соответствует передней камере)

вызов Должен После интерфейса,действительныйначальствода csi device Выполните работу по инициализации.

существовать A133 Платформа: Индекс существовать video0、1 Всегда устанавливайте для когда 0;существовать video2、3 Чтобы установить для 1。

3.4 VIDIOC_G_INPUT

3.4.1 Parameters
Язык кода:javascript
копировать
input(struct v4l2_input *inp)
The same as VIDIOC_ENUM_INPUT
3.4.2 Returns

Success:0; Fail: Failure Number

3.4.3 Description

получать inp.index, определяет текущую настройку из csi device для primary device Ну давай же secondary device。

Index = 0 (Конфигурация двойной камеры в целом соответствует задней камере. Мориться имеет только одно устройство камеры, то index Исправлено для0)

Индекс = 1 (конфигурация двойной камеры, обычно соответствует передней камере)

3.5 VIDIOC_S_PARM

3.5.1 Parameters
Язык кода:javascript
копировать
Parameter(struct v4l2_streamparm *parms)
struct v4l2_streamparm {
    enum v4l2_buf_type type;
    union {
        struct v4l2_captureparm capture;
        struct v4l2_outputparm output;
        __u8 raw_data[200]; /* user-defined */
    } parm;
};
struct v4l2_captureparm {
    __u32 capability; /* Supported modes */
    __u32 capturemode; /* Current mode */
    struct v4l2_fract timeperframe; /* Time per frame in .1us units */
    __u32 extendedmode; /* Driver-specific extensions */
    __u32 readbuffers; /* # of buffers for read */
    __u32 reserved[4];
};
3.5.2 Returns

Success:0; Fail: Failure Number

3.5.3 Description

CSI Что касается устройства ввода, обратите внимание только на на parms.type и parms. capture。

При использовании приложениями parms.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;

где установлено значение parms->capture.capturemode(V4L2_MODE_VIDEO или V4L2_MODE_IMAGE),

выполнитьвидеоиликартинакусокизколлекция。проходитьнастраивать parms->capture.timeperframe,Частоту кадров можно установить.

3.6 VIDIOC_G_PARM

3.6.1 Parameters
Язык кода:javascript
копировать
Parameter(struct v4l2_streamparm *parms)
The same as VIDIOC_S_PARM
3.6.2 Returns

Success:0; Fail: Failure Number

3.6.3 Description

При использовании приложениями parms.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;

проходить parms->capture.capturemode Возвратный ток да V4L2_MODE_VIDEO или V4L2_MODE_IMAGE;

проходить parms->capture.timeperframe, Вернуться в Текущие настройки Частота кадров。

3.7 VIDIOC_ENUM_FMT

3.7.1 Parameters
Язык кода:javascript
копировать
V4L2 format(struct v4l2_fmtdesc * fmtdesc)
struct v4l2_fmtdesc {
    __u32 index; /* Format number */
    enum v4l2_buf_type type; /* buffer type */
    __u32 flags;
    __u8 description[32]; /* Description string */
    __u32 pixelformat; /* Format fourcc */
    __u32 reserved[4];
};
3.7.2 Returns

Success:0; Fail: Failure Number

3.7.3 Description

получатьводить машинуподдерживатьиз V4L2 Формат.

ввод приложения type,index Параметры, возвраты драйвера pixelformat . для VIN Для оборудования введите дляV4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE。

3.8 VIDIOC_TRY_FMT

3.8.1 Parameters
Язык кода:javascript
копировать
Video type, format and size(struct v4l2_format * fmt)
struct v4l2_format {
    enum v4l2_buf_type type;
    union {
        struct v4l2_pix_format pix;
        struct v4l2_pix_format_mplane pix_mp;
        struct v4l2_window win;
        struct v4l2_vbi_format vbi;
        struct v4l2_sliced_vbi_format sliced;
        __u8 raw_data[200];
    } fmt;
};
struct v4l2_pix_format {
    __u32 width;
    __u32 height;
    __u32 pixelformat;
    enum v4l2_field field;
    __u32 bytesperline; /* for padding, zero if unused */
    __u32 sizeimage;
    enum v4l2_colorspace colorspace;
    __u32 priv; /* private data, depends on pixelformat */
};
3.8.2 Returns

Success:0; Fail: Failure Number

3.8.3 Description

В зависимости от типа захвата видео、Формат и размер, режим оценки、Формат и т. д. да вести машинаподдержание. Никакие аппаратные настройки не будут изменены.

для VIN устройство, тип для V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE. использовать struct v4l2_pix_format_mplane Передать параметры.

ввод приложения struct v4l2_pix_format_mplane Внутри конструкции из width、height、pixelformat、field ждать Параметры, возвраты драйвераближайшийиз ширина、высота;нравиться pixelformat、field Если поддержка не выбрана, по умолчанию будет выбран привод. Первый тип формата поддерживается аппаратом.

3.9 VIDIOC_S_FMT

3.9.1 Parameters
Язык кода:javascript
копировать
Video type, format and size(struct v4l2_format * fmt)
The same as VIDIOC_TRY_FMT
3.9.2 Returns

Success:0; Fail: Failure Number

3.9.3 Description

Установите тип, формат и размер захвата видео. VIDIOC_TRY_FMT будет вызываться перед настройкой.

для VIN устройство, тип для V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE. использовать struct v4l2_pix_format_mplane Передать параметры.ввод приложения width、height、pixelformat、field ждать,водить машина возвращает ближайший из width、height; нравиться pixelformat、field Если поддержка не выбрана, по умолчанию будет выбран привод. Первый тип формата поддерживается аппаратом.

Заявки необходимо подавать с оформлением заказа машинувозвращатьсяиз width、height、pixelformat、field Подождите и затем используйте параметр передачииз. для OSD устройство, тип для V4L2_BUF_TYPE_VIDEO_OVERLAY. использовать struct v4l2_windowПередать параметры.

ввод номер водяного знака приложения, положение и размер окна, растровое изображение адрес、bitmap формат и global_alpha ждать.водить машина сохранит эти параметры и будет существовать VIDIOC_OVERLAY Команда вступает в силу после передачи команды включения.

3.10 VIDIOC_G_FMT

3.10.1 Parameters
Язык кода:javascript
копировать
Video type, format and size(struct v4l2_format * fmt)
The same as VIDIOC_TRY_FMT
3.10.2 Returns

Success:0; Fail: Failure Number

3.10.3 Description

получатьзахватыватьвидеоиз width、height、pixelformat、field、bytesperline、sizeimage и другие параметры.

3.11 VIDIOC_OVERLAY

3.11.1 Parameters
Язык кода:javascript
копировать
Overlay on/off(unsigned int i)
3.11.2 Returns

Success:0; Fail: Failure Number

3.11.3 Description

передача 1 выражатьдавать возможность,0 выражение закрыто. Будет обновлено, когда настройка будет включена. osd параметры, которые сделают его эффективным.

3.12 VIDIOC_REQBUFS

3.12.1 Parameters
Язык кода:javascript
копировать
Buffer type ,count and memory map type(struct v4l2_requestbuffers * req)
struct v4l2_requestbuffers {
    __u32 count;
    enum v4l2_buf_type type;
    enum v4l2_memory memory;
    __u32 reserved[2];
};
3.12.2 Returns

Success:0; Fail: Failure Number

3.12.3 Description

v4l2_requestbuffers Количество кэшей определяется в структуре, привести соответственно, машина будет претендовать на соответствующее количество видеокэшей. Для создания можно использовать несколько кэшей FIFO для повышения эффективности сбора видео. Эти buffer Приложение ядра, после приложения требуется предоставление mmap метод, сопоставленный с User космос.

Подсчет: Для определения требуется приложение из количества видеобуфера;

Type:для VIN Оборудование, для V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;

Память: в настоящее время поддерживаются режимы V4L2_MEMORY_MMAP, V4L2_MEMORY_USERPTR и V4L2_MEMORY_DMABUF.

Приложение начало передачи описывает три параметра: машина будет основана на VIDIOC_S_FMT Установите формат вычислений по мере необходимости buffer от размера и возврата count количество.

3.13 VIDIOC_QUERYBUF

3.13.1 Parameters
Язык кода:javascript
копировать
Buffer type ,index and memory map type(struct v4l2_buffer *buf)
struct v4l2_buffer {
    __u32 index;
    enum v4l2_buf_type type;
    __u32 bytesused;
    __u32 flags;
    enum v4l2_field field;
    struct timeval timestamp;
    struct v4l2_timecode timecode;
    __u32 sequence;
    
    /* memory location */
    enum v4l2_memory memory;
    union {
        __u32 offset;
        unsigned long userptr;
        struct v4l2_plane *planes;
    } m;
    __u32 length;
    __u32 input;
    __u32 reserved;
};
3.13.2 Returns

Success:0; Fail: Failure Number

3.13.3 Description

проходить struct v4l2_buffer Структура из индекс, получить доступ к соответствующему порядковому номеру из буфер, получить в соответствующий buffer из Кэшировать информацию. В основном используется length информация и m.offset информация для завершения mmap действовать.

3.14 VIDIOC_DQBUF

3.14.1 Parameters
Язык кода:javascript
копировать
Buffer type ,index and memory map type(struct v4l2_buffer *buf)
struct v4l2_buffer is the same as VIDIOC_QUERYBUF
3.14.2 Returns

Success:0; Fail: Failure Number

3.14.3 Description

Воля driver Уже заполненные данныеиз buffer столбец вне, для использования приложения.

Приложение на основе index идентифицировать буфер, в это время m.offset выражать buffer переписыватьсяизфизикаадрес。

3.15 VIDIOC_QBUF

3.15.1 Parameters
Язык кода:javascript
копировать
Buffer type ,index and memory map type(struct v4l2_buffer *buf)
3.15.2 Returns

Success:0; Fail: Failure Number

3.15.3 Description

Воля User Помещение обработано буфер, запрос, передача драйвер, ожидающий заполнения данных.

Приложение на основе index идентифицировать buffer。

3.16 VIDIOC_STREAMON

3.16.1 Parameters
Язык кода:javascript
копировать
Buffer type(enum v4l2_buf_type *type)
3.16.2 Returns

Success:0; Fail: Failure Number

3.16.3 Description

здесь из buffer type для V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE. запустить это IOCTL, Воля buffer все в очереди buffer Присоединяйтесь к команде и активируйте CSIC DMA Аппаратное прерывание, каждое прерывание завершает кадр buffer данныеиззаполнять。

3.17 VIDIOC_STREAMOFF

3.17.1 Parameters
Язык кода:javascript
копировать
Buffer type(enum v4l2_buf_type *type)
3.17.2 Returns

Success:0; Fail: Failure Number

3.17.3 Description

здесь из buffer type для V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE. запустить это IOCTL, хватит снимать видео, Воля frame buffer Очередь опустеет и video buffer выпускать.

3.18 VIDIOC_QUERYCTRL

3.18.1 Parameters
Язык кода:javascript
копировать
Control id and value(struct v4l2_queryctrl *qc)
struct v4l2_queryctrl {
    __u32 id;
    enum v4l2_ctrl_type type;
    __u8 name[32]; /* Whatever */
    __s32 minimum; /* Note signedness */
    __s32 maximum;
    __s32 step;
    __s32 default_value;
    __u32 flags;
    __u32 reserved[2];
};
3.18.2 Returns

Success:0; Fail: Failure Number

3.18.3 Description

Заявление id Параметры, возвраты драйверу необходимо настроить параметрыиз name,minmum,maximum,default_value и шаг шаг. (зависит от v4l2 conctrols framework Завершено) На данный момент возможно утверждениеиз id Пожалуйста, обратитесь к VIDIOC_S_CTRL。

3.19 VIDIOC_S_CTRL

3.19.1 Parameters
Язык кода:javascript
копировать
Control id and value(struct v4l2_queryctrl *qc)
The same as VIDIOC_QUERYCTRL
3.19.2 Returns

Success:0; Fail: Failure Number

3.19.3 Description

Заявление id,value Параметры, да camera водить машина устанавливается в соответствии с параметром из.

Водитель сначала позвонит vidioc_queryctrl, судья id данетподдерживать,value данетсуществовать minimum и maximum между. (зависит от v4l2 conctrols framework Завершено) На данный момент возможно утверждениеиз id и value См. вложение.

3.20 VIDIOC_G_CTRL

3.20.1 Parameters
Язык кода:javascript
копировать
Control id and value(struct v4l2_queryctrl *qc)
The same as VIDIOC_QUERYCTRL
3.20.2 Returns

Success:0; Fail: Failure Number

3.20.3 Description

Заявление id, драйвер возвращает соответствующий id Текущие настройки value。

3.21 VIDIOC_ENUM_FRAMESIZES

3.21.1 Parameters
Язык кода:javascript
копировать
index,type,format(struct v4l2_frmsizeenum)
enum v4l2_frmsizetypes {
    V4L2_FRMSIZE_TYPE_DISCRETE = 1,
    V4L2_FRMSIZE_TYPE_CONTINUOUS = 2,
    V4L2_FRMSIZE_TYPE_STEPWISE = 3,
};

struct v4l2_frmsize_discrete {
    __u32 width; /* Frame width [pixel] */
    __u32 height; /* Frame height [pixel] */
};

struct v4l2_frmsize_stepwise {
    __u32 min_width;   /* Minimum frame width [pixel] */
    __u32 max_width;   /* Maximum frame width [pixel] */
    __u32 step_width;  /* Frame width step size [pixel] */
    __u32 min_height;  /* Minimum frame height [pixel] */
    __u32 max_height;  /* Maximum frame height [pixel] */
    __u32 step_height; /* Frame height step size [pixel] */
};

struct v4l2_frmsizeenum {
    __u32 index;        /* Frame size number */
    __u32 pixel_format; /* Pixel format */
    __u32 type;         /* Frame size type the device supports. */
    union {             /* Frame size */
        struct v4l2_frmsize_discrete discrete;
        struct v4l2_frmsize_stepwise stepwise;
	};
	__u32 reserved[2]; /* Reserved space for future use */
};
3.21.2 Returns

Success:0; Fail: Failure Number

3.21.3 Description

Передайте его согласно заявке индекс, формат пикселя, возврат драйвера тип и на основе type заполнять discrete или step-wise изценить。Discrete выражать разрешение, фиксированное по ступенчатому значению; выражать разрешение имеет минимальное и максимальное значение, и в соответствии с шагом постепенно. начальствослой по возврату из типа, делайте соответствующие разные издействовать.

3.22 VIDIOC_ENUM_FRAMEINTERVALS

3.22.1 Parameters
Язык кода:javascript
копировать
Index,format,size,type(struct v4l2_frmivalenum)
enum v4l2_frmivaltypes {
    V4L2_FRMIVAL_TYPE_DISCRETE = 1,
    V4L2_FRMIVAL_TYPE_CONTINUOUS = 2,
    V4L2_FRMIVAL_TYPE_STEPWISE = 3,
};
struct v4l2_frmival_stepwise {
    struct v4l2_fract min;  /* Minimum frame interval [s] */
    struct v4l2_fract max;  /* Maximum frame interval [s] */
    struct v4l2_fract step; /* Frame interval step size [s] */
};
struct v4l2_frmivalenum {
    __u32 index;        /* Frame format index */
    __u32 pixel_format; /* Pixel format */
    __u32 width;        /* Frame width */
    __u32 height;       /* Frame height */
    __u32 type;         /* Frame interval type the device supports. */
    union {             /* Frame interval */
        struct v4l2_fract discrete;
        struct v4l2_frmival_stepwise stepwise;
    };
    __u32 reserved[2]; /* Reserved space for future use */
};
3.22.2 Returns

Success:0; Fail: Failure Number

3.22.3 Description

Заявление пиксельный_формат, ширина, высота, возврат драйвера тип и на основе type заполнять

V4L2_FRMIVAL_TYPE_DISCRETE、V4L2_FRMIVAL_TYPE_CONTINUOUS илиV4L2_FRMIVAL_TYPE_STEPWISE。Discrete выражатьподдерживатьодинокийиз Частота кадров;stepwise выражатьподдерживатьшаг за шагомиз Частота кадров。

3.23 VIDIOC_ISP_EXIF_REQ

эффект: Получить текущую фотографию из EXIF Информация, заполняемая в соответствующее поле кодировки. Рубрика: для raw sensor Постарайтесь быть как можно более формальным EXIF информация, юв sensor Должен IOCTRL Его тоже можно использовать, но Вождениезаполнение также является фиксированной величиной. Связанные параметры:

Язык кода:javascript
копировать
struct v4l2_fract {
    __u32 numerator;
    __u32 denominator;
};

struct isp_exif_attribute {
    struct v4l2_fract exposure_time;
    struct v4l2_fract shutter_speed;
    __u32 aperture;
    __u32 focal_length;
    __s32 exposure_bias;
    __u32 iso_speed;
    __u32 flash_fire;
    __u32 brightness;
};

struct v4l2_fract exposure_time;
Время экспозиции: тип дроби, например числитель. = 1,denominator = 200, то время экспозиции составляет 1/200 секунды.

struct v4l2_fract shutter_speed;
Степень выдержки: дробный тип, например, числитель. = 1,denominator = 200, то выдержка составит 1/200 секунды. (Фактические значения времени выдержки начальства такие же)

__u32 aperture;
Размер диафрагмы: FNumber, например диафрагма = 22, тогда выразите, размер диафрагмы для 2.2, это FNumber = 22/10;

__u32 focal_length;
Фокусное расстояние: например, focus_length = 1400, то фокусное расстояние будет 14 мм, что и есть FocalLength. = 1400/100( mm);

__s32 exposure_bias;
Компенсация экспозиции: Диапазон -4~4

__u32 iso_скорость;
Светочувствительная степень скорости: 50 ~ 3200

__u32 flash_fire;
Включена ли вспышка: flash_fire = 1 выразить Вспышка включена, flash_fire = 0 выразить вспышка не включается.

__u32 brightness;
картинакак яркийстепень:0~255.

Пример использования:
int V4L2CameraDevice::getExifInfo(struct isp_exif_attribute *exif_attri)
{
    int ret = -1;
    if (mCameraFd == NULL)
    {
	    return 0xFF000000;
    }
    ret = ioctl(mCameraFd, VIDIOC_ISP_EXIF_REQ, exif_attri);
    return ret;
}

4 примера использования модуля

4.1 Тестовая демонстрация

модульиспользоватьиз demo код находится по адресу driver/media/platform/sunxi-vin/vin_test/mplane_image вы можете напрямую; make генерировать демо; поставь demo Нажмите его на машину и выполните, чтобы указать video узелизкартинакартина。рекомендоватьсуществовать pc начальствосоздавать bat Пакетный файл, используйте adb Команда завершения серии захватов, бита Содержание указано следующим образом. Обратите внимание на модификации для разных машин. push Заходим в изпуть:

Язык кода:javascript
копировать
del .\result\*.bin
adb root
adb remount
adb shell "mkdir /vendor/extsd/"
adb shell "mkdir /vendor/extsd/result"
adb shell rm /vendor/extsd/result/*.bin
adb push демонстрационный путь\csi_test_mplane /vendor/extsd/csi_test1
adb shell chmod 777 /vendor/extsd/csi_test1
adb shell "cd /vendor/extsd/ && ./csi_test1 0 0 1920 1080 ./result 1 20000 60 0"
adb shell ls /vendor/extsd/result
adb pull /vendor/extsd/result
pause

наконец-тосуществовать bat Инструкция из папки result Внутри папки сохраните двоичную изкартину, например данные. *.bin файл доступен; RawViewer Подождите, пока программное обеспечение просмотрит данные изображения. демо Описание параметра: 0 0 1920 1080 ./result 1 20000 60 0,соответственновыражать video0,set_input index0, целевое разрешение Ширина, целевое разрешение высокое, интервал Путь сохранения файла, формат изображения (например, NV21, конкретное значение можно увидеть demo Код из s_fmt параметры), количество собранных кадров (количество кадров больше, чем 10000 То есть для всегда включен узел), целевая частота кадров, идея, быть ли включенным wdr。

4.2 Процесс вызова

Рисунок 4-1: Процесс вызова CSI

5 FAQ

5.1 Метод отладки

5.1.1 Отладка узлов

Рисунок 5-1: узел vi

Когда система включает макрос компиляции DEBUG_FS, вы можете просмотреть его по команде cat /sys/kernel/debug/mpp/vi; в противном случае вы можете это сделать;

cat /sys/devices/platform/soc@2900000/2000800.vind/vi。

vi узел сохранить изда текущего илиначальства однажды работа (текущая Нет работы) изостояние.ниже лица vi узелиз Ключевая информация пояснена.

CSI_TOP、CSI_ISP соответственно да соответствующий CSI、и ISP вход рабочей частоты; одна линиявыражать CSI получен размер планшета изкартина, фмт выражатьвходитьданныеиз Формат;

output выражать CSI вне размера, если используется масштабирование и обрезка, то входной размер вне размера будет противоречивым, например выражатьданныеизтерятьвне Формат;

Последняя строка соответственно выражает средний интервал кадров、максимальный интервал кадров、Минимальный интервал кадров,Частоту кадров можно рассчитать,Вы можете обратиться к нему при отладке частоты кадров.

5.1.2 settle time

Способ 1: Изменить переписку sensor Вождениеиз sensor_probe Функция, может быть добавлена ​​и изменена info->time_hs из стоимости достаточно.

​ картина 5-2: info->time_hs

Способ 2:проходить mipi Суб-устройство settle_time узелсуществовать строку для изменения, урегулирование_время узелпуть:/sys/devices/platform/soc/5800800.vind/5810100.mipi。

После ввода пути к узлу вы увидите, что существующий узел урегулирования_time: хранится в текущем каталоге:

​ картина 5-3: settle time узел

Операции чтения и записи могут выполняться с использованием узла cat, echo Order и узла урегулирования_времени:

​ картина 5-4: settle time узел Читай и пиши

Скорректировать стратегию: договориться time изценить Медленно увеличивайте регулировку.,Включите его, пока не сможете внекартина,Просто возьмите другое значение чуть ниже максимального значения. Диапазон настройки: 0x00-0xff.

5.1.3 Статус сигнала

Познакомить с тем, как наблюдать SOC Главный контроль из полученныхизстатуса сигнал соответственно MIPI ипараллельный порт make вне инструкции.

5.1.3.1 MIPI

Существует два режима передачи MIPI:

Режим LP (Low-Power): используется для передачи управляющих сигналов с максимальной частотой 10 МГц.

Режим HS (высокоскоростной): используется для высокоскоростной передачи данных, чтобы MIPI DPHY V1.1 Версия для примера, диапазон ставок [80Mbps - 1.5Gbps] per Lane。

Можетпроходить Проверять user manual MIPI PHY частичная регистрация, наблюдение SOC Признать из clock lane и data lane из LP、HS состояние.

5.1.3.2 Параллельный порт

дляпараллельный интерфейс портаиз датчик, вы можете просмотреть user manual CSI PARSER часть из parser signal регистрация, наблюдение sensor конец PCLK、DATA судить по этому изсигналсостояние. parser да Было ли это признано? sensor конецотправлятьизданные。

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

5.2.1 I2C недоступен

Распечатайте следующим образом:

​ картина 5-5: i2c Не имеет смысла

[Первый этап анализа]: Подтвердите источник питания, MCLK, i2c. начальство Проверьте, в норме ли сигналы периферийных цепей, например, тяга. Используйте универсальную доску для измерения поверхности началствоAVDD, DVDD, IOVDD. Напряжение питания, MCLK Частота, амплитуда, СБРОС,PWDN уровня да соответствует Требовать.

[Шаг анализа 2]: Подтвердите i2c адрес,TWI рядданетипринципкартинапоследовательный。

[Шаг анализа третий]: Если все в порядке, используйте осциллограф и логический анализатор для измерения и анализа основного выходного сигнала управления. i2c Правильна ли форма сигнала и есть ли наконец ответ, вы можете рассмотреть; sensor Такие проблемы, как повреждение интерфейса и несовпадение.

Сенсор 5.2.2 не выдает изображения

[Первый шаг анализа]: Подтвердите chip id и datasheet начальствопоследовательный。

существоватьпереписываться sensor водить машинуиз sensor_detect Чтение в функции chip id Зарегистрируйтесь, на этом этапе также можно проверить i2c из Читай и пишиданетправильный。

[Шаг анализа 2]: Подтвердите Конфигурация завершена. Конфигурация завершена. sensor внутри.

Вы можете записать в регистр и прочитать его, чтобы проверить, соответствует ли записанное значение.

[Шаг анализа 3]: Убедитесь, что конфигурация правильна и датчик введен как внекартина.

Оригинальный заводской реестр подтверждения Конфигурация, измеренная осциллографом sensor конециз mipi данные lane и часы lane Форма волны, анализирует, существуют ли положительные данные.

[Шаг анализа 4]: Подтвердите SOC да Нет получено sensor данные。

  1. mipi из clock lane Существует два режима работы: один из них — режим непрерывной синхронизации, и процесс передачи не переключается. LP статус еще один режим прерывистого тактового сигнала, каждый раз, когда передается кадр, например данные изображения, кадр; blanking Когда Воля перейдет на LP состояние.В настоящее время большинство MIPI sensor Вообще да непостоянный режим часов.
  2. если sensor режим непрерывного времени, чтобы обеспечить MIPI существовать sensor Перед инициализацией необходимо существование sensor водить машину sensor_probe() середина Конфигурация info->stream_seq = MIPI_BEFORE_SENSOR;
  3. если sensor да непостоянный режим работы часов, можно судить по ходу SOC Признать из LP、HS Статус режима да Нет существования постоянно переключается, чтобы косвенно судить SOC из MIPI изперениматьсостояние.
  4. Проверять user manual MIPI PHY частичная регистрация, наблюдение clock lane и data lane из LP、HS Постоянно переключается ли статус да имеет существование, если есть, то это означает MIPI Уже получено sensor Отправьте изданные. инструкция по переключению ifNet MIPI Нетправильно получено sensor данные。В это время должно быть Долженисследовать MIPI Соответствующая конфигурация правильна.

[Шаг анализа 5]: Попробуйте изменить время расчета.

если это можно определить sensor ужесуществоватьправильныйотправлятьданные,только если MIPI Эта сторона не смогла получить сообщение, поэтому его невозможно загрузить. Вы можете попробовать изменить его. settle время (см. главу «Методы отладки»).

5.2.3 Изображение опубликовано, но экран зеленый или розовый

Генерал да YUYV Порядок обратный и может быть изменен. sensor Вождение sensor_formats Структура из mbus_code параметры, модификация YUV Просто закажите.

5.2.4 I2c подключен, но все значения регистров датчика читаются как 0

[Анализ, первый шаг] Проверка i2c коммуникация addr и data из Кусочек Ширина。

исследовать sensor Вождение cci_drv Соответствует ли значение да, определенное в структуре, datasheet Требовать.

[Второй шаг анализа] Обнаружение i2c коммуникационных данных по размеру конца не соответствует.

Вы можете быстро проверить, инвертировав младший бит адресвысокий при считывании идентификатора датчика.

5.2.5 Поворот экрана на 180 градусов

Может быть изменен board.dts Внутри hflip и vflip Решить, если картина и человеческие глаза станут 90 слова степени можно изменить только путем применения sensor Конфигурация для решения (только частично) sensor поддерживать).

5.2.6 Нет видеоузла

[Анализ проблем] Не загружается ko или ko Загрузка не удалась.

[Анализ, первый шаг] Неправильный порядок загрузки модулей.

lsmod Проверьте, правильно ли загружен модуль, и сообщает ли об ошибке да [VIN_ERR]registering gc2355_mipi, No such device! Это означает sensor модуль gc2355_mipi Не загружен.

[Этап анализа 2] board.dts вне телаConfigurationнетConfigurationПонятно винд0 и status для okay。

[Шаг анализа третий] еслида не удалось загрузить, не удалось загрузить исходный вариант да i2c Не имеет смысла Ну давай же Нет ko。

i2c Не имеет смысл Ссылка на предыдущий анализ из, Нет ko пожалуйстаисследоватьданетиметьпереписыватьсяизводить машинуисуществовать Makefile Компиляция включена в .

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