为这样一个通用的标题道歉,但没有比这更好的了。
我正在尝试理解在drivers/i2c/中的哪里是按照协议实现的发送开始、地址、数据、停止位序列的协议序列。我想在驱动程序代码中验证发送/接收协议,这就是这里的所有目标。
我使用Hikey620作为参考,它有DesignWare的I2C控制器。下面是我可以看到的注册码(elixir):
static const struct i2c_algorithm i2c_dw_algo = {
.master_xfer = i2c_dw_xfer,
.functionality = i2c_dw_func,
};如果我递归地跟踪i2c_dw_xfer函数,我能看到的最后一个调用是readl_relaxed,writel_relaxed in i2c_dw_xfer_init() (elixir)。
除此之外,就是所有的组装。这些readl/writel是实际的开始/数据/停止字节序列吗?还是我的理解完全错了?
在这种情况下,请帮助我并指出正确的流程。如果我得到的是正确的,有没有一些更简单的控制器代码,它有一个更干净的实现,可以作为参考。
发布于 2019-01-16 14:57:02
协议本身不是驱动程序代码的一部分。dw_{ readl/writel }函数通过调用readl/writel执行的操作是写入相关SoC的I2C外设的寄存器。SoC上的I2C控制器的工作是生成正确的I2C信令。通过查看数据表,您可以看到类似DW_IC_CON的内容是I2C外设存储器映射中的寄存器偏移量。
https://stackoverflow.com/questions/54180876
复制相似问题