在 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的实现主要是实现数据的传输速度配置以及读写,这里由于涉及到很多芯片寄存器,不过多详解。