1. 代码整体分析
mtk_pd_adapter.c(源文件)
- 主要内容:
- 该文件实现了MediaTek平台的USB PD(Power Delivery)适配器驱动,基于Linux内核的电源管理和Type-C端口控制器(TCPC)框架。
- 它处理PD协议事件,包括PD连接状态、Type-C状态、水检测(WD_STATUS)、Sink VBUS变化等。
- 支持APDO(Augmented PDO)和PPS(Programmable Power Supply),包括能力查询、认证、电压/电流请求。
- 与电源供应(power_supply)子系统集成,用于控制电源路径和高电压充电。
- 使用PHY接口处理DPDM pulldown(用于水检测恢复)。
- 定义了适配器操作接口(adapter_ops),包括获取/设置能力、输出、状态、认证等。
- 支持DT解析配置(如适配器名称、force_cv、ita_min)。
- 驱动注册为平台驱动(mtk_pd_adapter_driver),支持探针、移除和关机。
- 代码遵循GPL-2.0许可,作者为Wy Chuang(2019年,MediaTek Inc.)。
- 作用:桥接TCPC硬件和上层充电器驱动(如mtk_charger.c),处理PD事件通知、能力协商和控制。支持高功率充电(PPS/APDO)、异常保护(OCP/OTP/OVP)和水检测。代码依赖外部模块如tcpm.h(TCPC管理)和adapter_class.h(适配器类)。它不直接处理充电算法,而是提供接口给其他模块(如mtk_charger.c中的notify_adapter_event)。
- 关键特性:
- 事件驱动:通过TCP通知器处理PD/Type-C事件,并广播到上层。
- 能力支持:查询和设置PD/APDO能力,认证适配器是否支持PPS/CC。
- 错误转换:将TCPC返回码映射到MTK适配器返回码。
- 空实现:看门狗相关函数为空(pd_set_wdt/pd_enable_wdt)。
- 静态表:apdo_pps_tbl定义PPS电压范围,用于计算PDP(Power Delivery Power)。
- 注意:代码中有些函数标记为__maybe_unused(如pd_authentication、pd_is_cc),表示可能未使用但保留。驱动依赖"type_c_port0" TCPC设备,如果未就绪则延迟探针。
总体上,这是一个模块化的PD适配器驱动,与USB Type-C/PD硬件集成,支持快充协议,并与其他MTK充电模块(如mtk_charger)协作。
2. 函数的主要作用
以下列出主要函数(从代码中提取),按类别分组。仅列出关键函数,忽略内联或辅助函数。作用基于代码逻辑描述。
初始化和配置函数(从mtk_pd_adapter_probe调用)
- mtk_pd_adapter_probe:驱动探针函数。分配内存,解析DT,注册适配器设备,获取TCPC设备,注册TCP通知器。如果TCPC未就绪,则延迟探针。返回0表示成功。
- adapter_parse_dt:从设备树(DT)解析适配器配置(如名称、force_cv、ita_min、bootmode)。设置默认值,返回0表示成功。
- mtk_pd_adapter_remove:驱动移除函数(空实现,返回0)。
- mtk_pd_adapter_shutdown:关机处理函数(空实现)。
PD控制和能力函数
- pd_set_cap:设置适配器能力(如MTK_PD_APDO_START/END、MTK_PD_APDO、MTK_PD)。使用tcpm_dpm_pd_request或tcpm_set_apdo_charging_policy请求电压/电流。返回MTK_ADAPTER_OK或错误码。
- pd_get_output:获取