Guide de développement de caméras sur la plateforme ArmSoM (Partie 2)

  • Plateforme : RK3588
  • Carte de développement : ArmSoM-W3
  • Noyau : 5.10.160
  • Système d'exploitation : Debian 11

La documentation précédente a couvert la configuration du chemin MIPI-CSI sur la plateforme Rockchip. Ce document se concentre sur les commandes de test relatives à la caméra sous cette plateforme.

Connexion de la caméra

Voici le schéma de connexion entre la carte de développement ArmSoM-W3 et le capteur IMX415 :

Note : Les broches métalliques du câble plat doivent être orientées vers la carte.

Utilisation de la caméra

Après avoir connecté le module caméra et mis sous tension, vous pouvez examiner les logs de démarrage :


root@linaro-alip:/# dmesg | grep imx415
[    2.547754] imx415 3-001a: driver version: 00.01.08
[    2.547767] imx415 3-001a:  Get hdr mode failed! no hdr default
[    2.547819] imx415 3-001a: Failed to get power-gpios
[    2.547826] imx415 3-001a: could not get default pinstate
[    2.547831] imx415 3-001a: could not get sleep pinstate
[    2.547850] imx415 3-001a: supply dvdd not found, using dummy regulator
[    2.547918] imx415 3-001a: supply dovdd not found, using dummy regulator
[    2.547945] imx415 3-001a: supply avdd not found, using dummy regulator
[    2.613843] imx415 3-001a: Detected imx415 id 0000e0
[    2.613890] rockchip-csi2-dphy csi2-dphy0: dphy0 matches m00_b_imx415 3-001a:bus type 5
[   18.386174] imx415 3-001a: set fmt: cur_mode: 3864x2192, hdr: 0
[   18.389067] imx415 3-001a: set exposure(shr0) 2047 = cur_vts(2250) - val(203)
   

Si aucune errreur n'apparaît, le module fonctionne correctement. Sous Linux, vous pouvez accéder et utiliser ce périphérique caméra de plusieurs manières.

3.1 Utilisation des outils en ligne de commande

media-ctl et v4l2-ctl sont des utilitaires en ligne de commande pour la configuration et la gestion des périphériques vidéo et multimédia sous Linux. Ils interagissent avec le sous-système V4L2 (Video for Linux 2) pour contrôler les paramètres des caméras, des cartes de capture vidéo, des périphériques d'affichage et d'autres matériels multimédias.

media-ctl opère sur les périphériques /dev/media0, gérant la topologie des nœuds du Media Controller, y compris leur format, taille et leurs connexions. v4l2-ctl, quant à lui, cible les périphériques vidéo comme /dev/video0, /dev/video1, etc., et exécute des opérations telles que set_fmt, reqbuf, qbuf, dqbuf, stream_on, et stream_off sur ces périphériques.

La numérotation des périphériques vidéo suit une convention :

  • /dev/videoN+0 : Canal principal de sortie vidéo (SP).
  • /dev/videoN+1 : Canal propre du périphérique MP.
  • /dev/videoN+2 : Statistiques 3A (Auto Exposuer, Auto White Balance, Auto Focus).
  • /dev/videoN+3 : Configuration des paramètres 3A.

3.1.1 Affichage de la topologie

Utilisez la commande suivante pour afficher la topologie du média :


media-ctl -p -d /dev/media0
   

Il est crucial de vérifier si l'entité du capteur est détectée. Son absence indique un problème d'enregistrement du capteur.

Après avoir connecté la caméra à la carte de développement, vous devriez observer une sortie similaire à celle-ci :


root@linaro-alip:# media-ctl -p -d /dev/media0
       ......
       ......
- entity 58: rockchip-csi2-dphy0 (2 pads, 2 links)
            type V4L2 subdev subtype Unknown flags 0
            device node name /dev/v4l-subdev1
   pad0: Sink
       [fmt:SGBRG10_1X10/3864x2192@10000/300000 field:none
        crop.bounds:(12,16)/3840x2160]
       <- "m00_b_imx415 3-001a":0 [ENABLED]
   pad1: Source
       -> "rockchip-mipi-csi2":0 [ENABLED]

- entity 63: m00_b_imx415 3-001a (1 pad, 1 link)
            type V4L2 subdev subtype Sensor flags 0
            device node name /dev/v4l-subdev2
   pad0: Source
       [fmt:SGBRG10_1X10/3864x2192@10000/300000 field:none
        crop.bounds:(12,16)/3840x2160]
       -> "rockchip-csi2-dphy0":0 [ENABLED]
   

3.1.2 Consultation des informations de la caméra

Utilisez la commande suivante pour lister tous les périphériques caméra :


root@linaro-alip:/home/linaro# v4l2-ctl --list-devices
rk_hdmirx (fdee0000.hdmirx-controller):
   /dev/video20

rkisp-statistics (platform: rkisp):
   /dev/video18
   /dev/video19

rkcif-mipi-lvds2 (platform:rkcif):
   /dev/media0

rkcif (platform:rkcif-mipi-lvds2):
   /dev/video0
   /dev/video1
   /dev/video2
   /dev/video3
   /dev/video4
   /dev/video5
   /dev/video6
   /dev/video7
   /dev/video8
   /dev/video9
   /dev/video10

rkisp_mainpath (platform:rkisp0-vir0):
   /dev/video11
   /dev/video12
   /dev/video13
   /dev/video14
   /dev/video15
   /dev/video16
   /dev/video17
   /dev/media1
   

Dans cet exemple, /dev/video11 représente le périphérique caméra.

Pour connaître les formats pris en charge par le périphérique pour la prévisualisation :


root@linaro-alip:/# v4l2-ctl --list-formats-ext --device /dev/video11
ioctl: VIDIOC_ENUM_FMT
       Type: Video Capture Multiplanar

       [0]: 'UYVY' (UYVY 4:2:2)
               Size: Stepwise 32x16 - 3840x2160 with step 8/8
       [1]: 'NV16' (Y/CbCr 4:2:2)
               Size: Stepwise 32x16 - 3840x2160 with step 8/8
       [2]: 'NV61' (Y/CrCb 4:2:2)
               Size: Stepwise 32x16 - 3840x2160 with step 8/8
       [3]: 'NV21' (Y/CrCb 4:2:0)
               Size: Stepwise 32x16 - 3840x2160 with step 8/8
       [4]: 'NV12' (Y/CbCr 4:2:0)
               Size: Stepwise 32x16 - 3840x2160 with step 8/8
       [5]: 'NM21' (Y/CrCb 4:2:0 (N-C))
               Size: Stepwise 32x16 - 3840x2160 with step 8/8
       [6]: 'NM12' (Y/CbCr 4:2:0 (N-C))
               Size: Stepwise 32x16 - 3840x2160 with step 8/8
   

Pour obtenir toutes les informations sur le périphérique :


root@linaro-alip:/home/linaro# v4l2-ctl --all --device /dev/video11
Driver Info:
   Driver name      : rkisp_v6
   Card type        : rkisp_mainpath
   Bus info         : platform:rkisp0-vir0
   Driver version   : 2.0.0
   Capabilities     : 0x84201000
       Video Capture Multiplanar
       Streaming
       Extended Pix Format
       Device Capabilities
   Device Caps      : 0x04201000
       Video Capture Multiplanar
       Streaming
       Extended Pix Format
Media Driver Info:
   Driver name      : rkisp0-vir0
   Model            : rkisp0
   Serial           :
   Bus info         :
   Media version    : 5.10.110
   Hardware revision: 0x00000000 (0)
   Driver version   : 5.10.110
Interface Info:
   ID               : 0x03000007
   Type             : V4L Video
Entity Info:
   ID               : 0x00000006 (6)
   Name             : rkisp_mainpath
   Function         : V4L2 I/O
   Pad 0x01000009   : 0: Sink
     Link 0x0200000a: from remote pad 0x1000004 of entity 'rkisp-isp-subdev': Data, Enabled
Priority: 2
Format Video Capture Multiplanar:
   Width/Height      : 3840/2160
   Pixel Format      : 'NV12' (Y/CbCr 4:2:0)
   Field             : None
   Number of planes  : 1
   Flags             :
   Colorspace        : Default
   Transfer Function : Default
   YCbCr/HSV Encoding: Default
   Quantization      : Full Range
   Plane 0           :
      Bytes per Line : 3840
      Size Image     : 12441600
Selection Video Capture: crop, Left 0, Top 0, Width 3840, Height 2160, Flags:
Selection Video Capture: crop_bounds, Left 0, Top 0, Width 3840, Height 2160, Flags:
Selection Video Output: crop, Left 0, Top 0, Width 3840, Height 2160, Flags:
Selection Video Output: crop_bounds, Left 0, Top 0, Width 3840, Height 2160, Flags:

Image Processing Controls

                    pixel_rate 0x009f0902 (int64)  : min=0 max=1000000000 step=1 default=1000000000 value=356800000 flags=read-only, volatile
   

3.1.3 Affichage d'une image

Utilisez v4l2-ctl pour capturer une image :


root@linaro-alip:/# v4l2-ctl --verbose -d /dev/video11 --set-fmt-video=width=3840,height=2160,pixelformat='NV12' --stream-mmap=4 --stream-skip=3 --stream-to=/data/4k_nv12.yuv --stream-count=4 --stream-poll
VIDIOC_QUERYCAP: ok
VIDIOC_G_FMT: ok
VIDIOC_S_FMT: ok
Format Video Capture Multiplanar:
       Width/Height      : 3840/2160
       Pixel Format      : 'NV12' (Y/CbCr 4:2:0)
       Field             : None
       Number of planes  : 1
       Flags             :
       Colorspace        : Default
       Transfer Function : Default
       YCbCr/HSV Encoding: Default
       Quantization      : Full Range
       Plane 0           :
          Bytes per Line : 3840
          Size Image     : 12441600
               VIDIOC_REQBUFS returned 0 (Success)
               VIDIOC_QUERYBUF returned 0 (Success)
               VIDIOC_QUERYBUF returned 0 (Success)
               VIDIOC_QUERYBUF returned 0 (Success)
               VIDIOC_QUERYBUF returned 0 (Success)
               VIDIOC_QBUF returned 0 (Success)
               VIDIOC_QBUF returned 0 (Success)
               VIDIOC_QBUF returned 0 (Success)
               VIDIOC_QBUF returned 0 (Success)
               VIDIOC_STREAMON returned 0 (Success)
cap dqbuf: 0 seq:      0 bytesused: 12441600 ts: 4953.039121 delta: 4953039.121 ms (ts-monotonic, ts-src-eof)
cap dqbuf: 1 seq:      1 bytesused: 12441600 ts: 4953.073968 (ts-monotonic, ts-src-eof)
cap dqbuf: 2 seq:      2 bytesused: 12441600 ts: 4953.106558 (ts-monotonic, ts-src-eof)
cap dqbuf: 3 seq:      3 bytesused: 12441600 ts: 4953.139114 (ts-monotonic, ts-src-eof)
cap dqbuf: 0 seq:      4 bytesused: 12441600 ts: 4953.173258 fps: 29.82 (ts-monotonic, ts-src-eof)
cap dqbuf: 1 seq:      5 bytesused: 12441600 ts: 4953.206177 fps: 29.93 (ts-monotonic, ts-src-eof)
cap dqbuf: 2 seq:      6 bytesused: 12441600 ts: 4953.239030 fps: 30.01 (ts-monotonic, ts-src-eof)
   

Explication des paramètres :

  • -d : Spécifie le fichier de périphérique de la caméra.
  • --set-fmt-video : Définit la largeur, la hauteur et le format de pixel (représenté par FourCC). NV12 est le format de pixel utilisant FourCC.
  • --stream-mmap : Indique que le type de buffer est mmap, c'est-à-dire un buffer physiquement contigu ou mappé via IOMMU, alloué par le noyau.
  • --stream-to : Spécifie le chemin du fichier où les données d'image seront sauvegardées.
  • --stream-skip : Indique le nombre d'images initiales à ignorer (ne pas sauvegarder).
  • --stream-count : Spécifie le nombre d'images à capturer, sans compter celles ignorées par --stream-skip.

L'image capturée peut être ouverte avec l'outil 7YUV sous Windows après transfert via adb, ou affichée avec la commande ffplay.

ffplay, un lecteur multimédia simple fourni par FFmpeg, peut être utilisé pour la lecture, l'analyse visuelle, l'affichage d'informations et le test des API FFmpeg. Pour lire le fichier .yuv :


ffplay /data/4k_nv12.yuv -f rawvideo -pixel_format nv12 -video_size 3840x2160
   

3.1.4 Affichage Vidéo

Utilisez v4l2-ctl pour enregistrer une vidéo :


v4l2-ctl --verbose -d /dev/video11 --set-fmt-video=width=3840,height=2160,pixelformat='NV12' --stream-mmap=4 --set-selection=target=crop,flags=0,top=0,left=0,width=3840,height=2160 --stream-to=out.yuv
   

Pour lire la vidéo avec ffplay :


ffplay -f rawvideo -video_size 3840x2160 -pixel_format nv12 out.yuv
   

3.2 Utilisation d'applications de frameworks multimédias

GStreamer : GStreamer est un framework multimédia qui permet de créer des applications personnalisées pour capturer, traiter et afficher des flux vidéo de caméra.

Vous pouvez utiliser le pipeline GStreamer suivant pour capturer une vidéo :


gst-launch-1.0 v4l2src device=/dev/video11 ! video/x-raw,format=NV12,width=3840,height=2160,framerate=30/1 ! videoconvert ! autovideosink
   
  • v4l2src : Capture les données vidéo du périphérique /dev/video11.
  • video/x-raw : Spécifie le format des données vidéo brutes avec les paramètres format=NV12, width=3840, height=2160 et framerate=30/1.
  • videoconvert : Effectue les conversions de format nécessaires pour que les données soient compatibles avec les éléments suivants.
  • autovideosink : Sélectionne automatiquement le plugin de sortie vidéo approprié pour afficher la vidéo à l'écran.

Note : La résolution de l'écran étant 1920x1080 et celle de la caméra 3840x2160, une partie de l'image peut ne pas être visible. Double-cliquer sur le bord de la fenêtre peut ajuster l'affichage à la résolution de 1920x1080.

Voici un exemple simple en Python pour créer un pipeline GStreamer et démarrer la capture vidéo :


import gi
gi.require_version('Gst', '1.0')
from gi.repository import Gst

Gst.init(None)

# Création d'un nouveau pipeline GStreamer
pipeline = Gst.Pipeline()

# Création des éléments, configuration du périphérique caméra et de la résolution
src = Gst.ElementFactory.make("v4l2src", "v4l2-source")
src.set_property("device", "/dev/video11")

caps = Gst.Caps.from_string("video/x-raw,format=NV12,width=3840,height=2160,framerate=30/1")
filter_caps = Gst.ElementFactory.make("capsfilter", "filter")
filter_caps.set_property("caps", caps)

converter = Gst.ElementFactory.make("videoconvert", "converter")
video_sink = Gst.ElementFactory.make("autovideosink", "videosink")

# Ajout des éléments au pipeline
pipeline.add(src)
pipeline.add(filter_caps)
pipeline.add(converter)
pipeline.add(video_sink)

# Liaison des éléments
src.link(filter_caps)
filter_caps.link(converter)
converter.link(video_sink)

# Mise du pipeline en état de lecture
pipeline.set_state(Gst.State.PLAYING)

try:
   # Ajouter ici votre logique de traitement personnalisée
   # Par exemple, gestion des signaux, sauvegarde vidéo, traitement d'images, etc.
   pass
except KeyboardInterrupt:
   pass

# Arrêt du pipeline et libération des ressources
pipeline.set_state(Gst.State.NULL)
   

3.3 Développement d'applications personnalisées

Pour des fonctionnalités spécifiques et personnalisées, le développement d'applications caméra avec des langages de programmation tels que C++ ou Python est généralement requis.

Le processus général de collecte de données vidéo via des interfaces API comprend typiquement cinq étapes :

  1. Ouvrir le fichier du périphérique vidéo et initialiser les paramètres de capture, y compris la fenêtre de capture, la taille du tampon et le format.
  2. Demander plusieurs tampons de trame pour la capture vidéo, puis les mapper de l'espace noyau à l'espace utilisateur pour faciliter la lecture et le traitement par l'application.
  3. Mettre en file d'attente les tampons de trame demandés dans la file d'entrée de capture vidéo et démarrer la capture.
  4. Le pilote commence la capture des données vidéo. L'application retire les tampons de trame de la file de sortie de capture, les traite, puis les remet dans la file d'entrée de capture pour une capture continue.
  5. Arrêter la capture vidéo.

Étiquettes: RK3588 ArmSoM-W3 MIPI-CSI V4L2 media-ctl

Publié le 1 août à 13h59