Rockchip | Notas de portabilidad de la cámara ov13850

Fuente de este artículo

0. Medio ambiente

1. Introducción a ov13850

  1. parametros del producto

Marca: Omnivision
Modelo: CMK-OV13850
Interfaz: MIPI
Pixel: 1320W

inserte la descripción de la imagen aquí
El sensor de imagen en color OV13850 es un sensor de imagen CMOS de 1/3,06 pulgadas y 13,2 megapíxeles, de bajo voltaje y alto rendimiento que utiliza la tecnología OmniBSI+™ para proporcionar la funcionalidad de una sola cámara de 13,2 megapíxeles (4224×3136). Controlado a través de la interfaz del bus de control de cámara en serie (SCCB), proporciona imágenes MIPI de 10 bits en ventana, de fotograma completo y con resolución reducida.
El OV13850 cuenta con una matriz de imágenes capaz de funcionar a 24 cuadros por segundo (fps) con una resolución de 10 bits y 13,2 megapíxeles, lo que brinda al usuario un control total sobre la calidad de la imagen, el formato y la transferencia de datos de salida. Todas las funciones de procesamiento de imágenes requeridas, incluido el control de exposición, el balance de blancos, la eliminación de píxeles defectuosos, etc., se pueden programar a través de la interfaz SCCB.
inserte la descripción de la imagen aquí
Además, el sensor de imagen OmniBSI utiliza tecnología de sensor patentada para mejorar la calidad de la imagen al reducir o eliminar las fuentes comunes de contaminación de la imagen, como el ruido de patrón fijo, las manchas, etc., lo que da como resultado imágenes en color limpias y totalmente estables.

Para proporcionar información personalizada, el OV13850 incluye una memoria programable única (OPT). OV13850 tiene una interfaz MIPI con hasta 4 carriles.
El OV13850 es adecuado para módulos de cámara de bajo consumo.
La siguiente es la cámara y la placa de expansión utilizadas en la prueba:
inserte la descripción de la imagen aquí
2. Características
Tamaño de la lente: 1/3,06 pulgadas
Tamaño de píxel: 1,12 mm × 1,12 mm
31,2 ° CRA es 6 mm de altura z
Velocidad de cuadro de control programable, duplicación y volteo, recorte y ventana
●13,2 millones de píxeles AT30fps
●Control de bus serie de dos hilos (SCCB)
●Flash de control de salida de flash
●Formato de salida compatible: RGB RAW de 10 bits ●
Tamaño de imagen compatible: 13,2 MP (4224 × 3136), 10 MP (4224 × 2376) .
_
_
_
_ Memoria programable de una sola vez (OTP) integrada (consulte la nota al margen)
Dos bucles de bloqueo de fase (PLL) en el chip
Controles programables: ganancia, exposición, velocidad de fotogramas, inundación de imágenes, espejo horizontal, flip crop vertical, y traducción
●Sensor de temperatura incorporado
●Control de calidad de imagen: corrección de defectos, calibración automática del nivel de negro, corrección de sombreado de lente y altímetro para HDR.
●Temperatura de unión del sensor garantizada: -300C a +850C
● Núcleo de alimentación: 1,14 V-1,26 V, analógico: 2,6-3,0 V Entrada/Salida: 1,7-3,0 V
Paquete: PLCC40

  1. diagrama de pines ov13850
    inserte la descripción de la imagen aquí
  2. Módulo funcional ov13850
    inserte la descripción de la imagen aquí
    El generador de impulsos de temporización emite el reloj para acceder a las filas de la matriz de imágenes, llenar previamente la carga y muestrear las filas de la matriz en secuencia.

Durante el intervalo de tiempo entre la carga previa al llenado y el muestreo, la carga de cada píxel está expuesta a menos luz incidente.

Este es el tiempo de exposición en una arquitectura de persiana enrollable.

El tiempo de exposición se controla ajustando el intervalo de tiempo entre el llenado previo de la carga y el muestreo.

Después de muestrear cada fila de datos de píxeles, un circuito analógico (AMP) los procesa aún más: corrige el desplazamiento y multiplica los datos por la ganancia correspondiente.

Los datos de cada píxel en la matriz de salida pasan por el ADC de 10 bits después del procesamiento analógico.

El ISP (procesador del sensor de imagen) envía los datos de la imagen a través de la unidad de interfaz de salida de imagen a través de la interfaz mipi (MCP/MDP).

  1. Matriz de píxeles La
    matriz de imágenes del sensor OV13850 tiene 4256 columnas y 3152 filas (13414912 píxeles) El
    filtro de color está organizado en modo Bayer Modo
    inserte la descripción de la imagen aquí
    binning Binning 2x2
    El modo binning se usa generalmente para baja resolución
    inserte la descripción de la imagen aquí
  2. espejo y volteo
    OV13850 proporciona modos de espejo de imagen (volteo a la izquierda y a la derecha) y volteo (volteo hacia arriba y hacia abajo)
    inserte la descripción de la imagen aquí

2. Trasplante de conductor

Hay una lista de soporte para cámaras compatibles con Rockchip.
Esta vez seleccioné ov13850 de la lista.

1. Archivos fuente del controlador y scripts correspondientes

De manera predeterminada, todos los controladores de cámara admitidos se agregaron al kernel en el SDK, por lo que no es necesario portar el controlador,
pero aún debe confirmar cierta información sobre el controlador portado.

  • programa fuente
rk_android11.0_sdk_220718\kernel\drivers\media\i2c\ov13850.c	
rk_android11.0_sdk_220718\kernel\include\config\video\ov13850.h	

kernel/drivers/media/i2c/Makefile

115 obj-$(CONFIG_VIDEO_OV13850) += ov13850.o
  • núcleo/controladores/medios/i2c/Kconfig
1282 config VIDEO_OV13850                                                       
1283     tristate "OmniVision OV13850 sensor support"
1284     depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API
1285     depends on MEDIA_CAMERA_SUPPORT
1286     select V4L2_FWNODE
1287     ---help---
1288       This is a Video4Linux2 sensor driver for the OmniVision
1289       OV13850 camera.
  • Controlador de cambio de macro correspondiente
    kernel/arch/arm64/configs/rockchip_defconfig
581 CONFIG_VIDEO_OV13850=y

2. Árbol de dispositivos

1) Diagrama típico de enlace de cámara de la serie ov

inserte la descripción de la imagen aquí
Los pines principales que conectan la cámara de la serie ov al SOC son:
i2c, rst, pwdn, mclk, MIPI Clk, MIPI DATA
Estas líneas son las que los ingenieros del controlador deben tener claras

2) diagrama de circuito

Esta vez conectamos directamente la cámara a la interfaz de video de la versión pública, usando el canal 0 y usamos 4 carriles [Si no conoce la información específica del hardware, pregúntele al ingeniero de hardware]

inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
Como se puede ver en el diagrama del circuito, varias relaciones de pines clave:

  • señal de reinicio: GPIO3 B6
  • señal de apagado: GPIO4 B4
  • Canales I2C: 4
  • reloj: cif

3) Nodo del árbol de dispositivos

Consulte el nodo ov13850 de otras plataformas en el SDK para completar

kernel/arch/arm64/boot/dts/rockchip/rk3568-evb1-ddr4-v10.dtsi
   ov13850: ov13850@10 {
    
    
       status = "okay";
       compatible = "ovti,ov13850";
       reg = <0x10>;
       clocks = <&cru CLK_CIF_OUT>;
       clock-names = "xvclk";
       power-domains = <&power RK3568_PD_VI>;
       pinctrl-names = "default";
       pinctrl-0 = <&cif_clk>;
       reset-gpios = <&gpio3 RK_PB6 GPIO_ACTIVE_HIGH>;
       pwdn-gpios = <&gpio4 RK_PB4 GPIO_ACTIVE_HIGH>;
       rockchip,camera-module-index = <0>;
       rockchip,camera-module-facing = "back";             
       rockchip,camera-module-name = "ZC-OV13850R2A-V1";
       rockchip,camera-module-lens-name = "Largan-50064B31";
       port {
    
    
           ov13850_out: endpoint {
    
    
               remote-endpoint = <&mipi_in_ucam0>;
               data-lanes = <1 2 3 4>;
           };
       };
   };

114 &csi2_dphy0 {
    
    
115     status = "okay";
116 
117     ports {
    
    
118         #address-cells = <1>;
119         #size-cells = <0>;
120         port@0 {
    
    
121             reg = <0>;
122             #address-cells = <1>;                                                                                       
123             #size-cells = <0>;
124             
125             mipi_in_ucam0: endpoint@1 {
    
    
126                 reg = <1>;
127                 remote-endpoint = <&ov13850_out>;
128                 data-lanes = <1 2 3 4>;
129             };
……
152 }

La información del árbol de dispositivos finalmente se convierte en i2c_client y se pasa al controlador ov13850 ov13850_probe()
compatible = "ovti,ov13850"; de acuerdo con la tabla of_match_table del controlador

@rk_android11.0_sdk\kernel\drivers\media\i2c\ov13850.c
#if IS_ENABLED(CONFIG_OF)
static const struct of_device_id ov13850_of_match[] = {
    
    
	{
    
     .compatible = "ovti,ov13850" },
	{
    
    },
};
MODULE_DEVICE_TABLE(of, ov13850_of_match);
#endif

static const struct i2c_device_id ov13850_match_id[] = {
    
    
	{
    
     "ovti,ov13850", 0 },
	{
    
     },
};

static struct i2c_driver ov13850_i2c_driver = {
    
    
	.driver = {
    
    
		.name = OV13850_NAME,
		.pm = &ov13850_pm_ops,
		.of_match_table = of_match_ptr(ov13850_of_match),
	},
	.probe		= &ov13850_probe,
	.remove		= &ov13850_remove,
	.id_table	= ov13850_match_id,
};

Con respecto al controlador de la cámara,
el Sr. Peng continuará explicando en otro artículo más adelante.

3. Archivo de configuración de Android

Agregue la información de la cámara correspondiente en los siguientes dos archivos,

hardware/rockchip/camera/etc/camera/camera3_profiles_rk356x.xml
hardware/rockchip/camera/etc/camera/camera3_profiles.xml

Yikoujun se refirió directamente a otros archivos
y luego encontró una cámara de un modelo similar para modificar

3. Verifique la información relevante de la cámara

1. Registro de arranque

Después de una portabilidad exitosa, confirme el registro del controlador correspondiente

10-26 17:58:54.659     0     0 I ov13850 4-0010: driver version: 00.01.05
10-26 17:58:54.659     0     0 W ov13850 4-0010: Failed to get power-gpios, maybe no use
10-26 17:58:54.659     0     0 W ov13850 4-0010: 4-0010 supply avdd not found, using dummy regulator
10-26 17:58:54.659     0     0 I ov13850 4-0010: Linked as a consumer to regulator.0
10-26 17:58:54.659     0     0 W ov13850 4-0010: 4-0010 supply dovdd not found, using dummy regulator
10-26 17:58:54.659     0     0 W ov13850 4-0010: 4-0010 supply dvdd not found, using dummy regulator
10-26 17:58:54.660     0     0 E ov13850 4-0010: could not get default pinstate
10-26 17:58:54.660     0     0 E ov13850 4-0010: could not get sleep pinstate
10-26 17:58:54.665     0     0 I ov13850 4-0010: Detected OV00d850 sensor, REVISION 0xb2
10-26 17:58:54.665     0     0 I rockchip-csi2-dphy csi2-dphy0: dphy0 matches m00_b_ov13850 4-0010:bus type 4

2. Ver dispositivo ov13850

Después de que el controlador se cargue con éxito, habrá la siguiente información

Ver el nodo del dispositivo de la cámara:

rk3568_r:/ # ls /dev/video* -l
ls /dev/video* -l
crw-rw---- 1 media camera 81,   0 2022-10-31 06:56 /dev/video0
crw-rw---- 1 media camera 81,   1 2022-10-31 06:56 /dev/video1
crw-rw---- 1 media camera 81,   2 2022-10-31 06:56 /dev/video2
crw-rw---- 1 media camera 81,   3 2022-10-31 06:56 /dev/video3
crw-rw---- 1 media camera 81,   4 2022-10-31 06:56 /dev/video4
crw-rw---- 1 media camera 81,   5 2022-10-31 06:56 /dev/video5
crw-rw---- 1 media camera 81,   6 2022-10-31 06:56 /dev/video6
crw-rw---- 1 media camera 81,   7 2022-10-31 06:56 /dev/video7
crw-rw---- 1 media camera 81,   8 2022-10-31 06:56 /dev/video8
3. 查看sys文件系统中文件信息
内核会为摄像头在目录/sys/class/video4linux下分配设备信息描述文件
```bash
rk3568_r:/ # grep ov13850 /sys/class/video4linux/v*/name
grep ov13850 /sys/class/video4linux/v*/name
/sys/class/video4linux/v4l-subdev3/name:m00_b_ov13850 4-0010
rk3568_r:/ # grep "" /sys/class/video4linux/v*/name | grep mainpath
grep "" /sys/class/video4linux/v*/name | grep mainpath
/sys/class/video4linux/video0/name:rkisp_mainpath

mi sensor

grep 214 /sys/class/video4linux/v*/name
/sys/class/video4linux/v4l-subdev3/name:m00_b_imx214 2-0010

grep "" /sys/class/video4linux/v*/name | grep mainpath
/sys/class/video4linux/video14/name:rkisp_mainpath
/sys/class/video4linux/video5/name:rkisp_mainpath

## 4. 查看拓扑 media-ctl -d /dev/media0 -p

```c
rk3568_r:/ # media-ctl -d /dev/media0 -p                  
media-ctl -d /dev/media0 -p                               
Opening media device /dev/media0                          
Enumerating entities                                      
Found 13 entities                                         
Enumerating pads and links                                
Media controller API version 0.0.255                      
                                                          
Media device information                                  
------------------------                                  
driver          rkisp-vir0                                
model           rkisp0                                    
serial                                                    
bus info                                                  
hw revision     0x0                                       
driver version  0.0.255                                   
                                                          
Device topology                                           
- entity 1: rkisp-isp-subdev (4 pads, 7 links)            
            type V4L2 subdev subtype Unknown              
            device node name /dev/v4l-subdev0             
        pad0: Sink                                        
                [fmt:SBGGR10/4224x3136                    
                 crop.bounds:(0,0)/4096x3072              
                 crop:(0,0)/4096x3072]                    
                <- "rkisp-csi-subdev":1 []                
                <- "rkisp_rawrd0_m":0 []                  
                <- "rkisp_rawrd2_s":0 []                  
        pad1: Sink                                        
                <- "rkisp-input-params":0 []              
        pad2: Source                                      
                [fmt:YUYV2X8/4096x3072                    
                 crop.bounds:(0,0)/4096x3072              
                 crop:(0,0)/4096x3072]                    
                -> "rkisp_mainpath":0 []                  
                -> "rkisp_selfpath":0 []                  
        pad3: Source                                      
                -> "rkisp-statistics":0 []                
                                                          
- entity 6: rkisp-csi-subdev (6 pads, 5 links)            
            type V4L2 subdev subtype Unknown              
            device node name /dev/v4l-subdev1             
        pad0: Sink                                        
                <- "rockchip-csi2-dphy0":1 []             
        pad1: Source                                      
                -> "rkisp-isp-subdev":0 []                
        pad2: Source                                      
                -> "rkisp_rawwr0":0 []                    
        pad3: Source                                      
        pad4: Source                                      
                -> "rkisp_rawwr2":0 []                    
        pad5: Source                                      
                -> "rkisp_rawwr3":0 []                    
                                                          
- entity 13: rkisp_mainpath (1 pad, 1 link)               
             type Node subtype V4L                        
             device node name /dev/video0                 
        pad0: Sink                                        
                <- "rkisp-isp-subdev":2 []                
                                                          
- entity 19: rkisp_selfpath (1 pad, 1 link)               
             type Node subtype V4L                        
             device node name /dev/video1                 
        pad0: Sink                                        
                <- "rkisp-isp-subdev":2 []                
                                                          
- entity 25: rkisp_rawwr0 (1 pad, 1 link)                 
             type Node subtype V4L                        
             device node name /dev/video2                 
        pad0: Sink                                        
                <- "rkisp-csi-subdev":2 []                
                                                          
- entity 31: rkisp_rawwr2 (1 pad, 1 link)                 
             type Node subtype V4L                        
             device node name /dev/video3                 
        pad0: Sink                                        
                <- "rkisp-csi-subdev":4 []                
                                                          
- entity 37: rkisp_rawwr3 (1 pad, 1 link)                 
             type Node subtype V4L                        
             device node name /dev/video4                 
        pad0: Sink                                        
                <- "rkisp-csi-subdev":5 []                
                                                          
- entity 43: rkisp_rawrd0_m (1 pad, 1 link)               
             type Node subtype V4L                        
             device node name /dev/video5                 
        pad0: Source                                      
                -> "rkisp-isp-subdev":0 []                
                                                          
- entity 49: rkisp_rawrd2_s (1 pad, 1 link)               
             type Node subtype V4L                        
             device node name /dev/video6                 
        pad0: Source                                      
                -> "rkisp-isp-subdev":0 []                
                                                          
- entity 55: rkisp-statistics (1 pad, 1 link)             
             type Node subtype V4L                        
             device node name /dev/video7                 
        pad0: Sink                                        
                <- "rkisp-isp-subdev":3 []                
                                                          
- entity 61: rkisp-input-params (1 pad, 1 link)           
             type Node subtype V4L                        
             device node name /dev/video8                 
        pad0: Source                                      
                -> "rkisp-isp-subdev":1 []                
                                                          
- entity 67: rockchip-csi2-dphy0 (2 pads, 2 links)        
             type V4L2 subdev subtype Unknown             
             device node name /dev/v4l-subdev2            
        pad0: Sink                                        
                <- "m00_b_ov13850 4-0010":0 []            
        pad1: Source                                      
                -> "rkisp-csi-subdev":0 []                
                                                          
- entity 70: m00_b_ov13850 4-0010 (1 pad, 1 link)         
             type V4L2 subdev subtype Sensor              
             device node name /dev/v4l-subdev3            
        pad0: Source                                      
                [fmt:SBGGR10/4224x3136]                   
                -> "rockchip-csi2-dphy0":0 []                                                              

Puede ver en la información de la entidad70:

  • El nombre completo de la Entidad es: m00_b_ov13850 4-0010
  • Es un sensor V4L2 subdev (subdispositivo)
  • Su nodo correspondiente es /dev/v4l-subdev3, y las aplicaciones (como v4l2-ctl) pueden abrirlo y configurarlo
  • Solo tiene un nodo de salida (fuente), denominado pad0
  • Su formato de salida es [fmt:SBGGR10/4224x3136], donde SBGGR10 es una abreviatura de mbus-code
  • Su origen pad0 está vinculado a pad0 de "rockchip-csi2-dphy0", y el estado actual es HABILITADO.

3. Prueba fotográfica

1. Agarrar marco

rk3568_r:/ # v4l2-ctl -d /dev/video0 --set-fmt-video=width=800,height=600,pixelformat=NV12 --stream-mmap=3 --stream-to=/sdcard/out.yuv --stream-skip=9 --stream-count=1
m-mmap=3 --stream-to=/sdcard/out.yuv --stream-skip=9 --stream-count=1         <
<<<<<<<<< 7.51 fps
<

[Ver <<<<<<<<< 7.51 fps indica éxito]
descripción del parámetro

-d: 摄像头对应设备文件
--set-fmt-video:指定了宽高及pxielformat(用FourCC表示)。NV12即用FourCC表示的pixelformat
--stream-mmap:指定buffer的类型为mmap,即由kernel分配的物理连续的或经过iommu映射的buffer
--stream-to:指定帧数据保存的文件路径
--stream-skip:指定丢弃(不保存到文件)3--stream-count:指定抓取的帧数,不包括--stream-skip丢弃的数量

其他参数
--set-selection,指定对输入图像进行裁剪。特别是当RKISP1的前级大小发生变化时要保证selection不大于前级输出大小。RKCIF的裁剪则是通过--set-crop参数设置的
--stream-poll,该选项指示v4l2-ctl采用异步IO,即在dqbuf前先用select等等帧数据完成,从而保证dqbuf不阻塞。否则dqbuf将会阻塞直到有数据帧到来

2. Muestre la imagen:

Copie el archivo **/sdcard/out.yuv de la placa a través del comando adb pull**,

运行于windows下:
adb pull /sdcard/out.yuv

Luego cópielo en ubuntu y ejecute el siguiente comando para mostrar la imagen [también puede usar otras herramientas que pueden abrir imágenes en formato yuv]

ffplay out.yuv -f rawvideo -pixel_format nv12 -video_size 800x600

inserte la descripción de la imagen aquí

4. Configuración de parámetros

1. Mostrar los parámetros de la cámara

Mostrar parámetros de la cámara

rk3568_r:/ # v4l2-ctl -d /dev/video0 -l     
v4l2-ctl -d /dev/video0 -l  
User Controls                                                                                                                                                               
                       exposure 0x00980911 (int)    : min=4 max=3324 step=1 default=1536 value=1536   
Image Source Controls                                                                                                                                                                                                                              
              vertical_blanking 0x009e0901 (int)    : min=192 max=29631 step=1 default=192 value=192   
            horizontal_blanking 0x009e0902 (int)    : min=576 max=576 step=1 default=576 value=576 flags=read-only 
                  analogue_gain 0x009e0903 (int)    : min=16 max=248 step=1 default=16 value=16   
Image Processing Controls                                                                                                       
                 link_frequency 0x009f0901 (intmenu): min=0 max=0 default=0 value=0 flags=read-only 
                     pixel_rate 0x009f0902 (int64)  : min=0 max=120000000 step=1 default=120000000 value=120000000 flags=read-only      
                   test_pattern 0x009f0903 (menu)   : min=0 max=4 default=0 value=0   

2. Aumentar la exposición exposición

El rango de valores de exposición es: 4-3324
Ejemplo de comando:

v4l2-ctl -d /dev/video0 --set-ctrl exposure=3324

3. Aumente el brillo de la imagen analog_gain

analog_gain se utiliza para establecer el brillo de la imagen mostrada
rango de valores analog_gain: 16-248
ejemplo de comando:

v4l2-ctl -d /dev/video0 --set-ctrl analogue_gain=240

analog_gain=16 fenómeno
inserte la descripción de la imagen aquí
analog_gain=244 fenómeno [el efecto es muy obvio]
inserte la descripción de la imagen aquí

  1. Pruebe la información de visualización test_pattern
    parámetro test_pattern, que se puede usar para probar imágenes de visualización

0:
Imagen de prueba de cámara 1-3
Ejemplo de comando:

v4l2-ctl -d /dev/video0 --set-ctrl test_pattern=0 

patrón_prueba = 1
inserte la descripción de la imagen aquí
patrón_prueba = 2
inserte la descripción de la imagen aquí
patrón_prueba = 3

5. Modificar el formato y tamaño de Entidad

Por ejemplo 1, la cámara GC2053 admite salida de múltiples resoluciones, el valor predeterminado es 1920x1080. Ahora cambie la resolución de salida a 640x480

media-ctl -d/dev/media0 --set-v4l2' "m00_b_ov13850 4-0010":0[fmt:SBGGR10//640x480]'

Después de modificar la salida de GC2053, el tamaño de rkisp-isp-subdev y el recorte del dispositivo de video también deben modificarse en consecuencia. Porque el tamaño de la etapa posterior no puede ser mayor que el tamaño de la etapa anterior.

~/>$ media-ctl -d/dev/media0 --set-v4l2 ' "rkisp-isp-subdev":0[fmt:SBGGR10/640x480]'
~/>$ media-ctl -d/dev/media0 --set-v4l2 ' "rkisp-isp-subdev":0[crop: (0, 0)/640x480]'
~/>$ media-ctl -d/dev/media0 --set-v4l2 ' "rkisp-isp-subdev":2[crop: (0, 0)/640x480]'
~/>$ v4l2-ctl -d/dev/video0\
--set-selection=target=crop, top=0, left=0, width=640, height=480

Supongo que te gusta

Origin blog.csdn.net/liuqingsongmsdn2014/article/details/131664096
Recomendado
Clasificación