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

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를 연결한다.   


12/16/2020

MIPI(Mobile Industry Processor Interface)

1. MIPI(Mobile Industry Processor Interface)

MIPI Aliance는 ARM, Intel, Nokia, Samsung, STMicroelectronics and Texas Instruments 회사들이 만든  Mobile 관련된 Interface로 2003년에 처음 생성되었다고 한다.
그리고, 위에서 보았듯이 Mobile용으로 탄생했기 때문에 초반에 대중적으로 많이 사용되어지지 않았다. 

주로 사용되는 곳들은 Display 와 Camera 와 Baseband 부분인 것으로 보이며, 이외 것들은 아래의 링크로만 해둔다. 

MIPI Aliacne의 Spec 확인 

MIPI-CSI

MIPI-DSI

MIPI-DPI

MIPI-SPMI

C-PHY
D-PHY
M-PHY


1.1 MIPI 의 기본용어 정리 및 기본이해 

  • MIPI LP/HS 동작 
  1. Low power transmitter: LP-TX
  2. Low power receiver: LP-RX
  3. High-speed transmitter: HS-TX
  4. High-speed receiver: HS-RX
  5. Low-power competition detector: LP-CD

  • MIPI의 Lane type
Clock lane 과 Data lane  구분해보면 되고 , Data Lane로 다시 두 가지로 나뉘어진다.

One-way clock lane: 단방향 clock lane 
  • Master:HS-TX, LP-TX
  • Slave:HS-RX, LP-RX
Two-way data lane (lane0): 양방향 Data lane
  • Master, Slave:HS-TX, LP-TX, HS-RX, LP-RX, LP-CD
One-way data lane (lane1-lane3): 단방향 Data lane
  • Master:HS-TX, LP-TX
  • Slave:HS-RX, LP-RX

  • Low power mode (Low-Power LP mode)
used for control: maximum 10MHz, only use data lane0 (clock is XOR from CP and CN).
LP Mode라고 부르며, 재미 있는 것은 data lane0을 사용을 하며, clock lane과 XOR를 하여 동작하며, 이 Data Lane은 differential 로 동작하지 않는다. 

  • High-speed mode (High-Speed ​​HS mode) 
high-speed data transmission: 80M-1Gbps/lane.
HS Mode라고 하며 differential 로 동작하며, Level로 다르다. 


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


  • State of Lane
  1. LP-00, LP-01, LP-10, LP-11 (single-ended)
  2. HS-0, HS-1 (differential)
LP와 HS State는 아래의 값에의해 결정이 되며 이는 Lane의 상태와 Command라고 생각하면 되겠다. 

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




1.2 MIPI Operation Mode   
 

  • Three operating modes of Data Lane 
  1. Escape mode, 
  2. High-Speed(Burst) mode
  3. Control mode
아래 그림을 보면 쉽게 이해가 감 

Possible events starting from the stop state of the control mode are:
Control Mode 상태가 종료되어 events가 가능한 상태이며, LP11를 이용하여 STOP 후 진행 
  1. Escape mode request (LP-11→LP-10→LP-00→LP-01→LP-00)
  2. High-Speed mode request (LP-11→LP-01→LP-00)
  3. Turnaround request (LP-11→LP-10→LP-00→LP-10→LP-00)

BTA: Bus Trunaround / Trunaround  의미 

  • Escape mode State 
Escape mode is a special operation of data Lane in LP state 
    - In this mode, you can enter some additional functions: LPDT, ULPS, Trigger

• Data Lane enters Escape mode through LP-11→LP-10→LP-00→LP-01→LP-00
• Once in Escape mode, the sender must send an 8-bit command in response to the requested action
• Escape mode uses Spaced-One-Hot Encoding

  • Ultra-Low Power State
  1. In this state, lines are empty (LP-00)
  2. The ultra-low power state of the clock Lane
  3. Clock Lane enters the ULPS state through LP-11→LP-10→LP-00
  4. Exit this state through LP-10 → TWAKEUP → LP-11, the minimum TWAKEUP time is 1ms

  • High-speed data transmission
  1. The act of sending high-speed serial data is called high-speed data transmission or burst
  2. All Lanes doors start synchronously, and the ending time may be different.
  3. The clock should be in high-speed mode

  • The transmission process under each mode of operation
  1. The process of entering Escape mode: LP-11→LP-10→LP-00→LP-01→LP-00→Entry Code → LPD (10MHz)
  2. The process of exiting Escape mode: LP-10→LP-11
  3. The process of entering high-speed mode: LP-11→LP-01→LP-00→SoT(00011101) → HSD (80Mbps ~ 1Gbps)
  4. The process of exiting high-speed mode: EoT→LP-11
  5. Control mode-BTA transmission process: LP-11→LP-10→LP-00→LP-10→LP-00
  6. Control mode-BTA receiving process: LP-00→LP-10→LP-11






10/13/2015

IMX6 CAMERA MODULE 수정 및 Yocto 로 Patch 만들기

1. IMX6 CAMERA INTERFACE

현재 Freescale 의 I.MX6 의 Linux KERNEL은 device tree를 사용하고 있어, 수정 및 관리가 쉽다.
I.MX6의 camera capture의 interfaces는 Module 형태로 제공을 하고 있어,
만약, 해당부분을 추가한다면, module를 추가해서 넣고 테스트를 진행하면 된다.


1.1 CAMERA 관련문서확인

우선 Freescale에서 제공하는 문서와 Yocto File을 다운로드 하고 관련문서를 숙지하도록하자.

Freescale의 Camera 관련문서 
  https://www.freescale.com/webapp/sps/download/license.jsp?colCode=L3.10.17_1.0.0_LINUX_DOCS&appType=file1&location=null&DOWNLOAD_ID=null


  • Download
fsl-yocto-3.10.17_1.0.0.tar.gz ( Freescale site에서 download )


  • 상위 관련문서
  1. i.MX_6_SABRE-SD_Linux_Release_Notes.pdf
  2. i.MX_6_Linux_Reference_Manual.pdf
  3. i.MX_6_BSP_Porting_Guide.pdf

각 문서의 주요사항들을 아래와 같이 정리하다. 

A.  i.MX_6_SABRE-SD_Linux_Release_Notes.pdf

상위 문서에서 아래부분을 각각 확인하자.
Device Tree 부분은 나의 문서를 참조하고 기본개념을 파악하자. 

TI Sitara Device Tree 관련내용(반드시 숙지) 

Device Tree 부분 참조

그리고 나서 커널내부에서 제공하는 문서를 보자
  • Device Tree  
       uImage-imx6sl-evk-csi.dtb

상위문서의 아래부분들을 반드시 참고하고 확인하자
  • 4 BSP Supported Features i.MX 6 SABRE-SD
  1. Supported Features for i.MX 6 SABRE-SD
  2. IPU V3 driver Yes Provides the interfaces to access IPU V3 modules
  3. V4L2 Capture Yes Supports dual camera.
  4. CSI Camera Yes Supports OV5640 camera sensor.
  5. CSI Camera Yes Supports OV5640 camera sensor.

B. i.MX_6_Linux_Reference_Manual.pdf

기본적으로 Camera의 동작방식과 관련부분을 알고 있어야 아래 부분이 이해가 가능하다.

추후 Camera 관련내용제공 

각 부분 카메라 관련 모듈 테스트 방법 과 IPU와 동작방법알아두자.
상위 문서의 아래부분을 참고
  • Ch 6   IPU (Image Processing Unit)
        6.3 Source Code Structure
        6.3.1 Menu Configuration Options  ***
        6.4 Unit Test 확인

$ insmod ipu_prp_enc.ko
$ insmod ipu_bg_overlay_sdc.ko
$ insmod ipu_fg_overlay_sdc.ko
$ insmod ipu_csi_enc.ko
$ insmod ov5640_camera.ko
$ insmod mxc_v4l2_capture.ko


  • Chapter 20  OmniVision Camera Driver
  • Chapter 21  MIPI CSI2 Driver


C. i.MX_6_BSP_Porting_Guide.pdf

iMX의 BSP를 수정하는 전반적인 방법에대해서 설명을 해주고 있으므로, 반드시 확인


1.2 KERNEL 구조파악

기본적으로 KERNEL에 Linux Module을 추가하려면, 아래와 같이 기본구조를 파악하자.

A. KERNEL CONFIG 의 확인 

i.MX6에서 사용하는 Main Kernel Config 이며, 모든 Kernel Config 구성이 동일하다. 
아래와 같이 동일한 역할을 하는 파일이지만, 위치가 다 다를 수 있다

$ ls kernelxxx/arch/arm/configs/xxxx_defconfig     //  본래 xxx_defconfig 위치는 이곳이며, make xxx_defconfig  (bitbake(yocto)에서도 사용)
$ defconfig                              //  실제 적용되는 defconfig로 이 기반으로 .config 생성       
  imx_v7_defconfig                       //  imx_v7_defconfig defconfig 동일하며,  arch/xxx/configs/에 위치함 
$ vi .config                             //  현재 설정된 kernel config 값으로 defconfig 기반으로 생성됨   
                                         //  defconfig 와 .config는 구조는 거의 비슷하지만, 생성되는 것은 Kernel에서 변경이됨 

원래 Linux kernel의 경우 아래와 같이 동작하지만 Yocto에서도 상위와 같이 각각의 defconfig 를 이해하자 
$ make xxx_defconfig    //arch/arm/configs/xxxx_defconfig 설정  후 .config 설정됨 
$ make menuconfig       


B. KCONFIG 파일

Linux Kernel에서 직접 수정하도록 하자 

//일반적인 Linux Kernel는 알다시피 아래와 같이 하지만, 현재 Yocto를 사용하므로 아래를 참조해가며 하자 

$ make menuconfig // Linux 메뉴설정을 위해 아래의 파일들을 점검하자 (Driver추가시)

// 상위 .config에 의해 실제 소스에 적용되는 #define 설정값 
$ cat include/generated/autoconf.h 

// make menuconfig  실행시 메뉴설정 파일 
// 해당 driver에서 Kconfig파일과 makefile을 동시에 수정을 해주면된다.
$ Kconfig     // Main 설정 
$ makefile    // 관련부분 검토 (커널 Version 확인)

// Linux Kernel Version 확인 
$ vi include/linux/version.h  

2. CAMERA MODULE 수정


아래와 같이 build가 아니라 직접 source에 가서 수정하도록하자. 
대신 수정하기전에, backup을 반드시 진행하고 수정을 하도록하자.


2.1 Kernel Module 수정 및 config 수정 

$ cd ~/IMX6/fsl-community-bsp/build/tmp/work/imx6qsabreauto-poky-linux-gnueabi/linux-fslc-mx6/3.14-1.0.x+gitAUTOINC+4bae14aef7-r0/build/source

$ cp ./drivers/media/platform/mxc/capture/ov5642.c ./drivers/media/platform/mxc/capture/fpga.c

$ vi ./drivers/media/platform/mxc/capture/Makefile
fpga_camera-objs := fpga.o
obj-$(CONFIG_MXC_CAMERA_FPGA) += fpga_camera.o

$ vi ./drivers/media/platform/mxc/capture/Kconfig 
config MXC_CAMERA_FPGA
        tristate "FPGA camera support"
        depends on !VIDEO_MXC_EMMA_CAMERA && I2C
        ---help---
          If you plan to use the ov5642 Camera with your MXC system, say Y here.

$ cd ..      
$ vi . config                    //build directory.
CONFIG_MXC_CAMERA_OV5642=m
CONFIG_MXC_CAMERA_FPGA=m
$ cd .. 
$ vi defconfig 
CONFIG_MXC_CAMERA_OV5642=m
CONFIG_MXC_CAMERA_FPGA=m

상위와 같이 Kernel Config 와 관련 Driver 추가

2.2 make menuconfig시 설정정보 

Video For Linux는 Camera기능에서 Capture기능을 담당하는 부분으로 중요하다
  - Deivce Driver -> Multimedia Support -> V4L platform devices


3. PATCH 만들어 적용 

Linux Kernel Patch를 직접 만들어서 이를 Yocto의 적용해보도록하자.
물론 bbappend를 사용할 것이다. 

3.1  KERNEL Patch 생성 


$ cd ~/IMX6/fsl-community-bsp/build/tmp/work/imx6qsabreauto-poky-linux-gnueabi/linux-fslc-mx6/3.14-1.0.x+gitAUTOINC+4bae14aef7-r0
$ mkdir jhlee  // backup 용 source 보관
$ cp -a  /home/jhlee/IMX6/fsl-community-bsp/build/tmp/work-shared/imx6qsabreauto/kernel-source/  org  // orginal source backup
$ cp -a  /home/jhlee/IMX6/fsl-community-bsp/build/tmp/work-shared/imx6qsabreauto/kernel-source/  new // after modified kernel 
$ diff -urN  org  new  > fpga.patch  

상위와 같이 만들어진 patch를 확인한 후 필요한 부분만 사용


3.2 recipes-kernel 찾기

bitbake 사용시 중요한 것은 recipes 이므로 recipes-kernel 관련된 부분을 모두 찾아보자

내 kernel를  recipes 이름을 정확히 알고 있다면 . bb file 파일로 찾자

$ cd ~/IMX6/fsl-community-bsp/   // main으로 이동 
$ find . -name recipes-kernel
./sources/meta-openembedded/meta-initramfs/recipes-kernel
./sources/meta-openembedded/meta-oe/recipes-kernel
./sources/meta-openembedded/meta-networking/recipes-kernel
./sources/meta-fsl-arm-extra/recipes-kernel
./sources/poky/meta-yocto-bsp/recipes-kernel
./sources/poky/meta/recipes-kernel
./sources/poky/meta-skeleton/recipes-kernel
./sources/poky/scripts/lib/bsp/substrate/target/arch/arm/recipes-kernel
./sources/poky/scripts/lib/bsp/substrate/target/arch/i386/recipes-kernel
./sources/poky/scripts/lib/bsp/substrate/target/arch/x86_64/recipes-kernel
./sources/poky/scripts/lib/bsp/substrate/target/arch/powerpc/recipes-kernel
./sources/poky/scripts/lib/bsp/substrate/target/arch/mips/recipes-kernel
./sources/poky/scripts/lib/bsp/substrate/target/arch/qemu/recipes-kernel
./sources/poky/scripts/lib/bsp/substrate/target/arch/mips64/recipes-kernel
./sources/poky/scripts/lib/bsp/substrate/target/arch/common/recipes-kernel
./sources/meta-fsl-arm/openembedded-layer/recipes-kernel
./sources/meta-fsl-arm/recipes-kernel 


3.3 Kernel recipes 의 BB file 확인  

bb file의 예를 들면, 다음과 같다. 
linux-fslc-mx6_3.14-1.0.x.bb  
상위 구조를 보면  '_' 기준으로 PN(Package Name)과 PV(Package Version)를 나누어진다.
그러므로 아래와 같이 검색하면 쉽게 찾는다

  • 나의 기본 KERNEL BB FILE 확인 
상위구조를 이해했으며, 아래와 같이 쉽게 찾도록하자 
$ find ./ -name linux-fslc-mx6*bb* // manual을 보고 이미 kernel recipe 파악 or show-recipe로 추측하자 
.....
$ cd ~/IMX6/fsl-community-bsp/   // main으로 이동 
$ vi ./sources/meta-fsl-arm/recipes-kernel/linux/linux-fslc-mx6_3.14-1.0.x.bb 
# Copyright (C) 2015 O.S. Systems Software LTDA.
# Released under the MIT license (see COPYING.MIT for the terms)

SUMMARY = "FSL Community BSP i.MX6 Linux kernel with backported features and fixes"
DESCRIPTION = "Linux kernel based on Freescale 3.14.28 GA release, used by FSL Community BSP in order to \
provide support for i.MX6 based platforms and include official Linux kernel stable updates, backported \
features and fixes coming from the vendors, kernel community or FSL Community itself."

include linux-fslc.inc

PV .= "+git${SRCPV}"

SRCBRANCH = "3.14-1.0.x-mx6"
SRCREV = "4bae14aef7b8f340f30598d2b076e9ed7b7cba56"

COMPATIBLE_MACHINE = "(mx6)"

상위 bb file 의 내부에 include가 있으므로, linux-fslc.inc 파일을 찾아 세부적으로 보자

  • Source 와 Build된 부분의 defconfig
현재 Kernel config 와 동일한지 우선 확인하자.  
source 의 defconfig 값과 build의 defconfig를 비교를 해보고, 
만약 defconfig를 설정을 변경하고자 하면 source에서 이를 맞춰서 변경해주면된다.
$ cd ~/IMX6/fsl-community-bsp/ 
$ diff  ./sources/meta-fsl-arm/recipes-kernel/linux/linux-fslc-mx6/defconfig   ~/IMX6/fsl-community-bsp/build/tmp/work/imx6qsabreauto-poky-linux-gnueabi/linux-fslc-mx6/3.14-1.0.x+gitAUTOINC+4bae14aef7-r0/defconfig   // 동일 


3.4  Patch를 Yocoto *.bbappend 추가 

상위에서 만들어진, 나의 Linux Patch를 Kernel Recipe에 bbappend로 아래와 같이 추가하자.
보통 bbappend 형식으로 많이 Patch관리를 한다. 

$ cd ~/IMX6/fsl-community-bsp/   // main으로 이동 
$ cd ./sources/meta-fsl-arm/recipes-kernel/linux/  
$ cp ~/IMX6/fsl-community-bsp/build/tmp/work/imx6qsabreauto-poky-linux-gnueabi/linux-fslc-mx6/3.14-1.0.x+gitAUTOINC+4bae14aef7-r0/jhlee/fpga.patch . 
$ mkdir files             //  아래의 bbappend에 따라 subdirectory 생성하지만, files은 기본으로 찾음
$ mv fpga.patch files   // files에 copy 
$ ls
linux-fslc-mx6_3.14-1.0.x.bb        linux-imx                     linux-imx-rt-3.14.28     linux-ls1          linux-timesys-3.0.15
fpga.patch      linux-fslc-mx6_3.14-1.0.x.bbappend  linux-imx-3.14.38             linux-imx-rt_3.14.28.bb  linux-ls1.inc      linux-timesys_3.0.15.bb
linux-fslc      linux-fslc.inc                      linux-imx-mfgtool-3.14.28     linux-imx.inc            linux-ls1_3.12.bb
linux-fslc-mx6  linux-fslc_4.1.bb                   linux-imx-mfgtool_3.14.38.bb  linux-imx_3.14.38.bb     linux-mfgtool.inc


  • bbappend를 적용하여 patch진행 
기본으로 recipe(*.bb)파일 위치기준으로 사용되어지는 files는 FILEPATH에 의해 local file들을 찾을 수 있다.
하지만, 아래와 같이 FILEPEXTRAATHS에 추가적으로 위치를 확장가능
SRC_URI 을 "file://" 사용할 경우 Local File을 사용하는 것이며, 
THISDIR의 위치는 bbappend 파일의 위치이며, 아래와 같이 patch파일을 본인이 원하는 sub directory에 추가

주석처리 했지만, 다양하게 구성해서 해보자 
$ vi linux-fslc-mx6_3.14-1.0.x.bbappend 
FILESEXTRAPATHS_prepend := "${THISDIR}/files:"
#FILESEXTRAPATHS_prepend := "${THISDIR}/v${PV}:"
#FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"
#FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}-${PV}:"
SRC_URI += "file://fpga.patch"
#PRINC := "${@int(PRINC) + 1}" 

* prepend는 맨앞에 할당
* append 는 맨뒤에 할당
* SRC_URI += append 의미이며, file:// 은 local file 의미

  • Patch 문제발생시 확인사항 
상위를 추가하면 quilt 라는 것이 patch를 실행을 하는데, quilt에서 에러가 발생하면 path 내부에러문제인지 자세히 살펴보자.


3.4.1  상위 관련설정 세부사항 설명 


  • FILEPATH
Local FILES들을 기본으로 찾는 PATH로 보통 *bb 파일의 위치로 설정 ({THISDIR}/files:)
  https://www.yoctoproject.org/docs/1.8/ref-manual/ref-manual.html#var-FILESPATH

  • FILESEXTRAPATHS
Local FILE들을 찾는위치를 추가로 확장하는 PATH로 본인이 원하는대로 확장
  https://www.yoctoproject.org/docs/1.8/ref-manual/ref-manual.html#var-FILESEXTRAPATHS

  • SRC_URI
prefix 와 suffix 값에 의해 동작이 결정된다고 생각하면된다. ";" 를 넣어  patchdir를 이용하여 patch dir로 변경가능
  https://www.yoctoproject.org/docs/1.8/ref-manual/ref-manual.html#var-SRC_URI
  http://www.embeddedlinux.org.cn/OEManual/src_uri_variable.html

  • Kernel 관련수정방법
Kernel의 설정인 defconfig 부터 관련 driver 수정에 관련된 부분을 설명
  https://www.yoctoproject.org/docs/1.8/kernel-dev/kernel-dev.html
  https://www.yoctoproject.org/docs/1.8/kernel-dev/kernel-dev.html#changing-the-configuration
  https://www.yoctoproject.org/docs/1.8/kernel-dev/kernel-dev.html#creating-the-append-file


  • cfg 파일 만드는 방법
재미있는 것은  아래와 같이 diffconfig를 이용하면 .config 와 차이점을 *.cfg에 저장을 해준다.

$ bitbake linux-fslc-mx6 -c diffconfig