i2c adapter驱动简单介绍

在 Linux 内核中,I2C 是一种用于简化的嵌入式系统中的硬件接口,它允许在设备之间进行通信,而无需通过 CPU 进行干预。I2C 适配器的编号用于在系统中唯一标识每个适配器。

i2c适配器驱动的实现是通过调用i2c_add_numbered_adapter函数。

"i2c_add_numbered_adapter" 函数的目的是将一个具有特定编号的 I2C 适配器添加到系统中。它的函数原型如下:

 

c复制代码

int i2c_add_numbered_adapter(struct i2c_adapter *adap);

对于i2c_add_numbered_adapter最重要的是参数struct i2c_adapter *adap;

struct i2c_adapter {
    struct module *owner;
    unsigned int class;          /* classes to allow probing for */
    const struct i2c_algorithm *algo; /* the algorithm to access the bus */
    void *algo_data;

    /* data fields that are valid for all devices    */
    const struct i2c_lock_operations *lock_ops;
    struct rt_mutex bus_lock;
    struct rt_mutex mux_lock;

    int timeout;            /* in jiffies */
    int retries;
    struct device dev;        /* the adapter device */

    int nr;
    char name[48];
    struct completion dev_released;

    struct mutex userspace_clients_lock;
    struct list_head userspace_clients;

    struct i2c_bus_recovery_info *bus_recovery_info;
    const struct i2c_adapter_quirks *quirks;

    struct irq_domain *host_notify_domain;
};

以drivers\i2c\busses\i2c-s3c2410.c为例主要实现如下:

    strlcpy(i2c->adap.name, "s3c2410-i2c", sizeof(i2c->adap.name));//设备的名字
    i2c->adap.owner = THIS_MODULE;
    i2c->adap.algo = &s3c24xx_i2c_algorithm;//实现数据的传输
    i2c->adap.retries = 2;//传输数据失败时重试的次数
    i2c->adap.class = I2C_CLASS_DEPRECATED;

    i2c->adap.algo_data = i2c;
    i2c->adap.dev.parent = &pdev->dev;

    i2c->adap.nr = i2c->pdata->bus_num;//i2c 编号
    i2c->adap.dev.of_node = pdev->dev.of_node;

从以上可以看出最重要的是adap.algo的master_xfer实现

static const struct i2c_algorithm s3c24xx_i2c_algorithm = {
    .master_xfer        = s3c24xx_i2c_xfer,
    .functionality        = s3c24xx_i2c_func,
};

master_xfer的实现主要是实现数据的传输速度配置以及读写,这里由于涉及到很多芯片寄存器,不过多详解。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值