본문 바로가기

Programming/Linux_Kernel

linux kernel 에서 i2c slave address 등록 위치

커널 버전 : 2.6.24.*

드라이버 코드들을 보다보면 다음과 같이 probe 함수에서 i2c_client 정보를 받아와서 사용하는 경우가 있다.

static struct i2c_driver P_i2c_driver =
{
    .driver = {
        .name = "P_driver",
    },
 
    .probe = P_probe,
...
};

static int P_probe (struct i2c_client *client)
{
     ...
    if( strcmp(client->name, PROX_DEVICE_NAME) != 0 )
        ...
    else if( (ret = P_dev_init(client)) < 0 )
        ...
    P_dev.client = client
}

이러한 경우에 어느 곳에서 이것을 등록시켜 주어야 할지 난감한 경우가 있다.

kernel 에서는
i2c_register_board_info()
라는 함수를 사용해서 i2c 정보들을 등록시켜 둔다.
보통 이 함수는 한두 단계 함수로 캡슐되어 있지만, 따라가다 보면 쉽게 찾을 수 있다.
나의 수정된 커널에는 다음과 같이 구성되어 있다.


static struct i2c_board_info __initdata h2_i2c_board_info[] = {
 {              
  I2C_BOARD_INFO("m-5mo", M5MO_I2C_ADDR),
 },
 {
  I2C_BOARD_INFO("sfvga", SFVGA_I2C_ADDR),
 },
...

}

static int __init omap3430_i2c_init(void)
{
 omap_register_i2c_bus(1, 100, NULL, 0);
 omap_register_i2c_bus(2, 400, h2_i2c_board_info, ARRAY_SIZE(h2_i2c_board_info));
 omap_register_i2c_bus(3, 400, NULL, 0);
 return 0;
}

 omap_register_i2c_bus
함수내부를 따라가다 보면 등록하는 부분을 찾을 수 있다.