量产的项目遇到一个问题,10%的充电线不充电。将这些不良的充电线接到另一个项目或者其他手机上,能正常充电。问题跟着线走,但为什么这种线接到其他手机能充电呢。
拿到有问题的usb线后,通过WARN_ON/dump_stack函数查看充电流程的堆栈,发现检测充电线插入的方式不一样。一种是通过vbus来检测充电(这种比较容易理解),另一种通过typec中断(typec线的cc脚会进行握手,标准协议)来检测充电线的插拔。由于typec线不良(内部的电阻阻值不对),导致握手失败,进而不能触发typec中断,所以手机不能充电。
故事的背景讲完了,讲下本文故事的主角extcon(USB external connector)。先看两个项目的dts配置,
project1 config
extcon_gpio: extcon-gpio {
compatible = "linux,extcon-usb-gpio";
vbus-gpio = <&pmic_eic 0 GPIO_ACTIVE_HIGH>;
};
&hsphy {
extcon = <&extcon_gpio>;
};
project2 config
pmic_typec: typec@380 {
compatible = "sprd,sc27xx-typec", "sprd,sc2730-typec";
interrupt-parent = <&sc2730_pmic>;
};
&hsphy {
extcon = <&pmic_typec>;
};
先看project1 config是如何检测充电线的插入的。
drivers/extcon/extcon-usb-gpio.c
先分配edev,初始化内核通知链
static const unsigned int usb_extcon_cable[] = {
EXTCON_USB,
EXTCON_USB_HOST,
EXTCON_NONE,
};
static int usb_extcon_probe(struct platform_device *pdev)
{
...
info->edev = devm_extcon_dev_allocate(dev, usb_extcon_cabl

文章探讨了一项目中10%充电线无法充电的问题,揭示了检测方式的差异:一种通过VBUS,另一种依赖Type-C中断。文章详细解释了extcon(外部USB连接器)在项目配置中的角色,涉及DTS配置和内核通知链的使用。作者揭示了问题线材的Type-C握手失败原因,并展示了两个项目配置的对比分析。
最低0.47元/天 解锁文章
1240

被折叠的 条评论
为什么被折叠?



