一、在相应的平台文件中添加I2C的注册信息
1)、创建一个i2c_board_info结构体(平台文件目录Arch\arm\mach-xxx)
struct tda_platform_data //这可以随便定义自己想要的结构
{
unsigned char register0;
unsigned char register1;
unsigned char register2;
};
struct tda_platform_data tda_pdata
static struct i2c_board_info __initdata tda_i2c2_boardinfo[] =
{
{
I2C_BOARD_INFO("tda", 0x48),
.platform_data = &tda_pdata,
},
};
2)、注册
omap_register_i2c_bus(2, 400, tda_i2c2_boardinfo,ARRAY_SIZE(tda_i2c2_boardinfo)); //第一个参数是通道,第二个参数是速率(400KHz)
二、在驱动中以下信息
struct tda_client
{
struct i2c_client *client;
struct i2c_msg xfer_msg;
};
static struct tda_client tda001;
static int tda_remove(struct i2c_client *client)
{
struct tda_client *tda = &tda001;
if (tda->client && tda->client != client)
{
i2c_unregister_device(tda->client);
tda001.client = NULL;
}
return 0;
}
static int tda_probe(struct i2c_client *client, const struct i2c_device_id *id)
{
struct tda_client *tda = &tda001;
if (i2c_check_functionality(client->adapter, I2C_FUNC_I2C) == 0)
{
printk("can't talk I2C2\n");
return -1;
}
tda->client = client;
return 0;
}
static const struct i2c_device_id tda_ids[] =
{
{"tda",0},
{ },
};
MODULE_DEVICE_TABLE(i2c, tda_ids);
static struct i2c_driver tda_driver =
{
.driver.name
= "TDA_DRIVER",
.id_table
= tda_ids,
.probe
= tda_probe,
.remove
= tda_remove,
};
int Init_I2C2(void)
{
return i2c_add_driver(&tda_driver);
}
void Deinit_I2C2(void)
{
i2c_del_driver(&tda_driver);
}
三、添加读写函数
int tda_i2c_write(unsigned char reg,unsigned char value)
{
struct tda_client *tda = &tda001;
struct i2c_msg *msg;
int ret = 0;
msg = &tda->xfer_msg;
msg->addr= reg;
msg->len = 1;
msg->flags = 0;
msg->buf = &value;
ret = i2c_transfer(tda->client->adapter, &tda->xfer_msg, 1);
if(ret!=1)
return -1;
else
return 0;
}
int tda_i2c_read(unsigned char reg,unsigned char *value)
{
struct tda_client *tda = &tda001;
struct i2c_msg *msg;
int ret = 0;
msg = &tda->xfer_msg;
msg->addr= reg;
msg->len = 1;
msg->flags = 1;
msg->buf = value;
ret = i2c_transfer(tda->client->adapter, &tda->xfer_msg, 1);
if(ret!=1)
return -1;
else
return 0;
}
四、其实 linux内核中就有很多调用I2C的例子,可以认真阅读理解,然后再自己编写就可以了。