对这样的通用标题表示歉意,但没想到有什么更好的。
我试图了解在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_relaxed
(elixir)中的writel_relaxed
,i2c_dw_xfer_init()
。
除此以外,都是装配体。这些readl
/ writel
是开始/数据/停止字节序列的实际序列吗?还是我完全理解错了?
在这种情况下,请帮助并指出正确的流程。如果我的理解是正确的,是否有一些更简单的控制器代码,其代码更简洁,可作为参考。
答案 0 :(得分:1)
协议本身不是驱动程序代码的一部分。 dw_ {readl / writel}函数通过调用readl / writel所执行的操作被写入到相关SoC的I2C外设的寄存器中。然后,SoC上I2C控制器的工作就是生成正确的I2C信号。通过浏览数据表,您可以看到类似DW_IC_CON之类的东西是I2C外设存储器映射中的寄存器偏移。