6.4 Display Interfaces
6.4.1 Parallel LCD Interface
6.4.1.1 Introduction
병렬 인터페이스는 LCD 디스플레이를 지원한다. 병렬 디스플레이 인터페이스는 디스플레이 컨트롤러를 통하여 지원되며 i.MX 6와 i.MX 7의 fbdev 프레임워크와 i.MX 8 drm 프레임워크를 사용하여 구현된다.
다음 컨트롤러는 병렬 인터페이스를 지원한다 :
- IPU 블럭이 있는 i.MX의 IPU
- 모든 i.MX8의 DPU
- PxP 블럭이 있는 i.MX의 ELCDIF
병렬 인터페이스를 활성화한 i.MX SoC에서 적어도 하나의 병렬 인터페이스 포트를 지원하고, IPU 블럭이 있는 i.MX에서 2개의 포트를 지원한다. 활성화된 SoC는 포트당 18비트에서 24비트까지 다양한 비트 전송률을 갖는다. IPU 블럭이 있는 i.MX 6에서 병렬 인터페이스는 디스플레이 리프레시를 위한 동기 모드와 메모리에 대한 비동기 모드도 지원하고 RAM-less 디스플레이, 디스플레이 컨트롤러와 TV 인코더에 대한 glue-less 연결로 매우 유연하다.
6.4.2 MIPI DSI Interface
6.4.2.1 Software Operation
MIPI DSI 드라이버에는 MIPI DSI IP 드라이버와 MIPI DSI 디스플레이 패널 드라이버 두 부분으로 되어 있다.
MIPI DSI IP 드라이버는 mipi_dsi_info라는 private structure를 가지고 있다. MIPI DSI IP가 부착된 인스턴스는 "int dev_id" 필드에 설명(describe)되고 IPU 내부의 DI 인스턴스는 "int disp_id" 필드에 설명(describe)된다.
스타트업 동안 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 이벤트가 있을 때, 등록된 알리미는 저전력 모드로(를) enter/leave 하기 위해서 호출될 것이다.
MIPI DSI IP 드라이버는 디스플레이 모듈을 구성하려고 MIPI DSI 디스플레이 패널 드라이버를 위한 3가지 API를 제공한다.
드라이버는 디스플레이 모듈 레지스터를 read/write 하기 위해 MIPI DSI IP 드라이버에서 제공한 API를 사용한다. 일반적으로 디스플레이 패널에 통합된 MIPI DSI 슬레이브 컨트롤러가 있다. 전원 리셋 후, MIPI DSI 디스플레이 패널은 제조 업체의 사양에 따라 표준 MIPI DCS 명령이나 MIPI DSI Generic 명령을 통해 구성될 필요가 있다.
6.4.2.2. Source Code Structure
아래 테이블은 drivers/video/fbdev/mxc에서 사용할 수 있는 MIPI DSI 드라이버 소스 파일을 보여준다.
Table 65. MIPI DSI Driver Files
File | Description |
drveirs/video/fbdev/mxc/mipi_dsi.c | MIPI DSI IP Frame buffer driver source file |
drivers/video/fbdev/mxc/mipi_dsi.h | MIPI DSI IP Frame bufferdriver header file |
drivers/video/fbdev/mxc/mxcfb_hx8369_wvga.c | MIPI DSI Frame bufferDisplay Panel driver source file |
drivers/video/fbdev/mxc/mipi_dsi_samsung.c | MIPI DSI Frame buffer Samsung source file |
drivers/video/fbdev/mxc/mipi_dsi_northwest.c | MIPI DSI Frame buffer Northwest source file |
drivers/video/fbdev/mxc/mxcfb_hx8363_wvga.c | i.MX 7 Frame buffer Truly WVGA Panel TFT3P5581E |
drivers/video/fbdev/mxc/mxcfb_hx8369_wvga.c | i.MX 6 Frame buffer Truly WVGA sync panel |
drivers/video/fbdev/mxc/mxcfb_otm808b_wvga.c | Truly Frame buffer WVGA Panel TFT3P5079E |
drivers/gpu/drm/imx/sec_mipi_dsmi-imx.c | Samsung DRM driver |
drivers/gpu/drm/imx/nwl_dsi-imx.c | Northwest DRM driver |
6.4.2.3 Menu Coonfiguration 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
6.4.3 LVDS Interface
6.4.3.1 Introduction
저전압 차동 신호(LVDS : Low Voltage Differential Signalling)는 낮은 전력 소비로 높은 대역폭, 고화질 그래픽, 빠른 프레임 속도를 지원한다. 구현은 페어(pair)안의 각 와이어가 다른 페어(pair) 와이어의 역 신호를 전달하는 와이어 페어(pair)를 이용한다. 이렇게 구현을 하면 신호 간섭과 노이즈가 줄어든다. LVDS 인터페이스는 4개, 6개 또는 추가로 클럭(clock)과 접지(ground) 와이어를 전달하는 8개의 와이어 페어를 사용한다.
LVDS 인터페이스의 용도는 LVDS 인터페이스를 통하여 디스플레이 컨트롤러에서 외부 디스플레이 디바이스로 동기화된 RGB 데이터 흐름을 지원하는 것이다.
이 지원은 다음 활동의 모든 방면을 다룬다 :
- 관련 디바이스에 대한 연결 - LVDS 수신기로 디스플레이
- 외부 디스플레이 수신기와 LVDS 디스플레이 표준에서 요구하는 데이터 배열(arrangement)
- 동기화와 컨트롤 기능
LVDS 인터페이스는 아래 나열된 여러 컨트롤러를 지원한다.
- LDB - IPU가 있는 i.MX 6에서 두 배
- i.MX 8QuadMax 믹셀(mixel)
- i.MX 8QuadXPlus 믹셀(mixel) 콤보
LVDS 드라이버는 i.MX 6와 i.MX 7용 프레임 버퍼와 i.MX 8용 drm이 지원되는 디스플레이 프레임워크와 함께 작동한다.
LVDS 인터페이스는 다음과 같은 구조가 있다.
- 채널 - 일반적으로 2채널
- 각 채널은 여러 데이터 페어(pair)를 지원
- 각 데이터 페어(pair)에서 다를 수 있는 데이터 픽셀 속도
- HSYNC, VSYNC, DE용 제어 신호
LVDS 인터페이스는 다음 디스플레이를 지원한다.
- IT6263 LVDS - HDMI bridge - LDB 드라이버로 구현
- LVDS 듀얼 채널 패널
LVDS 관련된 표준은 다음과 같다.
- PHY 표준 : ANSI EIA-644A
- 디스플레이 프로토콜 표준 :
- 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. 단지 Unbalanced operating 모드만 지원됨 (대부분의 LCD 공급 업체와 일치)
LVDS 인터페이스는 i.MX 6와 i.MX 7의 프레임 버퍼 프레임워크와 i.MX 8의 drm 프레임워크를 통해 지원된다.
6.4.3.2 Software Operation
드라이버가 내장되어 있고 디바이스 트리 상태가 "okay"로 설정되어 있으면 LVDS 드라이버는 작동한다.
LVDS 디바이스 드라이버가 정상적으로 검색이 되면, 드라이버는 LVDS에 대한 클럭(clock)을 구성한다. LVDS 드라이버 probe 함수는 기본 모드를 1080p60으로 설정한다. LVDS 채널 매핑 모드와 비트 매핑 모드는 30비트 JEIDA 모드를 사용하도록 설정한다.
드라이버는 LVDS 채널을 활성화하기 위해 다음 단계를 수행한다 :
- LVDS 전원을 활성화한다.
- ldb_di_clk의 parent clk와 parent clk의 속도를 설정한다.
- ldb_di_clk의 속도를 설정한다.
- ldb_di_clk와 ldb_di_clk의 parent clk를 모두 활성화한다.
- 디스플레이 신호의 극성, 채널 매핑 모드, 그리고 비트 매핑 모드를 포함한 적절한 모드로 LVDS를 설정한다.
- 관련 i.MX LVDS 채널을 활성화한다.
6.4.3.3 Source Code Structure
Table 66. LVDS Source
File | Description |
drivers/video/fbdev/mxc/imx_lvds.c | LVDS driver |
drivers/gpu/drm/imx-ldb.c | LDB driver with Mixel information |
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
이 섹션에서는 LDB 모듈을 LVDS 인터페이스가 있는 외부 디스플레이 디바이스와 연결하기 위해 제어하는 LVDS Display Bridge(LDB) 드라이버에 대해 설명한다. LDB의 용도는 LVDS 인터페이스를 통해 IPU나 LCDIF에서 외부 디스플레이 디바이스로 동기화된 RGB 데이터의 흐름을 지원하는 것이다.
이 지원에는 다음이 포함된다 :
- 관련 디바이스 연결 - LVDS 수신기로 디스플레이
- 외부 디스플레이 수신기와 LVDS 디스플레이 표준이 요구하는 데이터 정렬
- 동기화와 제어 기능
6.4.4.2 Software Operation
드라이버가 내장되어 있으면 LDB 드라이버가 작동한다.
LDB 디바이스가 정상적으로 검색(probe)이 되면, 드라이버는 플랫폼의 데이터 정보를 사용하여 LDB 기준 저항 모드(reference resistor mode)와 레귤레이터(regulator)를 구성한다. LDB 드라이버 검색(probe) 기능은 LVDS 인터페이스를 외부 디스플레이 디바이스의 비디오 모드와 일치하려고 시도한다. LDB의 디스플레이 신호 극성 컨트롤 비트(display signal polarities control bits)는 일치하는 비디오 모드에 따라 설정된다. LDB의 LVDS 채널 매핑 모드와 비트 매핑 모드는 사용자가 설정한 LDB 디바이스 트리 노드에 따라 설정된다. 드라이버가 기본 디스플레이 디바이스로 LVDS 인터페이스가 있는 디스플레이 디바이스를 확인하면 LDB가 검색(probe) 함수에서 활성화된다.
드라이버가 LVDS 채널을 활성화하기 위해 취하는 단계는 다음과 같다 :
- ldb_di_clk의 parent clk와 parent clk의 속도를 설정한다.
- ldb_di_clk의 속도를 설정한다.
- ldb_di_clk와 ldb_di_clk의 parent clk 모두를 활성화한다.
- 디스플레이 신호의 극성, LVDS 채널 매핑 모드, 비트 매핑 모드와 기준 저항 모드를 포함하는 적절한 모드에서 LDB를 설정한다.
- 관련된 LVDS 채널을 활성화한다.
6.4.4.3 Source Code Structure
Table 67. LDB Source
File | Description |
drivers/video/fbdev/mxc/ldb.c | LDB Framebuffer driver |
6.4.4.4 Menu Configuration Options
이 모듈에 대해 다음 Linux Kernel 구성 옵션이 제공된다.
메뉴 구성에서 다음 모듈을 활성화한다 :
Device Drivers -> Graphics support -> MXC Framebuffer support -> Synchronous Panel Framebuffer -> MXC LDB
6.4.5 Electrophoretic Display Controller (EPDC) Interface
6.4.5.1 Introduction
EPDC(Eletrophoretic Display Controller)는 다양한 TFT 백플레인을 지원하는 E Ink EPD 패널을 구동하도록 설계된 direct-drive active matrix EPD 컨트롤러이다. EPDC 프레임 버퍼 드라이버는 표준 Linux 프레임 버퍼 디바이스로 작동한다. 이 드라이버는 EPD 관련 기능에 대한 액세스를 제공하려고 사용자 공간(IOCTL을 통해)이나 다른 커널 모듈(직접 함수 호출)에서 액세스할 수 있는 사용자 정의 API 확장 세트를 제공한다. EPDC 드라이버는 다양한 E Ink 패널 유형과 사양으로 작업할 수 있는 유연성을 제공하려고 특정 E Ink® 패널 유형으로 추상화되어 있다.
EPDC 드라이버는 다음 기능을 제공한다 :
- EPDC 드라이버는 로드 가능하거나 내장된 모듈.
- RGB565, RGB24, RGB32와 Y8 프레임 버퍼 형식.
- 전체 및 부분 EPD 화면 업데이트.
- 최대 256개의 패널별 파형(waveform) 모드.
- 주어진 업데이트에서 자동으로 최적의 파형(Automatic optimal waveform) 선택.
- 특정 업데이트 요청이 완료될 때까지 대기하여 동기화.
- 대체(overlay) 버퍼로 화면 업데이트.
- 자동 충돌 처리.
- 64개의 동시 업데이트 영역.
- Y8 프레임 버퍼 형식에서 픽셀 반전.
- 90, 180, 270도 HW 가속 프레임 버퍼 회전.
- Panning(y 방향만 해당)
- Linux fb_deferred_io 메커니즘을 통해 자동화된 전체와 부분 화면 업데이트.
- 세 가지 EPDC 드라이버 디스플레이 업데이트 구성 : Sanpshot, Queue, Queue and Merge.
- 일회성으로 지정된 API 호출이나 업데이트별을 기반으로 주변 온도를 설정.
- 모든 업데이트 완료와 EPDC 전원 끄기 사이에서 지연에 대한 사용자 제어.
6.4.5.2 EPDC Frame Buffer Driver Overview
프레임 버퍼 디바이스는 그래픽 하드웨어에 대한 추상화를 제공한다. 이는 프레임 버퍼 비디오 하드웨어를 나타내며 저수준 하드웨어 레지스터를 관리하는 방법을 소프트웨어로 추상화하여 잘 정의된 인터페이스를 사용하여 응용 소프트웨어가 그래픽 하드웨어에 액세스할 수 있도록 한다. EPDC 드라이버는 프레임 버퍼의 내용이 E Ink 디스플레이로 업데이트되지 않는다는 한 가지 주요 경고와 함께 이 모델을 지원한다. 대신 사용자 정의 API 함수를 호출하여 E Ink 디스플레이에 대한 업데이트 트리거를 요청해야 한다. 이 프로세스에 대한 자세한 내용은 6.4.5.3 EPDC Frame Buffer Driver Extensions에 설명되어 있다.
프레임 버퍼 드라이버는 커널 구성(kernel configuration)에서 graphics parameters의 frame buffer optioon을 선택하여 활성화된다. 프레임 버퍼 드라이버를 보완하기 위해 커널 빌더(kernel builder)는 폰트와 시작 로고에 대한 지원을 포함할 수 있다. 프레임 버퍼 디바이스는 시리얼(serial)에서 그래픽 모드로 전환을 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 kernel 문서를 참조한다.
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에 대한 액세스를 제공한다. 관련 데이터 structures, definitions와 함께 IOCTL 확장은 include/linux/mxcfb_epdc.h에서 찾을 수 있다. 이러한 IOCTL에 대한 전체 설명은 Programming Interface section Software Operation에서 찾을 수 있다.
사용자 정의 API 확장에 대한 커널 모드 액세스의 경우, 기본 기능에 대한 직접 액세스를 위해 IOCTL 인터페이스를 우회해야 한다.
6.4.5.4 EPDC Panel Configuration
EPDC 드라이버는 다양한 패널 해상도, 타이밍 파라미터, waveform 모드로 E Ink 패널을 유연하게 지원하도록 설계되어 있다. EPDC 드라이버는 include/linux/mxcfb_epdc.h에 있는 EPDC 패널 모드 structure인 imx_epdc_fb_mode를 사용하여 panel-agnostic(패널에 구애받지 않고)으로 유지된다.
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 programming model section을 참조한다.
EPDC 패널 모드 데이터 외에도, function이 EPDC 드라이버에 전달되어 EPDC 드라이버가 활성화 또는 비활성화될 때 EPDC 핀을 처리하는 방법을 정의할 수 있다. 이러한 function은 절전을 위해 EPDC 핀을 비활성화해야 한다.
6.4.5.5 Boot Command Line Parameters
EPDC 드라이버에 대한 추가 구성은 boot command line parameters를 통해 제공된다. command line 옵션 형식은 다음과 같다 :
epdc video=mxcepdcfb:[panel_name],bpp=16
EPDC 드라이버는 이러한 옵션을 분석하고 imx_epdc_fb_mode 패널 모드 구조체에 지정된 비디오 모드 이름과 panel_name을 일치시키려고 시도한다. 일치하는 항목이 없으면 플랫폼 데이터에 제공된 첫 번째 패널 모드가 EPDC 드라이버에서 사용된다. 이 command line의 bpp 설정은 프레임 버퍼에 대한 초기 픽셀당 비트 수를 설정한다. 32나 24 설정은 RGB888 픽셀 형식을 선택하고, 16 중 하나는 RGB565 픽셀 형식을 선택하고, 8 설정은 그레이스케일(Y8) 형식을 선택한다.
6.4.5.6 EPDC Waveform Loading
EPDC 드라이버는 올바른 작동을 위해 waveform 파일이 필요하다. 이 waveform 파일에는 E Ink 패널에 대한 업데이트를 구동하는 waveform을 생성하는 데 필요한 waveform 정보가 포함되어 있다. waveform 파일 데이터에 대한 포인터는 첫 번째 업데이트가 수행되기 전에 EPDC에 프로그래밍된다.
waveform 파일을 선택하기 위한 두 가지 옵션이 있다 :
- 이 BSP 릴리즈에 포함된 기본 waveform 파일 중 하나를 선택한다.
- 사용 중인 E Ink 패널과 관련된 새 waveform 파일을 사용한다.
waveform 파일은 Linux firmware API를 사용하여 EPDC 드라이버에 의해 로드된다.
6.4.5.7 Using a Default Waveform File
E Ink 패널과 EPDC 드라이버를 사용하여 시작하는 가장 빠르고 쉬운 방법은 Linux BSP에서 제공하는 기본 waveform 파일 중 하나를 사용하는 것이다. 이렇게 하면 패널별 waveform 파일이 없이 여러 유형의 E Ink 패널을 업데이트할 수 있다. 단점은 최적의 품질을 기대해서는 안 되다는 것이다. 일반적으로 E Ink 패널에 대해 패널에 맞는 waveform 파일을 사용하지 않으면 고스트 현상이 더 많이 발생하고 전반적으로 색상 품질이 떨어진다.
/lib/firmware/imx/epdc에 BSP에 포함된 다음의 기본 waveform 파일이 있다 :
- epdc_E60_V110.fw - 6.0 인치 V110 E Ink 패널에 대한 기본 waveform.
- epdc_E60_V220.fw - 6.0 인치 V220 E Ink 패널(애니메이션 모드 업데이트 지원)에 대한 기본 waveform.
- epdc_E97_V110.fw - 9.7 인치 V110 E Ink 패널에 대한 기본 waveform.
- epdc_E060SCM.fw - 6.0 인치 Pearl E Ink 패널(애니메이션 모드 업데이트 지원)에 대한 기본 waveform.
- epdc_ED060XH2C1.fw - 6.0 인치 E ink 패널(기본적으로 Reagl/-D 지원 없음. Reagl/-D 지원에 대해 NXP support에 문의)에 대한 기본 waveform.
EPDC 드라이버는 rootfs의 /lib/firmware/imx/epdc 아래 이름이 "epdc_[panel_name].fw"와 같은 waveform 파일을 로드하려고 시도한다. 여기서 panel_name은 fb_videomode 이름의 필드에 지정된 문자열을 나타낸다. 이 panel_name 정보는 이전 장에서 설명한 커널 command line 파라미터를 통해 EPDC 드라이버에 제공되어야 한다. 예를 들어, Pearl 패널에 대한 기본 firmware 파일 epdc_E060SCM.fw를 로드하려면 EPDC 커널 command line를 다음으로 설정한다 :
video=mxcepdcfb:E060SCM,bpp=16
6.4.5.8 Using a Custom Waveform File
최적의 E Ink 디스플레이 품질을 보장하려면, 사용 중인 E Ink 패널 고유의 waveform 파일을 사용한다. 로우(raw) waveform 파일 형식(.wbf)은 EPDC에서 이해하고 읽을 수 있는 형식으로 변환해야 한다. 이 변환 스크립트는 BSP 일부로 포함되어 있지 않다. 따라서 이 변환 스크립트를 얻으려면 NXP에 문의한다.
waveform 변환 스크립트가 로우(raw) waveform 파일을 실행하면, EPDC 드라이버가 파일을 찾아 로드할 수 있도록 변환된 waveform 파일의 이름을 변경해야 한다. 드라이버는 rootfs의 /lib/firmware/imx/epdc 디렉토리에서 이름이 "epdc_[panel_name].fw"인 waveform 파일을 검색한다. 여기서 panel_name은 fb_videomode 이름 필드에 지정된 문자열을 나타낸다. 예를 들어, 패널 이름이 "E60_ABCD"인 경우 변환된 waveform 파일 이름은 epdc_E60_ABCD.fw여야 한다.
주의
EPDC 드라이버가 기본 waveform 파일(이전 장 참조) 중 하나의 이름과 일치하는 펌웨어 waveform 파일을 검색하면, 검색 경로에 추가된 펌웨어 파일보다 BSP에 구축된 기본 펌웨어 파일을 선택한다. 따라서 기본 펌웨어 파일을 사용하도록 BSP를 그대로 두는 경우, 기본 펌웨어 파일과 연결된 패널 이름이 아닌 다른 패널 이름을 사용해야 한다. 이러한 기본 waveform 파일이 펌웨어 검색 경로에 있는 새로운 waveform 파일 보다 우선적으로 선택되고 취하게 되기 때문이다.
6.4.5.9 EPDC Panel Initialization
프레임 버퍼 드라이버는 프레임 버퍼 드라이버 모듈이 로드될 때 하드웨어 초기화 단계를 일반적으로(예외는 아래 주의 참조) 거치지 않는다. 대신 후속 사용자 모드 호출이 특정 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 드라이버가 프레임 버퍼 디바이스를 등록할 때, FB Console 드라이버는 이후에 FBIOPUT_VSCREENINFO ioctl 호출을 수행한다. 이것은 차례로 EPDC 패널을 초기화한다.
6.4.5.10 Grayscale Framebuffer Selection
EPDC 프레임 버퍼 드라이버는 프레임 버퍼에 대해 8비트 그레이스케일(Y8)과 8비트 반전된 그레이스케일(Y8 반전) 픽셀 형식의 사용을 지원한다(더 일반적인 RGB565 픽셀 형식 추가). 8비트 그레이스케일로 프레임 버퍼 형식을 구성하기 위해 애플리케이션은 FBIOPUT_VSCREENINFO 프레임 버퍼 ioctl을 호출한다. 이 ioctl은 fb_var_screeninfo 포인터를 파라미터로 사용한다. 이 파라미터는 프레임 버퍼의 속성을 지정하고 애플리케이션이 프레임 버퍼 형식에 대한 변경을 요청할 수 있도록 한다. fb_var_screeninfo 파라미터에는 8비트 그레이스케일 형식으로의 변경을 요청하기 위해 설정해야 하는 두개의 핵심 멤버인 bits_per_pixel와 grayscale가 있다. bits_per_pixel은 8로 설정되어야 하고 grayscale은 두 가지 유효한 grayscale 형식 값인 GRAYSCALE_8BIT나 GRAYSCALE_8BIT_INVERTED 중 하나로 설정되어야 한다.
다음의 코드 부분은 Y8 픽셀 형식을 사용하도록 프레임 버퍼를 변경하라는 요청을 보여준다 :
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 프레임 버퍼는 사용자 영역과 커널 영역에서 액세스할 수 있다. 함수의 단일 세트는 EPDC 프레임 버퍼 드라이버 확장을 설명한다. 이러한 기능에 액세스하는 두 가지 모드에는 IOCTL 인터페이스를 사용하는 사용자 영역과 함수를 직접 사용하는 커널 영역이 있다. 각 IOCTL와 함수 조합은 다음에 설명한다.
MXCFB_SET_WAVEFORM_MODES / mxc_epdc_fb_set_waveform_modes()
설명 :
일반적인 waveform 모드에 대한 매핑을 정의한다.
파라미터 :
mxcfb_waveform_modes *modes
일반적인 waveform 모드에 대한 waveform 모드 값을 포함하는 구조체에 대한 포인터이다. 이러한 값은 정확한 함수로 자동 waveform 모드를 선택하기 위해 구성되어야 한다.
MXCFB_SET_TEMPERATURE / mxc_epdc_fb_set_temperature
설명 :
이어지는 패널 업데이트에서 EPDC 드라이버가 사용할 온도를 설정한다.
파라미터 :
int32_t temperature
섭씨 온도 값이다. 이 온도 설정은 MXCFB_SEND_UPDATE ioctl을 사용할 때 temperature 값 파라미터를 TEMP_USE_AMBIENT 이외의 값으로 설정하여 무시될 수 있다.
MXCFB_SET_AUTO_UPDATE_MODE / mxc_epdc_fb_set_auto_update
설명 :
자동 및 지역 업게이트 모드 중에서 선택한다.
파라미터 :
__u32 mode
지역 업데이트 모드에서 업데이트는 MXCFB_SEND_UPDATE IOCTL을 통해 제공되어야 한다.
자동 모드에서 업데이트는 드라이버가 프레임 버퍼 메모리 영역에서 수정된 페이지를 감지하여 자동으로 생성한다.
MXCFB_SET_UPDATE_SCHEME / mxc_epdc_fb_set_upd_scheme
설명 :
드라이버에서 업데이트 흐름을 지시하는 스킴을 선택한다.
파라미터 :
__u32 scheme
다음의 업데이트 스킴을 선택할 수 있다 :
UPDATE_SCHEME_SNAPSHOT - Snapshot 업데이트 스킴에서는 프레임 버퍼의 내용은 즉시 처리되어 드라이버 내부 메모리 버퍼에 저장된다. MXCFB_SEND_UPDATE 호출이 완료될 때까지, 프레임 버퍼 영역은 사용 가능하며 마지막 업데이트의 무결성에 영향을 주지 않고 수정할 수 있다. 업데이트 프레임의 제공이 다른 보류중인 업데이트로 인해 지연되는 경우, 원래 버퍼 내용은 업데이트가 최종적으로 EPDC 하드웨어에 제공될 때 표시된다. 업데이트로 충돌이 발생하면, 충돌이 해결되면 원래 버퍼 내용이 다시 제공된다.
UPDATE_SCHEME_QUEUE - Queue 업데이트 스킴은 작업 queue를 사용하여 모든 업데이트의 처리와 제공을 비동기로 처리한다. MXCFB_SEND_UPDATE를 통해 업데이트가 제공되면, 업데이트는 queue에 추가되고 EPDC 하드웨어 리소스를 사용할 수 있게 되는 순서대로 처리된다. 결과적으로 처리나 업데이트된 프레임 버퍼 내용은 업데이트가 드라이버로 전달될 때 프레임 버퍼에 있던 내용을 반영하지 않을 수 있다.
UPDATE_SCHEME_QUEUE_AND_MERGE - Queue 및 Merge 스킴은 Queue 스킴의 queue 개념을 사용하지만 merge 단계를 추가한다. 즉, 업데이트가 작업 queue에서 처리되기 전에 먼저 보류 중인 다른 업데이트와 비교한다. 업데이트가 현재 업데이트의 모드, 플래그와 일치하고 현재 업데이트의 업데이트 영역과 겹치는 경우, 해당 업데이트는 현재 업데이트와 merge 된다. 보류 중인 모든 업데이트를 merge하려고 시도한 후 최종으로 merge된 업데이트가 처리되고 제공된다.
MXCFB_SEND_UPDATE / mxc_epdc_fb_send_update
설명 :
디스플레이에서 업데이트될 프레임 버퍼의 영역을 요청한다.
파라미터 :
mxcfb_update_data *upd_data
현재 업데이트에 대한 프레임 버퍼의 영역, waveform 모드, 충돌 모드를 정의하는 구조체의 포인터이다. 이 구조체는 다음 업데이트 옵션 중 하나를 선택할 수 있는 플래그 필드가 포함되어 있다 :
EPDC_FLAG_ENABLE_INVERSION - 업데이트 영역에서 모든 픽셀의 반전을 활성화한다.
EPDC_FLAG_FORCE_MONOCHROME - 업데이트 영역에서 모든 픽셀의 전체 black/white posterization(포스터화)을 활성화한다.
EPDC_FLAG_USE_ALT_BUFFER - 대체(비 프레임 버퍼) 메모리 버퍼에서 업데이트하도록 활성화한다.
활성화되면, 최종 upd_data 파라미터에는 대체 메모리 버퍼에 대한 자세한 구성 정보가 포함된다.
MXCFB_WAIT_FOR_UPDATE_COMPLETE / mxc_epdc_fb_wait_update_complete
설명 :
이전 업데이트 요청이 완료될 때까지 블록하고 대기한다.
파라미터 :
mxfb_update_marker_data marker_data
특정 업데이트를 식별하는 데 사용되는 update_marker 값(MXCFB_SEND_UPDATE IOCTL 호출로 전달되는 파라미터)은 업데이트가 완료될 때까지 대기하기 위해 여기에서 다시 사용해야 한다. 업데이트가 충돌 테스트 업데이트인 경우, collision_test 변수는 충돌이 발생했는지 여부를 나타내는 결과를 반환한다.
MXCFB_SET_PWRDOWN_DELAY / mxc_epdc_fb_set_pwrdown_delay
설명 :
드라이버에서 모든 업데이트 완료와 드라이버가 EPDC와 E Ink 디스플레이 전원 공급 장치에 전원을 꺼야 하는 시간 사이의 지연을 설정한다.
파라미터 :
int32_t delay
입력되는 delay 값은 밀리초 단위이다. EPDC 전원 차단을 완전히 비활성화하려면, FB_POWERDOWN_DISABLE(아래에 정의됨)을 사용한다.
MXCFB_GET_PWRDOWN_DELAY / mxc_epdc_fb_get_pwrdown_delay
설명 :
드라이버의 현재 전원 차단 delay 값을 반환한다.
파라미터 :
int32_t delay
출력되는 delay 값은 밀리초 단위이다.
6.4.5.12 Structure 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 68. EPDC Siurce
File | Description |
drivers/video/fbdev/mxc/mxc_epdc_v2_fb.c | i.MX 7Dual용 EPDC Gen-II V2 프레임 버퍼 드라이버 |
drivers/video/fbdev/mxc/epdc_v2_regs.h | EPDC Gen-II 레지스터 정의 |
drivers/video/fbdev/mxc/mxc_epdc_fb.c | i.MX 6Sololite, 6SLL, 6DualLite용 EPDC Gen-I 프레임 버퍼 드라이버 |
drivers/video/fbdev/mxc/epdc_regs.h | EPDC Gen-I 레지스터 정의 |
include/linux/uapi/mxcfb.h | EPDC IOCTL용 헤더 파일과 프레임 버퍼 드라이버 |
include/linux/mxcfb_epdc.h | 확장 EPDC API를 직접 커널에서 접근하기 위한 헤더 파일 |
6.4.5.14 Menu Configuration Options
EPDC 모듈에 대해 다음 Linux kernel 구성 옵션이 제공된다 :
- CONFIG_FB_MXC_EINK_PANEL - Electrophoretic Display Controller 지원. menuconfig에서 Device Drivers > Graphics Support > E-Ink Panel Framebuffer 선택.
- CONFIG_FB_MXC_EINK_V2_PANEL - Electrophoretic Display Controller v2 지원. menuconfig에서 이 옵션은 EPDC V2 기반의 Device Drivers > Graphics support > E-Ink Panel Framebuffer에서 사용할 수 있음.
- CONFIG_FB - 프레임 버퍼 지원을 포함하며 기본으로 활성화됨. menuconfig에서 Device Drivers > Graphics support > Support for frame buffer devices 선택.
- CONFIG_MXC_PXP_V2 - PxP와 EPDC 드라이버에 대한 요청(색상 공간 변환, 회전, 자동 waveform 선택등 프레임 버퍼 업데이트 영역을 처리하는)을 지원. menuconfig에서 Device Drivers > DMA Engine support > MXC PxP support 선택.
- CONFIG_MXC_PXP_V3 - 다음 레벨의 PxP와 프레임 버퍼 업데이트 영역을 처리하는 EPDC Gen-II 드라이버에 대한 요청을 지원. 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
고화질 멀티미디어 인터페이스(HDMI : High-Definition Multimedia Interface)와 Display Port(DP)는 고화질 비디오를 표시한다. HDMI 모듈은 on chip 솔루션이나 외부 솔루션이 있는 일부 i.MX 칩에서 지원된다. Display Port(DP)는 HDMI 전송(TX) 컨트롤러와 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와 Display Port를 지원하는 SoC와 지원되는 버전이 나와있다.
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 오디오 데이터 소스는 S/PDIF TX에서 제공된다.
6.4.6.2 Software Operation
HDMI sink 디바이스에 비디오와 오디오를 제공하는 두 가지 주요 목적에 따라 HDMI 드라이버는 하위 컴포넌트로 분리한다.
비디오 디스플레이 드라이버 컴포넌트와 오디오 컴포넌트는 HDMI 레지스터, 클록, IRQ를 포함하는 공통된 HDMI 리소스를 관리하기 위한 추가적인 core 드라이버 컴포넌트가 필요하다.
6.4.6.3 Core
온칩 HDMI i.MX 솔루션은 HDMI 오디오와 비디오 드라이버 사이에 공유해야 하는 리소스를 관리하는 core 드라이버를 지원한다. HDMI 오디오와 비디오 드라이버는 HDMI core 드라이버에 따라 달라지며, HDMI core 드라이버는 오디오와 비디오보다 먼저 로드되고 초기화되어야 한다. core 드라이버는 다음 기능을 제공한다 :
- HDMI 레지스터 영역을 매핑하고 HDMI 레지스터를 읽고 쓰기 위한 API를 제공한다.
- 주요 HDMI 레지스터의 일회성 초기화를 수행한다.
- HDMI IRQ를 초기화하고 IRQ를 활성화/비활성화하기 위한 공유 API를 제공한다.
- 오디오와 비디오 드라이버 사이에 정보를 공유하기 위한 방법을 제공한다. (예: HDMI 픽셀 클록)
- blank/unblank, plug in/plug out 이벤트가 발생하는 동한 HDMI 비디오와 오디오 사이의 동기화 방법을 제공한다. HDMI 케이블이 연결 해제된 상태이거나 HDMI가 blank 상태에서는 HDMI 오디오가 작동하지 않는다. HDMI 오디오가 재생을 시작할 때마다 HDMI 오디오 드라이버는 PCM을 core 드라이버에 등록하고 재생이 끝나면 PCM을 등록해제해야 한다. HDMI 비디오에서 blank나 케이블 연결 해제 이벤트가 발생하면, core 드라이버는 PCM이 등록된 경우 HDMI 오디오 DMA 컨트롤러를 일시 중지한다. HDMI가 unblank이거나 케이블이 연결 이벤트가 발생하면 core 드라이버는 먼저 케이블이 연결 상태인지, 비디오 상태가 unblank인지, PCM이 등록되어 있는지 확인한다. 위에 나열된 항목이 모두 yes인 경우 core 드라이버는 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 모듈을 등록하고 디스플레이 디바이스 init callback으로 mxc_hdmi_disp_init() 함수를 설정한다.
- i.MX Frame Buffer 드라이버가 초기화되면 mxc_dispdrv_init()가 호출된다. 그 결과 등록된 모든 디스플레이 디바이스에 대해 init call이 발생한다.
- mxc_hdmi_disp_init() callback이 실행된다. HDMI 드라이버는 프레임 버퍼 정보(fbi)가 포함된 i.MX Frame Buffer 드라이버에서 구조체를 수신한다. HDMI 드라이버는 FB 드라이버 이벤트에 대한 알림을 수신하기 위해 자기 자신을 등록한다. 마지막으로 HDMI 드라이버는 hotplug 인터럽트를 수신하도록 HDMI를 구성하여 초기화를 완료한다.
주의
모든 디스플레이 디바이스를 MXC Display Driver 디바이스로 등록하려면, 모든 디스플레이 디바이스 드라이버를 i.MX Frame Buffer 드라이버보다 먼저 초기화해야 한다.
6.4.6.5 Hotplug Handling and Video Mode Changes
i.MX Frame Buffer 드라이버와 HDMI 사이의 연결이 MXC 디스플레이 드라이버 인터페이스를 통해 설정되면, HDMI 비디오 드라이버는 유효한 HDMI 싱크 디바이스가 연결되어 HDMI 비디오 데이터를 수신할 준비가 되었음을 나타내는 hotplug 인터럽트를 기다린다. HDMI와 i.MX Frame Buffer 드라이버 사이의 후속 통신은 Linux Frame Buffer API를 통해 수행된다. 다음 목록은 HDMI 싱크 디바이스를 인식하고 비디오 출력을 구동하도록 ELCDIF FB 드라이버를 구성하는 소프트웨어 흐름을 보여준다 :
- HDMI 비디오 드라이버는 hotplug 인터럽트를 수신하고 HDMI 싱크 디바이스에서 EDID를 읽는다(검색된 EDID 정보에서 비디오 모드 목록을 구성). Linux kernel 커맨드 라인(초기 연결용)의 비디오 모드 스트링이나 최신 비디오 모드(이후 HDMI 케이블 연결용)를 사용하여 HDMI 드라이버는 모드 목록에서 가장 근접한(closet match) 비디오 모드를 선택한다.
- HDMI 비디오 드라이버는 i.MX Frame Buffer 드라이버에서 fb_set_var()를 호출하여 비디오 모드를 변경한다. i.MX Frame Buffer 드라이버는 새 모드에 대해 재구성을 완료한다.
- fb_set_var() 호출의 결과, FB_EVENT_MODE_CHANGE가 발생했음을 나타내는 Frame Buffer 알림이 HDMI 드라이버로 다시 전송된다. HDMI 드라이버는 새 비디오 모드에 대한 HDMI 하드웨어를 구성한다.
- 마지막으로 HDMI 모듈은 HDMI 싱크 디바이스로 출력을 생성할 수 있다.
i.MX Frame Buffer 드라이버는 각 SoC의 HDMI 장에서 언급한 대로 각 SoC의 디스플레이 인터페이스 사양에 맞게 정렬된다.
6.4.6.6 Audio
HDMI Tx 오디오 드라이버로 ALSA SoC 프레임워크를 사용한 이후, 각 HDMI 장의 소스 코드 구조 섹션에 나열된 것처럼 여러 파일로 나뉘어 있다. 대부분의 코드는 platform DMA 드라이버(sound/soc/imx/imx-hdmi-dma.c)와 CODEC 드라이버(sound/soc/codecs/mxc_hdmi.c)에 있다. machine 드라이버(sound/soc/imx/imx-hdmi.c)는 SoC 오디오 디바이스를 할당하고 모든 SoC 컴포넌트를 함께 연결한다. DAI 드라이버(sound/soc/imx/imx-hdmi-dai.c)는 SoC 요구 사항이다. 주로 platform 데이터를 가져오는 데 사용된다.
HDMI CODEC 드라이버는 HDMI 오디오 샘플러 초기화의 대부분을 수행한다. HDMI Tx 블록은 AHB DMA 오디오만 구현하고 다른 오디오 인터페이스(SSI, S/PDIF 등)는 구현하지 않느다. HDMI CODEC 드라이버의 다른 주요 기능은 오디오 스트림에 들어가는 IEC 헤더 정보의 구조를 설정하는 것이다. ALSA 레이어에 연결된 구조이므로 "iecset" 유틸리티를 사용하여 사용자 영역에서 IEC 설정에 접근할 수 있다.
platform DMA 드라이버는 HDMI Tx 블록 DMA 엔진을 처리한다. HDMI 오디오는 HDMI 블록 DMA와 SDMA를 사용한다. SDMA는 다중 버퍼 메커니즘을 구현하는 데 사용된다. HDMI Tx 블록은 오디오 스트림에 IEC 오디오 헤더 정보를 자동으로 병합하지 않기 때문에, platform DMA 드라이버는 버퍼를 출력하기 전에 hdmi_dma_copy()(메모리 맵을 사용 안하는 경우)나 hdmi_dma_mmap_copy()(메모리 맵 모드를 사용하는 경우) 함수를 사용하여 병합을 수행한다. IEC 오디오 헤더 추가 작업으로, 사용자 영역 애플리케이션은 데이터를 HDMI 오디오 드라이버에 제시간에 공급하기에 충분한 CPU 동작 시간을 얻지 못할 수 있다(특히 시스템 로딩(부하)이 높을 경우). 이 경우 약간의 spark noise가 들린다. 다른 오디오 프레임워크(ALSA LIB, PULSE AUDIO)에서는 이 noise에 대해 다른 로그가 출력될 수 있다. 예를 들어 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 오디오는 다음 기능을 지원한다 :
- Playback sample rate
- 32k, 44.1k, 48k, 88.2k, 96k, 176.4k, 192k
- HDMI 싱크 기능 - Playback Channels :
- 2, 4, 6, 8
- HDMI 싱크 기능 - Playback audio formats :
- SNDRV_PCM_FMTBIT_S16_LE
6.4.6.7 i.MX 8 Display Port
6.4.6.7.1 Software Operation
HDMI 드라이버는 HDP DRM 드라이버와 Core API 드라이버 제공이라는 두 가지 주요 목적에 따라 하위 컴포넌트로 나뉜다.
HDP DRM 드라이버는 구성된 HDMI FW에 대한 Core API 드라이버 컴포넌트가 필요하다.
6.4.6.7.2 Source Code Structure
HDMI 드라이버는 HDP core API 드라이버, HDP 디스플레이 드라이버, HDMI 오디오 드라이버등 세 가지 소프트웨어 컴포넌트가 있다.
Core API 소스 코드는 drivers/mxc/hdp 디렉토리에 있다.
Table 70. HDP Core API Driver File List
Files | Description |
|
HDMI Display Port Driver |
|
HDMI Display Port Audio Driver |
|
HDMI DRM Driver |
|
HDMI Display port CEC authentiation |
|
HDMI Sound Driver |
6.4.6.7.3 Menu Configuration Options
Linux OS 이미지에서 HDMI 드라이버 기능을 선택 및 포함하기 위해 사용되는 네 가지 주요 Linux Kernel 구성 옵션이 있다.
CONFIG_MX8_HDP 옵션은 HDP Core API 드라이버에 대한 지원을 제공하고, menuconfig의 다음 메뉴 위치에서 선택할 수 있다 :
Device Drivers > MXC support drivers > IMX8 HDP API
CONFIG_DRM_IMX_HDP 옵션은 HDP DRM 비디오 드라이버에 대한 지원을 제공하고, menuconfig의 다음 메뉴 위치에서 선택할 수 있다 :
Device Drivers > Graphics support > IMX8 HD Display Controller
CONFIG_IMX_HDP_CEC 옵션은 HDMI CEC 드라이버에 대한 지원을 제공하고, menuconfig의 다음 메뉴 위치에서 선택할 수 있다 :
Device Drivers > Graphics support > IMX8 HD Display Controller > Enable IMX HDP CEC support
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
HDMI(High-Definition Multimedia Interface) 드라이버는 i.MX 6QuadPlus, 6Quad, 6Dual SoC에서 온칩 DesignWare HDMI 하드웨어 모듈을 지원한다. 이 드라이버는 단일 케이블을 사용하여 압축되지 않은 비디오, 오디오, 데이터를 전송할 수 있는 기능을 제공한다.
HDMI 드라이버는 4개의 하위 콤포넌트로 나뉜다 :
- Linux Frame Buffer API가 통합되는 비디오 디스플레이 디바이스 드라이버
- ALSA/SoC 서브시스템이 통합되는 오디오 드라이버
- CEC 드라이버
- HDMI 드라이버의 소프트웨어, 하드웨어 공유 리소스를 관리하는 다기능 디바이스(MFD : multifunction device) 드라이버
HDMI 드라이버는 다음 기능을 지원한다 :
- MXC Display Device 프레임워크와 통합(IPU와 디스플레이 디바이스 연결 관리용)
- 최대 1080p60 해상도의 HDMI 비디오 출력
- HDMI 싱크 디바이스에서 EDID 정보를 읽기 위한 지원
- hotplug 감지
- CEC 지원
- 전력 소비를 최소화하는 자동화된 클록 관리
- 시스템 suspend/resume 지원
- HDMI 오디오 재생 (샘플 레이트 32KHz ~ 192KHz, 16비트, 2, 4, 6, 8 채널)
- "iecset" 유틸리티를 사용해 ALSA를 통해 노출되는 IEC 오디오 헤더 정보
아래 그림과 같이, HDMI 모듈은 IPU(Image Processing Unit)에서 비디오 데이터, 외부 메모리 인터페이스에서 오디오 데이터, CPU에서 제어 데이터를 수신한다. 출력 데이터는 SoC 외부의 HDMI 싱크 디바이스로 3개의 TMDS(Transition-Minimized Differential Signaling) 채널을 통해 전송된다. 또한 HDMI는 VESA DDC(Data Display Channel)를 전달한다. DDC는 HDMI 소스가 EDID(Extended Display Identification Data)에 대한 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 리소스를 관리하기 위한 추가적인 core 드라이버 컴포넌트가 필요하다. 다음 다이어그램은 다양한 HDMI 하위 드라이버 간의 상호 연결과 HDMI 비디오 드라이버와 Linux Frame Buffer 서브시스템 간의 상호 연결을 모두 보여준다.
i.MX 6Dual/6Quad/6QuadPlus/6Solo/6DualLite는 IPU 모듈에 연결되고 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 core 드라이버, HDMI 디스플레이 드라이버, HDMI 오디오 드라이버로 제공된다.
Table 71. HDMI Source
File | Description |
drivers/mfd/mxc-hdmi-core.c | HDMI core 드라이버 구현 |
include/linux/mfd/mxc-hdmi-core.h | HDMI core 드라이버 헤더 파일 |
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 platform DMA 드라이버 구현 |
drivers/mxc/hdmi-cec/hdmi-cec.c | HDMI CEC 드라이버 구현. HDMI CEC 라이브러리 파일은 codeaurraforum에서 imx-lib repo로 제공된다. |
6.4.6.8.5 Menu Configuration Options
Linux OS 이미지에서 HDMI 드라이버 기능을 선택하고 포함하는 세 가지 주요 Linux kernel 구성 옵션이 있다.
HDMI 비디오 지원은 Synchronous Panel Frambuffer에 대한 지원과 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 오디오에 대한 지원을 제공하며 다음을 선택하여 지원할 수 있다.
Device 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
HDMI(High-Definition Multimedia Interface) 드라이버는 외부 SiI9022 HDMI 하드웨어 모듈을 지원한다. 이 모듈은 단일 케이블을 사용하여 압축되지 않은 비디오, 오디오, 데이터를 전송할 수 있는 기능을 제공한다.
HDMI 드라이버는 두 개의 서브 컴포넌트로 나뉜다. Linux Frame Buffer API를 통합한 비디오 디스플레이 디바이스 드라이버와 SIi9022 HDMI 하드웨어 모듈로 S/PDIF 오디오 데이터를 전송하는 S/PDIF 오디오 드라이버이다.
HDMI 드라이버는 데모 애플리케이션 전용이고 다음 기능을 제공한다 :
- HDMI 비디오 출력으로 1080p60, 720p60 해상도를 지원한다.
- 비디오용 HDMI 싱크 디바이스에서 EDID 정보 판독을 지원한다.
- hotplug 감지
- HDMI 오디오 재생 (샘플 레이트 44.1KHz, 16/24비트, 2 채널)
외부 HDMI는 i.MX 6 7ULP SoC에서 지원된다.
출력 데이터는 3개의 TMDS(Transition-Minimized Differential Signaling) 채널을 통해 SoC 외부의 HDMI 싱크 디바이스로 전송된다. 또한, HDMI는 VESA DDC(Data Display Channel)를 전달한다. DDC는 HDMI 소스가 EDID(Extended Display Identification Data)에 대해 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 72. 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 kernel 구성 옵션이 있다.
HDMI 지원을 활성화하려면 다음 구성 옵션이 필요하다.
CONFIG_FB_MXS_SII902X 옵션은 Sii902x HDMI 비디오 드라이버에 대한 지원을 제공하고 다음을 선택하여 지원할 수 있다.
Device Drivers > Support for frame buffer devices > Si Image SII9022 DVI/HDMI Interface Chip
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
'NXP i.MX SoC Family > i.MX Linux Reference Manual' 카테고리의 다른 글
i.MX Linux Reference Manual - Video - Video Analog-to-Digital Converter (VADC) (0) | 2022.05.23 |
---|---|
i.MX Linux Reference Manual - Video - Video for Linux 2 (V4L2) (0) | 2022.05.20 |
i.MX Linux Reference Manual - Video - Display Controllers (0) | 2022.04.26 |
i.MX Linux Reference Manual - Video - Display Overview (0) | 2022.04.25 |
i.MX Linux Reference Manual - Video - Capture Overview (0) | 2022.04.22 |