rk3576+安卓14 ---上电时序调整

文章目录

一、问题描述

一个外设的供电由SOC的gpio控制,高电平使能供电。原来的控制方式是上电后直接使能供电。

PD协商时,供电会从5v跃迁到9v,导致外设的供电存在一个明显的上电台阶

二、解决思路

延时700ms之后再使能供电,避开电压波动期

市面上大部分pd适配器协商时间大概在500~600ms,在此基础上再预留100ms

三、实现方案

bash 复制代码
// 查看每个cable的名字
# for d in /sys/class/extcon/extcon0/cable.*; do echo "$d: $(cat $d/name)"; done
/sys/class/extcon/extcon0/cable.0: USB
/sys/class/extcon/extcon0/cable.1: USB-HOST
/sys/class/extcon/extcon0/cable.2: USB_VBUS_EN
/sys/class/extcon/extcon0/cable.3: SDP
/sys/class/extcon/extcon0/cable.4: CDP
/sys/class/extcon/extcon0/cable.5: DCP
/sys/class/extcon/extcon0/cable.6: SLOW-CHARGER

# cat /sys/class/extcon/extcon0/state
USB=1
USB-HOST=0
USB_VBUS_EN=0
SDP=0
CDP=0
DCP=0
SLOW-CHARGER=0

可知extcon0已正确上报USB插入,USB=1 ---> VBUS检测正常

实现一个简单的驱动程序:

Extcon事件处理函数:通过cable.0判断USB是否插入,触发延迟工作队列

延迟工作函数中实现开启电源的操作

此外,当usb口同时也作为供电口时,此时extcon0已经再kernel早期就上报了USB=1的事件,而驱动在later init阶段才加载probe,这时候extcon状态对于驱动来说"没有变化",notifier将永远不会被触发

因此在probe函数时就不能只依赖notifier变化事件,而需要主动读取当前状态并处理

四、部分代码实现

c 复制代码
static int usb_a_power_probe(struct platform_device *pdev)
{
    struct device *dev = &pdev->dev;
    struct usb_a_power_data *data;
    bool attached;
    int ret;

    data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL);
    if (!data)
        return -ENOMEM;

    data->dev = dev;
    data->delay_ms = 700;
    of_property_read_u32(dev->of_node, "delay-ms", &data->delay_ms);

    data->enable_gpio = devm_gpiod_get(dev, "enable", GPIOD_OUT_LOW);
    if (IS_ERR(data->enable_gpio))
        return PTR_ERR(data->enable_gpio);

    data->edev = extcon_get_edev_by_phandle(dev, 0);
    if (IS_ERR(data->edev))
        return PTR_ERR(data->edev);

    INIT_DELAYED_WORK(&data->enable_work, usb_a_enable_work);

    data->extcon_nb.notifier_call = usb_a_extcon_handler;
    ret = extcon_register_notifier(data->edev, 0, &data->extcon_nb);
    if (ret)
        return ret;

    //处理开机时已插入的情况
    attached = extcon_get_state(data->edev, 0);
    dev_info(dev, "USB initial state: %s\n", attached ? "attached" : "detached");
    if (attached) {
        dev_info(dev, "Scheduling USB-A power-on after %u ms\n", data->delay_ms);
        schedule_delayed_work(&data->enable_work,
                              msecs_to_jiffies(data->delay_ms));
    }

    platform_set_drvdata(pdev, data);
    dev_info(dev, "USB-A power driver probed (delay=%u ms)\n", data->delay_ms);
    return 0;
}
相关推荐
Libraeking3 小时前
破壁行动:在旧项目中丝滑嵌入 Compose(混合开发实战)
android·经验分享·android jetpack
市场部需要一个软件开发岗位4 小时前
JAVA开发常见安全问题:Cookie 中明文存储用户名、密码
android·java·安全
JMchen1235 小时前
Android后台服务与网络保活:WorkManager的实战应用
android·java·网络·kotlin·php·android-studio
crmscs6 小时前
剪映永久解锁版/电脑版永久会员VIP/安卓SVIP手机永久版下载
android·智能手机·电脑
localbob6 小时前
杀戮尖塔 v6 MOD整合版(Slay the Spire)安卓+PC端免安装中文版分享 卡牌肉鸽神作!杀戮尖塔中文版,电脑和手机都能玩!杀戮尖塔.exe 杀戮尖塔.apk
android·杀戮尖塔apk·杀戮尖塔exe·游戏分享
机建狂魔6 小时前
手机秒变电影机:Blackmagic Camera + LUT滤镜包的专业级视频解决方案
android·拍照·摄影·lut滤镜·拍摄·摄像·录像
hudawei9966 小时前
flutter和Android动画的对比
android·flutter·动画
lxysbly8 小时前
md模拟器安卓版带金手指2026
android
儿歌八万首9 小时前
硬核春节:用 Compose 打造“赛博鞭炮”
android·kotlin·compose·春节
消失的旧时光-194311 小时前
从 Kotlin 到 Dart:为什么 sealed 是处理「多种返回结果」的最佳方式?
android·开发语言·flutter·架构·kotlin·sealed