具体芯片的I2C_Adapter驱动分析
文章目录
- 具体芯片的I2C_Adapter驱动分析
- 参考资料:
- 一、 I2C控制器内部结构
- 1.1 通用的简化结构
- 1.2 IMX6ULL的I2C控制器内部结构
- 二、 I2C控制器操作方法
- 三、 分析代码
- 3.1 设备树
- 3.2 驱动程序分析
- 致谢
参考资料:
- Linux内核真正的I2C控制器驱动程序
- IMX6ULL:
Linux-4.9.88\drivers\i2c\busses\i2c-imx.c
- IMX6ULL:
一、 I2C控制器内部结构
1.1 通用的简化结构
1.2 IMX6ULL的I2C控制器内部结构
二、 I2C控制器操作方法
- 使能时钟、设置时钟
- 发送数据:
- 把数据写入tx_register,等待中断发生
- 中断发生后,判断状态:是否发生错误、是否得到回应信号(ACK)
- 把下一个数据写入tx_register,等待中断:如此循环
- 接收数据:
- 设置controller_register,进入接收模式,启动接收,等待中断发生
- 中断发生后,判断状态,读取rx_register得到数据
- 如此循环
三、 分析代码
3.1 设备树
-
IMX6ULL:
arch/arm/boot/dts/imx6ull.dtsi
i2c1: i2c@021a0000 { #address-cells = <1>; #size-cells = <0>; compatible = "fsl,imx6ul-i2c", "fsl,imx21-i2c"; reg = <0x021a0000 0x4000>; interrupts = <GIC_SPI 36 IRQ_TYPE_LEVEL_HIGH>; clocks = <&clks IMX6UL_CLK_I2C1>; status = "disabled"; // 在100ask_imx6ull-14x14.dts把它改为了"okay" };
3.2 驱动程序分析
读I2C数据时,要先发出设备地址,这是写操作,然后再发起读操作,涉及写、读操作。所以以读I2C数据为例讲解核心代码。
- IMX6ULL:函数
i2c_imx_xfer
分析:
致谢
以上笔记源自
韦东山
老师的视频课程,感谢韦老师,韦老师是嵌入式培训界一股清流,为嵌入式linux开发点起的星星之火,也愿韦老师桃李满园。聚是一团火,散是满天星!
在这样一个速食的时代,坚持做自己,慢下来,潜心琢磨,心怀敬畏,领悟知识,才能向下扎到根,向上捅破天,背着世界往前行!
仅此向嵌入行业里的每一个认真做技术的从业者致敬!