资料下载&百问网技术交流群,百万嵌入式工程师聚集地: https://www.100ask.net/page/2248041
资料下载coding无法使用浏览器打开,必须用git工具下载:
git clone https://e.coding.net/weidongshan/linux/doc_and_source_for_drivers.git
视频观看
百问网驱动大全
I2C_Adapter驱动框架讲解与编写参考资料:
-
Linux内核文档:
Linux-4.9.88\Documentation\devicetree\bindings\i2c\i2c-gpio.txt
Linux-5.4\Documentation\devicetree\bindings\i2c\i2c-gpio.yaml
-
Linux内核驱动程序:使用GPIO模拟I2C
Linux-4.9.88\drivers\i2c\busses\i2c-gpio.c
Linux-5.4\drivers\i2c\busses\i2c-gpio.c
-
Linux内核真正的I2C控制器驱动程序
- IMX6ULL:
Linux-4.9.88\drivers\i2c\busses\i2c-imx.c
- STM32MP157:
Linux-5.4\drivers\i2c\busses\i2c-stm32f7.c
- IMX6ULL:
-
本节视频的代码在GIT仓库里
- IMX6ULL:
doc_and_source_for_drivers\IMX6ULL\source\04_I2C\05_i2c_adapter_framework
- STM32MP157:
doc_and_source_for_drivers\STM32MP157\source\A7\04_I2C\05_i2c_adapter_framework
- IMX6ULL:
-
master_xfer:这是最重要的函数,它实现了一般的I2C传输,用来传输一个或多个i2c_msg
-
master_xfer_atomic:
- 可选的函数,功能跟master_xfer一样,在
atomic context
环境下使用 - 比如在关机之前、所有中断都关闭的情况下,用来访问电源管理芯片
- 可选的函数,功能跟master_xfer一样,在
-
smbus_xfer:实现SMBus传输,如果不提供这个函数,SMBus传输会使用master_xfer来模拟
-
smbus_xfer_atomic:
- 可选的函数,功能跟smbus_xfer一样,在
atomic context
环境下使用 - 比如在关机之前、所有中断都关闭的情况下,用来访问电源管理芯片
- 可选的函数,功能跟smbus_xfer一样,在
-
functionality:返回所支持的flags:各类I2C_FUNC_*
-
reg_slave/unreg_slave:
- 有些I2C Adapter也可工作与Slave模式,用来实现或模拟一个I2C设备
-
reg_slave就是让把一个i2c_client注册到I2C Adapter,换句话说就是让这个I2C Adapter模拟该i2c_client
- unreg_slave:反注册
分配、设置、注册一个i2c_adpater结构体:
- i2c_adpater的核心是i2c_algorithm
- i2c_algorithm的核心是master_xfer函数
-
分配
struct i2c_adpater *adap = kzalloc(sizeof(struct i2c_adpater), GFP_KERNEL);
-
设置
adap->owner = THIS_MODULE; adap->algo = &stm32f7_i2c_algo;
-
注册:i2c_add_adapter/i2c_add_numbered_adapter
ret = i2c_add_adapter(adap); // 不管adap->nr原来是什么,都动态设置adap->nr ret = i2c_add_numbered_adapter(adap); // 如果adap->nr == -1 则动态分配nr; 否则使用该nr
-
反注册
i2c_del_adapter(adap);
-
Linux-5.4中使用GPIO模拟I2C
-
Linux-5.4中STM32F157的I2C驱动
-
Linux-4.9.88中IMX6ULL的I2C驱动
在设备树里构造I2C Bus节点:
i2c-bus-virtual {
compatible = "100ask,i2c-bus-virtual";
};
3.2 platform_driver
分配、设置、注册platform_driver结构体。
核心是probe函数,它要做这几件事:
- 根据设备树信息设置硬件(引脚、时钟等)
- 分配、设置、注册i2c_apdater
i2c_apdater核心是master_xfer函数,它的实现取决于硬件,大概代码如下:
static int xxx_master_xfer(struct i2c_adapter *adapter,
struct i2c_msg *msgs, int num)
{
for (i = 0; i
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?