MTK Linux Charger驱动分析(五)- adapter_class.c
一、代码分析
代码是Linux内核模块的一部分,用于实现一个名为"Charging Adapter"的设备类(class)。这个模块主要针对电源适配器(如充电器)设计,允许驱动程序注册适配器设备,并提供统一的API接口来管理适配器的各种操作,例如获取属性、设置输出容量、认证、获取状态等。代码分为两个文件:
- adapter_class.h:头文件,定义了结构体(如adapter_power_cap用于电源容量信息、adapter_auth_data用于认证数据、adapter_status用于适配器状态、adapter_properties用于设备属性、adapter_device用于设备对象、adapter_ops用于操作回调函数集合)、枚举(如适配器类型、事件、属性、容量类型、返回值)和函数原型。重点是定义了适配器设备的操作接口(ops),类似于一个抽象类,提供钩子函数供具体驱动实现。
- adapter_class.c:源文件,实现头文件中声明的函数。模块初始化时创建设备类(class_create),并定义了sysfs属性(如"name"用于显示设备别名)。大多数导出函数都是包装器:检查设备和ops的有效性,然后调用ops中的对应回调。如果ops未实现,返回-EOPNOTSUPP(操作不支持)。此外,还有设备注册/注销、通知链管理和查找函数。
模块名为"Adapter Class Device",用于电源管理子系统,可能与PD(Power Delivery)充电协议相关(如支持APDO、认证等)。它不直接实现硬件交互,而是提供框架,让其他驱动(如USB PD驱动)注册并实现ops。
关键特性:
- 支持通知链(notifier),允许其他模块订阅事件。
- 通过sysfs暴露设备属性(e.g., /sys/class/Charging Adapter/<name>/name)。</name>
- 错误处理:常用返回码如-EOPNOTSUPP、-ENODEV、-ENOMEM。
- 线程安全:使用mutex保护ops访问,使用SRCU notifier头处理并发。
函数作用说明
以下按文件和类别列出主要函数(包括静态和导出函数),并简要说明其作用。忽略标准库函数(如kzalloc、memcpy)和宏(如EXPORT_SYMBOL)。
从 adapter_class.h 声明的函数(在 .c 中实现):
- *adapter_dev_get_property(struct adapter_device adapter_dev, enum adapter_property sta) 获取适配器的属性(如RP level或PD类型)。检查设备和ops有效性后,调用ops->get_property。如果未实现,返回-EOPNOTSUPP。
- **adapter