6.4 Display Interfaces
6.4.1 Parallel LCD Interface
6.4.1.1 Introduction
Parallel Interface는 LCD 디스플레이를 지원한다. Parallel Display Interface는 디스플레이 컨트롤러로 지원되며, i.MX 6, i.MX 7의 fbdev 프레임워크와 i.MX8의 drm 프레임워크인 디스플레이 프레임워크를 사용하여 구현되어 있다.
아래 컨트롤러는 병렬 인터페이스를 지원한다.
- IPU가 있는 i.MX의 IPU
- 모든 i.MX8에서 DPU
- PxP가 있는 i.MX의 ElCDIF
Parallel Interface는 병렬 인터페이스를 활성화한 i.MX SoC에서 최소 하나의 포트를 지원하고 IPU가 있는 i.MX에서 2개의 포트를 지원한다. 활성화된 SoC는 포트당 18비트에서 24비트까지 다양한 비트 전송률을 가지고 있다. IPU가 있는 i.MX 6에서 Parallel Interface는 디스플레이 리프레시를 위한 동기식 모드와 메모리에 대해 비동기식 모드를 지원하며, RAM이 없는 디스플레이, 디스플레이 컨트롤러 그리고 TV 인코더를 위한 글루리스 연결로 매우 유연하게 되어 있다.
6.4.2 MIPI DSI Interface
6.4.2.1 Introduction
MIPI Display Interface(MIPI DSI)는 디스플레이 패널에서 MIPI 디바이스 컨트롤러와 통신에 사용되는 드라이버 인터페이스이다. MIPI DSI 디스플레이 패널 드라이버는 MIPI DSI로 디스플레이 패널을 구성하기 위한 인터페이스를 제공한다.
MIPI DSI Interface는 MIPI DSI 사양에 정의된 모든 프로토콜 기능을 구현하는 멀티 레인 D-PHY와 함께 제공되는 디지털 코어이다. System과 MIPI DSI 호환 Display 사이의 인터페이스를 제공한다. MIPI DSI 개요는 여기에서 찾을 수 있지만, 사양은 MIPI 회원에게만 제공된다.
MIPI DSI 모듈은 호스트 프로세서와 디스플레이 모듈 사이에 고속의 시리얼 인터페이스를 제공한다. 병렬 버스와 비교해, 더 높은 성능, 더 낮은 전력, 더 적은 EMI 그리고 더 적은 핀을 가지고 있다. 표준 MIPI DSI 프로토콜과 호환되도록 디자인되었으며, 기존의 MIPI DPI-2, MIPI DBI-2 그리고 MIPI DCS 표준을 기반으로 만들어져 있다. 모듈은 주변 디바이스로 픽셀이나 커맨드를 보내고, 주변 디바이스에서 상태나 픽셀 정보를 다시 읽는다. MIPI DSI는 모든 픽셀 데이터, 커맨드와 이벤트를 직렬화하고, 커맨드 모드와 비디오 모드의 두 가지 기본 모드를 포함한다. 디스플레이 모듈의 상태 정보를 읽는 동안, 디스플레이 컨트롤러의 레지스터와 메모리에 쓰기 위해 커맨드 모드를 사용한다. 또한 고속 모드로 호스트에서 주변 디바이스로 실시간 픽셀 스트림을 전송하고 오류가 발생하면 인터럽트를 생성하기 위해 비디오 모드를 사용한다.
i.MX MIPI DSI의 경우, 다음 장에서 설명하는 다양한 드라이버에서 지원되고 있다. MIPI DSI 드라이버는 아래 기능을 지원한다:
- MIPI DSI 통신 프로토콜
- MIPI DSI 커맨드 모드와 비디오 모드
- MIPI DCS 커맨드 동작
MIPI DSI 드라이버는 i.MX 6과 i.MX 7을 위한 프레임 버퍼 드라이버와 i.MX 8과 i.MX 93을 위한 DRM 드라이버가 사용된다. 두 드라이버는 아래를 지원한다.
- 드라이버는 사용자 인터페이스로 노출되지 않고, DRM이나 프레임버퍼 인터페이스로 노출된다.
- MIPI DSI IP 드라이버 - 디스플레이 패널에서 MIPI 디바이스와 통신에 사용되는 로우 레벨 인터페이스
- MIPI DSI 디스플레이 패널 드라이버는 MIPI DSI로 디스플레이 패널을 구성하기 위한 인터페이스를 제공한다.
드라이버는 플랫폼 관련 레귤레이터와 클럭을 활성화한다. OS 관련 시스템 리소스를 요청하고 blank/unblank 동작을 위한 버퍼 이벤트 알리미를 등록한다. 드라이버는 MIPI D-PHY를 초기화하고 MIPI DSI 디스플레이 패널에 따라 MIPI DSI IP를 구성한다.
MIPI DSI 드라이버는 아래 기능을 지원한다:
- DSI를 위해 MIPI Alliance Specification Version1.01.0r11와 호환성
- D-PHY를 위해 MIPI Alliance Specification Version 1.00.00와 호환성
- SoC 기능에 따라 1~4개의 D-PHY 데이터 레인 지원
- Data Lane 0로 Bidirectional Communication과 Escape Mode 지원
- 프로그램 가능한 디스플레이 해상도
- Video Mode Pixel Formats, 16bpp (565 RGB),18bpp (666 RGB) packed, 18 bpp (666 RGB) loosely, 24bpp (888 RGB)
- 모든 일반적인 커맨드의 전송 지원
- ECC와 체크섬 기능 지원
- End-of-Transmission Packet(EoTp) 지원
- 초저전력 모드 지원
- 바이트 클럭 주파수를 구성하기 위해 PLL용 PMS 컨트롤 인터페이스 지원
- 바이트 클럭에서 이스케이프 클럭을 생성하는 Prescaler 지원
포트와 레인의 수는 arch/arm/boot/dts와 arch/arm64/boot/dts에 위치되어 있는 디바이스 트리에서 지정되어 있다.
6.4.2.2 Software Operation
MIPI DSI 드라이버는 MIPI DSI IP 드라이버와 MIPI DSI 디스플레이 패널 드라이버의 두 부분으로 구성된다.
MIPI DSI IP 드라이버에는 mipi_dsi_info라는 비공개(private) 구조체가 있다. MIPI DSI IP가 연결된 인스턴스는 int dev_id 필드에 기술되어 있고, IPU 내부의 DI 인스턴스는 int disp_id 필드에 기술되어 있다.
시작하는 동안, MIPI DSI IP 드라이버는 드라이버가 로드될 때 struct mxc_dispdrv_handle 필드를 통해 프레임버퍼 드라이버와 등록된다. 또한 디스플레이 패널의 blank/unblank 작업을 수행하기 위해, 프레임 버퍼 코어에 프레임버퍼 이벤트 알리미를 등록한다. struct fb_videomode *mode와 struct mipi_lcd_config *lcd_config 필드는 디스플레이 패널 콜백에서 수신된다. MIPI DSI IP는 MIPI DSI 하드웨어 레지스터를 구성하기 위해 이 정보가 필요하다.
MIPI DSI IP 컨트롤러와 디스플레이 모듈을 초기화한 후, MIPI DSI IP는 DPI-2 인터페이스로 IPU에서 픽셀 스트림을 가져오고, 디스플레이를 위한 고속의 데이터 링크로 픽셀 데이터와 비디오 이벤트를 직렬화한다. 프레임버퍼 blank/unblank 이벤트가 있을 때, 등록된 알리미가 호출되어 저전력 모드를 시작/종료한다.
MIPI DSI IP 드라이버는 디스플레이 모듈을 구성하기 위해 MIPI DSI 디스플레이 패널 드라이버를 위한 3개의 API를 제공한다.
드라이버는 디스플레이 모듈의 레지스터를 읽고 쓰기 위해 MIPI DSI IP 드라이버에서 제공하는 API를 사용한다. 일반적으로, 디스플레이 패널에는 통합된 MIPI DSI 슬레이브 컨트롤러가 있다. 파워온 리셋 후, MIPI DSI 디스플레이 패널은 제조업체의 사양에 따라 표준 MIPI DCS 커맨드와 MIPI DSI Generic 커맨드로 구성해야 한다.
6.4.2.3 Source Code Structure
아래 테이블은 drivers/video/fbdev/mxc에서 사용할 수 있는 MIPI DSI 드라이버 소스 파일을 보여준다.
Table 64. MIPI DSI Driver Files
File | Description |
---|---|
drveirs/video/fbdev/mxc/mipi_dsi.c | MIPI DSI IP Frame 버퍼 드라이버 소스 파일 |
drivers/video/fbdev/mxc/mipi_dsi.h | MIPI DSI IP Frame 버퍼 드라이버 헤더 파일 |
drivers/video/fbdev/mxc/mxcfb_hx8369_wvga.c | MIPI DSI Frame 버퍼 Display Panel 드라이버 소스 파일 |
drivers/video/fbdev/mxc/mipi_dsi_samsung.c | MIPI DSI Frame 버퍼 Samsung 소스 파일 |
drivers/video/fbdev/mxc/mipi_dsi_northwest.c | MIPI DSI Frame 버퍼 Northwest 소스 파일 |
drivers/video/fbdev/mxc/mxcfb_hx8363_wvga.c | i.MX 7 Frame 버퍼 Truly WVGA Panel TFT3 P5581E |
drivers/video/fbdev/mxc/mxcfb_hx8369_wvga.c | i.MX 6 Frame 버퍼 Truly WVGA sync 패널 |
drivers/video/fbdev/mxc/mxcfb_otm808b_wvga.c | Truly Frame 버퍼 WVGA Panel TFT3P5079E |
drivers/gpu/drm/imx/sec_mipi_dsmi-imx.c | Samsung DRM 드라이버 |
drivers/gpu/drm/imx/nwl_dsi-imx.c | Northwest DRM 드라이버 |
drivers/gpu/drm/imx/dw_mipi_dsi-imx.c | Synopsys DesignWare MIPI DSI DRM 드라이버 |
6.4.2.4 Menu Configuration Options
메뉴 구성에서 아래 모듈을 활성화한다:
- Device Drivers > Graphics support > MXC Framebuffer support > Synchronous Panel Framebuffer > MXC MIPI_DSI
- Device Drivers > Graphics support > MXC Framebuffer support > Synchronous Panel Framebuffer > MXC MIPI_DSI_SAMSUNG
- Device Drivers > Graphics support > DRM Support for Freescale i.MX > Support for Northwest Logic MIPI DSI displays
- Device Drivers > Graphics support > DRM Support for Freescale i.MX > Support for Samsung MIPI DSIM displays
- Device Drivers > Graphics support > DRM Support for Freescale i.MX > Freescale i.MX DRM Synopsys DesignWare MIPI DSI
6.4.3 LVDS Interface
6.4.3.1 Introduction
Low Voltage Differential Signalling(LVDS)는 낮은 전력 소비로 높은 대역폭과 고화질 그래픽과 빠른 프레임 속도를 지원한다. 구현은 한 쌍에서 각 와이어가 다른 와이어의 신호를 역으로 전달하는 와이어의 쌍으로 사용된다. 이렇게 하면 간섭과 노이즈가 줄어든다. LVDS 인터페이스는 클럭과 접지를 전달하는 와이어 한쌍을 추가하여 4, 6 또는 8 개의 와이어 쌍으로 사용한다.
LVDS 인터페이스의 목적은 디스플레이 컨트롤러에서 외부 디스플레이 디바이스로 LVDS 인터페이스를 사용하여 동기식 RGB 데이터 흐름을 지원하는 것이다.
이 지원은 다음 활동의 모든 측면을 다룬다:
- 관련 디바이스에 대한 연결성 - LVDS 리시버가 있는 디스플레이
- 외부 디스플레이 리시버와 LVDS 디스플레이 표준에서 요구하는 데이터 정열
- 동기화와 컨트롤 기능
LVDS 인터페이스는 아래 나열된 여러 컨트롤러를 지원한다.
- LDB - IPU가 있는 i.MX 6에서 더블
- i.MX 8QuadMax에서 Mixel
- i.MX 8QuadXPlus에서 Mixel Combo
LVDS 드라이버는 i.MX 6과 i.MX 7에서 프레임 버퍼, i.MX 8과 i.MX 93에서 DRM인 지원되고 있는 디스플레이 프레임워크와 함께 동작한다.
LVDS 인터페이스는 아래 구조를 지원한다.
- 채널 - 일반적으로 2 채널
- 각 채널은 여러 데이터 쌍을 지원
- 각 데이터 쌍에 따라 달라질 수 있는 데이터 픽셀 속도
- HSYNC,VSYNC, DE를 위한 컨트롤 신호
LVDS 인터페이스는 아래 디스플레이를 지원한다.
- IT6263 LVDS - HDMI 브리지 - LDB 드라이버로 구현
- LVDS 듀얼 채널 패널
LVDS 관련 표준은 아래와 같다.
- PHY Standard: ANSI EIA-644A
- Display Protocol Standards:
- SPWG: Standard Panel Working Group Specification 3.8 (May 2007)
- VESA PSWG – Panel Standardization Working Group – LVDS를 사용하는 패널에 대한 표준 세트
- JEIDA/JEITA DISM Standard JEIDA-59-1999
- OpenLDI (National) – Revision 0.95 13/May/1999. 오직 불균형 작동 모드 지원(대부분의 LCD 공급업체와 일치)
LVDS 인터페이스는 i.MX 6과 i.MX 7의 프레임 버퍼 프레임워크와 i.MX 8과 i.MX 93의 DRM 프레임워크로 지원되고 있다.
6.4.3.2 Software Operation
드라이버가 내장되어 있고 디바이스 트리 상태가 "okay"로 설정된 경우, LVDS 드라이버가 작동한다.
LVDS 디바이스 드라이버가 제대로 검색(probe)되면, 드라이버는 LVDS에 대한 클럭을 구성한다. LVDS 드라이버 probe 함수는 1080p60로 기본 모드를 설정한다. LVDS 채널 매핑 모드와 비트 매핑 모드는 30비트 JEIDA 모드를 사용하도록 설정된다.
드라이버는 LVDS 채널을 활성화하기 위해 아래 단계를 수행한다:
- LVDS에 대한 전원을 활성화
- ldb_di_clk의 상위 clk와 상위 clk 속도를 설정
- ldb_di_clk의 속도를 설정
- ldb_di_clk와 상위 clk를 모두 활성화
- 디스플레이 신호의 극성, 채널 매핑 모드와 비트 매핑 모드를 포함하여 적절한 모드로 LVDS를 설정
- 관련된 i.MX LVDS 채널 활성
6.4.3.3 Source Code Structure
Table 65. LVDS Source
File | Description |
---|---|
drivers/gpu/drm/imx/imx*-ldb.c | i.MX SoC 정보가 포함된 LDB 드라이버 |
drivers/gpu/drm/bridge/fsl-imx-ldb.c | LDB 브리지 드라이버 |
6.4.3.4 Menu Configuration Options
메뉴 구성에서 아래 모듈을 활성화한다:
- Device Drivers > Graphics support > DRM Support for Freescale i.MX > Support for LVDS displays
6.4.4 LVDS Display Bridge (LDB)
6.4.4.1 Introduction
이 섹션에서는 LVDS 인터페이스를 포함하는 외부 디스플레이 디바이스와 연결하기 위해 LDB 모듈을 컨트롤하는 LVDS Display Bridge(LDB) 드라이버에 대해 설명한다. LDB의 목적은 IPU나 LCDIF에서 외부 디스플레이 디바이스로 LVDS 인터페이스를 사용해 동기식 RGB 데이터 흐름을 지원하는 것이다.
이 지원은 아래를 포함한다:
- 관련 디바이스에 대한 연결성 - LVDS 리시버가 있는 디스플레이
- 외부 디스플레이 리시버와 LVDS 디스플레이 표준에서 요구하는 데이터 정열
- 동기화와 컨트롤 기능
6.4.4.2 Software Operation
드라이버가 내장되어 있는 경우, LDB 드라이버가 작동한다.
LDB 디바이스가 제대로 프로브되면, 드라이버는 플랫폼 데이터 정보를 사용하여 LDB 레퍼런스 저항 모드와 LDB 레귤레이터를 구성한다. LDB 드라이버의 프로브 함수는 LVDS 인터페이스로 외부 디스플레이 디바이스에 대해 비디오 모드를 일치 시키려고 시도한다. LDB의 디스플레이 신호 극성 제어 비트는 일치하는 비디오 모드에 따라 설정된다. LDB의 LVDS 채널 매핑 모드와 비트 매핑 모드는 사용자가 설정한 LDB 디바이스 트리 노드에 따라 설정된다. 드라이버가 기본 디스플레이 디바이스로 LVDS 인터페이스가 있는 디스플레이 디바이스를 식별하는 경우, LDB는 프로브 함수에서 완전히 활성화된다.
드라이버가 LVDS 채널을 활성화하기 위해 취하는 단계는 아래와 같다:
- ldb_di_clk의 상위 clk와 상위 clk의 속도를 설정한다.
- ldb_di_clk의 속도를 설정한다.
- ldb_di_clk와 상위 clk를 모두 활성화한다.
- 디스플레이 신호의 극성, LVDS 채널 매핑 모드, 비트 매핑 모드, 그리고 레퍼런스 저항 모드를 포함하여 적절한 모드로 LDB를 설정한다.
- 관련 LVDS 채널을 활성화한다.
6.4.4.3 Source Code Structure
Table 66. LDB Source
File | Description |
---|---|
drivers/video/fbdev/mxc/ldb.c | LDB Framebuffer 드라이버 |
6.4.4.4 Menu Configuration Options
이 모듈에는 아래와 같은 Linux 커널 구성 옵션이 제공된다.
메뉴 구성에서 아래 모듈을 활성화한다:
- Device Drivers -> Graphics support -> MXC Framebufer support ->Synchronous Panel Framebuffer -> MXC LDB
6.4.5 Electrophoretic Display Controller (EPDC) Interface
6.4.5.1 Introduction
Electrophoretic Display Controller(EPDC)는 다양한 TFT 백플레인을 지원하는 E Ink EPD 패널을 구동하도록 디자인된 직접 구동 활성 매트릭스 EPD 컨트롤러이다. EPDC framebuffer 드라이버는 표준 Linux 프레임 버퍼 디바이스 역할을 한다. 이 드라이버는 사용자에게 EPD 특정 기능에 대한 액세스를 제공하기 위해 사용자 공간(IOCTL을 통해)이나 다른 커널 모듈(직접 함수 호출을 통해)에서 액세스할 수 있는 사용자 정의 API 확장 세트를 지원한다. EPDC 드라이버는 특정 E Ink 패널 유형에서 추상화되어 다양한 E Ink 패널 유형과 사양으로 작업할 수 있는 유연성을 제공한다.
EPDC 드라이버는 아래 기능을 지원한다:
- 로드 가능하거나 내장 모듈로 EPDC 드라이버
- RGB565, RGB24, RGB32 및 Y8 프레임 버퍼 형식
- 전체 및 부분 EPD 스크린 업데이트
- 최대 256개의 패널별 파형 모드
- 주어진 업데이트에 대한 자동으로 최적의 파형 선택
- 특정 업데이트 요청이 완료될 때까지 대기에 의해 동기화
- 대체(오버레이) 버퍼에서 스크린 업데이트
- 자동화된 충돌 처리
- 64개의 동시 업데이트 영역
- Y8 프레임 버퍼 형식의 Ppixel 반전
- 90, 180, 및 270도 HW 가속 프레임 버퍼 회전
- 패닝 (y 방향만)
- Linux fb_deferred_io 메커니즘으로 자동화된 전체 및 부분 스크린 업데이트
- 세 가지 EPDC 드라이버 디스플레이 업데이트 체계: Snapshot, Queue, 및 Queue와 Merge
- 일회성으로 지정된 API 호출이나 업데이트 단위로 주변 온도를 설정
- 모든 업데이트 완료와 EPDC 전원 끄기 사이의 지연에 대한 사용자 컨트롤
6.4.5.2 EPDC Frame Buffer Driver Overview
프레임 버퍼 디바이스는 그래픽 하드웨어에 대한 추상화를 제공한다. 이것은 프레임 버퍼 비디오 하드웨어를 나타내며 애플리케이션 소프트웨어가 잘 정의된 인터페이스로 그래픽 하드웨어에 액세스할 수 있도록 하여 소프트웨어에서 로우 레벨 하드웨어 레지스터를 관리하는 방법을 추상화한다. EPDC 드라이버는 한 가지 중요한 주의 사항과 함께 이 모델을 지원한다. 프레임 버퍼의 내용은 E Ink 디스플레이로 자동 업데이트되지 않는다. 대신, E Ink 디스플레이에 대한 업데이트를 트리거하려면 사용자 지정 API 함수 호출이 필요하다. 이 프로세스의 세부 사항은 Section 6.4.5.3에 설명되어 있다.
프레임 버퍼 드라이버는 커널 구성의 그래픽 파라미터에서 프레임 버퍼 옵션을 선택하여 활성화한다. 프레임 버퍼 드라이버를 보완하기 위해, 커널 빌더는 폰트와 시작 로고에 대한 지원을 포함할 수도 있다. 프레임 버퍼 디바이스는 시리얼에서 그래픽 모드로 전환하기 위해 VT(virtual terminal: 가상 터미널) 콘솔에 의존한다. 디바이스는 /dev/fb*와 같이 /dev 디렉터리에 위치한 특수 디바이스 노드로 액세스된다. 일반적으로 fb0은 기본 프레임 버퍼이다.
프레임 버퍼 디바이스는 /dev/mem과 같은 메모리 디바이스이며, 메모리 디바이스와 유사한 기능을 가지고 있다. 사용자는 그것을 읽고, 그것에 쓰고, 그 안에서 어떤 위치를 찾고, 그리고 그것을 mmap()할 수 있다(주 사용 용도). 차이점은 특수 파일에 나타나는 메모리가 전체 메모리가 아니라 일부 비디오 하드웨어의 프레임 버퍼라는 것이다.
EPDC 프레임 버퍼 드라이버(i.MX 6DualLite에서 drivers/video/fbdev/mxc/mxc_epdc_fb.c 또는 i.MX 7Dual에서 2세대 EPDC의 drivers/video/fbdev/mxc/mxc_epdc_v2_fb.c)는 일반 Linux 프레임 버퍼 드라이버(drivers/video/fbmem.c)와 밀접하게 상호 작용한다.
프레임 버퍼 디바이스에 대한 자세한 내용은 Documentation/fb/framebuffer.txt에 있는 Linux 커널의 문서를 참조한다.
6.4.5.3 EPDC Frame Buffer Driver Extensions
EPDC와 함께 E Ink 디스플레이 기술에는 표준 LCD 기반 프레임 버퍼 디바이스와 구별되는 몇 가지 기능이 있다. 이러한 차이점으로 인해 프레임 버퍼 인터페이스에 대한 API 확장이 필요하다. EPDC는 E Ink 디스플레이를 비동기식으로 리프레시하고 스크린에 대한 부분 업데이트를 지원한다. 따라서 EPDC는 프레임 버퍼 내용이 수정되고 업데이트가 필요한 영역을 사용자에게 알려야 한다. E Ink 디스플레이에 대한 EPDC 업데이트의 또 다른 고유한 특성은 스크린 업데이트시 긴 레이턴시(300-980ms 사이)로, 사용자는 주어진 스크린 업데이트가 완료될 때까지 기다릴 수 있는 메커니즘이 필요하다.
프레임 버퍼 디바이스에 대한 사용자 지정 API 확장은 사용자 공간 애플리케이션과 커널 공간 내에서 모두 액세스할 수 있다. 표준 디바이스 IOCTL 인터페이스는 사용자 공간 애플리케이션을 위한 사용자 지정 API에 대한 액세스를 제공한다. 관련 데이터 구조 및 정의와 함께 IOCTL 확장은 include/linux/mxcfb_epdc.h에서 찾을 수 있다. 이러한 IOCTL에 대한 전체 설명은 Section 6.4.5.11의 Programming Interface 찾을 수 있다.
사용자 지정 API 확장에서 커널 모드 액세스의 경우, 기본 기능에 직접 액세스할 수 있도록 IOCTL 인터페이스를 우회해야 한다.
6.4.5.4 EPDC Panel Configuration
EPDC 드라이버는 다양한 패널 해상도, 타이밍 파라미터 그리고 파형 모드로 E Ink 패널을 유연하게 지원하도록 디자인되었다. EPDC 드라이버는 include/linux/mxcfb_epdc.h에서 찾을 수 있는 EPDC 패널 모드 구조체인 imx_epdc_fb_mode를 사용하여 패널에 구애받지 않고 유지된다.
struct imx_epdc_fb_mode {
struct fb_videomode *vmode;
int vscan_holdoff;
int sdoed_width;
int sdoed_delay;
int sdoez_width;
int sdoez_delay;
int gdclk_hp_offs;
int gdsp_offs;
int gdoe_offs;
int gdclk_offs;
int num_ce;
};
imx_epdc_fb_mode 구조체는 fb_videomode 구조체의 레퍼런스와 EPD 타이밍 파라미터 세트로 구성된다. fb_videomode 구조체는 패널 해상도와 기본 타이밍 파라미터(픽셀 클럭 주파수, hsync와 vsync 마진)를 정의하고, imx_epdc_fb_mode의 추가 타이밍 파라미터는 소스와 게이트 드라이버 타이밍과 같은 EPD 관련 타이밍 파라미터를 정의한다. E Ink 패널 타이밍 파라미터를 구성하는 방법에 대한 자세한 내용은 i.MX 6DualLite Applications Processor Reference Manual (IMX6DLRM) 또는 i.MX 7Dual Applications Processor Reference Manual (IMX7DRM)의 EPDC 프로그래밍 모델 섹션을 참조한다.
EPDC 패널 모드 데이터 외에도, EPDC 드라이버가 활성화되거나 비활성화될 때 EPDC 핀을 처리하는 방법을 정의하기 위해, 기능이 EPDC 드라이버에 전달될 수 있다. 이러한 기능은 절전을 위해 EPDC 핀을 비활성화해야 한다.
6.4.5.5 Boot Command Line Parameters
EPDC 드라이버에 대한 추가 구성은 부트 커맨드 라인 파라미터로 제공된다. 커맨드 라인 옵션의 형식은 다음과 같다.
epdc video=mxcepdcfb:[panel_name],bpp=16
EPDC 드라이버는 이러한 옵션을 구문 분석하고, imx_epdc_fb_mode 패널 모드 구조체에 지정된 비디오 모드의 이름과 panel_name을 일치시키려고 시도한다. 일치하는 항목이 없으면, 플랫폼 데이터에서 제공되는 첫 번째 패널 모드가 EPDC 드라이버에서 사용된다. 이 커맨드 라인의 bpp 설정은 프레임 버퍼에 대해 픽셀당 초기 비트 수를 설정한다. 32 또는 24로 설정하면 RGB888 픽셀 형식이 선택되고, 16으로 설정하면 RGB565 픽셀 형식이 선택되며, 8로 설정하면 8비트 그레이스케일(Y8) 형식이 선택된다.
6.4.5.6 EPDC Waveform Loading
EPDC 드라이버가 제대로 작동하려면 파형 파일이 필요하다. 이 파형 파일에는 E Ink 패널에 대한 업데이트를 구동하는 파형 생성에 필요한 파형 정보가 포함되어 있다. 첫 번째 업데이트가 수행되기 전에 파형 파일 데이터에 대한 포인터가 EPDC에 프로그램 된다.
파형 파일을 선택하기 위한 두 가지 옵션이 있다:
- 이 BSP 릴리스에 포함된 기본 파형 파일 중 하나를 선택한다.
- 사용 중인 E Ink 패널에 특정한 새 파형 파일을 사용한다.
파형 파일은 Linux 펌웨어 API를 사용하여 EPDC 드라이버에 의해 로드된다.
6.4.5.7 Using a Default Waveform File
E Ink 패널과 EPDC 드라이버 사용을 시작하는 가장 빠르고 가장 쉬운 방법은 Linux BSP에서 제공되는 기본 파형 파일 중 하나를 사용하는 것이다. 이렇게 하면 패널별 파형 파일 없이 여러 가지 유형의 E Ink 패널을 업데이트할 수 있다. 단점은 최적의 품질을 기대해서는 안된다는 것이다. 일반적으로, E Ink 패널에 해당 패널 관련이 아닌 파형 파일을 사용하면 잔상이 더 많이 생기고 전반적으로 색상 품질이 떨어진다.
BSP에 포함된 아래와 같은 기본 파형 파일은 /lib/firmware/imx/epdc에 있다:
- epdc_E60_V110.fw - 6.0인치 V110 E Ink 패널의 기본 파형
- epdc_E60_V220.fw - 6.0인치 V220 E Ink 패널의 기본 파형(애니메이션 모드 업데이트 지원)
- epdc_E97_V110.fw - 9.7인치 V110 E Ink 패널의 기본 파형
- epdc_E060SCM.fw - 6.0인치 Pearl E Ink 패널의 기본 파형(애니메이션 모드 업데이트 지원)
- epdc_ED060XH2C1.fw - 6.0인치 E Ink 패널의 기본 파형(기본으로 Reagl/-D 지원이 없다. Reagl/-D 지원에 대해서는 NXP 서포트에 문의한다.)
EPDC 드라이버는 rootfs의 /lib/firmware/imx/epdc 디렉터리 아래에 "epdc_[panel_name].fw"라는 이름의 파형 파일을 로드하려고 시도한다. 여기서 panel_name은 fb_videomode의 name 필드에 지정된 문자열을 나타낸다. 이 panel_name 정보는 이전 장에서 설명한 커널 커맨드 라인 파라미터로 EPDC 드라이버에 제공된다. 예를 들어, Pearl 패널용 epdc_E060SCM.fw 기본 펌웨어 파일을 로드하려면, EPDC 커널 커맨드 라인 파리미터를 아래와 같이 설정한다:
video=mxcepdcfb:E060SCM,bpp=16
6.4.5.8 Using a Custom Waveform File
최적의 E Ink 디스플레이 품질을 보장하려면, 사용중인 E Ink 패널에 특정한 파형 파일을 사용해야 한다. 로우 파형 파일 유형(.wbf)은 EPDC에서 이해하고 읽을 수 있는 형식으로 변환해야 한다. 이 변환 스크립트는 BSP의 일부로 포함되지 않는다. 따라서 이 변환 스크립트를 얻으려면, NXP에 문의해야 한다.
로우 파형 파일에서 파형 변환 스크립트를 실행한 후, 변환된 파형 파일은 EPDC 드라이버가 찾아서 로드할 수 있도록 이름을 변경해야 한다. 드라이버는 rootfs의 /lib/firmware/imx/epdc 디렉터리에서 이름이 "epdc_[panel_name].fw"인 파형 파일을 검색한다. 여기서 panel_name은 fb_videomode의 name 필드에 지정된 문자열을 나타낸다. 예를 들어, 패널 이름이 "E60_ABCD"인 경우, 변환된 파형 파일의 이름은 epdc_E60_ABCD.fw여야 한다.
참고
EPDC 드라이버가 기본 파형 파일 중 하나의 이름과 일치하는 펌웨어 파형 파일을 검색하는 경우(이전 장 참조), 펌웨어 검색 경로에 추가된 모든 펌웨어 파일보다 BSP에 내장된 기본 펌웨어 파일을 선택한다. 따라서 BSP가 기본 펌웨어 파일을 사용하도록 BSP를 그대로 둔 경우, 기본 펌웨어 파일과 연결된 패널 이름이 아닌 다른 패널 이름을 사용해야 한다. 이러한 기본 파형 파일은 펌웨어 검색 경로에 배치된 새 파형 파일보다 선호되고 선택될 수 있다.
6.4.5.9 EPDC Panel Initialization
framebuffer 드라이버 모듈이 로드될 때, 일반적으로 framebuffer 드라이버는 하드웨어 초기화 단계를 거치지 않는다(예외는 아래의 참고를 참조). 대신, 드라이버가 특정 EPD 패널에 대한 자체 초기화를 요청하려면, 후속 사용자 모드 호출을 수행해야 한다. EPDC 하드웨어와 E Ink 패널을 초기화하려면, 지원되는 E Ink 패널 유형의 X와 Y 해상도와 fb_var_screeninfo 파라미터의 xres와 yres 필드를 일치하도록 설정하여, FBIOPUT_VSCREENINFO ioctl 호출을 수행해야 한다. EPDC 드라이버가 초기화 요청을 받도록 하려면, fb_var_screeninfo 파라미터의 activate 필드를 FB_ACTIVATE_FORCE로 설정해야 한다.
참고
FB Console 드라이버가 커널에 포함된 경우는 예외이다. EPDC 드라이버가 framebuffer 디바이스를 등록하면, FB Console 드라이버는 이어지는 FBIOPUT_VSCREENINFO ioctl 호출을 수행하게 된다. 그러면 EPDC 패널이 초기화된다.
6.4.5.10 Grayscale Framebuffer Selection
EPDC framebuffer 드라이버는 framebuffer(더 일반적인 RGB565 픽셀 형식 외에도)에 대해 8비트 그레이스케일(Y8)과 8비트 반전된 그레이스케일(Y8 반전) 픽셀 형식의 사용을 지원한다. 8비트 그레이스케일로 framebuffer 형식을 구성하기 위해, 애플리케이션은 FBIOPUT_VSCREENINFO framebuffer ioctl을 호출한다. 이 ioctl은 파라미터로 fb_var_screeninfo 포인터를 사용한다. 이 파라미터는 framebuffer의 속성을 지정하고 애플리케이션이 framebuffer 형식에 대한 변경을 요청할 수 있도록 한다. fb_var_screeninfo 파라미터에는 8비트 그레이스케일 형식으로의 변경을 요청하기 위해 설정해야 하는 두 가지 핵심 멤버인 bits_per_pixel와 grayscale이 있다. bits_per_pixel은 8로 설정되어야 하고, grayscale은 GRAYSCALE_8BIT나 GRAYSCALE_8BIT_INVERTED의 2가지 유효한 grayscale 형식 값 중 하나로 설정되어야 한다.
아래의 일부 코드는 Y8 픽셀 형식을 사용하도록 framebuffer를 변경하라는 요청을 보여준다:
fb_screen_info screen_info;
screen_info.bits_per_pixel = 8;
screen_info.grayscale = GRAYSCALE_8BIT;
retval = ioctl(fd_fb0, FBIOPUT_VSCREENINFO, &screen_info);
6.4.5.11 Software Operation
EPDC Frame Buffer는 사용자 공간과 커널 공간에서 액세스할 수 있다. 기능의 단일 세트는 EPDC Frame Buffer 드라이버 확장을 기술한다. IOCTL 인터페이스를 사용하는 사용자 공간과 기능을 직접 사용하는 커널 공간에서 이러한 기능에 액세스하기 위한 두 가지 모드가 있다. 각 IOCTL과 기능의 조합은 다음에 기술된다.
MXCFB_SET_WAVEFORM_MODES / mxc_epdc_fb_set_waveform_modes()
Description:
일반적인 파형 모드에 대한 매핑을 정의.
Parameters:
mxcfb_waveform_modes *modes
일반적인 파형 모드에 대한 파형 모드의 값을 포함하는 구조체에 대한 포인터이다. 자동 파형 모드 선택이 제대로 작동하려면 이러한 값을 구성해야 한다.
MXCFB_SET_TEMPERATURE / mxc_epdc_fb_set_temperature
Description:
후속 패널 업데이트에서 EPDC 드라이버가 사용할 온도를 설정.
Parameters:
int32_t temperature
Celsius(섭씨) 단위의 온도 값이다. 이 온도 설정은 MXCFB_SEND_UPDATE ioctl을 사용할 때 TEMP_USE_AMBIENT 이외의 것으로 온도 값 파라미터를 설정하여 재정의할 수 있다.
MXCFB_SET_AUTO_UPDATE_MODE / mxc_epdc_fb_set_auto_update
Description:
자동과 지역 업데이트 모드 중에서 선택.
Parameters:
__u32 mode
지역 업데이트 모드에서, 업데이트는 MXCFB_SEND_UPDATE IOCTL로 제출해야 한다.
자동 모드에서, 업데이트는 수정된 프레임 버퍼 메모리 영역의 페이지를 감지하여 드라이버에서 자동으로 생성된다.
MXCFB_SET_UPDATE_SCHEME / mxc_epdc_fb_set_upd_scheme
Description:
드라이버 내의 업데이트 흐름을 지정하는 스킴을 선택.
Parameters:
__u32 scheme
아래 업데이트 스킴 중에서 선택한다:
UPDATE_SCHEME_SNAPSHOT - Snapshot 업데이트 스킴에서, framebuffer의 컨텐츠는 즉시 처리되고 드라이버 내부 메모리 버퍼에 저장된다. MXCFB_SEND_UPDATE에 대한 호출이 완료될 때까지, framebuffer 영역은 비어있으며 마지막 업데이트의 무결성에 영향을 주지 않고 수정할 수 있다. 업데이트 프레임 제출이 보류 중인 다른 업데이트로 인해 지연되는 경우, 업데이트가 최종적으로 EPDC 하드웨어에 제출될 때 원래 버퍼 컨텐츠가 디스플레이된다. 업데이트 결과 충돌이 발생한 경우, 충돌이 해결되면 원래 업데이트 컨텐츠가 다시 제출된다.
UPDATE_SCHEME_QUEUE - Queue 업데이트 스킴은 모든 업데이트의 처리와 제출을 비동기식으로 처리하기 위해 작업 큐를 사용한다. 업데이트가 MXCFB_SEND_UPDATE를 통해 제출되면, 업데이트는 큐에 추가된 다음 EPDC 하드웨어 리소스를 사용할 수 있는 순서대로 처리된다. 결과적으로, 처리되고 업데이트된 framebuffer 컨텐츠는 업데이트가 드라이버로 전송되었을 때 framebuffer에 있던 내용를 반영하도록 보장되지 않는다.
UPDATE_SCHEME_QUEUE_AND_MERGE - Queue와 Merge 스킴은 Queue 스킴의 큐 개념을 사용하지만, 병합 단계를 추가한다. 즉, 업데이트가 작업 큐에서 처리되기 전에 먼저 보류 중인 다른 업데이트와 비교된다. 업데이트가 현재 업데이트의 모드 및 플래그와 일치하고 현재 업데이트의 업데이트 영역과 겹치는 경우, 해당 업데이트가 현재 업데이트와 병합된다. 보류 중인 모든 업데이트를 병합하려고 시도한 후, 최종 병합된 업데이트가 처리되고 및 제출된다.
MXCFB_SEND_UPDATE / mxc_epdc_fb_send_update
Description:
프레임 버퍼의 영역을 디스플레이로 업데이트하도록 요청.
Parameters:
mxcfb_update_data *upd_data
현재 업데이트에 대한 프레임 버퍼, 파형 모드 그리고 충돌 모드의 영역을 정의하는 구조체의 포인터이다. 이 구조체는 아래 업데이트 옵션 중 하나를 선택할 수 있는 flags 필드도 포함되어 있다.
EPDC_FLAG_ENABLE_INVERSION - 업데이트 영역에서 모든 픽셀의 반전을 활성화한다.
EPDC_FLAG_FORCE_MONOCHROME - 업데이트 영역에 있는 모든 픽셀의 전체 흑백 포스터화(posterization)를 활성화한다.
EPDC_FLAG_USE_ALT_BUFFER - 대체(non-framebuffer) 메모리 버퍼에서 업데이트를 활성화한다. 활성화된 경우 마지막 upd_data 파라미터에는 대체 메모리 버퍼에 대한 자세한 구성 정보가 포함된다.
MXCFB_WAIT_FOR_UPDATE_COMPLETE / mxc_epdc_fb_wait_update_complete
Description:
블럭하고 이전 업데이트 요청이 완료될 때까지 대기.
Parameters:
mxfb_update_marker_data marker_data
특정 업데이트를 식별하는 데 사용되는 update_marker 값(MXCFB_SEND_UPDATE IOCTL 호출에서 파라미터로 전달됨)은 업데이트가 완료될 때까지 대기하기 위해 여기에서 재사용되어야 한다. 업데이트가 충돌 테스트 업데이트인 경우, collision_test 변수는 충돌 발생 여부를 나타내는 결과를 반환한다.
MXCFB_SET_PWRDOWN_DELAY / mxc_epdc_fb_set_pwrdown_delay
Description:
드라이버의 모든 업데이트 완료된 후 드라이버가 EPDC와 E Ink 디스플레이 전원 공급 장치의 전원을 꺼야 하는 시점 사이의 지연 시간을 설정한다.
Parameters:
int32_t delay
지연 값은 밀리초 단위로 입력한다. EPDC 전원 차단을 완전히 비활성화하려면, FB_POWERDOWN_DISABLE(아래 정의됨)을 사용한다.
MXCFB_GET_PWRDOWN_DELAY / mxc_epdc_fb_get_pwrdown_delay
Description:
드라이버의 현재 전원 차단 지연 값을 검색한다.
Parameters:
int32_t delay
출력 지연 값(밀리초)
6.4.5.12 Structures and Defines
#define GRAYSCALE_8BIT
0x1
#define GRAYSCALE_8BIT_INVERTED
0x2
#define AUTO_UPDATE_MODE_REGION_MODE
0
#define AUTO_UPDATE_MODE_AUTOMATIC_MODE
1
#define UPDATE_SCHEME_SNAPSHOT
0
#define UPDATE_SCHEME_QUEUE
1
#define UPDATE_SCHEME_QUEUE_AND_MERGE
2
#define UPDATE_MODE_PARTIAL
0x0
#define UPDATE_MODE_FULL
0x1
#define WAVEFORM_MODE_AUTO
257
#define TEMP_USE_AMBIENT
0x1000
#define EPDC_FLAG_ENABLE_INVERSION
0x01
#define EPDC_FLAG_FORCE_MONOCHROME
0x02
#define EPDC_FLAG_USE_ALT_BUFFER
0x100
#define EPDC_FLAG_TEST_COLLISION
0x200
#define FB_POWERDOWN_DISABLE
-1
struct mxcfb_rect {
__u32 left; /* Starting X coordinate for update region */
__u32 top; /* Starting Y coordinate for update region */
__u32 width; /* Width of update region */
__u32 height; /* Height of update region */
};
struct mxcfb_waveform_modes {
int mode_init; /* INIT waveform mode */
int mode_du; /* DU waveform mode */
int mode_gc4; /* GC4 waveform mode */
int mode_gc8; /* GC8 waveform mode */
int mode_gc16; /* GC16 waveform mode */
int mode_gc32; /* GC32 waveform mode */
};
struct mxcfb_alt_buffer_data {
__u32 phys_addr; /* physical address of alternate image buffer
*/
__u32 width; /* width of entire buffer */
__u32 height; /* height of entire buffer */
struct mxcfb_rect alt_update_region; /* region within buffer to
update */
};
struct mxcfb_update_data {
struct mxcfb_rect update_region; /* Rectangular update region
bounds */
__u32 waveform_mode; /* Waveform mode for update */
__u32 update_mode; /* Update mode selection (partial/full) */
__u32 update_marker; /* Marker used when waiting for completion
*/
int temp; /* Temperature in Celsius */
uint flags; /* Select options for the current update */
struct mxcfb_alt_buffer_data alt_buffer_data; /* Alternate
buffer data */
};
struct mxcfb_update_marker_data { __u32 update_marker; __u32
collision_test; };
6.4.5.13 Source Code Structure
아래 표에는 프로그래밍 액세스를 위한 EPDC 드라이버 및 헤더와 관련된 소스 파일이 나열되어 있다.
Table 67. EPDC Source
File | Description |
---|---|
drivers/video/fbev/mxc/mxc_epdc_v2_fb.c | i.MX 7Dual용 EPDC Generation-II V2 프레임 버퍼 드라이버 |
drivers/video/fbdev/mxc/epdc_v2_regs.h | EPDC Generation-II Register 정의 |
drivers/video/fbdev/mxc/mxc_epdc_fb.c | i.MX 6Sololite, 6SLL 그리고 6DualLite용 Generation-I EPDC 프레임 버퍼 드라이버 |
drivers/video/fbdev/mxc/epdc_regs.h | EPDC Generation-I Register 정의 |
drivers/video/fbdev/mxc/epdc_v2_regs.h | Generation-II EPDC v2 레지스터 정의 |
include/linux/uapi/mxcfb.h | EPDC IOCTL와 프레임 버퍼 드라이버용 헤더 파일 |
include/linux/mxcfb_epdc.h | EPDC API 확장에 대한 직접 커널 액세스를 위한 헤더 파일 |
6.4.5.14 Menu Configuration Options
EPDC 모듈에 대해 아래와 같은 Linux 커널 구성 옵션이 제공된다:
- CONFIG_FB_MXC_EINK_PANEL - Electrophoretic Display Controller 지원. menuconfig에서 다음을 선택한다.
Device Drivers > Graphics Support > E-Ink Panel Framebuffer - CONFIG_FB_MXC_EINK_V2_PANEL - v2 Electrophoretic Display Controller 지원. menuconfig에서, 이 옵션은 다음에서 사용할 수 있다.
Device Drivers > Graphics support > E-Ink Panel Framebuffer based on EPDC V2 - CONFIG_FB - 프레임 버퍼 지원을 포함하며 기본으로 활성화되어 있다. menuconfig에서 다음을 선택한다.
Device Drivers > Graphics support > Support for frame buffer devices - CONFIG_MXC_PXP_V2 - PxP 지원과 프레임 버퍼 업데이트 영역 처리(색 공간 변환, 회전, 자동 파형 선택)를 위해 EPDC 드라이버에 필요하다. menuconfig에서 다음을 선택한다.
Device Drivers > DMA Engine support > MXC PxP support - CONFIG_MXC_PXP_V3 - 차세대 PxP를 지원하며 프레임 버퍼 입데이트 영역을 처리하기 위해 Generation-II EPDC 드라이버에 필요하다. menuconfig에서 다음을 선택한다.
Device Drivers > DMA Engine support > MXC PxP V3 support
6.4.6 High-Definition Multimedia Interface (HDMI) and Display Port (DP) Overview
6.4.6.1 Introduction
High-Definition Multimedia Interface(HDMI)와 Display Port(DP)는 고화질의 비디오를 제공한다. HDMI 모듈은 온칩 솔루션이나 외부 솔루션으로 일부 i.MX 칩에서 지원되고 있다. Display Port DP는 HDMI Tranmit (TX) Controller와 PHY를 포함하는 embedded Display Port (eDP) Transmitter를 제공한다.
아래는 컴플라이언스 버전이다.
- HDMI 1.4와 2.0
- DVI 1.0
- DP 1.3
- eDP 1.4
- HDCP 1.4/2.2
각 SoC HDMI 솔루션은 별도의 장으로 소개되고 있다. i.MX의 Display Port는 동일한 IP 블럭을 사용하지만, 다른 사양을 가진다. 아래 테이블에는 HDMI와 디스플레이 포트를 지원하는 SoC와 지원되는 버전이 나와 있다.
Table 68. HDMI Support
SoC | Features |
---|---|
i.MX 6QuadPlus/Quad/Dual | HDMI 1.4 온칩 |
i.MX 7ULP | HDMI 1.4 외부 칩 |
i.MX 8M Quad | HDMI 2.0/Display Port 1.3 온칩 |
i.MX 8QuadMax | HDMI 2.0/Display Port 1.3 온칩 |
HDMI Audio 데이터 소스는 S/PDIF TX에서 가져온다.
6.4.6.2 Software Operation
HDMI 드라이버는 HDMI 싱크 디바이스에서 비디오와 오디오를 제공하는 두 가지 기본 목적에 따라 서브 컴포넌트로 나뉜다.
비디오 디스플레이 드라이버 컴포넌트와 오디오 드라이버 컴포넌트는 추가적인 코어 드라이버 컴포넌트가 필요하다. 이는 HDMI 레지스터, 클럭 그리고 IRQ를 비롯한 일반적인 HDMI 리소스를 관리하기 위한 것이다.
6.4.6.3 Core
온칩 HDMI i.MX 솔루션은 HDMI 오디오와 비디오 드라이버 사이에 공유해야 하는 리소스를 관리하는 코어 드라이버를 지원한다. HDMI 오디오와 비디오 드라이버는 HDMI 코어 드라이버에 의존하며, HDMI 코어 드라이버는 항상 오디오와 비디오 전에 로드되고 초기화되어야 한다. 코어 드라이버는 아래 기능을 제공한다:
- HDMI 레지스터 영역을 매핑하고 HDMI 레지스터를 읽고 쓰기 위한 API를 제공한다.
- 주요 HDMI 레지스터의 일회성 초기화를 수행한다.
- HDMI IRQ를 초기화하고 IRQ를 활성화와 비활성화하기 위한 공유된 API를 제공한다.
- 오디오와 비디오 드라이버(예: HDMI 픽셀 클럭) 사이에 정보를 공유하는 수단을 제공한다.
- blank/unblank, plug in/plug out 이벤트가 발생하는 동안, HDMI 비디오와 HDMI 오디오 사이의 동기화 수단을 제공한다. HDMI 케이블이 plug out 상태이거나 HDMI가 blank 상태에서는 HDMI 오디오가 작업을 시작할 수 없다. HDMI 오디오가 재생을 시작할 때마다, HDMI 오디오 드라이버는 PCM을 코어 드라이버에 등록하고 재생이 완료되면 PCM등록을 해제해야 한다. HDMI 비디오 blank나 케이블 plug out 이벤트가 발생하면, 코어 드라이버는 PCM이 등록된 경우 HDMI 오디오 DMA 컨트롤러를 일시 중지한다. HDMI가 unblank이거나 케이블 plug in 이벤트가 발생하면, 코어 드라이버는 먼저 케이블이 plug in 상태인지, 비디오 상태가 unblank인지, 그리고 PCM이 등록되었는지 확인한다. 위에 나열된 항목이 모두 예인 경우, 코어 드라이버는 HDMI 오디오 DMA를 다시 시작한다.
6.4.6.4 Display Device Registration and Initialization
MXC Display Driver 시스템으로 HDMI 디스플레이 디바이스를 i.MX Frame Buffer 드라이버에 연결하기 위해, OS 부팅 흐름에서 아래와 같은 일련의 소프트웨어 활동이 발생한다:
- HDMI 비디오 드라이버 초기화 중, mxc_dispdrv_register()가 호출되어 디스플레이 디바이스로 HDMI 모듈을 등록하고, mxc_hdmi_disp_init() 함수를 디스플레이 디바이스 초기화 콜백으로 설정한다.
- i.MX Frame Buffer 드라이버가 초기화되면, mxc_dispdrv_init()가 호출된다. 이로 인해 등록된 모든 디스플레이 디바이스에 대한 초기화 호출이 발생한다.
- mxc_hdmi_disp_init() 콜백이 실행된다. HDMI 드라이버는 i.MX Frame Buffer 드라이버에서 프레임 버퍼 정보(fbi)가 포함된 구조체를 받는다. HDMI 드라이버는 FB 드라이버 이벤트에 대한 알림을 수신하도록 자체 등록한다. 마지막으로, HDMI 드라이버는 핫플러그 인터럽트를 수신하도록 HDMI를 구성하여 초기화를 완료한다.
참고: 모든 디스플레이 디바이스를 MXC 디스플레이 드라이버 디바이스로 등록하려면, i.MX Frame Buffer 드라이버보다 먼저 모든 디스플레이 디바이스 드라이버를 초기화해야 한다.
6.4.6.5 Hotplug Handling and Video Mode Changes
MXC 디스플레이 드라이버 인터페이스로 i.MX 프레임 버퍼 드라이버와 HDMI 사이의 연결이 설정되면, HDMI 비디오 드라이버는 유효한 HDMI 싱크 디바이스가 연결되어 HDMI 비디오 데이터를 수신할 준비가 되었음을 나타내는 핫플러그 인터럽트를 대기한다. HDMI와 i.MX Frame Buffer Driver 사이의 후속 통신은 Linux Frame Buffer API로 수행된다. 아래 목록은 HDMI 싱크 디바이스를 인식하고 비디오 출력을 구동하도록 ELCDIF FB 드라이버를 구성하는 소프트웨어 흐름을 보여준다:
- HDMI 비디오 드라이버는 핫플러그 인터럽트를 수신하고, 검색된 EDID 정보에서 비디오 모드 목록을 구성하는 HDMI 싱크 디바이스에서 EDID를 읽는다. Linux 커널 커맨드 라인의 비디오 모드 문자열(초기 연결의 경우)이나 최신 비디오 모드(나중에 HDMI 케이블 연결의 경우)를 사용하여, HDMI 드라이버는 모드 목록에서 가장 일치하는 비디오 모드를 선택한다.
- HDMI 비디오 드라이버는 fb_set_var()를 호출하여, i.MX Frame Buffer 드라이버에서 비디오 모드를 변경한다. i.MX Frame Buffer 드라이버가 새로운 모드에 대한 재구성을 완료한다.
- fb_set_var()를 호출한 결과, FB_EVENT_MODE_CHANGE가 발생했음을 나타내는 Frame Buffer 알림이 HDMI 드라이버로 다시 전송된다. HDMI 드라이버는 새로운 비디오 모드로 HDMI 하드웨어를 구성한다.
- 마지막으로, HDMI 모듈은 HDMI 싱크 디바이스에 대한 출력을 생성하도록 활성화된다.
i.MX Frame Buffer Driver는 각 SoC의 HDMI 챕터에서 언급된 대로 각 SoC의 고유한 디스플레이 인터페이스에 결합된다.
6.4.6.6 Audio
HDMI Tx 오디오 드라이버는 ALSA SoC 프레임워크를 사용하기 때문에, 각 hdmi 챕터의 소스 코드 구조 섹션에 나열된 여러 파일로 분리되어 있다. 대부분의 코드는 플랫폼 DMA 드라이버(sound/soc/imx/imx-hdmi-dma.c)와 CODEC 드라이버(sound/soc/codecs/mxc_hdmi.c)에 있다. 머신 드라이버(sound/soc/imx/imx-hdmi.c))는 SoC 오디오 디바이스를 할당하고 모든 SoC 컴포넌트를 함께 링크한다. DAI 드라이버(sound/soc/imx/imx-hdmi-dai.c)는 SoC 요구 사항이다. 주로 플랫폼 데이터를 가져오는 데 사용된다.
HDMI CODEC 드라이버는 대부분의 HDMI 오디오 샘플러 초기화를 수행한다. HDMI Tx 블럭은 AHB DMA 오디오만 구현하고 다른 오디오 인터페이스(SSI, S/PDIF 등)는 구현하지 않는다. HDMI CODEC 드라이버의 다른 주요 기능은 오디오 스트림에 들어가야 하는 IEG 헤더 정보의 구조체를 설정하는 것이다. 구조체가 ALSA 레이어에 연결되어 있으므로, IEC 설정은 사용자 공간에서 "iecset" 유틸리티를 사용하여 액세스할 수 있다.
플랫폼 DMA 드라이버는 HDMI Tx 블럭 DMA 엔진을 처리한다. HDMI 오디오는 HDMI 블럭 DMA와 SDMA를 사용한다. SDMA는 다중 버퍼 메커니즘 구현에 사용되고 있다. HDMI Tx 블럭은 오디오 스트림에 IEC 오디오 헤더 정보를 자동으로 병합하지 않으므로, 플랫폼 DMA 드라이버에서는 버퍼에 보내기 전에 hdmi_dma_copy()(메모리 맵 사용 안함)이나 hdmi_dma_mmap_copy()(메모리 맵 모드 사용) 함수를 사용하여 병합을 수행한다. IEC 오디오 헤더 추가 작업으로 인해, 특히 시스템 부하가 높을 때, 사용자 공간 애플리케이션이 HDMI 오디오 드라이버로 데이터를 적시에 공급할 수 있는 충분한 CPU 사용 시간을 확보하지 못할 수 있다. 이 경우, 약간의 스파크 노이즈가 들린다. 다른 오디오 프레임워크(ALSA LIB나 PULSE AUDIO)에서는 이 노이즈에 대한 다른 로그가 출력될 수 있다. 예를 들어, ALSA LIB에서는 "underrung!!! at least * ms is lost"와 같은 로그가 출력된다.
HDMI 오디오 재생은 HDMI 픽셀 클럭에 따라 달라진다. 따라서, HDMI blank와 케이블 plug out 상태에서는 HDMI 오디오가 중지되거나 재생되지 않는다. 자세한 내용은 software_operation_core를 참조한다.
HDMI 오디오 드라이버는 IEC 헤더를 추가해야 하므로, 드라이버는 HDMI 오디오 드라이버에 이미 저장된 데이터의 양을 알아햐 한다. 애플리케이션이 저장된 데이터의 양을 해독할 수 없는 경우(예: ALSA LIB의 DMIX 플러그인), HDMI 오디오 드라이버가 제대로 작동하지 안될 수 있다. 아무 소리도 들이지 않을 것이다.
HDMI 오디오는 아래 기능을 지원한다:
- 재생 샘플 속도
- 32k, 44.1k, 48k, 88.2k, 96k, 176.4k, 192k
- HDMI 싱크 기능
- 재생 채널:
- 2, 4, 6, 8
- HDMI 싱크 기능
- 재생 오디오 형식:
- SNDRV_PCM_FMTBIT_S16_LE
6.4.6.7 i.MX 8 Display Port
6.4.6.7.1 Introduction
High-Definition Multimedia Interface(HDMI) 드라이버는 i.MX 8QuadMax와 iMX 8MQuad에서 온칩 Cadence HDTX IP 모듈을 지원하여, 단일 케이블을 사용하여 압축되지 않은 비디오, 오디오 그리고 데이터를 전송할 수 있는 기능을 제공한다. HDMI 드라이버는 DPU/DCSS/ DRM 드라이버와 통합되는 비디오 디스플레이 디바이스 드라이버, ALSA/SoC 서브 시스템과 통합되는 오드오 드라이버, HDMI 드라이버의 공유된 소프트웨어와 하드웨어 리소스를 관리하는 코어 API 드라이버의 세 가지 서브 컴포넌트로 나뉜다.
HDTX IP는 아래 기능을 지원한다:
- HDMI 2.0 Specification 준수
- 최대 600MHz 픽셀 CLK 지원
- 듀얼 비디오, 스테레오 그리고 모든 비색계(colorimetry: 색으로 값 수치화) 옵션(RGB, YCbCr444/422 그리고 YCbCr420)을 포함한 모든 비디오 형식이 지원된다.
- 지원되는 오디오 형식은 PCM, HBR, DST, 1비트 오디오, 멀티 스트림 그리고 3D 오디오이다.
- 모든 정보 프레임이 지원된다.
- APB 인터페이스는 상태 정보를 컨트롤하고 읽기 위해 사용된다.
- Embedded-CPU는 SoC 통합을 단순화하는 모든 프로토콜별 작업을 수행한다:
- HDCP 1.4/2.2
- Audio Return Channel (ARC)
HD Display TX Controller는 HDMI, DisplayPort, 또는 eDP와 같은 하나 이상의 프로토콜을 지원한다. 각 프로토콜에는 서로 다른 펌웨어 바이너리가 필요하다. 아래 그림이 이를 기술한다.
HD Display 컨트롤러는 임베디드 Firmware(FW)를 실행하는 CPP(uCPU)를 통합한다. 펌웨어는 HD Display 링크를 관리하고 측파대* 채널 통신을 제공한다. 펌웨어는 데이터 경로(비디오, 오디오 또는 정보 프레임)에 관여하지 않는다.
※ 측파대*(side-band) : 반송파 진폭에 변화를 주는 진폭 변조시 반송파(Carrier)를 중심으로 양쪽에 생기는 2개의 주파수성분
호스트 프로세서는 APB 인터페이스로 HD Display 컨트롤러와 인터페이스한다. 호스트 프로세서는 다음 방법 중 하나 이상으로 HD Display Controller를 관리한다:
- 디버깅 목적으로 HW 레지스터에 직접 액세스
- FW 다운로드(부팅 중)를 위해 I-MEM와 D-MEM에 직접 액세스
- 운영 모드 동안 지정된 HW 모듈(FW에 의해 제어되지 않는 모듈)의 HW 레지스터에 직접 액세스
- 커맨드 인터페이스(GENERAL_WRITE_REGISTER와 GENERAL_READ_REGISTER 커맨드)로 FW와 통신하여 운영 모드 동안 지정된 HW 모듈의 HW 레지스터에 대한 간접 액세스
- 커맨드 인터페이스를 사용하여 mailbox로 다른 FW 모듈과 통신
6.4.6.7.2 Software Operation
HDMI 드라이버는 HDP DRM 드라이버와 Core API 드라이버를 제공하는 두 가지 기본 목적에 따라 서브 컴포넌트로 나뉜다. HDP DRM 드라이버에는 구성된 HDMI FW에 대한 Core API 드라이버 컴포넌트가 필요하다.
6.4.6.7.3 Source Code Structure
HDMI 드라이버에는 MHPP DRM Bridge와 Core API 드라이버, MHDP i.MX 8 플랫폼 드라이버 그리고 HDMI 오디오 드라이버의 세 가지 소프트웨어 컴포넌트가 있다.
Table 69. HDP Core API Driver File List
Files | Description |
---|---|
drivers/gpu/drm/bridge/cadence | MHDP DRM Bridge와 Core API 드라이버 |
drivers/gpu/drm/imx/mhdp | MHDP i.MX 8 플랫폼 드라이버 |
|
HDMI Sound Driver |
6.4.6.7.4 Menu Configuration Options
Linux OS 이미지에서 HDMI 드라이버 기능을 선택하고 포함하는 데 사용되는 세 가지 주요 Linux 커널 구성 옵션이 있다.
CONFIG_DRM_CDNS_MHDP 옵션은 MHDP DRM Bridge와 Core API 드라이버에 대한 지원을 제공하며, menuconfig의 아래 메뉴 위치에서 선택할 수 있다:
- Device Drivers > Graphics support >Display Interface Bridges > Cadence MHDP COMMON API driver
CONFIG_DRM_IMX_CDNS_MHDP 옵션은 i.MX 8 HDMI/DP 비디오 드라이버에 대한 지원을 제공하며, menuconfig의 아래 메뉴 위치에서 선택할 수 있다:
- Device Drivers > Graphics support > NXP i.MX MX8 DRM HDMI/DP
CONFIG_SND_SOC_IMX_CDNHDMI 옵션은 ALSA/SoC 서브 시스템으로 HDMI 오디오를 지원하며, menuconfig의 아래 메뉴 위치에서 선택할 수 있다:
- Device Drivers > Sound card support > Advanced Linux Sound Architecture > ALSA for SoC audio support > SoC Audio support for CDN - HDMI
6.4.6.8 i.MX 6 On Chip High-Definition Multimedia Interface (HDMI)
6.4.6.8.1 Introduction
High-Definition Multimedia Interface(HDMI) 드라이버는 i.MX 6QuadPlus, 6Quad 그리고 6Dual SoC에서 온칩 DesignWare HDMI 하드웨어 모듈을 지원한다. 이 드라이버는 단일 케이블을 사용하여 비압축 비디오, 오디오 그리고 데이터를 전송할 수 있는 기능을 제공한다.
HDMI 드라이버는 4개의 서브 컴포넌트로 나뉜다:
- Linux Frame Buffer API와 통합되는 비디오 디스플레이 드라이버
- ALSA/SoC 서브 시스템과 통합되는 오디오 드라이버
- CEC 드라이버
- HDMI 드라이버의 공유된 소프트웨어와 하드웨어 리소스를 관리하는 Multifunction 디바이스(MFD) 드라이버
HDMI 드라이버는 아래 기능을 지원한다:
- MXC Display Device 프레임워크(IPU와 디스플레이 디바이스 연결 관리용)와 통합
- 최대 1080p60 해상도의 HDMI 비디오 출력
- HDMI 싱크 디바이스에서 EDID 정보 읽기 지원
- 핫플러그 감지
- CEC 지원
- 전력 소비를 최소화하기 위한 자동 클럭 관리
- 시스템 중지(suspend)/재개(resume) 지원
- HDMI 오디오 재생 (2, 4, 6 또는 8 채널, 16비트, 심플 속도 32KHz ~ 192KHz)
- ‘iecset’ 유틸리티를 사용하여 ALSA를 통해 노출된 IEC 오디오 헤더 정보
아래 그림과 같이, HDMI 모듈은 Image Processing Unit(IPU)에서 비디오 데이터를, 외부 메모리 인터페이스에서 오디오 데이터를 그리고 CPU에서 컨트롤 데이터를 수신한다. 출력 데이터는 3개의 Transition-Minimized Differential Signaling(TMDS) 채널을 통해 SoC 외부의 HDMI 싱크 디바이스로 전송된다. 또한 HDMI는 VESA Data Display Channel(DDC)을 전달한다. DDC는 HDMI 소스가 Extended Display Identification Data(EDID)에 대해 HDMI 싱크를 쿼리할 수 있게 해주는 I2C 인터페이스이다. CEC 채널은 소스와 싱크 디바이스 사이에 선택적인 고급 컨트롤 기능을 제공한다.
HDMI에 대한 비디오 입력은 구성 가능하고 i.MX 6 시리즈의 두 IPU 모듈 중 하나와 IPU, DI0 또는 DI1의 두 Display Interface(DI) 포트 중 하나에서 올 수 있다. 이 구성은 HDMI_MUX_CTRL 레지스터 필드를 사용하는 IOMUX 모듈을 통해 컨트롤된다. 이 상호 연결에 대한 설명은 아래 그림을 참조한다.
6.4.6.8.2 Software Operation
HDMI 드라이버는 HDMI 싱크 디바이스에 비디오와 오디오를 제공하는 두 가지 기본 목적에 따라 서브 컴포넌트로 나뉜다.
비디오 디스플레이 드라이버 컴포넌트와 오디오 드라이버 컴포넌트에는 HDMI 레지스터, 클럭 그리고 IRQ를 포함하는 일반적인 HDMI 리소스를 관리하기 위한 추가적인 코어 드라이버 컴포넌트를 필요로 한다. 아래 다이어그램은 다양한 HDMI 서브 드라이버 사이의 상호 연결과 HDMI 비디오 드라이버와 Linux Frame Buffer 서브 시스템 사이의 상호 연결을 모두 보여준다.
i.MX 6Dual/6Quad/6QuadPlus/6Solo/6DualLite는 IPU 모듈에 연결되어 구동되는 다양한 유형의 디스플레이 출력 디바이스(예: LVDS, LCD, HDMI 및 MIPI 디스플레이)를 지원한다. MXC Display Driver API는 디스플레이 디바이스를 등록하고 각 IPU DI에 연결하는 방법을 구성하는 시스템을 제공한다. HDMI 드라이버는 IPU에서 올바른 비디오 입력을 받기 위해 이 API를 사용하여 자신을 디스플레이 디바이스로 등록한다.
6.4.6.8.3 CEC
HDMI CEC는 사용자 환경인 다양한 시청각 제품 사이에 높은 수준의 컨트롤 기능을 제공하는 프로토콜이다. HDMI CEC 드라이버는 HDMI CEC 로우 레벨 프로토콜의 소프트웨어 부분을 구현한다. 여기에는 논리 주소 가져오기, CEC 메세지 송수신, 오류 처리, 메세지 재전송 등이 포함된다.
6.4.6.8.4 Source Code Structure
HDMI 소스 코드는 HDMI 코어 드라이버, HDMI 디스플레이 드라이버 그리고 HDMI 오디오 드라이버에서 제공되고 있다.
Table 70. HDMI Source
File | Description |
---|---|
drivers/mfd/mxc-hdmi-core.c | HDMI 코어 드라이버 구현 |
include/linux/mfd/mxc-hdmi-core.h | HDMI 코어 드라이버 헤더 파일 |
drivers/video/fbdev/mxc/mxc_hdmi.c | HDMI 디스플레이 드라이버 구현 |
sound/soc/fsl/fsl_hdmi.c | HDMI Audio SoC DAI 드라이버 구현 |
sound/soc/fsl/imx-hdmi-dma.c | HDMI Audio SoC 플랫폼 DMA 드라이버 구현 |
drivers/mxc/hdmi-cec/hdmi-cec.c | HDMI CEC 드라이버 구현. HDMI CEC 라이브러리 파일은 codeaurraforum에 imx-lib repo에서 제공되고 있다. |
drivers/mxc/hdmi-cec/hdmi-cec.c | HDMI CEC 드라이버 구현. HDMI CEC 라이브러리 파일은 Github nxp-imx 프로젝트의 imx-lib에서 제공되고 있다. |
6.4.6.8.5 Menu Configuration Options
Linux OS 이미지에서 HDMI 드라이버 기능을 선택하고 포함하는 데 사용되는 세 가지 주요 Linux 커널 구성 옵션이 있다.
HDMI 비디오 지원은 Synchronous Panel Framebuffer 지원과 IPUv3 지원의 포함에 따라 달라진다.
CONFIG_FB_MXC_HDMI는 HDMI 비디오 드라이버에 대한 지원을 제공하며, 아래에서 선택될 수 있다.
- Device Drivers > Graphics support > Support for frame buffer devices > MXC HDMI driver support
CONFIG_SND_SOC_IMX_HDMI는 ALSA/SoC 서브 시스템을 통해 HDMI 오디오에 대한 지원을 제공하며, 아래에서 선택될 수 있다.
- Drivers > Sound card support > Advanced Linux Sound Architecture > ALSA for SoC audio support > SoC Audio support for IMX - HDMI
앞의 두 가지 구성 옵션 중 하나를 선택하면 MXC HDMI Core 구성 옵션인, CONFIG_MFD_MXC_HDMI가 선택된다. 이 옵션은 아래에서 선택될 수 있다.
- Device Drivers > Multifunction device drivers > MXC HDMI Core
CONFIG_MXC_HDMI_CEC 옵션은 HDMI CEC 드라이버에 대한 지원을 제공하며, 아래에서 선택될 수 있다.
- Device Drivers > MXC support drivers > MXC HDMI CEC (Consumer Electronic Control) support
6.4.6.9 External HDMI
6.4.6.9.1 Introduction
High Definition Multimedia Interface(HDMI) 드라이버는 단일 케이블을 사용하여 압축되지 않은 비디오, 오디오 및 데이터를 전송할 수 있는 기능을 제공하는 외부 SiI9022 HDMI 하드웨어 모듈을 지원한다.
HDMI 드라이버는 Linux Frame Buffer API와 통합되는 비디오 디스플레이 장치 드라이버와 S/PDIF 오디오 데이터를 SiI9022 HDMI 하드웨어 모듈로 전송하는 S/PDIF 오디오 드라이버의 두 가지 서브 컴포넌트로 나뉜다.
HDMI 드라이버는 데모 애플리케이션 전용이며, 아래 기능을 지원한다:
- HDMI 비디오 출력은 1080p60와 720p60 해상도를 지원한다.
- 비디오용 HDMI 싱크 디바이스에서 EDID 정보 읽기를 지원한다.
- 핫플러그를 감지한다.
- HDMI 오디오 재생 (2채널, 16/24비트, 44.1KHz 샘플 속도)
외부 HDMI는 i.MX 6 7ULP SoC에서 지원된다.
출력 데이터는 3개의 Transition-Minimized Differential Signaling(TMDS) 채널을 통하여 SoC 외부의 HDMI 싱크 디바이스로 전송된다. 또한, HDMI에는 VESA Data Display Channel(DDC)을 전송한다. DDC는 HDMI 소스가 Extended Display Identification Data(EDID)에 대해 HDMI 싱크에 쿼리할 수 있도록 하는 I2C 인터페이스이다. CEC 패널은 소스와 싱크 디바이스 사이에 선택적인 고급 컨트롤 기능을 제공한다.
6.4.6.9.2 Software Operation
HDMI 드라이버는 HDMI 싱크 디바이스에 비디오와 오디오를 제공하는 두 가지 기본 목적에 따라 서브 컴포넌트로 나뉘어 있다.
오디오 출력은 비디오 디스플레이에 따라 다르다.
6.4.6.9.3 Source Code Structure
HDMI 드라이버의 소스 코드는 HDMI 디스플레이 드라이버와 HDMI 오디오 드라이버로 나뉘어 있다.
HDMI 디스플레이 드라이버 소스는 drivers/video/fbdev/mxc에서 사용할 수 있다. HDMI 오디오 드라이버 소스는 sound/soc/fsl에 있다.
Table 71. HDMI Source
File | Description |
---|---|
drivers/video/fbdev/mxc/mxsfb_sii902x.c | HDMI 디스플레이 드라이버 구현 |
sound/soc/fsl/imx-spdif.c | S/PDIF Audio SoC Machine 드라이버 구현 |
sound/soc/fsl/fsl_spdif.c | S/PDIF Audio SoC DAI 드라이버 구현 |
6.4.6.9.4 Menu Configuration Options
Linux OS 이미지에서 HDMI 드라이버 기능을 선택하고 포함하는 데 사용되는 두 가지 기본 Linux 커널 구성 옵션이 있다.
HDMI 지원을 활성화하려면, 다음 구성 옵션이 필요하다.
CONFIG_FB_MXS_SII902X 옵션은 Sii902x HDMI 비디오 드라이버에 대한 지원을 제공하며, 아래에서 선택할 수 있다.
- Device Drivers > Support for frame buffer devices > Si Image SII9022 DVI/HDMI Interface Chip
i.MX 6Sololite의 HDMI 비디오는 MXC ELCDIF Framebuffer에 의존한다.
CONFIG_SND_SOC_IMX_SII902X 옵션은 HDMI 오디오 드라이버에 대한 지원을 제공하며, 아래에서 선택할 수 있다.
- Device Drivers > Sound card support > ALSA for SoC audio support > ommon SoC Audio options for Freescale CPUs: > SoC Audio support for i.MX boards with sii902x