6.5 Video for Linux 2 (V4L2)
6.5.1 Introduction
Video for Linux Two(V4L2) 드라이버는 카메라 캡쳐와 디스플레이를 지원하는 V4L2 프레임워크를 위한 플러그인이다.
일부 i.MX SoC는 관련 이미지 처리 유닛과 캡쳐 하드웨어를 기반으로 V4L2를 지원한다.
V4L2에 대한 자세한 내용은 Linux Media Subsystem Documentation에서 제공되는 Linux Video for Linux 2용 API 사양으로 이동한다.
V4L2 API는 카메라와 디스플레이 컨트롤을 지원하지만, i.MX 8은 V4L2 캡처만 지원하고 디스플레이 컨트롤 대신 DPU를 사용하는 디스플레이는 지원하지 않는다. i.MX 6과 i.MX 7에서는 캡처 및 디스플레이 모두 V4L2를 사용한다.
6.5.1.1 i.MX 8 DPU V4L2
i.MX 8에서 Video for Linux Two(V4L2) 드라이버는 Display Processing Unit(DPU)으로만 카메라 캡처를 지원할 수 있는 V4L2 프레임워크용 플러그인이다.
V4L2 DPU 카메라 드라이버는 기본 캡처만 지원한다. V4L2 캡처 디바이스는 카메라나 TV 디코더에서 들어오는 비디오 이미지를 가져와 메모리에서 이미지를 캡처한다. V4L2 드라이버에서 지원하는 기능은 아래와 같다:
- 캡처 인터페이스를 위한 RGB 24비트와 YUV 4:2:2 인터리브 형식
- 다양한 센서 드라이버의 플러그인
- 스트리밍(대기 중인) 입력 버퍼
- 프로그램 가능한 입력과 출력 픽셀 형식과 크기
- RGB 16, 24, 32비트와 YUV 4:2:0 그리고 4:2:2 인터리브 입력 형식
V4L2 카메라 기능을 사용하기 전에 modprobe mxc_v4l2_capture 커맨드를 실행해야 한다.
6.5.1.2 PxP V4L2
PxP를 위한 Video for Linux Two(V4L2) 드라이버는 디스플레이 출력에만 사용된다.
6.5.1.3 i.MX 6 with IPU V4L2
Video for Linux Two(V4L2) 드라이버는 V4L2 프레임워크에 대한 플러그인으로 카메라와 전처리 기능은 물론 비디오와 후처리 기능을 지원할 수 있다. V4L2 카메라 드라이버는 모든 카메라 관련 기능에 대한 지원을 구현한다. V4L2 캡처 디바이스는 카메라나 스트림에서 들어오는 비디오 이미지를 가져와 처리를 한다. 출력 디바이스는 비디오를 가져와 처리한 다음, 디스플레이나 유사한 디바이스로 보낸다.
IPU V4L2 드라이버가 지원하는 기능은 다음과 같다:
- SDC 전면 오버레이 평면으로 직접 미리보기와 출력(LCD 새로고침과 동기화)
- 그래픽 프레임 버퍼에 직접 미리보기(LCD 새로고침과 동기화하지 않음)
- 프레임 버퍼와 오버레이 평면의 색상 키(크로마키)나 알파 블렌딩
- IPU 인코딩 채널에서 스트리밍(대기중인) 캡처
- 직접(로우 Bayer) 스틸 캡처 (센서에 따라 다름)
- 미리보기와 캡처를 위한 프로그램 가능한 픽섹 형식, 크기, 프레임 속도
- 사용자 정의 API를 사용하여 프로그램 가능한 회전과 플립
- RGB 16, 24, 32 비트의 미리보기 형식
- 캡처를 위한 로우 Bayer(스틸 전용, 센서에 따라 다름), RGB 16, 24, 32비트, YUV 4:2:0와 4:2:2 평면, YUV 4:2:2 인터리브 그리고 JPEG 형식
- 노출, 화이트 밸런스, 밝기, 대비 등을 포함하는 센서 속성 컨트롤
- 다양한 센서 드라이버의 플러그인
- 크기 조정과 CSC, 회전의 후처리 링크와 IPU 채널 디스플레이
- 스트리밍(대기중인) 입력 버퍼
- 오버레이와 중간(회전) 버퍼의 더블 버퍼링
- 입력 버퍼의 구성 가능한 3+ 버퍼링
- 프로그램 가능한 입력과 출력 픽셀 형식과 크기
- 프로그램 가능한 스케일링과 프레임 속도
- RGB 16, 24, 32 비트, YUV 4:2:0와 4:2:2 평면 그리고 YUV 4:2:2 인터리브 입력 형식
- TV 출력
modprobe mxc_v4l2_capture 커맨드는 V4L2 기능 사용 전에 실행해야 한다.
6.5.1.4 IPU V4L2 Capture Device
V4L2 캡처 디바이스에는 두 가지 인터페이스가 포함되어 있다:
- 캡처 인터페이스 - IPU 전처리 ENC 채널을 사용하여 YCrCb 비디오 스트림을 저장한다.
- 오버레이 인터페이스 - IPU 디바이스 드라이버를 사용하여 미리 보기 비디오를 SDC 전면과 후면 패널에 표시한다.
V4L2 캡처 지원은 커널 구성 중에 선택할 수 있다. 드라이버에는 두 개의 레이어가 포함되어 있다. 상위 레이어는 체인 버퍼 관리, 스트림 API와 기타 ioctl 인터페이스를 포함하는 일반적인 Video for Linux 드라이버이다. 이 디바이스의 파일은 아래 위치에 있다.
drivers/media/platform/mxc/capture/
V4L2 캡처 디바이스 드라이버는 mxc_v4l2_capture.c 파일에 있다. 저수준의 오버레이 드라이버는 ipu_fg_overlay_sdc.c, ipu_bg_overlay_sdc.c에 있다.
이 코드(ipu_prp_enc.c)는 IPU ENC 하드웨어와 인터페이스하고, ipu_still.c는 IPU CSI 하드웨어와 인터페이스한다. 센서의 프레임 속도 컨트롤은 VIDIOC_S_PARM ioctl에 의해 처리된다. 프레임 속도가 설정되기 전에, 센서는 AE를 켜고 AWB를 켠다. 프레임 속도는 광 센서의 샘플에 따라 변경될 수 있다.
특정 카메라용 드라이버는 아래에서 찾을 수 있다.
drivers/media/platform/mxc/capture/
6.5.2 V4L2 Capture Device
V4L2 캡처 디바이스에는 두 가지 인터페이스가 포함되어 있다:
- 캡처 인터페이스 - YCrCb 비디오 스트림을 저장하기 위해 i.MX 프로세싱 엔진을 사용한다.
- 오버레이 인터페이스 - SDC 전면과 후면 패널에 미리 보기 비디오를 디스플레이하기 위해 i.MX 프로세싱 엔진을 사용한다.
드라이버에는 두 개의 레이어가 포함되어 있다. 상위 레이어는 체인 버퍼 관리, 스트림 API와 기타 ioctl 인터페이스를 포함하는 일반적인 Video for Linux 드라이버이다. 저수준 레이어는 각 V4L2 SoC장에 자세히 설명된 SoC와 연결된 디스플레이 엔진을 위한 i.MX SoC 구현이다.
6.5.2.1 V4L2 Capture IOCTLs
현재, 메모리 맵 스트림 API가 지원되고 있다. 지원되는 V4L2 IOCTL에는 아래가 포함된다:
- VIDIOC_QUERYCAP
- VIDIOC_G_FMT
- VIDIOC_S_FMT
- VIDIOC_REQBUFS
- VIDIOC_QUERYBUF
- VIDIOC_QBUF
- VIDIOC_DQBUF
- VIDIOC_STREAMON
- VIDIOC_STREAMOFF
- VIDIOC_OVERLAY
- VIDIOC_G_FBUF
- VIDIOC_S_FBUF
- VIDIOC_G_CTRL
- VIDIOC_S_CTRL
- VIDIOC_CROPCAP
- VIDIOC_G_CROP
- VIDIOC_S_CROP
- VIDIOC_S_PARM
- VIDIOC_G_PARM
- VIDIOC_ENUMSTD
- VIDIOC_G_STD
- VIDIOC_S_STD
- VIDIOC_ENUMOUTPUT
- VIDIOC_G_OUTPUT
- VIDIOC_S_OUTPUT
V4L2 컨트롤 코드는 회전에 대한 지원을 제공하기 위해 확장되어 있다. ID는 V4L2_CID_PRIVATE_BASE이다. 지원되는 값은 아래와 같다:
- 0 - 일반 작업
- 1 - 수직 플립
- 2 - 수평 플립
- 3 - 180° 회전
- 4 - 90° 시계 방향 회전
- 5 - 90° 시계 방향 회전과 수직 플립
- 6 - 90° 시계 방향 회전과 수평 플립
- 7 - 90° 반시계 방향 회전
아래 그림은 V4L2 Capture API 상호 작용의 블럭 다이어그램을 보여준다.
6.5.2.2 Use of the V4L2 Capture APIs
이 섹션에서는 샘플 V4L2 캡처 프로세스에 대해 설명한다. 애플리케이션은 아래 단계를 작성한다:
- 캡처 픽셀 형식과 크기를 IOCTL VIDIOC_S_FMT로 설정한다.
- 회전 사용을 위해 IOCTL VIDIOC_S_CTRL로 컨트롤 정보를 설정한다.
- IOCTL VIDIOC_REQBUFS를 사용하여 버퍼를 요청한다. 일반적인 V4L2 드라이버는 버퍼의 체인을 생성한다(현재 최대 프레임 수는 3개).
- 메모리는 버퍼를 사용자 공간에 매핑한다.
- IOCTL 커맨드 VIDIOC_QBUF를 사용하여 버퍼를 큐에 넣는다.
- IOCTL VIDIOC_STREAMON를 사용하여 스트림을 시작한다. 이 IOCTL은 i.MX Processing Enginee 작업과 IDMA 채널을 활성화한다. 프레임에 대한 처리가 완료되면, 드라이버는 다음 프레임을 위해 대기중인(큐에 있는) 버퍼로 전환한다. 또한, 드라이버는 버퍼가 준비되었다는 것을 나타내기 위해 세마포어에 시그널을 보낸다.
- IOCTL VIDIOC_DQBUF를 사용하여 큐에서 버퍼를 가져온다. 이 IOCTL은 ISR 드라이버가 시그널을 보낼 때가지 블럭된다.
- 버퍼를 YCrCb 파일에 저장한다.
- VIDIOC_QBUF를 다시 실행하여, V4L2 드라이버 큐의 버퍼를 교체한다.
V4L2 스틸 이미지 캡처 프로세스의 경우, 애플리케이션은 아래 단계를 작성한다:
- IOCTL VIDIOC_S_FMT를 실행하여 캡처 픽셀 형식과 크기를 설정한다.
- YUV422로 한 프레임 스틸 이미지를 읽는다.
V4L2 오버레이 지원 사용 사례의 경우, 애플리케이션은 아래 단계를 작성한다.
- IOCTL VIDIOC_S_FMT로 오버레이 윈도우를 설정한다.
- IOCTL VIDIOC_OVERLAY로 오버레이 태스크를 켠다.
- IOCTL VIDIOC_OVERLAY로 오버레이 태스크를 끈다.
6.5.3 V4L2 Output Device
드라이버는 출력 디바이스를 위한 표준 V4L2 API를 구현한다. V4L2 출력 디바이스 지원은 커널을 구성하는 동한 선택할 수 있다. 드라이버는 아래에서 사용할 수 있다.
drivers/media/platform/mxc/output/mxc_vout.c
6.5.3.1 V4L2 Output IOCTLs
현재, 메모리 맵 스트림 API가 지원되고 있다. 지원되는 V4L2 IOCTL에는 다음이 포함된다:
- VIDIOC_QUERYCAP
- VIDIOC_REQBUFS
- VIDIOC_G_FMT
- VIDIOC_S_FMT
- VIDIOC_QUERYBUF
- VIDIOC_QBUF
- VIDIOC_DQBUF
- VIDIOC_STREAMON
- VIDIOC_STREAMOFF
- VIDIOC_G_CTRL
- VIDIOC_S_CTRL
- VIDIOC_CROPCAP
- VIDIOC_G_CROP
- VIDIOC_S_CROP
- VIDIOC_ENUM_FMT
V4L2 컨트롤 코드는 디인터레이스 모션을 지원하도록 확장되어 있다. 이를 사용하기 위한, ID는 V4L2_CID_MXC_MOTION이다. 지원되는 값은 다음이 포함된다:
- 0-Medium motion
- 1-Low motion
- 2-High motion
6.5.3.2 Use of the V4L2 Output APIs
이 섹션에서는 V4L2 출력 API를 사용하는 샘플 V4L2 출력 프로세스에 대해 설명한다. 애플리케이션은 아래 단계를 작성한다:
- IOCTL VIDIOC_S_FMT를 사용하여 입력 픽셀 형식과 크기를 설정한다.
- 회전과 디인터레이스 모션(필요한 경우)을 위해 IOCTL VIDIOC_S_CTRL를 사용하여 컨트롤 정보를 설정한다.
- IOCTL VIDIOC_S_CROP를 사용하여 출력 정보를 설정한다.
- IOCTL VIDIOC_REQBUFS를 사용하여 버퍼를 요청한다. 일반적인 V4L2 드라이버는 버퍼 체인을 생성한다(아직 할당되지 않음).
- 메모리는 버퍼를 사용자 공간에 매핑한다.
- IOCTL VIDIOC_QUERYBUF를 실행하여 버퍼를 쿼리한다.
- 후 처리가 필요한 데이터를 버퍼로 전달한다.
- IOCTL 커맨드 VIDIOC_QBUF를 사용하여 버퍼를 큐에 넣는다.
- 버퍼를 큐에서 가져오기 위해 IOCTL VIDIOC_DQBUF를 실행한다.
- IOCTL VIDIOC_STREAMON을 실행하여 스트림을 시작한다.
- IOCTL VIDIOC_STREAMOFF를 실행하여 스트림을 중지한다.
6.5.4 Software Operatoins
6.5.4.1 Source Code Structure
아래 테이블에는 V4L2 드라이버와 관련된 소스와 헤더 파일이 나열되어 있다.
이러한 파일들은 drivers/media/platform/mxc에서 사용할 수 있다.
Table 72. V4L2 Driver Files
File | Description |
---|---|
drivers/media/platform/mxc/output/mxc_vout.c | i.MX6과 i.MX7 V4L2 출력 디바이스 드라이버 |
drivers/media/platform/mxc/output/mxc_pxp_v4l2.c | V4L2 PxP 출력 디바이스 드라이버 |
drivers/media/platform/mxc/output/mxc_pxp_v4l2.h | V4L2 PxP 출력 디바이스 드라이버 헤더 |
drivers/media/platform/mxc/capture/mxc_v4l2_capture.c | V4L2 캡처 디바이스 드라이버 |
drivers/media/platform/mxc/capture/mxc_v4l2_capture.h | V4L2 캡처 디바이스 드라이버 헤더 |
drivers/media/platform/mxc/capture/ipu_bg_overlay_sdc.c | IPU 동기식 백그라운드 드라이버 |
drivers/media/platform/mxc/capture/ipu_fg_overlay_sdc.c | IPU 동기식 포그라운드 드라이버 |
drivers/media/platform/mxc/capture/ipu_prp_sw.h | IPU Pre-processing 헤더 |
drivers/media/platform/mxc/capture/ipu_still.c | IPU Pre-processing 스틸 이미지 캡처 드라이버 |
drivers/media/platform/mxc/capture/ipu_prp_vf_sdc_bg.c | IPU Pre-processing 뷰 파인더 (동기식 백그라운드) |
drivers/media/platform/mxc/capture/ipu_prp_enc.c | IPU Pre-processing Encoder 드라이버 |
drivers/media/platform/mxc/capture/ipu_csi_enc.c | IPU CSI 인터페이스 드라이버 |
V4L2 카메라용 드라이버는 divers/media/platform/mxc/capture에서 찾을 수 있다.
V4L2 출력용 드라이버는 drivers/media/platform/mxc/output에서 찾을 수 있다.
6.5.4.2 Menu Configuration Options
커널 구성 옵션은 아래에서 제공되고 있다.
- Device Drivers > V4L platform devices > MXC Video For Linux Video Capture
- Device Drivers > V4L platform devices > MXC Video For Linux Video Output