4.6 Inter-IC (I2C)
4.6.1 Introduction
LPI2C는 간단하고 효율적인 데이터 교환 방법을 제공하여 디바이스 사이의 상호 연결을 최소화하는 양방향 시리얼 버스이다.
Linux OS를 위한 LPI2C 드라이버는 두 부분으로 구성된다:
- Bus driver(버스 드라이버) - LPI2C 버스와 통신하는 데 사용되는 저수준의 인터페이스
- Chip driver(칩 드라이버) - 다른 디바이스 드라이버와 LPI2C 버스 드라이버 사이의 인터페이스
I2C 버스 드라이버는 I2C 버스와 인터페이스하는 데 사용되는 저수준의 인터페이스이다. 이 드라이버는 I2C 칩 드라이버에서 호출되고 사용자 공간에 노출되지 않는다. 표준 Linux 커널에는 I2C 버스로 데이터를 전송하기 위한 버스 드라이버에 액세스하기 위해 칩 드라이버가 사용하는 코어 I2C 모듈이 포함되어 있다. 이 버스 드라이버는 아래를 지원한다:
- I2C 버스 표준과 호환성
- 최대 400Kbps의 비트 전송률
- 표준 I2C 마스터 모드
- I2C를 일시 중지와 재개하는 전원 관리 기능
4.6.2 LPI2C Bus Driver Overview
LPI2C 버스 드라이버는 칩 드라이버에서만 호출(invoke)되고 사용자 공간에 노출되지 않는다. 표준 Linux 커널에는 코어 I2C 모듈이 포함되어 있다. 그것은 LPI2C 버스로 데이터를 전송하기 위해 LPI2C 버스 드라이버에 액세스하는 칩 드라이버에서 사용된다. 칩 드라이버는 코어 I2C 모듈에 액세스하기 위해 Linux 커널에서 제공되는 표준 커널 공간 API를 사용한다. 표준 I2C 커널 함수는 커널 소스 트리의 Documentation/i2c 아래에 있는 파일에 문서화되어 있다. 이 버스 드라이버는 아래 기능을 지원한다:
- I2C 버스 표준과 호환 가능
- 인터럽트 기반, 바이트 단위 데이터 전송
- 표준 I2C 마스터 모드
4.6.3 I2C Device Driver Overview
I2C 디바이스 드라이버는 LPI2C 버스 드라이버와 통신하는 데 필요한 모든 Linux I2C 데이터 구조를 구현한다. LPI2C 버스에 연결된 디바이스로 데이터를 전송하기 위해 사용자 커널 공간 API를 다른 디바이스 드라이버에 노출한다. 내부적으로, 이러한 API 함수는 I2C 코어 모듈을 호출하기 위해 표준 I2C 커널 공간 API를 사용한다. I2C 코어 모듈은 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_algorithm 구조체에 대한 포인터이다. 이것은 데이터가 I2C 버스로 전송되는 방법을 기술한다. 알고리즘 구조체에는 I2C 칩 드라이버가 I2C 디바이스와 통신하려고 할 때마다 호출되는 함수에 대한 포인터가 포함되어 있다.
시작하는 동안, I2C 버스 어댑터는 드라이버가 로드될 때 I2C 코어에 등록된다. 특정 아키텍처에는 두 개 이상의 I2C 모듈이 있다. 그렇다면, 드라이버는 I2C 코어가 있는 각 I2C 모듈에 대해 별도의 i2c_adapter 구조체를 등록한다. 이러한 어댑터는 드라이버가 언로드될 때 등록 해제(제거)된다.
정상적인 통신 동안, 전송에 NACK 감지와 같은 일부 오류 조건이 감지되면 시간이 초과되고 오류를 반환한다. 오류 조건이 발생하면, 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 디바이스 드라이버는 표준 SMBus 인터페이스를 사용하여 LPI2C 버스에 연결된 디바이스의 레지스터를 읽고 쓸 수 있다. 자세한 내용은 include/linux/i2c.h를 참조한다.