4.6 Inter-IC (I2C)
4.6.1 Introduction
LPI2C는 단순하고 효율적인 데이터 교환 방법을 제공하여 디바이스 간의 상호 연결을 최소화하는 양방향(bidirectional) 시리얼 버스이다.
Linux OS용 LPI2C 드라이버는 두 부분이 있다 :
- 버스 드라이버 - LPI2C 버스와 통신하기 위해 사용되는 저수준의 인터페이스
- 칩 드라이버 - 다른 디바이스 드라이버와 LPI2C 버스 드라이버 사이의 인터페이스
I2C 버스 드라이버는 I2C 버스와 인터페이스하기 위해 사용되는 저수준의 인터페이스이다. 이 드라이버는 I2C 칩 드라이버에서 호출되고 사용자 공간에 노출되지 않는다. 표준 Linux 커널에는 core I2C 모듈이 포함되어 있다. 이 모듈은 칩 드라이버가 I2C 버스로 데이터를 전송하는 버스 드라이버에 액세스하기 위해 사용한다. 이 버스 드라이버는 아래를 지원한다 :
- I2C 버스 표준과 호환성
- 최대 400Kbps의 비트 전송률
- 표준 I2C 마스터 모드
- I2C를 일시 중단하고 재개하는 전원 관리 기능 제공
4.6.2 LPI2C Bus Driver Overview
LPI2C 버스 드라이버는 칩 드라이버에서만 호출하고 사용자 공간에 노출되지 않는다. 표준 Linux 커널에는 core I2C 모듈이 포함되어 있다. 이 모듈은 칩 드라이버가 LPI2C 버스로 데이터를 전송하는 LPI2C 버스 드라이버에 액세스하기 위해 사용한다. 칩 드라이버는 Linux 커널에서 제공하는 표준 커널 공간 API를 사용하여 core I2C 모듈에 액세스한다. 표준 I2C 커널 함수는 커널 소스 트리의 Documentation/i2c에서 사용할 수 있는 파일에 설명되어 있다. 이 버스 드라이버는 아래의 기능을 지원한다 :
- I2C 버스 표준과 호환성
- 인터럽트 구동, 바이트 단위 데이터 전송
- 표준 I2C 마스터 모드
4.6.3 I2C Device Driver Overview
I2C 디바이스 드라이버는 LPI2C 버스 드라이버와 통신하기 위해 필요한 모든 Linux I2C 데이터 구조체를 구현한다. 사용자 정의한 커널 공간 API를 다른 디바이스 드라이버에 노출하여, LPI2C 버스에 연결된 디바이스로 데이터를 전송한다. 내부적으로, 이러한 API 함수는 표준 I2C 커널 공간 API를 사용하여 I2C core 모듈을 호출한다. I2C core 모듈은 LPI2C 버스 드라이버를 찾고, 데이터를 전송하기 위해 LPI2C 버스 드라이버에서 적절한 함수를 호출한다. 이 드라이버는 다른 디바이스 드라이버에게 아래 함수를 제공한다 :
- 디바이스 레지스터를 읽는 read 함수
- 디바이스 레지스터를 쓰는 write 함수
4.6.4 Software Operation
Linux OS용 I2C 드라이버는 I2C 버스 드라이버와 I2C 칩 드라이버의 두 부분으로 구성된다.
4.6.5 I2C Bus Driver Software Operation
I2C 버스 드라이버는 i2c_adapter라는 구조체로 설명된다. 이 구조체에서 가장 중요한 필드는 struct i2c_algorithm *algo 이다. 이 필드는 데이터가 I2C 버스로 전송되는 방법을 설명하는 i2c_algorithm 구조체에 대한 포인터이다. 알고리즘 구조체는 I2C 칩 드라이버가 I2C 디바이스와 통신하기를 원할 때마다 호출되는 함수에 대한 포인터를 포함한다.
시작하는 동안, 드라이버가 로드될 때 I2C 버스 어댑터가 I2C core에 등록된다. 특정 아키텍처에는 둘 이상의 I2C 모듈이 있다. 그런 경우, 드라이버는 I2C core를 포함하는 각 I2C 모듈에 대해 별도의 i2c_adapter 구조체를 등록한다. 이러한 어댑터는 드라이버가 언로드될 때 등록 해제(제거)된다.
일반적인 통신 중에, NACK가 감지되는 것과 같은 전송에 오류 조건이 있는 경우, 시간이 초과(timeout)되고 오류를 반환한다. 오류 조건이 발생하면, I2C 드라이버는 전류 전송을 중지해야 한다.
4.6.6 I2C Device Driver Software Operation
I2C 드라이버는 I2C 버스의 개별 I2C 디바이스를 컨트롤한다. 구조체 i2c_driver는 I2C 칩 드라이버를 설명한다. 이 구조체에서 관심 있는 필드는 flags와 attach_adapter이다. flags 필드는 I2C_DF_NOTIFY 값으로 설정되어, 드라이버가 로드된 후 새로운 I2C 디바이스에 대한 통보를 칩 드라이버로 할 수 있다. I2C 버스 드라이버가 로드되면, 데이터를 전송하는 적절한 방법을 사용할 수 있는 버스 드라이버와 관련된 i2c_adapter 구조체를 이 드라이버에 저장한다.
4.6.7 Driver Features
LPI2C 드라이버는 아래 기능을 지원한다 :
- I2C 통신 프로토콜
- I2C 마스터 작동 모드
참고
LPI2C 드라이버는 슬레이브 모드를 지원하지 않는다.
4.6.8 Source Code Structure
아래 테이블은 drivers/i2c/busses에서 사용 가능한 드라이버 소스 파일을 보여준다.
Table 43. I2C Driver Files
File | Description |
drivers/i2c/busses/imx-lpi2c.c | i.MX 8, i.MX 8X용 LPI2C Bus Driver |
drivers/i2c/busses/imx-i2c.c | i.MX 6, i.MX 7, i.MX 8M용 I2C Bus Driver |
4.6.9 Menu Configuration Options
menuconfig로 모듈을 활성화하는 커널 옵션을 구성한다 :
i.MX 6, i.MX 7, i.MX 8M에서는 Device Drivers > I2C support > I2C Hardware Bus support > IMX I2C interface를 선택한다.
i.MX 8, i.MX 8X에서는 Device Drivers > I2C support > I2C Hardware Bus support > IMX Low Power I2C interface를 선택한다.
4.6.10 Programming Interface
LPI2C 디바이스 드라이버는 LPI2C 버스에 연결된 디바이스의 레지스터를 읽고 쓸 수 있는 표준 SMBus 인터페이스를 사용할 수 있다. 자세한 내용은 include/linux/i2c.h를 참조한다.