快速业务通道

实例解析linux内核I2C体系结构(2)

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-04-17
sg *msgs, int num)

smbus_xfer中的参数设置及调用方法如下:

static int pca953x_write_reg(struct pca953x_chip *chip, int reg, uint16_t val)
{
int ret;
ret = i2c_smbus_write_word_data(chip->client, reg << 1, val);
if (ret < 0) {
dev_err(&chip->client->dev, "failed writing register\n");
return -EIO;
}
return 0;
}

上面函数完成向芯片的地址为reg的寄存器写一个16bit的数据.i2c_smbus_write_word_data的实现如下:

s32 i2c_smbus_write_word_data(struct i2c_client *client, u8 command, u16 value)
{
union i2c_smbus_data data;
data.word = value;
return i2c_smbus_xfer(client->adapter,client->addr,client->flags,
I2C_SMBUS_WRITE,command,
I2C_SMBUS_WORD_DATA,&data);
}

从中可以看出smbus传输一个16位数据的方法.其它操作如:字符写、字符读、字读、块操作等,可以参考内核的i2c-core.c中提供的方法.

● 注销i2c_driver

static void __exit pca953x_exit(void)
{
i2c_del_driver(&pca953x_driver);
}
module_exit(pca953x_exit);

● detach_client动作

顺序调用内核中注册的适配器来断开我们注册过的i2c设备.此过程通过调用i2c_driver中的attach_adapter方法完成的.具体实现形式如下:

static int pca953x_detach_client(struct i2c_client *client)
{
int err;
struct pca953x_chip *data;
if ((err = i2c_detach_client(client)))//断开i2c_client
return err;
data=i2c_get_clientdata(client);
cdev_del(&(data->cdev));
unregister_chrdev_region(MKDEV(pca953x_major, 0), 1);
kfree(data->client);
kfree(data);
return 0;
}

(2) Probe方式(new style)

● 构建i2c_driver

和LEGACY方式一样,也需要构建i2c_driver,但是内容有所不同.

static struct i2c_driver pca953x_driver = {
.driver = {
.name= "pca953x",
},
.probe= pca953x_probe, //当有i2c_client和i2c_driver匹配时调用
.remove= pca953x_remove,//注销时调用
.id_table= pca953x_id,//匹配规则
};

● 注册i2c_driver

static int __init pca953x_init(void)
{
return i2c_add_driver(&pca953x_driver);
}
module_init(pca953x_init);

在注册i2c_driver的过程中,是将driver注册到了i2c_bus_type的总线上.此总线的匹配规则是:

static const struct i2c_device_id *i2c_match_id(const struct i2c_device_id *id,

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号