mach-모델명.c 파일등에서 i2c_board_info 구조체 형태로 각 포트에 맞게 이름과 slave address 를 저장합니다.
static struct i2c_board_info i2c_devs0[] __initdata = {
{ I2C_BOARD_INFO("KXSD9", 0x18), }, /* accelerator */
{ I2C_BOARD_INFO("USBIC", 0x25), }, /* uUSB ic */
{ I2C_BOARD_INFO("max17040", 0x36), }, /* max17040 fuel gauge */
};
s3c_i2c0_set_platdata(NULL);
i2c_register_board_info(0, i2c0_devs, ARRAY_SIZE(i2c0_devs));
드라이버 모듈 init 시 동일한 스트링을
i2c_device_id
구조체에 등록시켜서
i2c_add_driver
을 요청하면 됩니다.
static const struct i2c_device_id max17040_id[] = {
{ "max17040", 0 },
{ }
};
MODULE_DEVICE_TABLE(i2c, max17040_id);
static struct i2c_driver max17040_i2c_driver = {
.driver = {
.name = "max17040",
.owner = THIS_MODULE,
},
.probe = max17040_probe,
.remove = max17040_remove,
.id_table = max17040_id,
};
static int __init max17040_init(void)
{
return i2c_add_driver(&max17040_i2c_driver);
}
module_init(max17040_init);
이렇게 등록시켜 주면 probe 가 호출할때 파라미터로 등록시켜놓은 i2c client 와 id 값을 받을 수 있습니다.
static int max17040_probe(struct i2c_client *client,
const struct i2c_device_id *id)
{
struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent);
...
max17040_client = client;
}
이렇게 전역에 저장시켜 놓은 i2c client 를 i2c r/w 시 사용합니다.
static int max17040_write(u8 reg, u8 value)
{
int ret;
ret = i2c_smbus_write_byte_data(max17040_client, reg, value);
if (ret < 0)
pr_err("%s: error!(%d)\n", __func__, ret);
return ret;
}
static int max17040_read(u8 reg)
{
int ret;
ret = i2c_smbus_read_byte_data(max17040_client, reg);
if (ret < 0)
pr_err("%s: error!(%d)\n", __func__, ret);
return ret;
}
static struct i2c_board_info i2c_devs0[] __initdata = {
{ I2C_BOARD_INFO("KXSD9", 0x18), }, /* accelerator */
{ I2C_BOARD_INFO("USBIC", 0x25), }, /* uUSB ic */
{ I2C_BOARD_INFO("max17040", 0x36), }, /* max17040 fuel gauge */
};
s3c_i2c0_set_platdata(NULL);
i2c_register_board_info(0, i2c0_devs, ARRAY_SIZE(i2c0_devs));
드라이버 모듈 init 시 동일한 스트링을
i2c_device_id
구조체에 등록시켜서
i2c_add_driver
을 요청하면 됩니다.
static const struct i2c_device_id max17040_id[] = {
{ "max17040", 0 },
{ }
};
MODULE_DEVICE_TABLE(i2c, max17040_id);
static struct i2c_driver max17040_i2c_driver = {
.driver = {
.name = "max17040",
.owner = THIS_MODULE,
},
.probe = max17040_probe,
.remove = max17040_remove,
.id_table = max17040_id,
};
static int __init max17040_init(void)
{
return i2c_add_driver(&max17040_i2c_driver);
}
module_init(max17040_init);
이렇게 등록시켜 주면 probe 가 호출할때 파라미터로 등록시켜놓은 i2c client 와 id 값을 받을 수 있습니다.
static int max17040_probe(struct i2c_client *client,
const struct i2c_device_id *id)
{
struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent);
...
max17040_client = client;
}
이렇게 전역에 저장시켜 놓은 i2c client 를 i2c r/w 시 사용합니다.
static int max17040_write(u8 reg, u8 value)
{
int ret;
ret = i2c_smbus_write_byte_data(max17040_client, reg, value);
if (ret < 0)
pr_err("%s: error!(%d)\n", __func__, ret);
return ret;
}
static int max17040_read(u8 reg)
{
int ret;
ret = i2c_smbus_read_byte_data(max17040_client, reg);
if (ret < 0)
pr_err("%s: error!(%d)\n", __func__, ret);
return ret;
}
'Programming > Linux_Kernel' 카테고리의 다른 글
misc 에 sysfs 등록하기 (0) | 2010.02.08 |
---|---|
linux 레지스터 맵핑주소 찾기 (0) | 2010.02.08 |
Probe 함수의 파라미터로 데이터 전달하기 (0) | 2010.02.06 |
linux 에서 GPIO로 I2C Emulation 사용하기 (0) | 2010.02.06 |
linux kernel update list 정리 (2.6.25 - 2.6.29) (0) | 2010.01.28 |