6.3 Display Controllers
6.3.1 Display Processing Unit (DPU)
6.3.1.1 Introduction
디스플레이 처리 장치(DPU)는 비디오와 그래픽 처리 기능을 지원하고, 비디오 및 스틸 디스플레이 센서(still display sensor)와 디스플레이가 인터페이스하도록 설계되어 있다. DPU 드라이버는 논리 채널을 조작하기 위한 내부 커널 수준의 API를 제공한다. 논리 채널은 완전한 DPU 처리 흐름을 나타낸다. 예를 들어 완전한 DPU 처리 흐름(논리 채널)은 메모리에서 YUV 버퍼를 읽고 외부 인터페이스에 표시하는 것으로 구성될 수 있다. DPU API는 모든 채널에 대한 공통된 기능 세트로 구성된다. 그 기능은 채널을 초기화하고, 버퍼를 설정하고, 채널을 활성화/비활성화하고 그리고 인터럽트를 설정하는 것이다.
일반적인 논리 채널에는 다음이 포함한다 :
- CSI를 메모리에 직접 연결
- 배경(background) 동기 프레임 버퍼에 대한 메모리
- 전경(foreground) 동기 프레임 버퍼에 대한 메모리
상위 레벨 드라이버는 메모리 할당과 사용자 레벨 API 제공을 담당한다. DPU 인터페이스는 V4L2 프레임워크에서 캡처하고 DRM 디스플레이 프레임워크를 사용하여 디스플레이할 수 있다. LVDS, MIPI-DSI, HDMI와 Parallel Display 인터페이스와 DPU는 인터페이스한다.
DPU 디스플레이 컨트롤러는 다음을 포함하는 32비트 디스플레이 엔진 구성을 지원한다.
- 2 디스플레이는 독립된 패널에 스트림을 출력
- 두 단계의 구성
- 자동 안전 스트림 패닉과 지역 CRC 검사기를 사용하여 CRC 매칭을 사용한 감지
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 디스플레이 인터페이스 캐시는 다음을 지원한다.
- 각 디스플레이 평면은 여러 줄의 캐시가 있다.
- 이는 각 평면에 대해 8 라인의 픽셀을 포함한다.
- RGB, YUV 등 형식 지원
- 비디오와 GPU 타일(tile) 형식 지원
- 미리 캐시를 채우기 위해 메모리에서 콘텐츠를 가져온다.
- 수평(horizontal)와 수직(vertical) 가져오기 지원
- 경사방향(wrap)의 가져오기는 지원되지 않음, 다른 방법 필요함
6.3.1.2 DRM
DPU(Display Processing Unit)는 비디오 디스플레이를 지원하는 DRM 드라이버와 인터페이스한다.
6.3.1.3 Source Code Structure
DPU 드라이버는 DRM, 블리팅(bit block transfer)와 메인 프로세싱으로 분리된다. 공통된 기능은 drivers/gpu/drm/imx/dpu와 drivers/gpu/imx/dpu-blit에 제공되는 반면 메인 드라이버는 drivers/gpu/imx/dpu에 있다. 다음 표에는 소스 파일이 나열되어 있다.
Table 59. 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 Blitter |
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 kernel 구성 옵션이 제공된다.
- Device Drivers -> i.MX DPU core support
6.3.2 Image Processing Unit (IPU)
6.3.2.1 Introduction
IPU(Image Processing Unit)는 비디오와 그래픽 처리 기능을 지원하고 비디오, 스틸 이미지 센서(still image sensor)와 디스플레이를 인터페이스하도록 설계되어 있다. IPU 드라이버는 논리 채널을 조작하기 위한 커널 수준의 API를 제공한다. 논리 채널은 완전한 IPU 처리 흐름을 나타낸다. 예를 들어, 완전한 IPU 처리 흐름(논리 채널)은 메모리에서 YUV 버퍼 읽기, 사후 처리(post-processing) 수행, RGB 버퍼를 메모리에 쓰는 것으로 구성될 수 있다. 논리 채널은 1~3개의 IDMA 채널을 매핑하고 0이나 1개의 IC 태스크에 매핑한다. 논리 채널은 하나의 입력, 하나의 출력과 하나의 보조 입력 IDMA 채널을 가질 수 있다. IPU API는 모든 채널에 대한 공통의 기능 세트로 구성된다. 그 기능으로는 채널 초기화, 버퍼 설정, 채널 활성화/비활성화, 자동 프레임 동기화를 위한 채널 연결 그리고 인터럽트 설정이다.
IPU는 디스플레이 컨트롤러이며 프레임 버퍼 디스플레이 프레임워크를 통해 지원되는 다음 디스플레이 인터페이스를 지원한다. 액세스는 프레임 버퍼 fbdev 애플리케이션 프레임워크를 통해서만 가능하다.
- Parallel
- LVDS
- HDMI
- MIPI-DSI
일반적인 논리 채널은 다음을 포함한다 :
- CSI를 메모리에 직접 연결
- 뷰파인더 전처리 메모리에 대한 CSI
- 뷰파인더 전처리 메모리에 대한 메모리
- 뷰파인더 로테이션 메모리에 대한 메모리
- 비디오 디인터레이싱 메모리의 이전 필드 채널과 뷰파인더 전처리 메모리
- 비디오 디인터레이싱 메모리의 현재 필드 채널과 뷰파인더 전처리 메모리
- 비디오 디인터레이싱 메모리의 다음 필드 채널과 뷰파인더 전처리 메모리
- 인코더 전처리 메모리에 대한 CSI
- 인코더 전처리 메모리에 대한 메모리
- 인코더 로데이션 메모리에 대한 메모리
- 전처리 로테이션 메모리에 대한 메모리
- 배경(background)용 동기 프레임 버퍼에 대한 메모리
- 전경(foreground)용 동기 프레임 버퍼에 대한 메모리
- DC용 동기 프레임 버퍼에 대한 메모리
- 마스크용 동기 프레임 버퍼에 대한 메모리
IPU API에는 모든 채널에서 동일하지 않고 IPU 하위 모듈에 고유한 몇 가지 추가 기능이 있다. IPU 하위 모듈의 기능 유형은 다음과 같다 :
- 동기 프레임 버퍼 기능
- 패널 인터페이스 초기화
- 전경(foreground) 위치 설정
- 지역/전역 투명도와 칼라 키 설정
- 감마 설정
- CSI 기능
- 센서 인터페이스 초기화
- 센서 클럭 설정
- 캡처 크기 설정
- PRE/PRG를 사용하여 리니어 프레임 프리페치(prefetching linear frames) 활성화/비활성화
- PRE/PRG를 사용하여 타일 프레임 확인(resolving tiled frames) 활성화/비활성화
더 높은 수준의 드라이버는 메모리 할당, 채널 연결과 사용자 수준 API 제공을 담당한다.
6.3.2.2 Hardware Operation
IPU의 자세한 하드웨어 동작은 "Applications Processor Reference Manual"에서 설명한다. 다음 그림은 IPU 하드웨어 모듈을 보여준다.
6.3.2.3 Software Operation
IPU 드라이버는 Linux 커널에 자체 포함된 드라이버 모듈이다.
다음 블럭에 대한 custom kernel-level API로 구성된다 :
- 동기 프레임 버퍼 드라이버
- 디스플레이 인터페이스 (DI)
- 디스플레이 프로세서 (DP)
- 이미지 DMA 컨트롤러 (IDMAC)
- CMOS 센서 인터페이스 (CSI)
- 이미지 변환 (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 : virtual terminal) 콘솔에 의존한다. 디바이스는 /dev/fb*와 같이 /dev 디렉토리에 있는 특수 디바이스 노드를 통해 액세스된다. fb0는 일반적으로 기본 프레임 버퍼이다.
물리적인 메모리 할당과 LCD 패널 구성 외에, 공통된 커널 비디오 API는 색상 설정, 팔레트 등록, 이미지 블리팅와 메모리 매핑에 활용된다. IPU는 프레임 버퍼 메모리에서 로우(raw) 픽셀 데이터를 읽고 디스플레이를 위해서 패널로 보낸다.
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의 기능 중 일부이다 :
- 이름, 스크린 메모리의 구성(planes, packed pixels 등), 스크린 메모리의 주소와 길이같은 하드웨어에 대한 일반적인 정보를 요청한다.
- 가시적 그리고 가상의 지오메트리, 깊이, 컬러 맵 형식, 타이밍 등과 같은 하드웨어에 대한 다양한 정보를 요청하고 변경한다. 이 정보가 변경되면, 드라이버는 하드웨어 기능(가능하지 않은 경우 하드웨어는 EINVAL을 반환)을 충족하는 값을 제안한다.
- 컬러 맵의 일부를 가져오고 설정한다. 통신은 모든 기존 하드웨어를 지원하기 위해 픽셀당 16비트(빨간색, 녹색, 파란색, 투명도에 대한 값)를 사용한다. 드라이버는 옵션을 하드웨어(더 적은 비트로 반올림, 투명도 값을 버릴 수 있음)에 적용하는 데 필요한 모든 계산을 수행한다.
하드웨어 추상화(추상화 계층)는 애플리케이션 프로그램의 구현을 더 쉽고 이식성 있게 만든다. 애플리케이션 프로그램에 내장되어야 하는 유일한 것은 화면 구성(bitplanes나 chunky pixel 등)이다. 왜냐하면 프레임 버퍼 이미지 데이터에서 직접 작업하기 때문이다.
MXC 프레임 버퍼 드라이버(drivers/video/mxc/mxc_ipuv3_fb.c)는 일반적인 Linux 프레임 버퍼 드라이버(drivers/video/fbdev/core/fbmem.c)와 긴밀하게 상호작용한다.
6.3.2.7 Synchronous Frame Buffer Driver
동기식 프레임 버퍼 스크린 드라이버는 동기식 LCD 패널이나 메모리가 없는 패널을 위한 Linux 표준 프레임 버퍼 드라이버 API를 구현한다. 동기식 프레임 버퍼 스크린 드라이버는 커널과 사용자 레벨 애플리케이션이 상호 작용하는 최상위 커널 비디오 드라이버이다. 이는 커널 구성의 그래픽 지원 디바이스 드라이버(graphics support device drivers)에서 동기식 패널 프레임 버퍼(Synchronous Panel Frame buffer) 옵션을 선택하여 활성화한다. 프레임 버퍼 드라이버를 보완하기 위해 커널 빌더는 폰트와 시작 로고에 대한 지원도 포함할 수 있다. 이는 시리얼에서 그래픽 모드로 전환하기 위한 VT 콘솔에 따라 다르다.
물리적 메모리 할당과 LCD 패널 구성을 제외하고, 공통된 커널 비디오 API는 컬러 설정, 팔레트 등록, 이미지 블리팅과 메모리 매핑에 활용된다. IPU는 프레임 버퍼 메모리에서 로우(raw) 픽셀 데이터를 읽고 디스플레이를 위한 패널로 보낸다.
프레임 버퍼 드라이버는 커널 구성 옵션으로 다른 패널을 지원한다. 패널 설정 구조에 대한 새 값을 정의하여 새 패널에 대한 지원을 추가할 수 있다.
프레임 버퍼는 다음을 허용하는 사용자 정의 API를 사용하여 IPU 드라이버와 상호 작용한다 :
- 패널 인터페이스 설정 초기화
- LCD 리프레시를 위한 IPU 채널 설정 초기화
- 이중 버퍼링 지원을 위한 프레임 버퍼 주소 변경
다음 기능이 지원된다 :
- 구성 가능한 화면 해상도
- 구성 가능한 픽셀 프레임 버퍼당 RGB 16, 24, 32 비트
- 구성 가능한 패널 인터페이스 시그널 타이밍과 극성
- 팔레트/컬러 변환 관리
- 전원 관리
- LCD 전원 끄기/켜기
- PRE/PRG 기능 활성화/비활성화
사용자 애플리케이션은 프레임 버퍼로 기능을 수행하려고 일반적인 비디오 API(표준 Linux 프레임 버퍼 드라이버 API)를 활용한다. 여기에는 다음이 포함된다 :
- 해상도나 스캔 길이와 같은 화면 정보 얻기
- 직접 블리팅 작업을 수행하기 위해 mmap을 사용한 사용자 공간 메모리 할당
두 번째 프레임 버퍼 드라이버는 두 번째 비디오/그래픽 평면(plane)을 지원한다.
6.3.2.8 IPU Backlight Driver
IPU 드라이버는 백라이트도 제어한다. IPU 백라이트 드라이버는 패널용 IPU PWM 백라이트 제어를 구현한다. /sys/class/backlight/pwm-backlight.0/brightness 아래의 시스템 제어 파일을 사용자 공간으로 내보낸다. 기본 백라이트 강도 값은 128이다.
6.3.2.9 IPU Device Driver
IPU (프로세싱) 디바이스 드라이버는 IPUv3의 IC/IRT 모듈을 기반으로 resizing/rotation/CSC/combination/deinterlacing과 같은 이미지 처리 기능을 제공한다.
IPU 디바이스 드라이버는 작업(task) 기반이며, 사용자는 작업(task) 설정 준비, 작업(task) 큐잉 그 다음 대기 작업(task) 완료를 블럭하기만 하면 된다. 드라이버는 현재 블럭 방식만 지원하며, 향후 논블럭 방식이 추가될 예정이다. 작업 구조는 다음과 같다 :
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)을 준비하려면, 사용자는 task.input, task.overlay(결합이 필요한 경우)와 task.output 파라미터를 채운 다음 커널 레벨(예 : V4L2 드라이버)의 경우 int ipu_queue_tak(struct ipu_task *task); 또는 애플리케이션 레벨의 경우 /dev/mxc_ipu 의 IPU_QUEUE_TASK ioctl에 의해 작업(task)이 큐잉된다.
6.3.2.10 Source Code Structure
IPU, 센서, V4L2와 패널 드라이버와 관련된 소스 파일은 다음 폴더에서 사용할 수 있다.
- drives/mxc/ipu3
- drives/video/mxc
- drives/video/fbdev/mxc
- drives/video/backlight
IPU V4L2 드라이버 파일에 대한 자세한 내용은 V4L2 장을 참조한다.
Table 60. IPU Driver Files
File | Description |
driveers/mxc/ipu3/ipu_common.c | IPU common library functions |
driveers/mxc/ipu3/ipu_common.c | IPU common library functions |
drivers/mxc/ipu3/ipu_ic.c | IPU IC base driver |
drivers/mxc/ipu3/ipu_device.c | IPU driver device interface and fops functions. |
drivers/mxc/ipu3/ipu_capture.c | IPU CSI capture base driver |
drivers/mxc/ipu3/ipu_disp.c | IPU display functions |
drivers/mxc/ipu3/ipu_calc_stripes_sizes.c | Multistripes method functions for ipu_device.c |
drivers/mxc/ipu3/pre.c | i.MX 6 QuadPlus Prefetch/Resolve the engine driver |
drivers/mxc/ipu3/prg.c | i.MX 6 QuadPlus Prefetch/Resolve the Gasket driver |
drivers/mxc/ipu3/mxc_ipuv3_fb.c | Driver for synchronous frame buffer |
drivers/mxc/ipu3/vdoa.c | VDOA post-processing driver, used by ipu_device.c |
drivers/video/fbdev/mxc/mxc_lcdif.c | Display Driver for CLAA-WVGA and SEIKO-WVGA LCD support |
drivers/video/fbdev/mxc/mxc_hdmi.c | Display Driver for HDMI interface |
drivers/video/fbdev/mxc/ldb.c | Driver for synchronous frame buffer for on chip LVDS |
drivers/video/fbdev/mxc/mxc_dispdrv.c | Display Driver framework for synchronous frame buffer |
drivers/video/fbdev/mxc/mxc_edid.c | Driver for EDID |
Table 61은 IPU, 패널 드라이버와 관련된 헤더 파일을 나열한다.
Table 61. IPU Global Header Files
File | Description |
drivers/mxc/ipu3/ipu_param_mem.h | Hellper functions for IPU parameter memory access |
drivers/mxc/ipu3/ipu_prv.h | Header file for Pre-processing drivers |
drivers/mxc/ipu3/ipu_regs.h | IPU register definitions |
drivers/mxc/ipu3/pre-regs.h | Prefetch/Resolve Engine register definitions |
drivers/mxc/ipu3/prg-regs.h | Prefetch/Resolve Gasket register definitions |
drivers/mxc/ipu3/vdoa.h | Header file for VDOA drivers |
drivers/video/fbdev/mxc/mxc_dispdrv.h | Header file for display driver |
include/linux/uapi/mxcfb.h | Header file for the synchronous framebuffer driver |
include/linux/uapi/ipu.h | Header file for IPU APIs |
6.3.2.11 Menu Configuration Options
다음 Linux 커널 구성 옵션이 IPU 모듈에 대해서 제공된다.
메뉴 구성에서 다음 모듈을 활성화한다 :
- CONFIG_MXC_IPU_V3 - 이미지 처리 유닛에 대한 지원을 포함한다. menuconfig에서 이 옵션은 다음에서 사용할 수 있다:
Device Drivers > MXC support drivers > Image Processing Unit Driver
기본 값으로 이 옵션은 모든 아키텍쳐에서 Y이다.
ARCH_MXC가 true이면, CONFIG_MXC_IPU_V3가 설정(Y)된다. - CONFIG_MXC_IPU_V3_PRG - 이를 통해 IPUv3 prefetch gasket engine을 지원하여 IPUv3와 prefetch engine (PRE) 사이의 double buffer handshake control를 지원하고, 메모리에 대한 디스플레이 리프레시 요청을 위해 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 engine에 대한 지원을 활성화한다. 엔진은 타일 픽셀 형식의 프레임버퍼를 선형으로 해석하는 기능이 있다.
Device Drivers > MXC support drivers > i.MX IPUv3 prefetch engine
이 옵션은 CONFIG_MXC_IPU_V3에 의존한다. 이 옵션을 활성와하면 CONFIG_MXC_IPU_V3_PRG가 선택된다. - CONFIG_MXC_CAMERA_OV5640_MIPI - OV5640 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 옵션에 의존한다. menucoonfig에서 이 옵션은 다음 위치에서 사용할 수 있다 :
Device Drives > Multimedia platform > V4L platform devices > MXC Video For Linux Video Capture > MXC Camera/V4L2 PRP Feature 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 옵션
dumb 센서에 대한 드라이버 사용 예
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 suport > Support for frame buffer devices
이 옵션에 대한 기본 값은 모든 아키텍처에서 Y이다. - CONFIG_FB_MXC - MXC 프레임 버퍼 드라이버에 대한 구성 옵션이다. 이 옵션은 CONFIG_FB 옵션에 의존한다. menuconfig에서 이 옵션은 다음 위치에서 사용할 수 있다 :
Device Drivers > Graphic 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 옵션에 의존한다. 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 엔진 드라이버는 다양한 하드웨어 오프로드 엔진 구현의 세부 사항을 매끄럽게 하는 dmaengine 클라이언트로 구현되는 고유한 API를 제공한다. 일반적으로 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) 처리와 하드웨어 디더링(dithering) 지원과 같은 주로 EPDC를 위한 새로운 기능이 있는 i.MX 7Dual에 사용된 새 버전의 PxP에 대한 유지 관리를 용이하게 하기 위해, 다른 드라이버(drivers/dma/pxp/pxp_dma.v3.c)가 있다. 그러나 각 버전은 DMA 엔진 프레임워크를 사용한다.
* 디더링(dithering) : 제한된 색을 이용하여 음영이나 색을 나타낸는 것이며, 여러 컬러의 색을 최대한 맞추는 과정이다.
6.3.3.3 Key Data Structs
PxP DMA 엔진 드라이버 구현은 DMA 엔진 프레임워크에 의존한다. PxP 드라이버에 의해 확장된 DMA 엔진 프레임워크에는 struct dma_device, struct dma_chan, struct dma_async_tx_descriptor의 세 가지 중요한 구조체가 있다. PxP 드라이버는 DMA 슬레이브(클라이언트)가 DMA 엔진과 상호 작용할 때 DMA 엔진 프레임워크(또는 DMA 슬레이브)에 의해 호출되는 여러 콜백 함수를 구현한다.
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 */
and,
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 엔진 프레임워크에서 사용하고 마지막 2개는 DMA 슬레이브(DMA 클라이언트)에서 사용한다. 특히, device_issue_pending은 PxP 작업의 시작을 트리거하는 데 사용된다.
또한 PxP DMA 드라이버는 struct dma_async_tx_descriptor의 tx_submit 인터페이스를 구현하며, 이는 엔진에서 실행할 descriptor(s)를 준비하는 데 사용된다. pxp_tx_submit에서 태스크(작업)을 수신하면 즉시 구성과 실행이 되지 않는다. 오히려 태스크(작업) 큐에 추가되고 함수 호출이 즉시 반환 되도록 허용된다.
6.3.3.4 Channel Management
하드웨어적으로 ePxP는 멀티 채널이 없지만, 드라이버에서 가상 채널을 지원한다. 이는 멀티 인스턴스/클라이언트 디자인에 유연성을 제공한다. 언제든지 사용자는 비어있는 채널을 얻기위해 dma_request_channel()을 호출하고, 여러 디스크립터(descriptor)로 이 채널을 구성할 수 있다. 각 입력 플레인(plane)과 출력 플레인(plane)에 대해 디스크립터(descriptor)가 필요하다. PxP가 더 이상 사용되지 않으면, dma_release_channel()을 호출하여 채널을 해제해야 한다. 채널 관리의 세부 요소는 드라이버가 처리하고 클라이언트에는 투명하다.
6.3.3.5 Decsriptor Management
DMA 엔진은 디스크립터(descriptor)를 기반의 작업(task)을 처리한다. 하나의 DMA 채널은 일반적으로 여러 디스크립터(descriptor)와 연관된다. 디스크립터(descriptor)는 작업이 완료될 때까지 재사용될 수 있는 오프로드 엔진 드라이버의 제어 하에 있는 재활용된 리소스이다. 확장된 TX 디스크립터(descriptor) 패킷 (pxp_tx_desc)을 통해 사용자는 PxP 구성 정보를 드라이버에 전달할 수 있다. 여기에는 처리할 작업(a processing task)을 실행하는데 PxP가 필요한 모든 것이 포함된다.
6.3.3.6 Completion Notification
애플리케이션이 PxP 작업이 완료되었다는 알림을 받는 방법에는 두 가지가 있다.
- dma_wait_for_async_tx()를 호출한다. 이 호출은 작업 완료를 위해 폴링하는 동안 CPU를 회전(다른 작업을 처리) 시킨다.
- 완료 콜백(작업 완료시 호출되는 함수)을 지정한다.
후자의 방법으로 사용하는 것을 권장한다. PxP 작업이 완료된 후, PxP 출력 버퍼 데이터를 검색할 수 있다.
DMA 엔진 프레임워크에 대한 일반적인 정보는 Linux 커널 소스 트리에서 Documentation/dmaengine.txt를 참조한다.
6.3.3.7 Limitations
- 전통적으로 사용되는 방법에서는 현재 드라이버는 분산 목록(scatterlist) 개체를 지원하지 않는다. 메모리 소스(source)와 대상(destination)의 체인을 제공하는 scatterlist 파라미터 개체를 사용하는 대신, 하나의 전송에 대한 입력과 출력 버퍼(필요한 경우 오버레이 버퍼)를 제공하는 것을 현재 드라이버에서 사용한다.
- 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 62. Pxp source
File | Description |
drivers/dma/pxp/pxp_device.c | PxP Device |
drivers/dma/pxp/pxp_dma_v2.c | PxP DMA for i.MX 6 |
drivers/dma/pxp/pxp_dma_v3.c | PxP DMA for i.MX 7 |
drivers/dma/pxp/regs-pxp_v2.h | PxP registers for i.MX 6 |
drivers/dma/pxp/regs-pxp_v3.h | PxP registers for i.MX 7 |
include/linux/drivers/dma/pxp/pxp_dma_v3.c | PxP Device for i.MX 7 |
include/linux/pxp_dma.h | PxP DMA kernel header |
include/linux/pxp_device.h | PxP Device kernel header |
include/linux/uapi/pxp_dma.h | PxP DMA user space header |
include/linux/uapi/pxp_device.h | PxP Device user space header |
drivers/media/platform/mxc/output/mxc_pxp_v4l2.c | PxP V4L2 |
drivers/media/platform/mxc/output/mxc_pxp_v4l2.h | PxP V4L2 header |
drivers/media/platform/mxc/output/mxc_vout.c | i.MX V4L2 Output driver |
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/fb*, 일반적으로 /dev 디렉토리 안에 위치한 특수 디바이스 노드를 통해 액세스된다. 또한 /dev/fb*에는 하드웨어에 대한 정보를 쿼리하고 설정을 통해서 이를 작동 시키는 여러 IOCTL를 가지고 있다. 컬러 맵 처리도 IOCTL을 통해서도 작동한다. 어떤 IOCTL이 있고 어떤 데이터 구조가 사용되는지에 대한 자세한 내용은 linux/fb.h를 참조한다.
i.MX ELCDIF 프레임 버퍼 드라이버 구현은 실제 하드웨어에 대해 추상화된다. 기본 패널 드라이버는 플랫폼 데이터에 정의된 비디오 모드에 의해 선택되거나, 프로빙(probing) 중에 'video=mxc_elcdif_fb:resolution, bpp=bits_per_pixel' kernel bootup command로 전달된다. 해상도는 공용 프레임 버퍼 비디오 모드 패턴에 있어야 하고, 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
프레임 버퍼에 대한 소스는 drivers/video/fbdev/mxc에 있고, drm 드라이버는 drivers/gpu/drm/imx/lcdif에 있다.
Table 63. ELCDIF source
File | Description |
drivers/video/fbdev/mxsfb.c | ELCDIF frame buffer driver |
drivers/video/fbdev/mxc/mxc_lcdif.c | ELCDIF frame buffer driver |
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 Header |
6.3.5 Display Control Subsystem (DCSS)
6.3.5.1 Introduction
DCSS(Display Control Subsystem)은 i.MX 8M Quad용 디스플레이 컨트롤러로 DRM 디스플레이 프레임워크를 사용하여 통합되어 있다. DCSS는 HDMI 출력으로 최대 3개의 그래픽이나 비디오 오버레이 레이어와 결합할 수 있는 기능과 함께 메모리에서 프레임 버퍼를 UltraHD나 HDTV에 출력하는 메커니즘을 제공한다. DCSS 컨트롤러의 주요 기능은 다음과 같다 :
- 최대 3개의 그래픽이나 비디오 레이어 지원
- 임의의 오프셋
- 하나의 플레인(plane)은 8비트 알파(alpha)를 지원하는 그래픽 가능
- 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 출력으로도 가능
- 프레임 버퍼 압축 - 버퍼의 무손실 압축
6.3.5.2 Source Code Structure
DCSS drm 드라이버는 drivers/gpu/drm/imx/dcss에 있고 DCSS core 드라이버는 drivers/gpu/imx/dcss에 있다.
Table 64. DCSS Driver source
File | Description |
drivers/gpu/drm/dcss/dcss-plane | DRM DCSS Plane |
drivers/gpu/drm/dcss/dcss-kms | DRM DCSS KMS |
drivers/gpu/drm/dcss/dcss-crtc | DRM DCSS CRTC Header |
drivers/gpu/drm/dcss/dcss-dec400d.c | DCSS dec400d |
drivers/gpu/drm/dcss/dcss-scaler | DCSS Scaler |
drivers/gpu/drm/dcss/dcss-ss.c | DCSS ss |
drivers/gpu/drm/dcss/dcss-hdr10.c | DCSS hdr10 |
drivers/gpu/drm/dcss/dcss-wtsc1.c | DCSS wtsc1 |
drivers/gpu/drm/dcss/dcss-dtg.c | DCSS dtg |
drivers/gpu/drm/dcss/dcss-common.c | DCSS common |
drivers/gpu/drm/dcss/dcss-ctx1d.c | DCSS ctx1d |
drivers/gpu/drm/dcss/dcss-dtrc.c | DCSS dtrc |
drivers/gpu/drm/dcss/dcss-dpr.c | DCSS dpr |
drivers/gpu/drm/dcss/dcss-blkctr.c | DCSS blkctr |
'NXP i.MX SoC Family > i.MX Linux Reference Manual' 카테고리의 다른 글
i.MX Linux Reference Manual - Video - Video for Linux 2 (V4L2) (0) | 2022.05.20 |
---|---|
i.MX Linux Reference Manual - Video - Display Interfaces (0) | 2022.05.09 |
i.MX Linux Reference Manual - Video - Display Overview (0) | 2022.04.25 |
i.MX Linux Reference Manual - Video - Capture Overview (0) | 2022.04.22 |
i.MX Linux Reference Manual - Video (0) | 2022.04.22 |