在linux驱动中调用I2C的方法

本文介绍了如何在Linux驱动程序中注册和使用I2C。首先,通过创建`i2c_board_info`结构体并注册I2C总线,接着在驱动中初始化`tda_client`结构体,实现`tda_probe`和`tda_remove`函数以进行设备探测和移除。然后,提供了读写函数`tda_i2c_write`和`tda_i2c_read`用于I2C传输。最后建议参考Linux内核中的I2C例子进行学习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、在相应的平台文件中添加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", 0x
48),
.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 tda
001;

static int tda_remove(struct i2c_client *client)
{
struct tda_client *tda = &tda
001;
if (tda->client && tda->client != client)
{
i2c_unregister_device(tda->client);
tda
001.client = NULL;
}

return 0;
}

static int tda_probe(struct i2c_client *client, const struct i2c_device_id *id)
{
struct tda_client *tda = &tda
001;
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 = &tda
001;
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 = &tda
001;
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的例子,可以认真阅读理解,然后再自己编写就可以了。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值