linux下的extcon驱动小析

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

      量产的项目遇到一个问题,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
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值