6.3 Display Controllers
6.3.1 Display Processing Unit (DPU)
6.3.1.1 Introduction
Display Processing Unit(DPU)는 비디오와 그래픽 처리 기능을 지원하고 비디오와 스틸 이미지 센서와 디스플레이와 인터페이스하도록 디자인되어 있다. DPU 드라이버는 논리 채널을 조작하기 위한 내부 커널 수준의 API를 제공한다. 논리 채널은 완전한 DPU 처리 흐름을 나타낸다. 예를 들어, 완전한 DPU 처리 흐름(논리 채널)은 메모리에서 YUV 버퍼를 읽어서 이를 외부 인터페이스에 표시하는 것으로 구성할 수 있다. DPU API는 모든 채널에 대해 공통 기능의 세트로 구성된다. 그 기능으로는 채널 초기화, 버퍼 설정, 채널 활성화/비활성화, 인터럽트 설정이 있다.
일반적인 논리 채널은 아래를 포함한다:
- 메모리로 CSI 직접 접근
- 동기식 프레임 버퍼 배경에 대한 메모리
- 동기식 프레임 버퍼 전경에 대한 메모리
상위 레벨 드라이버는 메모리 할당과 사용자 레벨의 API 제공을 담당한다. DPU 인터페이스는 V4L2 프레임워크에서 캡처하고 DRM 디스플레이 프레임워크를 사용하여 표시할 수 있다. DPU는 LVDS, MIPI-DSI, HDMI와 Parallel 디스플레이 인터페이스와 연결된다.
DPU 디스플레이 컨트롤러는 아래를 포함하는 32비트 디스플레이 컴포지션 엔진을 지원한다:
- 독립 패널에 두 개의 디스플레이 출력 스트림
- 2 레이어 컴포지션
- Region CRC 검사기를 사용하여 CRC 매칭을 사용하는 Automatic safety stream panic plus detection
DPU 디스플레이 컨트롤러는 효율성, 성능 그리고 안전성을 제공하는 2D 컴포지션 엔진을 지원한다. DPU 2D 그래픽 엔진 지원은 GPU에 대한 부담이 줄여주기 때문에, 3D GPU만을 사용한다. 오버레이 네이티브 비디오와 그래픽의 비디오 효율성은 시스템 메모리에 대한 액세스를 최소화한다. 전력 효울성으로 인해 Android Hardware Composer와 같은 윈도우 GUI를 위해 3D 엔진을 끌 수 있다.
또한, DPU는 인증을 위해 아래를 지원한다.
- 8개의 스택(적층) 가능한 영역을 마스크할 수 있는 CRC 검사기, 배타적인 위에서 아래로의 우선 순위
- CRC 검사는 후처리 파이프의 모든 단계 후에 넣을 수 있다.
- CRC 실패는 SW 인터럽트를 생성하거나, Frame Gen을 Safety Stream이나 Constant Plane으로 전환할 수 있다.
DPU 디스플레이 인터페이스 캐시는 아래를 지원한다.
- 각 디스플레이 평면(plane)에는 멀티 라인 캐시가 있다.
- 이는 각 평명에 대해 8라인의 픽셀을 포함한다.
- RGB, YUV 등 기타 형식이 지원된다.
- Video와 GPU 타일 형식을 지원한다.
- 미리 캐시를 채우기 위해 메모리에서 콘텐츠를 가져(fetch)온다.
- 수평과 수직 가져(fetch)오기가 지원된다.
- 워프 가져오기는 지원되지 않고, 우회(bypass)가 필요하다.
6.3.1.2 DRM
디스플레이 처리 유닛(DPU)는 비디오 디스플레이를 지원하는 DRM 드라이버와 인터페이스한다.
6.3.1.3 Source Code Structure
DPU 드라이버는 DRM, blitting 그리고 메인 프로세싱으로 분리되어 있다. 공통적인 기능은 drivers/gpu/drm/imx/dpu와 drivers/gpu/imx/dpu-blit에서 제공되며, 메인 드라이버는 drivers/gpu/imx/dpu에 있다. 아래 테이블에는 소스 파일이 나열되어 있다.
Table 57. DPU Driver source
File | Description |
---|---|
DRM Source | |
drivers/gpu/drm/imx/dpu/dpu-plane | DRM DPU Plane |
drivers/gpu/drm/imx/dpu/dpu-crtc | DRM DPU CRTC |
drivers/gpu/drm/imx/dpu/dpu-blit | DRM DPU blitter |
drivers/gpu/drm/imx/dpu/dpu-kms | DRM DPU KMS |
DPU Blitter Source | |
drivers/gpu/imx/dpu-blit/dpu-blit | DPU Bliter |
drivers/gpu/imx/dpu-blit/dpu-blit-registers.h | DPU Blit registers |
DRM Core Source | |
drivers/gpu/imx/dpu/dpu-vscaler.c | DPU VScaler |
drivers/gpu/imx/dpu/dpu-fetchwarp.c | DPU Fetchwarp |
drivers/gpu/imx/dpu/constframe.c | DPU Const Frame |
drivers/gpu/imx/dpu/dpu-prv.h | DPU Private headers |
drivers/gpu/imx/dpu/dpu-disengcfg.c | DPU Display Configurations |
drivers/gpu/imx/dpu/dpu-fetchunit.c | DPU Fetch Unit |
drivers/gpu/imx/dpu/dpu-framegen.c | DPU Frame Generator |
drivers/gpu/imx/dpu/dpu-hscaler.c | DPU HScaler |
drivers/gpu/imx/dpu/dpu-extdst.c | DPU External Destination |
drivers/gpu/imx/dpu/dpu-common.c | DPU Common |
drivers/gpu/imx/dpu/dpu-fetchlayer.c | DPU Fetch Layer |
drivers/gpu/imx/dpu/dpu-tcon.c | DPU TCon |
drivers/gpu/imx/dpu/dpu-layerblend.c | DPU Layer Blend |
drivers/gpu/imx/dpu/dpu-fetcheco.c | DPU Fetch Encode |
drivers/gpu/imx/dpu/dpu-fetchdecode.c | DPU Decode |
6.3.1.4 Menu Configuration Options
DPU 모듈에 대해 아래와 같은 Linux 커널 구성 옵션이 제공되고 있다.
- Device Drivers -> i.MX DPU core support
6.3.2 Image Processing Unit (IPU)
6.3.2.1 Introduction
Image Processing Unit(IPU)는 비디오와 그래픽 처리 기능을 지원하고 비디오와 스틸 이미지 센서와 디스플레이와 인터페이스하도록 디자인되어 있다. IPU 드라이버는 논리 채널을 조작하기 위한 커널 레벨의 API를 제공한다. 논리 채널은 완전한 IPU 처리 흐름을 나타낸다. 예를 들어, 완전한 IPU 처리 흐름(논리 채널)은 메모리에서 YUV 버퍼 읽고, 사후 처리 수행하고 RGB 버퍼를 메모리에 저장하는 것으로 구성될 수 있다. 논리 채널은 1~3개의 IDMA 채널을 매핑하고, 0 또는 1개의 IC 작업으로 매핑한다. 논리 채널은 하나의 입력과 하나의 출력과 하나의 보조 입력 IDMA 채널을 가질 수 있다. IPU API는 모든 채널에 대한 공통의 기능 세트로 구성된다. 그 기능은 채널 초기화와 버퍼 설정과 채널 활성화/비활성화와 자동 프레임 동기화를 위한 채널 링크와 인터럽트 설정이다.
IPU는 디스플레이 컨트롤러이며, 프레임 버퍼 디스플레이 프레임워크로 지원되는 아래의 디스플레이 인터페이스를 지원한다. 액세스는 프레임 버퍼 fbdev 애플리케이션 프레임워크로만 노출되고 있다.
- Parallel
- LVDS
- HDMI
- MIPI-DSI
일반적인 논리 채널은 아래를 포함한다:
- 메모리로 CSI 직접 접근
- 메모리로 뷰파인더 전처리를 위한 CSI
- 메모리에서 뷰파인더 전처리를 위한 메모리
- 메모리에서 뷰파인더 회전을 위한 메모리
- 메모리에서 비디오 인터레이싱과 뷰파인더 전처리를 위한 메모리의 이전 필드 채널
- 메모리에서 비디오 인터레이싱과 뷰파인더 전처리를 위한 메모리의 현재 필드 채널
- 메모리에서 비디오 인터레이싱과 뷰파인더 전처리를 위한 메모리의 다음 필드 채널
- 메모리에서 인코더 전처리를 위한 CSI
- 메모리에서 인코더 전처리를 위한 메모리
- 메모리에서 인코더 회전을 위한 메모리
- 메모리에서 사후 처리 회전을 위한 메모리
- 동기식 프레임 버퍼 배경에 대한 메모리
- 동기식 프레임 버퍼 전경에 대한 메모리
- 동기식 프레임 버퍼 DC에 대한 메모리
- 동기식 프레임 버퍼 마스크에 대한 메모리
IPU API에는 모든 채널에서 공통적이지 않고 IPU 서브 모듈에만 해당되는 몇 가지 추가 기능이 있다. IPU 서브 모듈의 기능 유형은 아래와 같다:
- 동기식 프레임 버퍼 기능
- 패널 인터페이스 초기화
- 전경 위치 설정
- 지역/전역 알파와 색상 키 설정
- 감마 설정
- CSI 기능
- 센서 인터페이스 초기화
- 센서 클럭 설정
- 캡처 크기 설정
- PRE/PRG를 사용하여 선형 프레임 사전 추출 활성화/비활성화
- PRE/PRG를 사용하여 타일 프레임 분석 활성화/비활성화
상위 레벨 드라이버는 메모리 할당과 채널 체인과 사용자 레벨의 API 제공을 담당한다.
6.3.2.2 Hardware Operation
IPU의 자세한 하드웨어 작동은 Applications Processor Reference Manual에서 설명되어 있다. 아래 그림은 IPU 하드웨어 모듈을 보여준다.
6.3.2.3 Software Operation
IPU 드라이버는 Linux 커널의 독립형 드라이버 모듈이다.
아래 블록에 대한 사용자 지정 커널 레벨 API로 구성된다:
- 동기식 프레임 버퍼 드라이버
- Display Interface (DI)
- Display Processor (DP)
- Image DMA Controller (IDMAC)
- CMOS Sensor Interface (CSI)
- Image Converter (IC)
- Prefetch/Resolve Engine/Gasket (PRE/PRG)
아래 그림은 다양한 그래픽/비디오 드라이버와 IPU 사이의 상호 작용을 보여준다.
IPUv1용 드라이버는 간단하게 ipu라고 불린다. IPUv3용 드라이버는 이름에 3이나 v3를 포함한다. IPU 드라이버는 아래와 같이 세분화되어 있다:
- 디바이스 드라이버 - 동기식 프레임 버퍼를 위한 프레임 버퍼 드라이버, 디스플레이를 위한 프레임 버퍼 드라이버, IPU 전처리를 위한 V4L2 캡처 드라이버, IPU 후처리를 위한 V4L2 출력 드라이버, 그리고 사용자 공간이나 V4L2 드라이버로 시스템 인터페이스를 제공하는 ipu 프로세싱 드라이버를 포함한다. 프레임 버퍼 디바이스 드라이버는 drivers/video/mxc에서 사용할 수 있다. V4L2 디바이스 드라이버는 drivers/media/platform/mxc에서 사용할 수 있다.
- MXC 디스플레이 드라이버는 IPU와 디스플레이 디바이스 드라이버(예: LCD, LVDS, HDMI, MIPI, 등) 사이의 상호 작용을 관리하기 위한 단순한 프레임워크로 도입되었다.
- 하위 레벨의 라이브러리 루틴 - IPU 하드웨어 레지스터에 대한 인터페이스. 그것들은 상위 레벨의 디바이스 드라이버에서 입력을 받아 IPU 하드웨어와 통신을 한다. 하위 레벨 라이브러리는 Linux 커널의 디렉터리에서 사용할 수 있다.
6.3.2.4 IPU Frame Buffer Drivers Overview
프레임 버퍼 디바이스 드라이버는 그래픽 하드웨어에 대한 추상화를 제공한다. 이는 비디오 하드웨어의 프레임 버퍼를 나타내고, 애플리케이션 소프트웨어가 잘 정의된 인터페이스로 그래픽 하드웨어에 액세스할 수 있도록 하므로, 소프트웨어가 하위 레벨의 하드웨어 레지스터에 대해 알아야 할 필요가 없다.
드라이버는 커널 구성에서 그래픽 파라미터 아래 프레임 버퍼 옵션을 선택하여 활성화될 수 있다. 프레임 버퍼 드라이버를 보완하기 위해, 커널 빌더는 글꼴과 시작 로고 지원을 포함할 수도 있다. 이 디바이스는 시리얼에서 그래픽 모드로 전환하기 위해 VT(vitual terminal: 가상 터이널) 콘솔에 의존한다. 이 디바이스는 /dev 디렉토리에 위치한 특수 디바이스 노드를 통해 /dev/fb*에 액세스되고 있다. fb0은 일반적으로 기본(primary) 프레임 버퍼이다.
물리적인 메모리 할당과 LCD 패널 구성 외에, 일반적인 커널 비디오 API는 색상 설정, 팔레트 등록, 이미지 블리팅(블럭 전송), 그리고 메모리 매핑에 사용된다. IPU는 프레임 버퍼 메모리에서 로우 픽셀 데이터를 읽고 디스플레이를 위해 패널로 보낸다.
6.3.2.5 IPU Frame Buffer Hardware Operation
프레임 버퍼는 IPU 하드웨어 드라이버 모듈과 상호 작용한다.
6.3.2.6 IPU Frame Buffer Software Operation
프레임 버퍼 디바이스는 /dev/mem과 같은 메모리 디바이스이며, 메모리 디바이스와 유사한 기능을 가지고 있다. 사용자는 그것을 읽고, 그것에 쓰고, 그 안에서 어떤 위치를 탐색하고 그것을 mmap()(주요 용도)할 수 있다. 다른 점은 특수 파일에 나타나는 메모리가 전체 메모리가 아니라, 일부 비디오 하드웨어의 프레임 버퍼라는 것이다.
또한, /dev/fb*는 사용자가 하드웨어에 대한 정보를 쿼리하고 설정할 수 있도록 하는 여러 IOCTL과 상호 작용한다. 컬러 맵도 IOCTL로 처리된다. 존재하는 IOCTL과 사용하는 데이터 구조체에 대한 자세한 내용은 include/uapi/linux/fb.h를 참조한다. 아래는 몇 가지 IOCTL 기능이다:
- 이름, 스크린 메모리 구성(평면, 픽셀 패킹, 등등), 그리고 스크린 메모리의 주소와 길이 같은 하드웨어에 대한 일반적인 정보를 요청한다.
- 가시적과 가상 형상, 깊이, 색상 맵 형식, 타이밍 등과 같은 하드웨어에 대한 가변 정보를 요청하고 변경한다. 이 정보가 변경되면, 드라이버는 하드웨어 기능(하드웨어는 가능하지 않은 경우 EINVAL을 반환함)을 충족하는 값을 제안한다.
- 컬러 맵의 일부를 가져오고 설정한다. 통신은 기존 모든 하드웨어를 지원하기 위해 픽셀당 16비트(빨간색, 녹색, 파란색, 투명도에 대한 값)이다. 드라이버는 옵션을 하드웨어에 적용하는 데 필요한 모든 계산을 수행한다(더 적은 비트로 반올림, 투명도 값을 버릴 수 있음).
하드웨어 추상화는 애플리케이션 프로그램의 구현을 쉽고 보다 이식성 있게 만든다. 프레임 버퍼 이미지 데이터에서 직접 작동하기 때문에, 애플리케이션 프로그램에 내장되어야 하는 유일 것은 스크린 구성(비트 평면이나 청키(chunky:덩어리, 큰 블럭) 픽셀 등)이다.
MXC 프레임 버퍼 드라이버(drivers/video/mxc/mxc_ipuv3_fb.c)는 일반 Linux 프레임 버퍼 드라이버(drivers/video/fbdev/core/fbmem.c)와 밀접하게 상호 작용한다.
6.3.2.7 Synchronous Frame Buffer Driver
동기식 프레임 버퍼 스크린 드라이버는 동기식 LCD 패널이나 메모리가 없는 LCD 패널용 Linux 표준 프레임 버퍼 드라이버 API를 구현한다. 동기식 프레임 버퍼 스크린 드라이버는 커널과 사용자 레벨 애플리케이션과 상호 작용하는 최상위 레벨의 커널 비디오 드라이버이다. 이는 커널 구성의 그래픽 지원 디바이스 드라이버 아래에 Synchronous Panel Frame buffer option을 선택하여 활성화되고 있다. 프레임 버퍼를 보완하기 위해, 커널 빌더는 글꼴과 시작 로고에 대한 지원을 포함할 수도 있다. 이는 시리얼에서 그래픽 모드로 전환하기 위해 VT 콘솔에 의존한다.
물리적 메모리 할당과 LCD 패널 구성을 제외하고, 일반적인 커널 비디오 API는 색상 설정, 팔레트 등록, 이미지 블리팅, 그리고 메모리 매핑에 사용되고 있다. IPU는 프레임 버퍼 메모리에서 로우 픽셀 데이터를 읽고 디스플레이를 위해 패널로 보낸다.
프레임 버퍼 드라이버는 커널 구성 옵션으로 다양한 패널을 지원한다. 새로운 패널에 대한 지원은 패널 설정 구조체에 새 값을 정의하여 추가할 수 있다.
프레임 버퍼는 아래를 허용하는 사용자 지정 API를 사용하여 IPU 드라이버와 상호 작용한다:
- 패널 인터페이스 설정 초기화
- LCD Refresh를 위한 IPU 채널 설정 초기화
- 더블 버퍼링 지원을 위한 프레임 버퍼 주소 변경
아래 기능이 지원되고 있다:
- 구성 가능한 스크린 해상도
- 구성 가능한 프레임 버퍼에서 픽셀당 RGB 16, 24 또는 32비트
- 구성 가능한 패널 인터페이스에서 시그널 타이밍과 극성
- 팔레트 색상 변환 관리
- 전원 관리
- LCD 전원 끄기/켜기
- PRE/PRG 기능 활성화/비활성화
사용자 애플리케이션은 일반적인 비디오 API(표준 Linux 프레임 버퍼 드라이버 API)를 활용하여 프레임 버퍼 기능을 수행한다. 여기에는 아래를 포함한다:
- 해상도와 스캔 길이 같은 스크린 정보 얻기
- 직접 블리팅 작업을 수행하기 위해 mmap을 사용하여 사용자 공간 메모리 할당
두 번재 프레임 버퍼 드라이버는 두 번째 비디오/그래픽 평면을 지원한다.
6.3.2.8 IPU Backlight Driver
또한, IPU 드라이버는 백라이트를 컨트롤한다. IPU 백라이트 드라이버는 패널을 위한 IPU PWM 백라이트 컨트롤을 구현한다. 사용자 공간에서 /sys/class/backlight/pwm-backlight.0/brightness 아래에서 sys 컨트롤 파일을 노출한다. 기본 백라이트 강도 값은 128이다.
6.3.2.9 IPU Device Driver
IPU(프로세싱) 디바이스 드라이버는 IPUv3의 IC/IRT 모듈을 기반으로 크기 조정/회전/CSC/조합/디인터레이싱 같은 이미지 처리 기능을 제공한다.
IPU 디바이스 드라이버는 태스크 기반이며, 사용자는 태스크 설정을 준비하고, 태스크를 큐에 넣은 다음 태스크 완료를 블럭 대기만 하면 된다. 현재 드라이버는 블러킹 방식만 지원하며, 향후 넌블러킹 방식이 추가될 예정이다. 태스크 구조체는 아래와 같다:
struct ipu_task {
struct ipu_input input;
struct ipu_output output;
bool overlay_en;
struct ipu_overlay overlay;
#define IPU_TASK_PRIORITY_NORMAL 0
#define IPU_TASK_PRIORITY_HIGH 1
u8 priority;
#define IPU_TASK_ID_ANY 0
#define IPU_TASK_ID_VF 1
#define IPU_TASK_ID_PP 2
#define IPU_TASK_ID_MAX 3
u8 task_id;
int timeout;
};
struct ipu_input {
u32 width;
u32 height;
u32 format;
struct ipu_crop crop;
dma_addr_t paddr;
struct ipu_deinterlace deinterlace;
dma_addr_t paddr_n; /*valid when deinterlace enable*/
};
struct ipu_overlay {
u32 width;
u32 height;
u32 format;
struct ipu_crop crop;
struct ipu_alpha alpha;
struct ipu_colorkey colorkey;
dma_addr_t paddr;
};
struct ipu_output {
u32 width;
u32 height;
u32 format;
u8 rotate;
struct ipu_crop crop;
dma_addr_t paddr;
};
태스크를 준비하려면, 사용자는 task.input, task.overlay(결합이 필요한 경우) 그리고 task.output 파라미터를 채우고, 커널 레벨인 경우 int ipu_queue_task(struct ipu_task *task); 또는 애플리케이션 레벨인 경우 /dev/mxc_ipu 아래 IPU_QUEUE_TASK ioctl로 태스크를 큐에 넣는다.
6.3.2.10 Source Code Structure
IPU, Sensor, V4L2 그리고 Panel 드라이버와 관련된 소스 파일은 아래 폴더에서 사용할 수 있다.
- drivers/mxc/ipu3
- drivers/video/mxc
- drivers/video/fbdev/mxc
- drivers/video/backlight
IPU V4L2 드라이버 파일에 대한 자세한 내용은 V4L2 장을 참조한다.
Table 58. IPU Driver Files
File | Description |
---|---|
drivers/mxc/ipu3/ipu_common.c | IPU 일반 라이브러리 기능 |
drivers/mxc/ipu3/ipu_ic.c | IPU IC 기반 드라이버 |
drivers/mxc/ipu3/ipu_device.c | IPU 디바이스 드라이버 인터페이스와 fops 기능 |
drivers/mxc/ipu3/ipu_capture.c | IPU CSI 캡처 기반 드라이버 |
drivers/mxc/ipu3/ipu_disp.c | IPU 디스플레이 기능 |
drivers/mxc/ipu3/ipu_calc_stripes_sizes.c | ipu_device.c에 대한 멀티스트라이프 메서드 함수 |
drivers/mxc/ipu3/pre.c | i.MX 6 QuadPlus Prefetch/Resolve 엔진 드라이버 |
drivers/mxc/ipu3/prg.c | i.MX 6 QuadPlus Prefetch/Resolve Gasket 드라이버 |
drivers/mxc/ipu3/mxc_ipuv3_fb.c | 동기식 프레임 버퍼 드라이버 |
drivers/mxc/ipu3/vdoa.c | ipu_device.c에서 사용되는, VDOA 후처리 드라이버 |
drivers/video/fbdev/mxc/mxc_lcdif.c | CLAA-WVGA를 위한 Display Driver이고 SEIKO-WVGA LCD 지원 |
drivers/video/fbdev/mxc/mxc_hdmi.c | HDMI 인터페이스를 위한 Display Driver |
drivers/video/fbdev/mxc/ldb.c | 온칩 LVDS를 위한 동기식 프레임 버퍼 드라이버 |
drivers/video/fbdev/mxc/mxc_dispdrv.c | 동기식 프레임 버퍼를 위한 Display Driver 프레임워크 |
drivers/video/fbdev/mxc/mxc_edid.c | EDID를 위한 드라이버 |
테이블 59에는 IPU와 Panel 드라이버와 관련된 헤더 파일이 나열되어 있다.
Table 59. IPU Global Header Files
File | Description |
---|---|
drivers/mxc/ipu3/ipu_param_mem.h | IPU 파라미터 메모리에 액세스하기 위한 도우미 함수 |
drivers/mxc/ipu3/ipu_prv.h | 전처리 드라이버를 위한 헤더 파일 |
drivers/mxc/ipu3/ipu_regs.h | IPU 레지스터 정의 |
drivers/mxc/ipu3/pre-regs.h | Prefetch/Resolve Engine 레지스터 정의 |
drivers/mxc/ipu3/prg-regs.h | Prefetch/Resolve Gasket 레지스터 정의 |
drivers/mxc/ipu3/vdoa.h | VDOA 드라이버를 위한 헤더 파일 |
drivers/video/fbdev/mxc/mxc_dispdrv.h | 디스플레이 드라이버를 위한 헤더 파일 |
include/linux/uapi/mxcfb.h | 동기식 프레임 버퍼 드라이버를 위한 헤더 파일 |
include/linux/uapi/ipu.h | IPU API를 위한 헤더 파일 |
6.3.2.11 Menu Configuration Options
IPU 모듈에 대해 아래와 같은 Linux 커널 구성 옵션이 제공되고 있다.
메뉴 구성에서 아래 모듈을 활성화한다:
- CONFIG_MXC_IPU_V3 - Image Processing Unit에 대한 지원을 포함한다. menuconfig에서, 이 옵션은 다음에서 사용할 수 있다:
Device Drivers > MXC support drivers > Image Processing Unit Driver
이 옵션은 모든 아키텍처에 대해 기본 값이 Y 이다. ARCH_MXC가 true이면, CONFIG_MXC_IPU_V3이 설정된다. - CONFIG_MXC_IPU_V3_PRG - 이를 통해 IPUv3 prefetch gasket 엔진을 지원하여, IPUv3와 prefetch engine(PRE) 사이의 더블 버퍼 핸드셰이크 컨트롤을 지원하고,AXI 인터페이스를 스누핑하여 디스플레이 리프레시 요청을 메모리로 가져오고, 요청 주소를 수정하여 OCRAM에서 더블 버퍼링된 블럭의 행을 가져올 수 있.
Device Drivers > MXC support drivers > i.MX IPUv3 prefetch gasket engine
이 옵션은 CONFIG_MXC_IPU_V3와 CONFIG_MXC_IPU_V3_PRE에 의존한다. - CONFIG_MXC_IPU_V3_PRE - 이를 통해 IPUv3 prefetch 엔진을 지원하여, 시스템 메모리 성능을 향상 시킨다. 엔진에는 타일 픽셀 형식의 프레임을 선형으로 분해하는 기능이 있다.
Device Drivers > MXC support drivers > i.MX IPUv3 prefetch engine
이 옵션은 CONFIG_MXC_IPU_V3에 의존한다. 이 옵션을 활성화하려면 CONFIG_MXC_IPU_V3_PRG를 선택한다. - CONFIG_MXC_CAMERA_OV5640_MIPI - OV 5640 mipi 센서 드라이버와 사용 사례 드라이버 모두에 대한 옵션이다. 이 옵션은 VIDEO_MXC_CAPTURE 옵션에 의존한다. menuconfig에서, 이 옵션은 다음에서 사용할 수 있다:
Device Drivers > Multimedia support > V4L platform devices > MXC Video For Linux Video Capture > MXC Camera/V4L2 PRP Features support > OmniVision 5640 Camera support using mipi - CONFIG_MXC_CAMERA_OV5640 - OV5640 센서 드라이버와 사용 사례 드라이버 모두에 대한 옵션이다. 이 옵션은 VIDEO_MXC_CAPTURE 옵션에 의존한다. menuconfig에서, 이 옵션은 다음에서 사용할 수 있다:
Device Drivers > Multimedia platform > V4L platform devices > MXC Video For Linux Video Capture > MXC Camera/V4L2 PRP Features support > OmniVision ov5640 camera support
한 번에 하나의 센서만 설치해야 한다. - CONFIG_MXC_IPU_PRP_VF_SDC - IPU 옵션(여기서 > 심볼은 HW 블럭 사이의 데이터 흐름의 방향을 나타낸다):
CSI > IC > MEM MEM > IC (PRP VF) > MEM
덤(dumb) 센서용 또는
CSI > IC(PRP VF) > MEM
스마트 센서용 사용 사례 드라이버. menuconfig에서, 이 옵션은 다음에서 사용할 수 있다:
Multimedia devices > Video capture adapters > MXC Video For Linux Camera > MXC Camera/V4L2 PRP Features support > Pre-Processor VF SDC library
이 옵션은 기본 값으로 모두 M 이다. - CONFIG_MXC_IPU_PRP_ENC - IPU 옵션:
덤 센서용
CSI > IC > MEM MEM > IC (PRP ENC) > MEM
또는 스마트 센서용 사용 사례
CSI > IC(PRP ENC) > MEM.
menuconfig에서, 이 옵션은 다음에서 사용할 수 있다:
Device Drivers > Multimedia Devices > Video capture adapters > MXC Video For Linux Camera > MXC Camera/V4L2 PRP Features support > Pre-processor Encoder library
이 옵션은 기본 값으로 모두 M으로 설정된다. - CONFIG_VIDEO_MXC_CAMERA - V4L2 캡처 드라이버에 대한 구성 옵션이다. 이 옵션은 아래 식에 의존한다:
VIDEO_DEV && MXC_IPU && MXC_IPU_PRP_VF_SDC && MXC_IPU_PRP_ENC
menuconfig에서, 이 옵션은 다음에서 사용할 수 있다:
Device Drivers > Multimedia devices > Video capture adapters > MXC Video For Linux Camera
이 옵션은 기본 값으로 모두 M 이다. - CONFIG_VIDEO_MXC_OUTPUT - V4L2 출력 드라이버에 대한 구성 옵션이다. 이 옵션은 VIDEO_DEV && MXC_IPU 옵션에 의존한다. menuconfig에서, 이 옵션은 다음에서 사용할 수 있다:
Device Drivers > Multimedia devices > Video capture adapters > MXC Video for Linux Video Output
이 옵션은 기본 값으로 모두 Y 이다. - CONFIG_FB - Linux 커널에 프레임 버퍼 지원을 포함하는 구성 옵션이다. menuconfig에서, 이 옵션은 다음에서 사용할 수 있다:
Device Drivers > Graphics support > Support for frame buffer devices
이 옵션은 모든 아키텍처에서 기본 값이 Y 이다. - CONFIG_FB_MXC - MXC 프레임 버퍼 드라이버에 대한 구성 옵션이다. 이 옵션은 CONFIG_FB 옵션에 의존한다. menuconfig에서, 이 옵션은 다음에서 사용할 수 있다:
Device Drivers > Graphics support > MXC Framebuffer support
이 옵션은 모든 아키텍처에서 기본 값으로 Y 이다. - CONFIG_FB_MXC_SYNC_PANEL - 동기식 패널의 프레임 버퍼를 선택하는 구성 옵션이다. 이 옵션은 CONFIG_FB_MXC 옵션에 의존한다. menuconfig에서, 이 옵션은 다음에서 사용할 수 있다:
Device Drivers > Graphics support > MXC Framebuffer support > Synchronous Panel Framebuffer
이 옵션은 모든 아키텍처에서 기본 값으로 Y 이다. - CONFIG_FB_MXC_LDB - 이 구성 옵션은 i.MX 6 칩에서 LVDS 모듈을 선택한다. 이 옵션은 CONFIG_FB_MXC_SYNC_PANEL와 CONFIG_MXC_IPUV3 || FB_MXS 옵션에 의존한다. menuconfig에서, 이 옵션은 다음에서 사용할 수 있다:
Device Drivers > Graphics support > MXC Framebuffer support > Synchronous Panel Framebuffer > MXC LDB - CONFIG_FB_MXC_SII9022 - 이 구성 옵션은 SII9022 HDMI 칩을 선택한다. 이 옵션은 CONFIG_FB_MXC_SYNC_PANEL 옵션에 의존한다. menuconfig에서, 이 옵션은 다음에서 사용할 수 있다:
Device Drivers > Graphics support > MXC Framebuffer support > Synchronous Panel Framebuffer > Si Image SII9022 DVI/HDMI Interface Chip
6.3.3 Pixel Pipeline (PxP)
6.3.3.1 Introduction
PxP는 EPDC 디스플레이 인터페이스와 작동하는 디스플레이 컨트롤러이다. Pixel Pipeline(PxP) DMA 엔진 드라이버는 고유한 API를 제공한다. 이는 다양한 하드웨어의 오프로드 엔진 구현의 세부 사항을 원활하게 처리하는 dmaengine 클라이언트로 구현되어 있다. 일반적으로, PxP DMA-ENGINE 드라이버의 이용자는 EPDC 드라이버, V4L2 출력 드라이버와 PxP 사용자 공간 라이브러리가 포함된다.
PxP 드라이버는 하드웨어와 상호 작용하기 위해 PxP 레지스터를 사용한다. 하드웨어 작동의 자세한 내용은 SoC와 연관된 Applications Processor Reference Manual 문서를 참조한다.
6.3.3.2 Software Operation
PxP IP에는 다양한 버전이 있다. 하드웨어 충돌 감지, 하드웨어에서 E Ink Gen-II 파형 알고리즘(REAGL/-D) 처리, 그리고 하드웨어 디더링 지원과 같은 EPDC를 위한 새로운 기능을 주로 가지고 있는 i.MX 7Dual에서 사용되는 새 버전의 PxP에 대한 유지 관리를 용이하게 하기 위해, 다른 드라이버(drivers/dma/pxp/ pxp_dma_v3.c)가 있다. 그러나 각 버전은 DMA Engine 프레임워크를 사용한다.
6.3.3.3 Key Data Structs
PxP DMA Engine 드라이버 구현은 DMA Engine Framework에 의존한다. PxP 드라이버에 의해 확장되는 DMA Engine Framework에는 struct dma_device, struct dma_chan, struct dma_async_tx_descriptor의 세 가지 중요한 구조체가 있다. DMA 슬레이브(클라이언트)가 DMA Engine과 상호 작용할 때, DMA Engine Framework(또는 DMA 슬레이브)에서 호출하는 여러 콜백 함수를 PxP 드라이버는 구현한다.
PxP 드라이버는 struct dma_device에서 아래 콜백 함수를 구현한다:
device_alloc_chan_resources /* allocate resources and descriptors */
device_free_chan_resources /* release DMA channel's resources */
device_tx_status /* poll for transaction completion */
device_issue_pending /* push pending transactions to hardware */
그리고
device_prep_slave_sg /* prepares a slave DMA operation */
device_terminate_all/* manipulate all pending operations on a channel, returns zero or error code */
처음 4개의 함수는 DMA Engine Framework에서 사용하고 마지막 2개는 DMA 슬레이브(DMA 클라이언트)에서 사용한다. 특히, device_issue_pending은 PxP 작업의 시작을 트리거하는 데 사용되고 있다.
PxP DMA 드라이버는 엔진에서 실행할 디스크립터를 준비하는 데 사용되는 struct dma_async_tx_descriptor의 tx_submit 인터페이스도 구현한다. pxp_tx_submit에서 태스크를 수신하면, 바로 구성과 실행이 되지는 않는다. 오히려, 태스크 큐에 추가되고 함수 호출이 바로 반환될 수 있다.
6.3.3.4 Channel Management
ePxP는 하드웨어에서 멀티 채널을 가지고 있지는 않지만, 가상 채널을 드라이버에서 지원되고 있다. 이는 멀티 인스턴스/클라이언트 디자인에 유연성을 제공한다. 사용자는 언제든지 비어 있는 채널을 얻기 위해 dma_request_channel()을 호출할 수 있고, 그런 다음 여러 디스크립터로 이 채널을 구성할 수 있다. 디스크립터는 각 입력 평면과 출력 평면에 대해 필요하다. PxP가 더 이상 사용되지 않으면, 채널은 dma_release_channel()을 호출하여 해제해야 한다. 채널 관리의 세부적인 요소는 드라이버에서 처리되며 클라이언트에 투명하다.
6.3.3.5 Descriptor Management
DMA Engine은 디스크립터를 기반으로 태스크를 처리한다. 일반적으로 하나의 DMA 채널은 여러 디스크립터와 연결된다. 디스크립터는 오프로드 엔진 드라이버의 컨트롤하에 작업이 완료될 때 재사용되는 재활용되는 리소스이다. 확장된 TX 디스크립터 패킷(pxp_tx_desc)으로 사용자는 PxP 구성 정보를 드라이버에 전달할 수 있다. 여기에는 PxP가 프로세싱 태스크를 실행하는 데 필요한 모든 것이 포함된다.
6.3.3.6 Completion Notification
애플리케이션이 PxP 작업 완료 알림을 받을 수 있는 두 가지 방법이 있다.
- dma_wait_for_async_tx()를 호출한다. 이 호출은 작업 완료를 폴링하는 동안 스핀을 위해 CPU를 사용한다.
- 완료 콜백 지정
후자의 방법을 권장한다. PxP 작업이 완료된 후 PxP 출력 버퍼 데이터를 검색할 수 있다.
DMA Engine Framework에 대한 일반적인 정보는 Linux 커널 소스 트리의 Documentation/dmaengine.txt를 참조한다.
6.3.3.7 Limitations
- 현재 드라이버는 전통적으로 사용되는 방법으로 scatterlist 개체를 지원하지 않는다. 메모리 소스와 대상의 체인을 제공하기 위해 scatterlist 파라미터 개체를 사용하는 대신, 현재 드라이버는 한 번의 전송으로 입력과 출력 버퍼(그리고 필요한 경우, 오버레이 버퍼)를 제공하기 위해 PxP를 사용한다.
- PxP 드라이버는 빠른 순서로 대기 중인 일련의 전송을 제대로 실행하지 못할 수 있다. 새 전송을 제출하기 전에 각 전송이 완료될 때가지 기다리는 것이 좋다.
6.3.3.8 Menu Configuration Options
이 모듈에 대해 다음 Linux 커널 구성 옵션이 제공된다:
- i.MX 7Dual의 경우, 다음을 선택한다.
Device Drivers > DMA Engine support > [*] MXC PxP V3 support > [*] MXC PxP Client Device - i.MX 6의 경우, 다음을 선택한다.
Device Drivers > DMA Engine support > [*] MXC PxP V2 support > [*] MXC PxP Client Device
6.3.3.9 Source Code Structure
PxP 드라이버 소스 코드는 drivers/dma/pxp에 있다.
Table 60. Pxp source
File | Description |
---|---|
drivers/dma/pxp/pxp_device.c | PxP Device |
drivers/dma/pxp/pxp_dma_v2.c | i.MX 6용 PxP DMA |
drivers/dma/pxp/pxp_dma_v3.c | i.MX 7용 PxP DMA |
drivers/dma/pxp/regs-pxp_v2.h | i.MX 6용 PxP 레지스터 |
drivers/dma/pxp/regs-pxp_v3.h | i.MX 7용 PxP 레지스 |
include/linux/drivers/dma/pxp/pxp_dma_v3.c | i.MX 7용 PxP Device |
include/linux/pxp_dma.h | PxP DMA 커널 헤더 |
include/linux/pxp_device.h | PxP Device 커널 헤더 |
include/linux/uapi/pxp_dma.h | PxP DMA 사용자 공간 헤더 |
include/linux/uapi/pxp_device.h | PxP Device 사용자 공간 헤더 |
drivers/media/platform/mxc/output/mxc_pxp_v4l2.c | PxP V4L2 |
drivers/media/platform/mxc/output/mxc_vout.c | i.MX V4L2 Output 드라이버 |
6.3.4 eLCDIF Frame Buffer
6.3.4.1 Introduction
eLCDIF는 Parallel LCD 인터페이스와 작동하는 디스플레이 컨트롤러이다. 로우 레벨의 하드웨어 컨트롤을 허용하는 일반적인 LCD 로우 레벨 작업을 컨트롤하는 프레임 버퍼나 DRM의 디스플레이 서스 시스템 드라이버로 이 드라이버는 구현되어 있다. ELCDIF의 DOTCLK 모드만 테스트되므로, 이론적으로 ELCDIF 프레임 버퍼 드라이버는 프레임 버퍼 디바이스를 지원하기 위해 sync LCD 패널 드라이버와 작동할 수 있다. sync LCD 드라이버는 유연하고 확장 가능한 방식으로 구성되며 특정 sync LCD 패널 지원에서 추상화될 수 있다. 다른 sync LCD 패널을 지원하기 위해, 사용자는 기존 sync LCD 드라이버를 참조하여 sync LCD 드라이버를 작성할 수 있다.
6.3.4.2 Software Operation
프레임 버퍼 드라이버로 구현된 eLCDIF의 경우, 프레임 버퍼 디바이스는 /dev/mem와 유사한 메모리 디바이스이다. 읽고/쓰기 또는 mmap()을 사용하여 그 안의 일부 위치를 찾거나 매핑할 수 있다. 차이점은 사용자가 사용할 수 있는 메모리는 할당된 전체 메모리가 아니라 비디오 하드웨어의 프레임 버퍼뿐이라는 것이다. 디바이스는 일반적으로 /dev 디렉토리에서 /dev/fb*에 위치한 특수 디바이스 노드로 액세스된다. 또한 /dev/fb*에는 그것을 작동시키고 하드웨어에 대한 정보를 쿼리하고 설정을 할 수 있는 여러 IOCTL이 있다. 컬러 맵 처리는 IOCTL을 통해서도 작동한다. 어떤 IOCTL이 있고 어떤 데이터 구조체가 사용되는지, 자세한 내용은 linux/fb.h를 참조한다.
i.MX ELCDIF 프레임 버퍼 드라이버 구현은 실제 하드웨어에서 추상화되어 있다. 기본 패널 드라이버는 플랫폼 데이터에 정의된 비디오 모드에 의해 선택되거나, 'video=mxc_elcdif_fb:resolution, bpp=bits_per_pixel' 커널 부트업 커맨드로 전달된다. 해상도는 공통 프레임 버퍼 비디오 모드 패턴이어야 하고 bits_per_pixel은 프레임 버퍼의 색상 심도여야 한다.
6.3.4.3 Menu Configuration Options
아래 메뉴 옵션은 MXC ELCDIF 프레임 버퍼 드라이버를 구성한다. 이 옵션은 FB와 (ARCH_MXS || ARCH_MXC)에 의존한다.
- Frame buffer Devices > MXS LCD framebuffer support (CONFIG_FB_MXS)
6.3.4.4 Source Code Structure
프레임 버퍼 소스는 drivres/video/fbdev/mxc에 있고 DRM 드라이버는 drivers/gpu/drm/imx/lcdif와 drivers/gpu/drm/imx/lcdifv3에 있다.
Table 61. ELCIF source
File | Description |
---|---|
drivers/video/fbdev/mxsfb.c | ELCDIF 프레임 버퍼 드라이버 |
drivers/video/fbdev/mxc/mxc_lcdif.c | ELCDIF 프레임 버퍼 드라이버 |
drivers/gpu/drm/imx/lcdif/lcdif-crtc.c | ELCDIF DRM Authentication |
drivers/gpu/drm/imx/lcdif/lcdif-kms.c | ELCDIF DRM KMS |
drivers/gpu/drm/imx/lcdif/lcdif-kms.h | ELCDIF DRM KMS Header |
drivers/gpu/drm/imx/lcdif/lcdif-plane.c | ELCDIF DRM Plane |
drivers/gpu/drm/imx/lcdif/lcdif-plane.h | ELCDIF DRM Plane 헤 |
drivers/gpu/drm/lcdifv3/lcdifv3-crtc.c | LCDIFv3 DRM CRTC |
drivers/gpu/drm/lcdifv3/lcdifv3-kms.c | LCDIFv3 DRM KMS |
drivers/gpu/drm/lcdifv3/lcdifv3-kms.h | LCDIFv3 DRM KMS Header |
drivers/gpu/drm/lcdifv3/lcdifv3-plane.c | LCDIFv3 DRM Plane |
drivers/gpu/drm/lcdifv3/lcdifv3-plane.h | LCDIFv3 DRM Plane 헤 |
6.3.5 Display Control Subsystem (DCSS)
6.3.5.1 Introduction
Display Control Subsystem(DCSS)은 DRM 디스플레이 프레임워크로 통합되는 i.MX 8M Quad를 위한 디스플레이 컨트롤이다. DCSS는 HDMI 출력으로 최대 3개의 그래픽이나 비디오 오버레이를 결합할 수 있는 기능으로 메모리의 프레임 버퍼를 UltraHD나 HDTV로 출력하는 디스플레이 메커니즘을 제공한다. DCSS 컨트롤러의 주요 특징은 아래와 같다:
- 최대 3개의 그래픽이나 비디오 레이어 지원
- 임의의 오프셋
- 하나의 평면은 8비트 알파를 지원하는 그래픽이 될 수 있다.
- 1920x1080p60 비디오나 그래픽을 3840x2160p60로 업스케일
- 3840x2160p30 비디오를 1920x1080p30나 1280x720p30로 다운스케일
- HDR 지원:
- 2084와 2020 색 공간의 HDR10
- Dolby Vision 싱글과 듀얼 레이어 형식
- HLG
- 하나의 디스플레이에 HDMI 2.0a 지원:
- 해상도: 640x480p60, 720x480p60, 1280x720p60, 1920x1080p60,3840x2160p60, 4096x2160p60
- HDCP 2.2와 HDCP 1.4
- 최대 596MHz의 픽셀 클럭
- 출력은 MIPI DSI 출력으로도 보낼 수 있다.
- Frame Buffer Compression - 버퍼의 Lossless 압축
6.3.5.2 Source Code Structure
DCSS drm 드라이버는 drivers/gpu/drm/imx/dcss에 위치해 있고 DCSS 코어 드라이버는 drivers/gpu/imx/dcss에 있다.
Table 62. DCSS Driver source
File | Description |
---|---|
drivers/gpu/drm/imx/dcss/dcss-plane | DRM DCSS Plane |
drivers/gpu/drm/imx/dcss/dcss-kms | DRM DCSS KMS |
drivers/gpu/drm/imx/dcss/dcss-crtc | DRM DCSS CRTC 헤 |
drivers/gpu/drm/imx/dcss/dcss-dec400d.c | DCSS dec400d |
drivers/gpu/drm/imx/dcss/dcss-scaler | DCSS Scaler |
drivers/gpu/drm/imx/dcss/dcss-ss.c | DCSS ss |
drivers/gpu/drm/imx/dcss/dcss-hdr10.c | DCSS hdr10 |
drivers/gpu/drm/imx/dcss/dcss-wtsc1.c | DCSS wtsc1 |
drivers/gpu/drm/imx/dcss/dcss-dtg.c | DCSS dtg |
drivers/gpu/drm/imx/dcss/dcss-ctx1d.c | DCSS ctx1d |
drivers/gpu/drm/imx/dcss/dcss-dtrc.c | DCSS DTRC |
drivers/gpu/drm/imx/dcss/dcss-dpr.c | DCSS ctx1d |
drivers/gpu/drm/imx/dcss/dcss-blkctr.c | DCSS ctx1d |
6.3.6 DCNANO
6.3.6.1 Introduction
LCDIF는 프레임 버퍼에서 렌더링된 이미지를 읽는 데 사용할 수 있는 고성능 그래픽 코어이다. 하드웨어 커서 패턴을 제공하는 것 외에도, 디스플레이 컨트롤러는 형식 변환, 디더링 그리고 감마 보정을 수행한다.
디스플레이 컨트롤러 주요 기능은 아래와 같다:
- Video Timing Generation (비디오 타이밍 생성기)
- HSYNC, VSYNC, DE 시그널
- 프로그램 가능한 타이머
- MIPI Display Protocols (MIPI 디스플레이 프로토콜)
- Display Pixel Interface-2(DPI-2) 형식
- DPI 24비트, 18비트 (2개의 구성) 그리고 16비트 지원 (3개의 구성)
- (선택적인) Display Bus Interface 2.0(DBI-2)
- Display Interface (디스플레이 인터페이스)
- 24비트 데이터, HSync, VSync, Data 활성화를 포함하는 Parallel Pixel Output
- 외부 직렬화 로직(예로 HDMI)에 쉽게 적용 가능성
- Display (디스플레이)
- 1024x480 까지의 디스플레이 크기
- sync와 blank 시그널
- 감마와 디더 테이블
- Input Formats (입력 형식)
- ARGB2101010/ARGB8888/ARGB1555/RGB565/ARGB4444
- YUV422 패킹 & 세미 플레이 (YUY2, UYVY)
- Format Conversion (형식 변환)
- 픽셀 입력은 여러 RGB 형식에서 허용된다.
- 픽셀 출력은 여러 형식의 24비트 RGB이다.
- Output Formats (출력 형식)
- RGB888/DPI_D16CFG1/DPI_D16CFG2/DPI_D16CFG3/DPI_D18CFG1/DPI_D18CFG2/ DPI_D24
- Hardware Cursor (하드웨어 커서)
- ARGB888와 Mask 커서 형식 지원
- Color (색상)
- 좌표 생성기로 오버레이
- Alpha Blending: 8 Porter Duff Blending 모드
- Dither and Gamma Correction (디더와 감마 보정)
- Dither를 위한 별도의 Look Up Table
- Gamma Correction을 위한 별도의 Look Up Table
6.3.6.2 Source Code Structure
DCNANO drm 드라이버는 drivers/gpu/drm/imx/dcnano에 위치되어 있다.
Table 63. DCNANO driver source
File | Description |
---|---|
drivers/gpu/drm/imx/dcnano/dcnano-crtc.c | DRM DCNANO CRTC |
drivers/gpu/drm/imx/dcnano/dcnano-drv.c | DRM DCNANO 코어 |
drivers/gpu/drm/imx/dcnano/dcnano-drv.h | DRM DCNANO 헤더 |
drivers/gpu/drm/imx/dcnano/dcnano-kms.c | DRM DCNANO KMS |
drivers/gpu/drm/imx/dcnano/dcnano-plane.c | DRM DCNANO 평면 |
drivers/gpu/drm/imx/dcnano/dcnano-reg.h | DCNANO 레지스터 헤더 |