본문 바로가기

Programming/Linux_Kernel

정식 i2c port 에 등록하여 사용하기

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;
}