6.1 Capture Overview
6.1.1 Introduction
i.MX 캡처 드라이버 지원은 카메라 센서 컨트롤러와 인터페이스가 있는 V4L2 인터페이스로 이루어진다. 애플리케이션은 카메라 드라이버를 직접 사용할 수 없다. 대신, 애플리케이션은 V4L2 캡처 드라이버를 사용하여 미리보기와 이미지 캡처를 위해 카메라를 open/close 하고, 카메라 컨트롤, 카메라에서 이미지 가져오기와 카메라 미리보기를 시작한다.
캡처 컨트롤러 목록은 아래와 같다:
- Camera Serial Interface - CSI
- IPU-CSI
- Video Interface Unit - VIU
- Image Sensor Interface - ISI
- Image Sensor Processing - ISP
이미지 데이터 전송을 위한 캡처 인터페이스 목록은 다음과 같다:
- Parallel-CSI
- MIPI-CSI2
- HDMI RX
- TV Decoder
이 장에서는 다양한 컨트롤러와 인터페이스 사이의 차이점에 대해 설명한다.
참고
IPU가 있는 i.MX 6은 V4L2 인터페이스로 internaldev를 사용하는 반면, 다른 모든 제품은 V4L2 인터페이스로 subdev를 사용한다.
아래 테이블은 다양한 컨트롤러와 인터페이스 조합을 설명한다.
Table 52. Camera Controllers and Interfaces
SoC | Controller | Interface |
---|---|---|
6SLL | CSI | Parallel CSI |
6SoloX | VIU | Parallel CSI와 TV Decoder |
6UltraLite/6ULL | CSI | Parallel CSI |
6DualLite/Solo | IPU-CSI | Parallel CSI internaldev IPU |
6QuadPlus/Quad/Dual | IPU-CSI | Parallel CSI internaldev IPU |
7Dual/Solo | CSI | Samsung을 사용하는 MIPI-CSI2와 Parallel CSI |
8M Plus/8M Nano | ISI | MIPI-CSI2 |
8M Plus | ISP | MIPI-CSI2 |
8QuadMax | ISI | Mixel을 사용하는 MIPI-CSI2와 Cadence를 사용하는 HDMI Receiver |
8QuadXPlus | ISI | Mixel을 사용하는 MIPI-CSI2와 IMX8을 사용하는 Parallel CSI |
8M Quad | CSI | Mixel을 사용하는 MIPI-CSI2 |
8M Mini | CSI | Samsung을 사용하는 MIPI-CSI2 |
i.MX 93 | ISI | Synopsys을 사용하는 MIPI-CSI2 |
몇 가지 추가 세부 사항은 아래와 같다:
- ISP는 i.MX 8M Plus에 사용되는 새로운 컨트롤러이다.
- ISI 컨트롤러는 i.MX 8 시리즈에 사용되는 새로운 컨트롤러이다.
- IPU가 없는 i.MX 6 SoC, i.MX 7Dual와 i.MX 8M은 동일한 CSI 컨트롤러 드라이버를 사용한다.
- i.MX 8과 i.MX 8X 제품군은 최신 i.MX 8 CSI 드라이버를 사용한다.
- IPU가 있는 i.MX 6은 IPU 하드웨어와 인터페이스하는 맞춤형 CSI를 사용한다.
- 각 SoC는 이전 테이블에 설명된 대로 하나 이상의 인터페이스를 지원할 수 있다. 인터페이스는 Video for Linux V4L2 APIs와 일치한다.
- 일부 경우에는 캡처 컨트롤러가 카메라가 아닌 비디오 입력 장치에 연결된다. 일부는 HDMI Receiver에 대한 인터페이스도 제공한다.
6.1.2 Omnivision Camera
Omnivision Camera는 다양한 인터페이스와 카메라 타입을 지원한다. Omnivision 카메라는 저전력 소모의 소형 카메라 센서와 렌즈 모듈이다.
Omnivision 카메라는 컨트롤에 대해 I2C 클라이언트로 작동하는 센서를 컨트롤 하기 위해 SCCB(Serial Camera Control Bus) 인터페이스를 사용한다. 이 카메라는 CSI, MIPI-CSI2, Parallel-CSI 인터페이스의 전송 모드를 지원한다. MIPI 모드를 사용할 때, OV5460은 MIPI CSI-2 인터페이스로 i.MX 칩에 연결된다. MIPI는 센서 데이터를 수신하여 CSI로 전송한다.
테이블 아래에는 다양한 Omnivision 카메라와 지원되는 인터페이스가 나열되어 있다.
Table 53. Camera Controllers and Interfaces
Camera | Controller Interface |
---|---|
OV5640 | CSI 컨트롤러/MIPI-CSI2/Parallel CSI |
OV5642 | Parallel CSI |
OV10635 | MIPI-CSI2/Parallel CSI |
Omnivision 메뉴 구성에는 지원에 따라 여러 옵션이 있다.
최상위 단계 선택은 아래와 같다:
- Device Drivers > Multimedia support (MEDIA_SUPPORT [=y]) > V4L platform devices (V4L_PLATFORM_DRIVERS)
다음 단계 선택은 각 SoC에 대한 서로 다른 인터페이스를 기반으로 한다.
- IPU가 있는 i.MX 6의 경우, 아래를 모두 선택한다.
> MXC Camera/V4L2 PRP Features support
> OmniVision ov5640 camera support (MXC_CAMERA_OV5640) - IPU가 없는 i.MX 6의 경우, 아래를 선택한다.
> OmniVision ov5640 camera support (MXC_CAMERA_OV5640_V2) - i.MX 7의 경우, 아래를 선택한다.
> OmniVision ov5640 camera support using MIPI (MXC_CAMERA_OV5640_MIPI_V2) - i.MX 8의 경우, 아래를 선택한다.
> IMX8 Camera ISI/MIPI Features support (VIDEO_MX8_CAPTURE)
> IMX8 Camera Controller (IMX8_CAPTURE_DRIVER) and Maxim OV5640_V3 driver support (Device Drivers > Statging Drivers > Media Staging Drivers > i.MXqQXP/QM Camera ISI/MIPI Features support) - i.MX 8M의 경우, 아래를 선택한다.
> OmniVision ov5640 camera support (MXC_CAMERA_OV5640_V2) and OmniVision ov5640 camera support using MIPI (MXC_CAMERA_OV5640_MIPI_V2)
아래 테이블은 각 인터페이스로 지원되는 카메라 기능을 설명한다.
Table 54. Capture Interface Features
Interface | Features |
---|---|
IPU-CSI |
|
CSI |
|
ISI-8QuadXPlus |
|
ISI-8QuadMax |
|
ISI-8M Plus |
|
ISI-8M Nano |
|
ISI-IMX93 |
|
6.1.3 Parallel CSI
Parallel CSI 드라이버는 외부 CMOS 센서와 CCIR656 비디오 소스에 직접 연결할 수 있다. CSI와 센서 드라이버는 이미지 캡처 드라이버와 비디오 출력 드라이버로 구성된 Video for Linux Two(V4L2) 드라이버 프레임워크에 구현되어 있다.
드라이버는 CSI 인터페이스를 초기화하고 CSI 모듈에 대한 하드웨어 레지스터를 구성 및 작동한다. 아래 기능을 지원되고 있다:
- 가장 일반적으로 사용 가능한 CMOS 센서를 지원하는 구성 가능한 인터페이스 로직.
- 8비트/픽셀, 10비트/픽셀 또는 16비트/픽셀 데이터 형식을 32비트 수신 FIFO 패킹으로 완벽하게 컨트롤.
- 수신된 이미지 픽셀 데이터를 저장하는 128x32 FIFO.
- FIFO 오버런 방지 메커니즘으로 수신.
- AHB 버스로 수신 FIFO나 통계 FIFO에서 데이터를 전송하는 임베디드 DMA 컨트롤러.
- 외부 메모리에서 두 프레임의 더블 버퍼링을 지원.
- 마스크 가능한 인터럽트 소스에서 컨트롤러를 인터럽트하기 위한 단일 인터럽트 소스: Start of Frame, End of Frame 등.
- 센서에 대한 구성 가능한 마스터 클럭 주파수 출력.
V4L2 CSI 캡처 디바이스에는 캡처와 오버레이 인터페이스라는 두 가지 인터페이스가 포함되어 있다. 캡처와 오버레이 인터페이스는 CSI에 내장된 DMA 컨트롤러를 사용하여 V4L2 API를 사용하는 기능을 구현한다. 아래는 캡처와 오버레이의 데이터 흐름이다.
- 카메라는 8비트/10비트 데이터 포트로 데이터를 CSI 수신 FIFO로 보낸다.
- 내장된 DMA 컨트롤러는 AHB 버스로 수신 FIFO에서 외부 메모리로 데이터를 전송한다.
- 데이터는 사용자 공간 메모리에 저장되거나 프레임 버퍼로 직접 출력된다.
IPU가 있는 i.MX 6은 IPU와 직접 인터페이스하는 IPU-CSI 드라이버를 사용한다. i.MX Quad Plus/Quad/Dual은 2개의 IPU-CSI 시나리오를 지원한다. IPU가 없는 i.MX 6과 i.MX 7Dual/Solo는 센서에 직접 인터페이스하는 별도의 CSI 센서 드라이버를 사용한다.
6.1.4 MIPI Camera Serial Interface (MIPI CSI)
MIPI CSI-2 D-PHY에는 네 가지 블록이 있다. 각각 PHY 적응 레이어, 패킷 분석기, 이미지 데이타 인터페이스와 레지스터 뱅크이다.
MIPI CSI-2는 호스트 시스템에 카메라 센서를 연결하는 모바일 애플리케이션을 위한 고성능의 시리얼 상호 연결 버스가 있는 MIPI-Camera Serial Interface Host Controller이다. CSI-2 Host Controller는 MIPI CSI-2 Specification에 정의된 모든 프로토콜 기능을 구현하는 디지털 코어이다. 그렇게 해서, 시스템과 MIPI D-PHY 사이의 인터페이스를 제공하고 MIPI CSI-2-compliant Camera Sensor와의 통신을 허용한다.
MIPI CSI2 드라이버는 MIPI D-PHY를 관리하는 데 사용되며, MIPI 센서와 IPU CSI 모두에서 작동하도록 만든다. MIPI CSI2 드라이버는 아래와 같은 기능을 구현한다:
- mipi D-PHY 레지스터와 클럭 관리를 위한 MIPI CSI-2 저 수준 인터페이스
- MIPI 센서와 MIPI D-PHY 사이의 통신을 위한 MIPI CSI-2 공통 API
MIPI 공통 API를 호출하여, MIPI 센서는 센서에 대한 특정 정보(데이터 타입, 레인 수 등)를 MIPI CSI2 드라이버에 설정하여 D-PHY를 구성할 수 있다. IPU CSI 모듈 드라이버가 올바른 구성을 가지고 적절한 데이터를 수신하여 올바르게 처리하기 위해서는, MIPI CSI2 드라이버에서 센서에 대한 정보(데이터 타입, 가상 채널, IPU ID, CSI ID 등)를 수신해야 한다.
기능과 작동 목록은 아래와 같다:
- PHY Adaptation Layer는 PHY 오류 처리를 포함하여 D-PHY 인터페이스 관리를 담당한다.
- Packet Analyzer는 필요한 경우, 헤더 디코딩, 오류 감지와 수정, 프레임 크기 오류 감지와 CRC 오류 감지와 함께 데이터 레인 병합을 담당한다.
- Image Data Interface는 CSI-2 패킷 헤더 정보를 분리하고 메모리 스토리지 형식에 따라 데이터를 재정렬한다. 또한, 정확한 타이밍의 비디오 동기 신호를 생성한다. 몇 가지 오류 감지는 프레임 레벨과 라인 레벨에서도 수행된다.
- Register Bank는 표준 AMBA-APB 슬레이브 인터페이스로 액세스할 수 있으며, 구성과 컨트롤을 위해 CSI-2 Host Controller 레지스터에 대한 액세스를 제공한다. 또한, 특정 이벤트를 시스템에 알리기 위해 완전히 프로그램 가능한 인터럽트 생성기가 있다.
Linux OS에서 MIPI CSI2 드라이버는 두 개의 부분으로 구성된다. 하나는 mipi_csi2_info 구조체를 초기화하는 MIPI CSI2 드라이버 초기화 작업이고 다른 하나는 CSI 모듈 드라이버와 MIPI 센서 드라이버를 위해 API를 노출하는 MIPI CSI2 공통 API이다.
6.1.5 HDMI
Image Sensor Interface(ISI)와 HDMI 비디오 인터페이스이다.
i.MX 8QuadMax에서, HDMI 리시버 비디오 인터페이스는 HDMI 1.4 4K30을 하나의 포트에 지원한다.
6.1.6 Software Operation
캡처를 위한 V4L2 작업은 각 캡처 인터페이스에 따라 달라지는 모드, 사진 포맷과 사진 크기를 지원한다.
imx-test repo의 mxc_v4l2_test에는 이러한 인터페이스를 위한 단위 테스트가 있다. 테스트 실행 방법은 README를 참조한다.
6.1.7 V4L2 Capture
Video for Linux Two(V4L2)는 Linux 표준이다. API 사양은 https://www.kernel.org/doc/html/latest/userspace-api/media/v4l/v4l2.html에서 확인할 수 있다.
V4L2 캡처 디바이스에는 두 가지 인터페이스가 포함되어 있다. 캡처와 오버레이 디바이스를 위해 V4L2 API를 사용하는 캡처와 오버레이 인터페이스이다.
아래는 V4L2 캡처 API의 몇 가지 사용 사례 샘플이다:
- IOCTL VIDIOC_S_FMT를 사용하여 캡처할 픽셀 형식과 크기를 설정한다.
- 회전에 대해, IOCTL VIDIOC_S_CTRL을 사용하여 컨트롤 정보를 설정한다.
- IOCTL VIDIOC_REQBUFS를 사용하여 버퍼를 요청한다.
- 메모리는 사용자 공간으로 버퍼를 매핑한다.
- IOCTL VIDIOC_DQBUF를 실행한다.
- 사후 처리가 필요한 데이터를 버퍼로 전달한다.
- IOCTL 커맨드 VIDIOC_QBUF를 사용하여 버퍼를 대기열(queue)에 넣는다.
- IOCTL VIDIOC_STREAMON을 실행하여 스트림을 시작한다.
- VIDIOC_STREAMON와 VIDIOC_OVERLAY는 동시에 활성화할 수 없다.
아래 테이블에는 i.MX Capture Drivers에서 사용되는 V4L2 캡처 ioctls이 나열되어 있다. 자세한 내용은 V4l2 Chaper를 참조한다.
Table 55. V4L2 Capture API IOCTLs
IOCTL | Description |
---|---|
VIDIOC_QUERYCAP | Query Device Capabiities |
VIDIOC_G_FMT, VIDIOC_S_FMT | 데이터 형식 가져오기/설정하기 |
VIDIOC_S_DEST_CROP | 크로핑 영역 설정하기 |
VIDIOC_REQBUFS | 메모리 매핑 개시 |
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_OVERLAY | 비디오 오버레이 시작/정지 |
VIDIOC_G_FBUF, VIDIOC_S_FBUF | 프레임 버퍼 오버레이 파라미터 가져오기/설정하기 |
VIDIOC_G_PARM, VIDIOC_S_PARM | 스트리밍 파라미터 가져오기/설정하기 |
VIDIOC_G_STD, VIDIOC_S_STD | 비디오 표준 가져오기/설정하기 |
VIDIOC_G_OUTPUT, VIDIOC_S_OUTPUT | 비디오 출력 가져오기/설정하기 |
VIDIOC_G_INPUT, VIDIOC_S_INPUT | 비디오 입력 가져오기/설정하기 |
VIDIOC_ENUMSTD | 비디오 표준 열거하기 |
VIDIOC_ENUMOUTPUT, VIDIOC_ENUMINPUT | 출력과 입력 열거하기 |
VIDIOC_ENUM_FMT | 이미지 형식 열거하기 |
VIDIOC_ENUM_FRAMESIZE, VIDIOC_ENUM_FRAMEINTERVALSS | 프레임 크기와 프레임 사이 간격 열거하기 |
VIDIOC_DBG_G_CHIP_IDENT | 칩 식별 |
6.1.8 Source Code Structure
아래 테이블은 캡처 드라이버의 소스 파일을 보여준다. i.MX 6과 i.MX 7의 경우, 소스 파일은 drivers/media/platform/mxc/capture에 있다. i.MX 8 시리즈의 경우, 소스 파일은 drivers/media/platform/imx8에 있다. MIPI-CSI의 경우, 소스 파일은 drivers/mxc/mipi에 있다.
Table 56. Omnivision V4L2 Camera Driver Files
File | Description |
---|---|
|
i.MX 8 MIPI-CSI2 Capture Interface 드라이버 |
|
i.MX 8 MIPI-CSI2 Parallel-CSI Interface 드라이버 |
|
i.MX 8 ISI Capture Controller 드라이버 |
|
i.MX 8 Omnivision Camera V3 Camera 인터페이스 |
|
i.MX 8 JEPG 하드웨어 인터페이스 |
|
i.MX 6과 i.MX 7 MIPI-CSI2 인터페이스 코어 드라이버 |
|
i.MX 6 IPU V4L2 플러그인 |
|
CSI Omnivision Camera V4L2 플러그인 |
|
Paralllel CSI Omnivision Camera V4L2 플러그인 |
|
MIPI-CSI Omnivision Camera V4L2 플러그인 |
|
MIPI-CSI2 Omnivision Camera V4L2 플러그인 |
|
TV Decoder ADV7180 V4L2 |
|
i.MX 8 HDMI RX |