在 Linux 内核树中如何以及在何处实现主发送/接收的 i2c 协议



这样一个通用的标题道歉,但想不出更好的了。

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

我正在使用Hikey 620作为参考,它具有DesignWare的I2C控制器。以下是我可以看到的注册码(长生不老药):

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

如果我递归地跟踪i2c_dw_xfer函数,我可以看到的最后一个调用是 readl_relaxedwritel_relaxed i2c_dw_xfer_init()(长生不老药)。

除此之外,就是所有的组装。这些readl/writel是开始/数据/停止字节序列的实际序列吗?还是我理解得完全错误?

在这种情况下,请帮助并指出我正确的流程。如果我得到的是正确的,是否有一些更简单的控制器代码,它具有更干净的实现并且可以用作参考。

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

最新更新