在Linux内核树中如何以及在哪里实现用于主机发送/接收的i2c协议?

时间:2019-01-14 11:43:41

标签: linux-kernel linux-device-driver device-driver i2c

对这样的通用标题表示歉意,但没想到有什么更好的。

我试图了解在drivers/i2c/中是按照协议发送的START,ADDR,DATA,STOP位序列的实现的协议序列。我要验证驱动程序代码中的发送/接收协议,这就是这里的全部目的。

我将Hikey 620作为具有DesignWare的I2C控制器的参考。以下是我可以看到的注册代码(elixir):

static const struct i2c_algorithm i2c_dw_algo = {
     .master_xfer = i2c_dw_xfer,
     .functionality = i2c_dw_func,
};

如果我递归地跟踪i2c_dw_xfer函数,那么我可以看到的最后一个调用是readl_relaxedelixir)中的writel_relaxedi2c_dw_xfer_init()

除此以外,都是装配体。这些readl / writel是开始/数据/停止字节序列的实际序列吗?还是我完全理解错了?

在这种情况下,请帮助并指出正确的流程。如果我的理解是正确的,是否有一些更简单的控制器代码,其代码更简洁,可作为参考。

1 个答案:

答案 0 :(得分:1)

协议本身不是驱动程序代码的一部分。 dw_ {readl / writel}函数通过调用readl / writel所执行的操作被写入到相关SoC的I2C外设的寄存器中。然后,SoC上I2C控制器的工作就是生成正确的I2C信号。通过浏览数据表,您可以看到类似DW_IC_CON之类的东西是I2C外设存储器映射中的寄存器偏移。