Programming/Linux_Kernel
linux kernel 에서 i2c slave address 등록 위치
decdream
2009. 12. 22. 15:56
커널 버전 : 2.6.24.*
드라이버 코드들을 보다보면 다음과 같이 probe 함수에서 i2c_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
함수내부를 따라가다 보면 등록하는 부분을 찾을 수 있다.
드라이버 코드들을 보다보면 다음과 같이 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;
}
{
.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
함수내부를 따라가다 보면 등록하는 부분을 찾을 수 있다.