I2C 서브 시스템은 간단한 I2C 프로토콜과는 다르게 굉장히 복잡하게 구현되어 있다.
/devices/i2c/i2c-core.c : I2C의 일반적인 부분을 담당
/devices/i2c/algos : 알고리즘 드라이버
알고리즘 드라이버는 i2c_algorithm 구조체와 관련되어 있는데 기본적인 세가지 알고리즘은 PCF, SGI, PCA, BIT는 여기에 선언되어 있지만 대부분의 것들은 /busses 에서 함께 정의하여 사용한다.
i2c_algorithm 관련해서 master_xfer 와 functionality 콜백 함수만 주로 정의한다.
master_xfer는 데이터 전송을 담당하도록 되어 있다. 예를 들면 에러 발생 시에 몇번을 Retry 하는 지, 전송 전에 어떤 것을 체크하는지에 대한 내용이다.
functionality는 어댑터가 지원하는 기능을 반환하는 함수를 정의해서 등록한다.
알고리즘 드라이버는 버스 어댑터 드라이버와 같이 사용해야 의미를 가진다.
이를 위해서 i2_adapter 구조체가 정의되며, i2c_algorithm으로 정의된 내용은 i2c_adapter의 algo에 등록되어야 한다.
I2C 서브 시스템에서 알고리즘 드라이버와 버스 어댑터 드라이버를 분리한 이유는 보드 수준의 루틴들은 버스 어댑터 드라이버에 정의하고 알고리즘 드라이버는 순전히 데이터 전송을 위한 내용만 정의하기 위해서이다. (실제는 버스 어댑터 드라이버 디렉토리에 하나의 파일을 만들고 혼용되어 정의하고 있다.)
/devices/i2c/busses : 버스 어댑터 드라이버
보통 i2c_adapter의 내용을 정의하고 이를 등록하는 역활을 한다. 등록함수로는 i2c-core.c에서 제공하는 i2c_add_numbered_adapter() 나 i2c_add_adapter 이다.
보통 이러한 adapter 등록 과정은 probe 함수에서 처리된다. 당연한 얘기지만 probe 함수가 있다는 것은 platform_driver에 대한 선언을 여기서 한다는 것을 의미한다.
최근의 ARM 계열 프로세서는 대부분 I2C Host I/O를 가지고 있는데 이를 사용하기 위해서는 포트 설정, 클럭 설정, 레지스터 초기화 과정 등을 해주어야 한다. 이러한 것들이 버스 어댑터 드라이버에 있는 소스에서 주로 처리된다. (probe() 함수에서 대부분 처리된다.)
/devices/i2c/chips : 슬레이브와 클라이언트 드라이버 관련 코드
이름 그대로 I2C 슬레이브 칩들에 대한 드라이버 소스 파일이 여기에 저장된다. 대표적인 I2C 슬레이브 칩이라고 하면 GPIO Expender, Audio Codec, RTC, Touch IC controller 등이 있다. 리눅스의 디렉토리 구조상 GPIO Expender를 제외하고는 다른 디렉토리를 가지고 있기 때문에 chips에 있는 소스들은 대부분 GPIO Expender 칩들에 대한 소스라고 생각하면 된다. (pca9539.c, pca963x, pcf8574.c pcf8575.c 들이 여기에 해당한다)
여기에서 하는 일을 보면 i2c_driver 를 정의하는데 attach_adapter와 detach_client 콜백 함수를 정해주어야 한다. attach_adapter의 콜백 함수를 보면 i2c_probe 함수를 호출하여 xxx_probe() 함수를 등록하는데 xxx_probe()에서는 i2c_attach_client()를 호출하게 된다. i2c_attach_client() 에 의한 등록은 I2C 통신을 위하여 가장 필요한 I2C 슬레이브 장치의 주소를 설정하는 일이다.
정리하면 algos와 busses는 I2C Host와 관련된 내용이 구현되어 있고, chips에는 I2C Slave에 대한 내용이 구현되어 있다.
대부분의 구조체는 include/linux/i2c.h에 정의되어 있다.
대부분의 ID는 include/linux/i2c-id.h에 정의되어 있고 새로운 ID를 선언하려면 여기에 추가하면 된다.
http://blog.daum.net/baramjin/16011037
'C++ > Linux & Device Driver' 카테고리의 다른 글
Platform Devices and Drivers (0) | 2012.01.04 |
---|---|
[Device driver] printk 커널 메시지 출력 (0) | 2011.12.23 |
[명령어] grep (0) | 2011.12.22 |
[명령어] find 사용법 (0) | 2011.12.21 |
PVR_K:(Error) (2) | 2011.12.21 |