6.5 Video for Linux 2 (V4L2)
6.5.1 Introduction
V4L2(Video for Linux 2) 드라이버는 카메라 캡쳐와 디스플레이를 지원하는 V4L2 프레임워크를 위한 플러그인(plug-in)이다.
일부 i.MX SoC는 관련된 ipu(image processing unit)과 캡쳐 하드웨어를 기반으로 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에서 V4L2(Video for Linux 2) 드라이버는 DPU(Display Processing Unit)로만 카메라 캡쳐를 지원하는 V4L2 프레임워크용 플러그인이다.
V4L2 DPU 카메라 드라이버는 기본 캡쳐만 지원한다. V4L2 캡쳐 디바이스는 카메라나 TV 디코더에서 들어오는 비디오 이미지를 가져와서 메모리에 캡쳐한다. V4L2 드라이버에서 지원하는 기능은 다음과 같다 :
- 캡쳐 인터페이스를 위한 RGB 24비트, YUV 4:2:2 인터리브 형식
- 다양한 센서 드라이버 플러그인
- 스트리밍(queued) 입력 버퍼
- 프로그래밍 가능한 입/출력 픽셀 형식과 크기
- RGB 16, 24, 32비트, YUV 4:2:0, 4:2:2 인터리브 입력 형식
V4L2 카메라 기능을 사용하기 전에 modprobe mxc_v4l2_capture 명령을 실행해야 한다.
6.5.1.2 PxP V4L2
PxP용 V4L2 드라이버는 디스플레이 출력만 사용된다.
6.5.1.3 i.MX 6 with IPU V4L2
V4L2(Video for Linux 2) 드라이버는 V4L2 프레임워크에 대한 플러그인이다. 이는 카메라와 전처리 기능, 비디오와 후처리 기능을 지원한다. V4L2 카메라 드라이버는 모든 카메라 관련 기능에 대한 지원을 구현한다. V4L2 캡처 디바이스는 카메라 또는 스트림에서 들어오는 비디오 이미지를 가져와서 처리한다. 출력 디바이스는 비디오를 가져와 처리한 후 디스플레이나 유사한 디바이스로 보낸다.
IPU V4L2 드라이버가 지원하는 기능은 다음과 같다 :
- direct preview, SDC foreground overlay plane(LCD 새로 고침에 동기화됨)
- 그래픽 프레임 버퍼를 direct preview(LCD 새로 고침에 동기화되지 않음)
- 프레임 버퍼와 overlay plane의 칼라키나 알파 블렌딩
- IPU 인코딩 채널에서 스트림(queued) 캡처
- direct(Raw Bayer) 스틸 캡처(센서에 따라 다름)
- preview와 캡처를 위한 프로그래밍 가능한 픽셀 형식, 사이즈, 프레임 레이트
- 사용자 정의 API를 사용하여 프로그래밍 가능한 rotation와 flip
- RGB 16비트, 24비트, 32비트 preview 형식
- 캡처를 위한 Raw Bayer(센서에 따라 다름), RGB 16, 24, 32비트, YUV 4:2:0과 4:2:2 planar, YUV 4:2:2 인터리브, JPEG 형식
- exposure(노출), white-balance, brightness(밝기), contrast(대비) 등의 센서 속성 제어
- 다양한 센서 드라이버 플러그인
- 후처리 resize와 CSC, rotation, 디스플레이 IPU 채널 링크
- 스트림(queued) 입력 버퍼
- overlay와 중간(rotation) 버퍼의 이중 버퍼
- 입력 버퍼의 구성 가능한 3+ 버퍼
- 프로그래밍 가능한 입력/출력 픽셀 형식과 크기
- 프로그래밍 가능한 스케일링과 프레임 레이트
- RGB 16, 24, 32비트, YUV 4:2:0와 4:2:2 planar, YUV 4:2:0 인터리브 입력 형식
- TV 출력
modprobe mxc_v4l2_capture 명령은 V4L2 함수 호출 전에 실행되어야 한다.
6.5.1.4 IPU V4L2 Capture Device
V4L2 캡쳐 디바이스는 두 개의 인터페이스가 포함된다 :
- 캡처 인터페이스 - IPU 전처리 ENC 채널을 사용해서 YCbCr 비디오 스트림을 기록한다.
- 오버레이 인터페이스 - IPU 디바이스 드라이버를 사용하여 preview 비디오를 SDC foreground와 background 패널에 디스플레이한다.
Kernel 구성에서 V4L2 캡처 지원이 선택될 수 있다. 드라이버는 두 개의 레이어가 있다. 최상위 레이어는 체인 버퍼 관리, 스트림 API, 기타 ioctl 인터페이스를 포함하는 일반 비디오용 Linux 드라이버이다. 이 디바이스의 파일은 다음 위치에 있다.
drivers/media/platform/mxc/capture/
V4L2 캡처 디바이스 드라이버는 mxc_v4l2_capture.c 파일이다. 하위 레벨의 오버레이 드라이버는 ipu_fg_overlay_sdc.c, ipu_bg_overlay_sdc.c 이다.
이 코드(ipu_prp_end.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 캡처 디바이스에는 두 개의 인터페이스가 포함된다 :
- 캡처 인터페이스 - i.MX Processing Engine을 사용하여 YCbCr 비디오 스트림을 기록한다.
- 오버레이 인터페이스 - i.MX Processing Engine을 사용하여 preview 비디오를 SDC foreground와 background 패널에 디스플레이한다.
드라이버는 두 개의 레이어가 있다. 최상위 레이어는 체인 버퍼 관리, 스트림 API, 기타 ioctl 인터페이스를 포함하는 일반 비디오용 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_G_PARM
- VIDIOC_S_PARM
- VIDIOC_ENUMSTD
- VIDIOC_G_STD
- VIDIOC_S_STD
- VIDIOC_ENUMOUTPUT
- VIDIOC_G_OUTPUT
- VIDIOC_S_OUTPUT
V4L2 제어 코드는 rotation을 지원하도록 확장된다. ID는 V4L2_CID_PRIVATE_BASE이다. 지원되는 값은 다음과 같다 :
- 0 - 정상 작동
- 1 - Vertical flip
- 2 - Horizontal flip
- 3 - 180˚ rotation
- 4 - 90˚ rotation 시계 방향
- 5 - 90˚ rotation 시계 방향과 vertical flip
- 6 - 90˚ rotation 시계 방향과 horizontal flip
- 7 - 90˚ rotation 시계 반대 방향
아래 그림은 V4L2 Capture API의 상호 작용 블록 다이어그램을 보여준다.
6.5.2.2 Use of the V4L2 Capture APIs
이 섹션에서는 샘플 V4L2 캡쳐 프로세스에 대해 설명한다. 애플리케이션은 다음 단계를 완료한다 :
- IOCTL VIDIOC_S_FMT로 캡처 픽셀 형식과 크기를 설정한다.
- IOCTL VIDIOC_S_CTRL로 rotation 사용에 대한 제어 정보를 설정한다.
- IOCTL VIDIOC_REQBUFS를 사용하여 버퍼를 요청한다. 보통 V4L2 드라이버는 버퍼 체인을 생성한다(현재 최대 프레임 수는 3개).
- 버퍼를 사용자 영역에 메모리 매핑한다.
- IOCTL 커맨드 VIDIOC_QBUF를 사용하여 버퍼를 큐에 넣는다.
- IOCTL VIDIOC_STREAMON을 사용하여 스트림을 시작한다. 이 IOCTL은 i.MX Processing Engine 작업과 IDMA 채널을 활성화한다. 프레임에 대한 처리가 완료되면, 드라이버는 다음 프레임을 위해 대기중인(queued) 버퍼로 전환한다. 또한 드라이버는 버퍼가 준비 되었다는 신호를 세마포어로 보낸다.
- IOCTL VIDIOC_DQBUF를 사용하여 큐에서 버퍼를 가져온다. 이 IOCTL은 ISR 드라이버에서 신호를 보낼 떄까지 블록된다.
- 버퍼를 YCbCr 파일에 저장한다.
- 다시 VIDIOC_QBUF를 실행하여 V4L2 드라이버 queue에 있는 버퍼를 교체한다.
V4L2 스틸 이미지 캡처 프로세스의 경우, 애플리케이션은 다음 단계를 완료한다 :
- IOCTL_VIDIOC_S_FMT를 실행하여 캡처 픽셀 포맷과 크기를 설정한다.
- YUV422로 된 한 프레임의 스틸 이미지를 읽는다.
지원되는 V4L2 오버레이를 사용하는 경우, 애플리케이션은 다음 단계를 완료한다 :
- IOCTL VIDIOC_S_FMT로 overlay 윈도우를 설정한다.
- IOCTL VIDIOC_OVERLAY로 overlay 작업을 시작한다.
- IOCTL VIDIOC_OVERLAY로 overlay 작업을 종료한다.
6.5.3 V4L2 Output Device
드라이버는 출력 디바이스에 대해 표준 V4L2 API를 구현한다. Kernel 구성 중에 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 제어 코드는 de-interlace motion을 지원하도록 확장된다. 이 용도의 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를 사용하여 필요한 경우 rotation, de-interlace motion을 위한 제어 정보를 설정한다.
- 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 Operation
6.5.4.1 Source Code Structure
다음 테이블에는 V4L2 드라이버와 관련된 소스와 헤더 파일이 나열되어 있다.
이 파일은 drivers/media/platform/mxc에서 확인할 수 있다.
Table 73. V4L2 Driver Files
File | Description |
drivers/media/platform/mxc/output/mxc_vout.c | MX6 and 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 synchronous background 드라이버 |
drivers/media/platform/mxc/capture/ipu_fg_overlay_sdc.c | IPU synchronous forground 드라이버 |
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 뷰파인더 (synchronous background) |
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 카메라 드라이버는 drivers/media/platform/mxc/capture에서 찾을 수 있다.
V4L2 출력 드라이버는 drivers/media/platform/mxc/output에서 찾을 수 있다.
6.5.4.2 Menu Configuration Options
Kernel 구성 옵션은 다음과 같다.
Device Drivers > V4L2 platform devices > MXC Video For Linux Video Capture
Device Drivers > V4L2 platform devices > MXC Video For Linux Video Output
'NXP i.MX SoC Family > i.MX Linux Reference Manual' 카테고리의 다른 글
i.MX Linux Reference Manual - Video - Video Processing Unit (VPU) (0) | 2022.05.24 |
---|---|
i.MX Linux Reference Manual - Video - Video Analog-to-Digital Converter (VADC) (0) | 2022.05.23 |
i.MX Linux Reference Manual - Video - Display Interfaces (0) | 2022.05.09 |
i.MX Linux Reference Manual - Video - Display Controllers (0) | 2022.04.26 |
i.MX Linux Reference Manual - Video - Display Overview (0) | 2022.04.25 |