레이블이 IF-LCD인 게시물을 표시합니다. 모든 게시물 표시
레이블이 IF-LCD인 게시물을 표시합니다. 모든 게시물 표시

12/19/2020

MIPI DSI(Display Serial Interface) 와 SW 구조

1. MIPI  Data 전송방식  

MIPI-DSI Hardware 구조 

ST MIPI-DSI 구조 (필독 자세한 설명이 나옴)

MIPI 관련내용


MIPI의 기본전송방식은 크게 Long Packet/ Short Packet 구조로 두개로 나누어지며, 세부적으로 Data ID에 따라 변경이 된다.  

https://www.st.com/resource/en/application_note/dm00287601-dsi-host-on-stm32f469-479-stm32f7x8-x9-and-stm32l4r9-s9-mcus-stmicroelectronics.pdf

  1. PH(Packet Header):  Header는 ECC로 검증이가능
  2. Data Paylod 
  3. PF(Packet Footer): Checksum으로 전체 Data가 검증가능 

만약 S/W에서 MIPI 전송오류가 발생한다면, ECC or Checksum Error가 발생할 것이며, 이는 곳 MIPI가 고속 Serial 통신이므로, 
HW 관련부분을 점검해봐야 할 것이다. 


  • 일반적인 HS(High Speed )모드 전송 방식 


  • Short Packet 전송 HS Mode 


  • Long Packet 전송 HS Mode (2 Lane)


1.1  Long Packet 과 Short Packet 

MIPI에서 알아야 할 기본구조 전송방식이며, DataID 값도 같이 알아야 정확한 이해가 가능하다. 

  • Long Packet 
  1. SoT(Start Of Transmission)
  2. Data ID(Virtual Channel ID) : 1byte
  3. Word Count: 2 bytes (Payload Size)
  4. ECC: 1 byte
  5. Data: Payload
  6. CheckSum: 2bytes 
  7. EoT(End Of Transmission)











Kernel(drivers/gpu/drm/drm_mipi_dsi.c)
mipi_dsi_packet_format_is_long  ( 이 함수를 보면 long packet의 종류를 파악)

  • Short Packet 
  1. SoT(Start Of Transmission)
  2. Data ID(Virtual Channel ID) : 1 byte
  3. Data 1/2: 2 bytes
  4. ECC: 1byte
  5. EoT(End Of Transmission)








Kernel (drivers/gpu/drm/drm_mipi_dsi.c)
mipi_dsi_packet_format_is_short  ( 이 함수를 보면 short packet의 종류를 파악)
  https://elixir.bootlin.com/linux/latest/source/drivers/gpu/drm/drm_mipi_dsi.c#L369

long/short packet (mipi_dsi_msg *msg ) 자체가 packet header 와 payload 가 포함됨 


1.2 Packet 의 Data ID의 구조 


  • DI(Data ID) 에서 Virtual Channel ID 사용 



  • Virtual ID로 Logical Channel 구분 


  • Virtual Channel로 구성 









1.2.1  Data ID->Data Type 의 값 


  • Data ID-> Data Type Class 
아래와 같이 Data Type의 종류를 간단히 보고 세부 값들을 보자. 


  • Data Type 의 다양한 값의 의미  
Packet 이 Short 과 Long으로 구분이 되며, 아래의 Data Type은 Data ID 값이며, DSI Mode에서 Both인 EOT를 반드시 기억하자.
  1. Video: Display 관련 Video Signal 
  2. Both: Master /Slave 동시사용
  3. Command: Master에서 주로 Command를 주는 것 


  1. DCS: DCI 기반으로 DCS로 Display Command 가능 
  2. VD(Video Display Packet)
  3. GN(General Packet)



상위 Data ID (DI) 값과 동일하며, Linux Source에서  동일하며, 상위 값 이외에도 다양하게 확장중이며, 아래와 같이 각 함수마다 호출되는 곳이 다르다. (주의)


  • Linux Kernel 의 Data Type 값 

//include/video/mipi_display.h
/* MIPI DSI Processor-to-Peripheral transaction types */
enum {
	MIPI_DSI_V_SYNC_START                         = 0x01,
	MIPI_DSI_V_SYNC_END                           = 0x11,
	MIPI_DSI_H_SYNC_START                         = 0x21,
	MIPI_DSI_H_SYNC_END                           = 0x31,

	MIPI_DSI_COMPRESSION_MODE                     = 0x07,  //mipi_dsi_compression_mode()
	MIPI_DSI_END_OF_TRANSMISSION            = 0x08,  //주의 SOT는 없어도 EOT는 별도로 존재

	MIPI_DSI_COLOR_MODE_OFF                       = 0x02,
	MIPI_DSI_COLOR_MODE_ON				          = 0x12,
	MIPI_DSI_SHUTDOWN_PERIPHERAL                  = 0x22,   //mipi_dsi_shutdown_peripheral()
	MIPI_DSI_TURN_ON_PERIPHERAL                   = 0x32,   //mipi_dsi_turn_on_peripheral()

	MIPI_DSI_GENERIC_SHORT_WRITE_0_PARAM    = 0x03,     //mipi_dsi_generic_write -> mipi_dsi_device_transfer()
	MIPI_DSI_GENERIC_SHORT_WRITE_1_PARAM 	= 0x13,    //mipi_dsi_generic_write -> mipi_dsi_device_transfer()
	MIPI_DSI_GENERIC_SHORT_WRITE_2_PARAM		= 0x23,     //mipi_dsi_generic_write -> mipi_dsi_device_transfer()

	MIPI_DSI_GENERIC_READ_REQUEST_0_PARAM     = 0x04,     //mipi_dsi_generic_read -> mipi_dsi_device_transfer()
	MIPI_DSI_GENERIC_READ_REQUEST_1_PARAM 	= 0x14,     //mipi_dsi_generic_read -> mipi_dsi_device_transfer()
	MIPI_DSI_GENERIC_READ_REQUEST_2_PARAM 	= 0x24,     //mipi_dsi_generic_read -> mipi_dsi_device_transfer()

	MIPI_DSI_DCS_SHORT_WRITE 		= 0x05,       //mipi_dsi_dcs_write_buffer->mipi_dsi_device_transfer()
	MIPI_DSI_DCS_SHORT_WRITE_PARAM		= 0x15,        //mipi_dsi_dcs_write_buffer->mipi_dsi_device_transfer()

	MIPI_DSI_DCS_READ				= 0x06,
	MIPI_DSI_EXECUTE_QUEUE				= 0x16,

	MIPI_DSI_SET_MAXIMUM_RETURN_PACKET_SIZE		= 0x37,  //mipi_dsi_set_maximum_return_packet_size()

	MIPI_DSI_NULL_PACKET				= 0x09,
	MIPI_DSI_BLANKING_PACKET			= 0x19,
	MIPI_DSI_GENERIC_LONG_WRITE		= 0x29,          //mipi_dsi_generic_write
	MIPI_DSI_DCS_LONG_WRITE			= 0x39,         // mipi_dsi_dcs_write_buffer

	MIPI_DSI_PICTURE_PARAMETER_SET            = 0x0a,  //mipi_dsi_picture_parameter_set()->pps정의 
	MIPI_DSI_COMPRESSED_PIXEL_STREAM		= 0x0b,

	MIPI_DSI_LOOSELY_PACKED_PIXEL_STREAM_YCBCR20	= 0x0c,
	MIPI_DSI_PACKED_PIXEL_STREAM_YCBCR24		= 0x1c,
	MIPI_DSI_PACKED_PIXEL_STREAM_YCBCR16		= 0x2c,

	MIPI_DSI_PACKED_PIXEL_STREAM_30			= 0x0d,
	MIPI_DSI_PACKED_PIXEL_STREAM_36			= 0x1d,
	MIPI_DSI_PACKED_PIXEL_STREAM_YCBCR12		= 0x3d,

	MIPI_DSI_PACKED_PIXEL_STREAM_16			= 0x0e,
	MIPI_DSI_PACKED_PIXEL_STREAM_18			= 0x1e,
	MIPI_DSI_PIXEL_STREAM_3BYTE_18			= 0x2e,
	MIPI_DSI_PACKED_PIXEL_STREAM_24			= 0x3e,
};
Kernel (include/video/mipi_display.h)
상위값으로 Data ID 값을 확인 


1.3  DSI-DCS(Display Command Set) 

DCS를 비롯하여, 모든 Data는 상위 Long Packet 과 Short Packet 구조를 가지고 있으며, DCS도 아래와 같이 Long Packet / Short Packet으로 구분 

  • DCS(Display Command Set)
Data ID만 변경하면 Long Packet/ Short Packet 구분되어 Header 구성되며, Payload에 DCS가 전달되는 구조임  (아래그림참조)



  • DCS Command는 아래 참조 (Linux Kernel)
//include/video/mipi_display.h
/* MIPI DCS commands */
enum {
	MIPI_DCS_NOP			= 0x00,
	MIPI_DCS_SOFT_RESET		= 0x01,
	MIPI_DCS_GET_COMPRESSION_MODE	= 0x03,
	MIPI_DCS_GET_DISPLAY_ID		= 0x04,
	MIPI_DCS_GET_ERROR_COUNT_ON_DSI	= 0x05,
	MIPI_DCS_GET_RED_CHANNEL	= 0x06,
	MIPI_DCS_GET_GREEN_CHANNEL	= 0x07,
	MIPI_DCS_GET_BLUE_CHANNEL	= 0x08,
	MIPI_DCS_GET_DISPLAY_STATUS	= 0x09,
	MIPI_DCS_GET_POWER_MODE		= 0x0A,
	MIPI_DCS_GET_ADDRESS_MODE	= 0x0B,
	MIPI_DCS_GET_PIXEL_FORMAT	= 0x0C,
	MIPI_DCS_GET_DISPLAY_MODE	= 0x0D,
	MIPI_DCS_GET_SIGNAL_MODE	= 0x0E,
	MIPI_DCS_GET_DIAGNOSTIC_RESULT	= 0x0F,
	MIPI_DCS_ENTER_SLEEP_MODE	= 0x10,
	MIPI_DCS_EXIT_SLEEP_MODE	= 0x11,
	MIPI_DCS_ENTER_PARTIAL_MODE	= 0x12,
	MIPI_DCS_ENTER_NORMAL_MODE	= 0x13,
	MIPI_DCS_GET_IMAGE_CHECKSUM_RGB	= 0x14,
	MIPI_DCS_GET_IMAGE_CHECKSUM_CT	= 0x15,
	MIPI_DCS_EXIT_INVERT_MODE	= 0x20,
	MIPI_DCS_ENTER_INVERT_MODE	= 0x21,
	MIPI_DCS_SET_GAMMA_CURVE	= 0x26,
	MIPI_DCS_SET_DISPLAY_OFF	= 0x28,
	MIPI_DCS_SET_DISPLAY_ON		= 0x29,
	MIPI_DCS_SET_COLUMN_ADDRESS	= 0x2A,
	MIPI_DCS_SET_PAGE_ADDRESS	= 0x2B,
	MIPI_DCS_WRITE_MEMORY_START	= 0x2C,
	MIPI_DCS_WRITE_LUT		= 0x2D,
	MIPI_DCS_READ_MEMORY_START	= 0x2E,
	MIPI_DCS_SET_PARTIAL_ROWS	= 0x30,		/* MIPI DCS 1.02 - MIPI_DCS_SET_PARTIAL_AREA before that */
	MIPI_DCS_SET_PARTIAL_COLUMNS	= 0x31,
	MIPI_DCS_SET_SCROLL_AREA	= 0x33,
	MIPI_DCS_SET_TEAR_OFF		= 0x34,
	MIPI_DCS_SET_TEAR_ON		= 0x35,
	MIPI_DCS_SET_ADDRESS_MODE	= 0x36,
	MIPI_DCS_SET_SCROLL_START	= 0x37,
	MIPI_DCS_EXIT_IDLE_MODE		= 0x38,
	MIPI_DCS_ENTER_IDLE_MODE	= 0x39,
	MIPI_DCS_SET_PIXEL_FORMAT	= 0x3A,
	MIPI_DCS_WRITE_MEMORY_CONTINUE	= 0x3C,
	MIPI_DCS_SET_3D_CONTROL		= 0x3D,
	MIPI_DCS_READ_MEMORY_CONTINUE	= 0x3E,
	MIPI_DCS_GET_3D_CONTROL		= 0x3F,
	MIPI_DCS_SET_VSYNC_TIMING	= 0x40,
	MIPI_DCS_SET_TEAR_SCANLINE	= 0x44,
	MIPI_DCS_GET_SCANLINE		= 0x45,
	MIPI_DCS_SET_DISPLAY_BRIGHTNESS = 0x51,		/* MIPI DCS 1.3 */
	MIPI_DCS_GET_DISPLAY_BRIGHTNESS = 0x52,		/* MIPI DCS 1.3 */
	MIPI_DCS_WRITE_CONTROL_DISPLAY  = 0x53,		/* MIPI DCS 1.3 */
	MIPI_DCS_GET_CONTROL_DISPLAY	= 0x54,		/* MIPI DCS 1.3 */
	MIPI_DCS_WRITE_POWER_SAVE	= 0x55,		/* MIPI DCS 1.3 */
	MIPI_DCS_GET_POWER_SAVE		= 0x56,		/* MIPI DCS 1.3 */
	MIPI_DCS_SET_CABC_MIN_BRIGHTNESS = 0x5E,	/* MIPI DCS 1.3 */
	MIPI_DCS_GET_CABC_MIN_BRIGHTNESS = 0x5F,	/* MIPI DCS 1.3 */
	MIPI_DCS_READ_DDB_START		= 0xA1,
	MIPI_DCS_READ_PPS_START		= 0xA2,
	MIPI_DCS_READ_DDB_CONTINUE	= 0xA8,
	MIPI_DCS_READ_PPS_CONTINUE	= 0xA9,
};
  
  


  • DCS 로 제어는 아래의 함수이용  
  1. mipi_dsi_dcs_write
  2. mipi_dsi_dcs_write_buffer

 

1.4  일반적인 DSI Write

우선 LCD Initial Code는 이전에 병렬에서 맞춰주던 Hsync/Vsync를 비롯하여, LCD의 Data Format 및 기타 설정을 위해서 MIPI Interface로 설정을 해준다. 

  • 일반적인으로  DSI 사용되는 함수 
  1. mipi_dsi_generic_write
  2. mipi_dsi_generic_read 
상위 함수를 이용하여  자동으로 Long or Short 선택되어 Header가 구성되어 read/write 되지만, 상위 Data ID는 상위에 정해짐 


반드시 LCD Datasheet를 참조하여, Payload에 들어가는 Header에 Data ID도 확인가능하다며 확인하자.

본인이 LCD Spec에서 DCS Command 사용여부에  맞게 선택해서 함수도 맞게 넣어 개발하는 것이 맞을 것이라고 본다. 

  • 기타 MIPI-DSI Debug 관련내용 


2. GPU의 DRM (Direct Rendering Manager)

처음 DRM의 약자를 Digital Right Management로 착각했으며, 예전에 HDMI Device Driver 개발당시 HDCP와 유사한 기능이라고 착각했다.
DRM은 GPU기반으로 빠른 Rendering을 지원하기 위해서 제공해주는 기능이며, 이전에 Frame buffer Driver만 개발했던 나에게 다소 생소했는데, 
각 여러 Layer들을 쉽게 Rotate/Scale/Crop/Overlay되는 것을 보고 이 기능에 조금 놀라웠다. 

이전에 TI DSP기반으로했던, Davinci의 경우 Scale 과 Crop은 가능했던걸로 기억하지만, 많은 Layer들은 제어하지는 못했는데, DRM은 GPU를 통해서 다양한 기능을 제공한다.
한마디로 GPU에서 확장된 Frame Buffer라고 생각하면 될 것 같으며, Overlay 기능역시 GPU에 따라 다른 것 같다. 

  • FrameBuffer 와 DRM(Direct Rendering Manager) 비교 


Kernel DRM Driver 기본구조

Kernel GPU DRM-KMS(Kernel Mode Setting) 
상위 MIPI-DSI의 HW Dispaly 관련 출력설정 

TI사의 DSS와 DRM 부분 


2.2  Frame Buffer vs DRM 기반의 Pannel 

  • Frame Buffer LCD Initial Code 
Frame Buffer 기반으로 DCS Command 입력 후 Initial Code 입력 SPI/GPIO 기반으로 입력 

  • DRM 기반의 LCD Initial Code
DRM기반의 실제 Panel Driver들의 다양한 예제이며, SPI와 I2C 및 GPIO와도 연결되어 구성되므로 참고

DRM(Direct Rendering Manager)로 GPU기반으로 DBI (이전의 ST 칩의 DBI라고 생각하면됨)

mipi_dsi_dcs_xxx 함수들은 내부적으로 dcs command를 호출


  • i.MX 의 경우 i.MX6는 Framebuffer Driver
Table 64. MIPI DSI Driver Files  // Frame buffer 기반 Driver 와 DRM 기반 Driver들 
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
  •  i.MX의 경우 i.MX 8은 DRM Driver  
drivers/gpu/drm/imx/sec_mipi_dsmi-imx.c Samsung            DRM driver
drivers/gpu/drm/imx/nwl_dsi-imx.c Northwest                        DRM driver



Device Tree 

12/18/2020

MIPI DSI(Display Serial Interface)

1. MIPI-DSI 구조 

MIPI(Mobile Industry Processor Interface)의 DSI는 LCD Interface를 고속 Serial Interface를 이용하는 예로 이번기회에 정리하고자 한다.  
세부내용들은 아래의 링크들에서 자세히 잘 설명해주고 있다. 

LCD Interface 관련내용

ST MIPI-DSI 관련내용 

MIPI(Mobile Industry Processor Interface)

MIPI-DSI(Display Serial Interface)

MIPI-PHY 관련내용 

LCD Pannel Spec


1.1 MIPI DSI 의 구조 

MIPI-DSI

  • MIPI DSI 의 기본구조
DSI Interface로 DCS로 Command로 구성이 되어져 이를 제어한다. 



  • MIPI의 D-PHY 구조 
  1. Clock Lane: One-way (단방향)
  2. Data Lane: One-way (단방향)
  3. Data Lane: Two-way (양방향)

One-way Clocl Lane/ Data Lane
Master: 
    


https://www.programmersought.com/article/42054062840/





2. NXP 사의 i.MX Series 구조 

i.MX6 과 8의  MIPI Interface를 비교하고 관련 부분을 간단히 비교해보자. 

2.1  NXP사의 MIPI-DSI (i.MX6) 

상위에서 기본적인 MIPI를 알았으니, 실제 AP인 i.MX의 경우를 보면 어떻게 세부적으로 동작하는지 알수 있을 것이다. 
두개다 D-PHY는 내부에 포함이 되어있으며, 동작구조가 유사하지만, 점점 변경되어가는 것을 볼 수 있다. 

  • i.MX6 MIPI DSI(Host Controller) 
상위 ST와 거의 유사하며, 별로 다르게 없다.  
  • i.MX6  DSI 내부구조 

i.MX6의 LVDS는 병렬 LCD제어에서 Bridge로 변경되어 제어됨 




2.2  NXP사의 MIPI-DSI (i.MX8) 

  • i.MX8의 MIPI-DSI or LVDS 
기존의 i.MX6와 다르게 MIPI-DSI 와 LVDS PHY를 합쳐서 사용하며, 외부 칩 제어를 위해 i2C 와 GPIO를 설정 (IO Expander 및 레귤레이터)  및 
Bakclight를 위한 PWM제어를 한 묶음으로 변경하여 보기쉽게 변경되었다.
 

아래의 구조는 쉽게 이해하고자 한다면, 이전에 ST 버전하고 거의 동일하다고 생각하면 될 것같다. 
DSI Controller (DSI Host) 로 LCD의 Device를 연결한다.   


8/27/2018

ST MIPI DSI(Display Serial Interface)

1. LCD Interface 확인 



ST LCD Interface 와 MIPI Interface 설명 

  • Intel8080/68K/SPI
이전에 설명했듯이 CPU/MPU Interface 와 SPI Interface이며, 주로 내부에 GRAM이 존재하여, 별도의 Fram Buffer가 필요가 없다. 

  • RGB Interface
아래 그림과 같이 SoC에 Frame Buffer가 존재하며, RGB Interface로 붙어 각 Timing을 설정해준다. 

1.1 LCD Interface 와 MIPI Interface의 이해 

ST기반의 LCD와 MIPI Interface를 이해해보자. 
  1. DBI (Display Bus Interface): CPU/MPU Interface 와 SPI Interface without Frame Buffer
  2. DPI(Display Pixel Interface): RGB Interface with Frame Buffer
  3. DCS(Display Command Set): MIPI-DBI Interface 지원하는 Command들 


  • DBI 구조 (CPU/SPI Interface로 Frame Buffer가 필요 없는 Type)



  • DPI 구조 (RGB Interface로 내부에 Frame Buffer가 존재)



  • MIPI-DSI Host 구조 
DPI 와 DBI 기반으로 MIPI DSI Host(Display Serial Interface) 구축하고, PPI(PHY Protocol Interface)를 이용하여 D-PHY와 통신하여,
이를 MIPI LCD에게 전달해준다.  


DPI와 상위 MIPI-DSI Interfce 

MIPI-DSI 를 보면 이전의 LCD Interface로 연결이 되어 이를 Host로 생성한 후 이를 MIPI-DSI로 연결하는 방식이다. 
어떻게 보면 예전의 LVDS와 다르지 않게 느껴진다. 

2. MIPI-DSI Host 기본구조 

MIPI(Mobile Industry Processor Interface)의 DSI는 LCD Interface를 고속 Serial Interface를  이번기회에 정리하고자 한다.  

MIPI(Mobile Industry Processor Interface)

MIPI-DSI(Display Serial Interface)

  • MIPI DSI Host 와 LCD Dispaly 구조 
Lane은 0~3도 가능하며, PHY는 중 1개의 Lane은 양방향통신을 진행한다.
  1. HS(High Speed) Mode
  2. LP(Low Power) Mode

상위 D-PHY기반의 PHY Protocol Interface (PPI) 말하며, 용어만 알아두도록하자. 
상위 Lane들을 구조를 좀 자세히 보면 3개 중 2개 HS Mode(단방향)만 사용하며, 나머지 1개만 HS Mode 와 LP 모드(양방향)형식으로 데이타 전송이 이루어 지고 있음을 알수 있다.  

즉 Host에서 상위 DCS(Display Command Set)을 LP 모드로 전송하고 DATA는 HS Mode로 전송함을 짐작할 수 있다. 


  • DPI 기반의 MIPI-DSI Host 구조 
아래의 경우는 상위 설명의 DPI(RGB Interface) 기반으로 동작되는 것을 MIPI-DSI Host로 연결한 구조이다. 


기존의 RGB Interface와 거의 유사하며, 다만 실제 영상데이타는 PPS(HS)로 전송되며 나머지는 LP로 되어지는 것으로 보인다. 


  1. HSA (Hsync active)
  2. HBP (horizontal back porch)
  3. HFP (horizontal front porch)
  4. VSA (Vsync active)
  5. VBP (Vertical back porch)
  6. VFP (Vertical front porch)
  7. VSS (Vsync Start)
  8. VSE (Vsync end)
  9. HSS (Hsync Start)
  10. HSE (Hsync end)
  11. PPS (Packed Pixel Stream)으로 16/24/32 등 RGB/YUV를 비롯하여 다양하다 

Tegra의 DRM 의  RGB Interface 설정 


2.1  MIPI 의 PHY의 동작방식  

상위그림은 현재 D-PHY를 사용하고 있으며, PHY 내부의 Protocol을 조금 더 알아보자.

  • PHY 의 모드와 속도 


  • DSI PHY Signal Mode에서는 두가지 모드로 통신 구성
  1. HS (High Speed) Mode: 빠른 모드로 최대 1.5Gb/s 라고 하며, 상위 글을 보면 각 PHY마다 다른것으로 파악 (200mV)
  2. LP (Low Power) Mode: 저전력모드로 아래 그림과 같이 differtial 이 아니며, Level과 속도도 10Mb/s 밖에 되지 않는다. (1.2V)


각 Lane의 각 HS 와 LP로 State Code가 존재하며, 이를 이 기반으로 통신을 진행한다. 


  • Data lane의 Operating Mode/ State Code 
  1. Control Mode: Reset 후 LP-11인 상태이며, 다른모드가 종료후 이모드임 
  2. HS Mode:  뒤에 설명 
  3. Escape Mode: 뒤에 설명  

2.2  Data lane 의 HS Mode

Control Mode 진입 후 HS Mode로 진입하여 데이타 통신을 진행하므로 반드시 알아야함
  • 일반적인 HS Mode 동작 

  • SoT (Start of Transmission) 
LP-11 (Stop), LP-01 (HS-Rqst), LP-00( Bridge) 받는 즉시 HS Mode로 진입하고 DSI Host는 HS-0과 함께 시작하며, 상위 Sync Sequence를 보낸다.

  • EoT(End of Transmission)
HS모드로 Data 전송후 Host는 Trailing sequence를 보내는데, 마지막 data의 반대 값 HS-0/1
LP-11모드로 진입



2개의 Lane사용시의 Data 전송되는 방식이며, 4개도 동일하다. 


2.3 Data lane의 Escape Mode

Escape Mode는 접해보지 못한것으로 아래의 Command들도 제공을 해주며, 이 부분 추후에 더 보강을 하자. 


Escape Mode Command 



3. PHY의 세부 동작 


  • 상위 Data Lane 중 양방향 통신방식을 보면 아래와 같이 동작 


  • Clock-lane의 Power Mode
  1. LP(Low Power) Mode
  2. HS(High Speed) Mode
  3. ULPS(Ultra-low-power state)


3. MIPI Spec


CCI 

9/30/2014

Porting LCD, Touch Screen

1. LCD 관련정리 

LCD Interface 관련정리 

  • LCD 와 Frame Buffer 
SoC에서 Frame Buffer의 역할은 중요하며, LCD가 특히 RGB Interface로 연결되었을 경우 LCD 내부에 RAM이 별도로 없으므로, 
Frame Buffer를 통해 이 Latency를 없애고자 하는 것이며, OSD 와 VIDEO Frame Buffer의 경우 갯수 또한 다르다. 

2. KERNEL 설정 

TFTP Pannel이므로, 별도의 Backlight와 Frame Buffer를 설정해야줘야 한다. 
LCD: U133WA01

  • Odroid Kernel 설정 
Odroid의 LCD 설정 및 Backlight 및 Frame Buffer 설정 
$ make menuconfig 
Device Driver-> Graphics support -> Backlight & LCD device support
        
Lowlevel LCD controls
Lowlevel Backlight controls
Generic PWM based Backlight Driver

$ make menuconfig   
Device Driver-> Graphics support ->Support for frame buffer devices->
S5P Framebuffer support
LCD init in kernel
(2)     Default Window (0-4)
(2)     Number of frame buffers (1-3)
Select LCD Type (U133WA01)

  • LCD Back Light 관련소스 
arch/arm/mach-exynos/mach-odroid-x.c  :  spi resiger, pwm
arch/arm/mach-exynos/setup-fb-odroid.c :  s3cfb_backlight_on   backright
arch/arm/plat-samsung/dev-backlight.c

  • Frame Buffer 와 LCD 관련부분 확인 
$ ls qtwork/kernel/linux-3.0.68/drivers/video/samsung
built-in.o  s3cfb_fimd6x.o  s3cfb_main.o  s3cfb.o  s3cfb_ops.o u133wa01.o

2.1 SPI 관련 추가방법  

GPIO 기반의 SPI 설정 

$ vi arch/arm/mach-exynos/mach-odroid-x.c

static struct s3c64xx_spi_csinfo spi1_csi[] = {
        [0] = {
                .line = EXYNOS4_GPB(5),
                .set_level = gpio_set_value,
                .fb_delay = 0x2,
        },
};

static struct spi_board_info spi1_board_info[] __initdata = {
        {
                .modalias = "spidev",
                .platform_data = NULL,
                .max_speed_hz = 10*1000*1000,
                .bus_num = 1,
                .chip_select = 0,
                .mode = SPI_MODE_3,
                .controller_data = &spi1_csi[0],
        }
};

......
spi_register_board_info(spi0_board_info, ARRAY_SIZE(spi0_board_info));

  • SPI Driver Based GPIO
drivers/spi/spi.c

drivers/spi/spi_gpio.c: 위의 board에서 정의된 값을 이용하여, gpio를 이용하여 기본 SPI 설정
                        이 곳에서 제대로 GPIO 제대로 설정되었는지 TEST
          
drivers/spi/spi_bitbang.c
                         위 함수를 이용하여 SPI  based on GPIO 구동
- bitbang_work           : 실제 gpio로 전송을 담당 하는 함수.
- spi_bitbang_transfer  : 전송을  전송을 하지만, queue만 넣고 실제 전송을 bitbang_work 동작


  • 관련 GPIO 설정 및 Contorl 
sys filesystem을 이용하여 쉽게 gpio로 control 
cat /sys/kernel/debug/gpio 
관련참조 
  http://th15.tistory.com/25

Touch TSC2007 


  http://codewalkerster.blogspot.kr/2014/06/optimize-setting-for-low-dpi.html
  https://access.redhat.com/documentation/ko-KR/Red_Hat_Enterprise_Linux/6/html/Performance_Tuning_Guide/s-cpu-irq.html

Interrupt Chattering
  http://forum.falinux.com/zbxe/index.php?document_srl=786529&mid=question
  http://mroon.tistory.com/263

9/16/2014

LCD Inteface 정리

 1. LCD Interface 기본지식 


LCD Interface는 크게 보면 3가지 종류로 나누어 볼수 있을 것 같다. 
  1. CPU Interface (Intel 8080 / Motorola 68K)로 연결되던 GRAM 기반의 Serial Interface
  2. RGB Interface 임베디드에서 흔히 볼수 있는 것으로 Parrarel Inteterface
  3. Serial Interface로 SPI Interface를 자주 이용하는 것으로 Serial Interface


  • 출처
LCD interface 정리 한번 정리하고자 하는데, 쉽게 설명한 사이트이며, 오랜전에도 봤지만, 가능 낫은 것으로 생각되며, 추후 없어질지 몰라 다시 정리한다.
1.1  CPU/MPU Interface 

Intel 8080 과 Motorola 68K기반으로  CPU or MPU Interface라고 한다고 하며, 나의 경우 거의 다루어보지 못했다. 
WR(Write), RD(Read),RS(Command/Data),CS(Chip Select) 등 구성되며, Driver IC에 별도의 RAM이 존재하여 Frame Buffer가 필요없는 것으로 보인다.  
쉽게 생각하면, GPU기반으로 생각을 하면될 것 같다. 

CS는  Low 가 일 때  Driver IC가 동작가능하며, 이 맞추어 WR/RD 신호에 따라 Parrarel DB가 Write or Read가 되어진다. 
RS(Data/Command)신호에 따라 Data 역시 Instruction 과 Data로 구분되어 전송이 되어진다.
 


이 LCD Driver IC를 보면, Serial Mode와 같이 지원하며, 아래와 같이 80은 Intel의 8080을 의미하며, 각 Data Bus의 길이를 설정한다. 



글을 이해하면서 옮겨 적는데, DB(Data Bus)0~17은 CPU/MPU에서 나오는 Data Bus이며, IB의 경우 LCD로 들어가는 신호라고 한다.
이때 생각해봐야 할것이 IB가 16 or 8Bit 밖에 지원이 안되는 것으로 보이며, 이에 맞게 HW Pin도 수정해서 해야 하는 것으로 보인다. 

상위모드 중  80-system 16bit Interface
상위사이트의 글과 그림이 좀 달라서 내 생각에는 상위 모드에서 16bit로 설정했을 경우

상위모드 중  80-system 18bit Interface 
IB가 16 or 8Bit 만 지원해서 마지막 2bit가 빠지는 것으로 보이며, 설명은 Instruction 길이이며, Data 길이는 실제 Datasheet를 봐야 할 것 같다. 

상위모드 중  80-system 8bit Interface 
16bit와 비교하여, 두번에 나누어 Instruction 전송이 되는 구조 

추후에 CPU/MPU Interface를 만나게 될 경우, 이때 제대로 한번 정리하고자 한다. 

  • Motorola 68K Series


  • Intel 8080 Series



1.2 RGB Interface

내가 LCD Interface 중 가장 많이 만들어본 Interface이며, LCD Driver를 Porting 할때 거의 이것으로 사용을 했다. 
이 경우 주로 Frame Buffer Driver가 별도로 필요로 하며, 특히 TI의 Davinci Series의 경우 거의 이 방식으로 사용을 했다. 
더불어 여기에 LVDS로 Converter도 가능해서 이 방식이 가장 많이 사용했던 것으로 기억한다.
기본적으로 Data Line은 Parrarel 16bit 와 Hsync/Vsync / Enable이런식로 나온다. 

  • 실제 Pannel의 그림영역 
VSync 후  Height 크기만큼  Hsync 와 Width Data를 나누어서 보내는 방식인데, Porch라는 것을 두어 실제 표시될 영역을 수정이 가능하다.
이것은 LCD만에 해당되는 것이 아니며, NTSC/PAL도 거의 비슷하다. 


  • VSync 와 Hsync 와 Porch
아래의 Timing은 1 Frame의 기본 Timing 이며 상위 그림에서 보여진 실제 Data는 Porch로 조절한다. 


  • LCD Timing 설정에 관련된 용어
아래의 용여들은 SoC에서 직접 Register에서 설정하여 맞추는 것이며, 각각의 SoC마다 다를 것이다. 


1.3 Serial Interface

Serial Interface라고 했는데, 다양하지만, 크게 두가지로 나누어질 것 같다. 
  1. 저속 Serial Interface: SPI 
  2. 고속 Serial interface: 고속 Serial Interface로 주로 USB 처럼 Differertial 를 사용함. 
나의 경우는 MCU에서는 SPI Interface 사용을 해봤으며, 고속 Serial Interface인 MIPI 와 LVDS,  DDI (MDDI/PDDI) 가 존재하지만, 
MIPI 와 LVDS만 경험이 있지, DDI인 MDDI/PDDI 관련부분은 경험이 없다. 

LCD Serial Interface 

  • 저속 Serial Interface SPI 
MCY에서 사용했던 기억이 있으며, Frame Buffer역시 필요가 없으며, SPI가 지원이 되는 것으로 보이면, 각각에 LCD 마다 맞추어 줘야하는 것으로 기억한다.



  • 일반적인 SPI 통신
SPI는 I2C와 달리 Open Drain 기반의 Bus방식이 아닌 GPIO기반으로 만들어진 Serial 통신이라고 생각하면 되겠다.
SPI도 다중의 Device를 붙히는것도 가능하지만, 이때 CS의 각각의 Device마다 별도로 있어야 한다. 

LCD에서 SPI는 8/9/16/17/24bit가 존재한다고 하는데, 거의 RGB 값에 의존적일 것이라고 생각한다.

  • SPI 4-Wires
SDC라는 것이 별도로 존재하며, Register 와 Data 영역을 구분하는 역할로 사용한다고 한다.



  • SPI 3 wires




  • 고속 Serial Interface들 
MIPI/LVDS/ MDDI/PDDI가 될 것 같으며, LVDS의 경우 RGB에서 직접 연결해서 사용했던걸로 기억하며, MIPI의 경우는 
지인에게 Spec을 받아 만들어 본 경험이 있지만, MIPI는 각 LCD Panel의 Datasheet를 자세히 본걸로 기억한다.

MDDI/PDDI의 경험이 없어 상위 링크에서 그림만 가져온다.





2.  LCD 에 관련된 정보 

LCD에 관련된 기본용어