Linux kernel linux内核树中主发送/接收的i2c协议是如何实现的,在哪里实现的?

Linux kernel linux内核树中主发送/接收的i2c协议是如何实现的,在哪里实现的?,linux-kernel,linux-device-driver,device-driver,i2c,Linux Kernel,Linux Device Driver,Device Driver,I2c,为这样一个通用的标题道歉,但想不出更好的 我试图理解在drivers/i2c/中,根据协议,发送START、ADDR、DATA、STOP位序列的协议序列在哪里实现。我想在驱动程序代码中验证发送/接收协议,这就是这里的全部目标 我使用Hikey 620作为参考,其中包含DesignWare的I2C控制器。下面是我可以看到的注册码(): 如果我递归地跟踪i2c\u dw\u xfer函数,我能看到的最后一个调用是readl\u relaxed,writel\u relaxed在i2c\u dw\u

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

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

我使用Hikey 620作为参考,其中包含DesignWare的I2C控制器。下面是我可以看到的注册码():

如果我递归地跟踪
i2c\u dw\u xfer
函数,我能看到的最后一个调用是
readl\u relaxed
writel\u relaxed
i2c\u dw\u xfer\u init()中

除此之外,还有所有的装配。这些
readl
/
writel
是启动/数据/停止字节序列的实际序列吗?还是我完全错了


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

协议本身不是驱动程序代码的一部分。dw_{readl/writel}函数通过调用readl/writel所做的是写入相关SoC的I2C外围设备的寄存器。SoC上的I2C控制器的任务是生成正确的I2C信号。通过查看数据表,您可以看到类似DW_IC_CON的内容是I2C外围内存映射中的寄存器偏移量。

这是否意味着适配器或客户端驱动程序不必担心启动/停止位序列。他们需要做的就是转储要读/写的地址和数据?如果是,我们是否也可以假设控制器固件已编程为遵循i2c协议,并将适当的启动/停止位附加到从适配器驱动程序接收的消息中?i2c驱动程序本身不担心启动/停止位排序。司机主要做两件事1。设置外围设备2的寄存器。它与Linux定义的I2C核心子系统集成,通过/dev/I2C-x接口公开I2C设备。在我们讨论的内容中没有控制器固件这样的东西。任何外围SoC IP都是硬件。“遵循i2c协议,并在从适配器驱动程序接收到的消息中附加适当的启动/停止位”是的,谢谢,但我在这里仍然感到困惑。你的意思是在驱动程序中的某个地方有代码附加启动/停止位序列,还是由控制器完成而不需要任何固件?它是在硬件中完成的。
static const struct i2c_algorithm i2c_dw_algo = {
     .master_xfer = i2c_dw_xfer,
     .functionality = i2c_dw_func,
};