PD快充 - fusb302驱动调试笔记

这篇具有很好参考价值的文章主要介绍了PD快充 - fusb302驱动调试笔记。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、fusb302介绍

Fusb302是可编程的USB Type-C控制器,支持识别各种USB 设备和对应的状态;且支持最高100W的PD协议。

Fusb302用CC1/CC2引脚与typeC电源适配器通信,通过PD协议来设置电源适配器的输出电压和电流,从而达到控制充电电压电流,实现快充的目的。

说白了,就是通过 PD协议 控制电源适配器,从VBUS输出不同功率的电源(最高100W)。

PD快充 - fusb302驱动调试笔记

 二、fusb302引脚功能

引脚

功能

CC1/CC2

主要用来 PD协议通信 或 其他:

1)探测USB连接,区分正反面,区分DFP和UFP的主从关系

2)配置Vbus,有USB Type-C和USB Power Delivery两种模式

3)配置Vconn,当线缆里有芯片的时候,一个cc传输信号,一个cc变成供电Vconn,用来给线缆里的芯片供电(3.3V或5V);

4)如果CC通道连接其他配置,如连接音频配件、DP、PCIE时,CC通道配置是不同的。

VBUS

VBUS为电源适配器提供的用来给电池充电的总线电源,USB PD协议可配置电压和电流,最大100W,如:20V 5A

VCONN

当线缆里有芯片的时候,一个cc传输信号,一个cc变成供电Vconn,用来给线缆里的芯片供电(3.3V或5V)

INIT_N

中断输出,当有事件发生时,用于通知处理器读取I2C寄存器数据。如:插入/拔出typeC,INIT_N都会拉低一下。

SCL、SDA

I2C时钟、数据引脚

介绍:

1、主从

SRC:Source,供电端如:充电器。

SNK:Sink,受电端如:手电筒。

2、DFP、UFP、DRP用途解析

① DFP:Source,下行端口,可以理解为一个Host,DFP作为source给VBUS和vcon供电的,简单理解为一个提供电源的设备,如:电源适配器。

② UFP:Sink,上行端口,可以理解为Device,UFP可以理解为受电端口,DFP为供电端口,UFP从VBUS中取电,并可提供数据。典型设备如:U盘、移动硬盘。

③ DRP:双角色端口,DRP既可以做DFP(Source)又可以做UFP(Sink),也可以在DFP和UFP间动态切换,典型设备是:笔记本电脑、充电宝。

充电宝为UFP(Sink)的应用:电源适配器给充电宝充电。

充电宝为DFP(Source)的应用:充电宝给手机或其他设备充电。

三、fusb302驱动移植及修改方法

PD快充 - fusb302驱动调试笔记

与供应商沟通,原厂前期只提供了mcu的代码没提供linux的。因此移植瑞芯微的板子里的fusb302驱动到酷芯平台。

PD快充 - fusb302驱动调试笔记

1、将fusb302驱动编译成.ko,并加载

1)设备树dts添加子节点,fusb302挂载 i2c3上

&i2c3 {
         status = "okay";
         fusb0:fusb30x@22 {
                 compatible = "fairchild,fusb302";
                 reg = <0x22>;                                    //设备地址
                 int-n-gpios = <&porta0 4 GPIO_ACTIVE_HIGH>;     //GPIO_A0_4
                 status = "okay";
         };
};

引脚配置如下:

i2c 和 gpio 引脚

PD快充 - fusb302驱动调试笔记

 2)Makefile

KERN_DIR = /home/dongao/share/kernel/linux-linaro-stable-lsk-v4.9-17.07  #内核路径

all:
    make -C $(KERN_DIR) ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- M=`pwd` modules 

clean:
    make -C $(KERN_DIR) ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- M=`pwd` modules clean
    rm -rf modules.order

obj-m    += fusb302.o

3)加载并测试

删除没有定义的 extcon相关函数。

$ make                                //ubuntu下编译生成 fusb302.ko

$ insmod fusb302.ko        //ARM板加载驱动

发现问题:

问题1:probe() 中的 devm_extcon_dev_allocate() 函数会失败。

PD快充 - fusb302驱动调试笔记

 解决方法:内核配置 extcon。

PD快充 - fusb302驱动调试笔记

问题2:酷芯提供的内核的 drivers\extcon\extcon.c 中的 extcon_info[] 没有定义 EXTCON_USB_VBUS_EN

解决方法:按照rk内核的extcon.c文件,extcon_info[]数组添加 EXTCON_USB_VBUS_EN 如下。

struct __extcon_info {
    unsigned int type;
    unsigned int id;
    const char *name;

} extcon_info[] = {
    ...
/* 2022-08-22 donga add */
       [EXTCON_USB_VBUS_EN] = {
                .type = EXTCON_TYPE_USB,
                .id = EXTCON_USB_VBUS_EN,
                .name = "USB_VBUS_EN",
        },
    ...
}

问题3:正常运行probe()后,插上typec电源适配器后,发现电源适配器不停的发送 Hard Rest。

PD快充 - fusb302驱动调试笔记

分析原因:PD协议对实时性要求比较高,fusb302收到适配器适配器的cap自动返回GoodCRC之后,要在15ms内发送request,不然电源适配器会发送HardReset命令。rk平台主频高,每个打印信息也只消耗1ms左右,而酷芯为900M主频,每个打印信息都间隔10ms左右。因此没来得及发送request。

解决方法:见修改驱动源码。

借用一张网图,描述PD协议交互过程:

PD快充 - fusb302驱动调试笔记

 2、修改驱动源码

修改方向:发送完GoodCRC后,会触发 INTERRUPTB_GCRCSENT 中断,状态机中尽量减少不需要的分支。

PD快充 - fusb302驱动调试笔记

 PD快充 - fusb302驱动调试笔记

 之后,经过多次HardRest,某次及时request进入正常充电。(此时代码不稳定,我想要每次都能立刻request进入正常充电)。继续调试代码。

同时,测试typeC拔出时,应该能产生INIT_N中断。示波器测INIT_N脚,确实有拉低的动作,奇怪为什么没有运行中断处理函数?

原因:驱动代码中断配置成 IRQF_ONESHOT | IRQF_TRIGGER_LOW 模式,中断处理函数中关中断,工作队列再开中断。之后就无法触发了。(如果不关开中断,可以一直触发)。这个问题找厂家协助处理中。。。

测试发现下降沿触发不会出现这样的问题,因此对代码作出修改,改为 IRQF_TRIGGER_FALLING 模式加载驱动时,还需判断 type-C插入状态。

如下:

PD快充 - fusb302驱动调试笔记

3、验证fusb302驱动,结合bq25720 充电管理IC

fusb302只是控制typeC电源适配器的VBUS脚输入的电压和电流。充电还需要充电管理IC,这里为 bq25720(驱动方法看相关文档)。

如:项目中fusb302控制电压适配器VBUS输出为 9V 3A,再通过 bq25720 限制到 8V 2A(实际看功率,要比VBUS的功率小),最终给电池充电。

PD快充 - fusb302驱动调试笔记

 硬件环境:

PD快充 - fusb302驱动调试笔记

 PD快充 - fusb302驱动调试笔记

 PD快充流程:

PD快充 - fusb302驱动调试笔记

1)fusb302 原理图

PD快充 - fusb302驱动调试笔记

2)加载驱动

$ insmod fusb302.ko                 //ARM板加载fusb302.ko驱动

$ insmod bq25720_charger.ko //ARM板加载bq25720_charger.ko驱动

3)逻辑分析仪采集CC1/2 PD协议通信过程

Sink发送Soft_Rest信号

PD快充 - fusb302驱动调试笔记

 Sink请求

PD快充 - fusb302驱动调试笔记

 PD快充 - fusb302驱动调试笔记

至此,每次插上type-c充电时,电流计能检测到 9V 2.2A左右。与我代码里设置的值一致。

附上源码:https://download.csdn.net/download/hinewcc/87589264文章来源地址https://www.toymoban.com/news/detail-447076.html

到了这里,关于PD快充 - fusb302驱动调试笔记的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Type-C PD充电器诱骗PD+QC+AFC+FCP全协议快充取电5V9V12V15V20V

    Type-C充电器采用的是PD快充协议,支持的电压高,电流大,一般有5V3A、9V3A、12V3A、15V3A、20V5A等等。 因为充电器内部有协议芯片,当外部设备连接时,设备会和充电器进行协议匹配,匹配成功之后,充电器才会输出相应的电压给设备供电,所以没有这个XSP12取电芯片,充电器就

    2024年02月04日
    浏览(36)
  • 常见手机快充协议介绍

    早在几年前,各厂家就在逐步推进手机的充电速度,随着QC、PD等一系列的充电协议不断更新,各家手机厂家都有自己的快充解决方案,不仅功率不一样,手机间的充电协议与标准也变得越发复杂,不同品牌的手机快充名称也各有不同。所以我们需要先清楚我们的手机采用的充

    2024年02月05日
    浏览(30)
  • Steamcommunity302使用教程介绍

    Steamcommunity302怎么使用?最近有用户询问这个问题,Steam是一款好用的游戏平台,但是也会遇到好友系统连接不上的情况,而Steamcommunity302就是为了解决这个问题推出的,那么怎么使用呢? Steamcommunity302使用教程: 1、首先我们需要下载一个steamcommunity302软件。 2、一般我们会下

    2024年02月13日
    浏览(26)
  • Windows高级调试(学习笔记)-第二章-调试器介绍

    2.1.1 Debugger Types调试器类型 User Mode Deduggers(用户态调试器) 实时调试(Living Debugging)、事后调试(Postmortem Debugging) 三个用户态调试器:cdb.exe、nstd.exe及windbg.exe Kernel Mode Debugger(内核态调试器) 可以分析计算机系统 二个内核态调试器:kd.exe及windbg.exe 2.1.2 Debugger Commands调试器命令 buil

    2024年01月18日
    浏览(54)
  • F1C200S/F1C100S修改U-BOOT调试串口为UART1(PD3,PD4)

    此处用的uboot是荔枝派nano的 可以从荔枝派的仓库拉取 修改好的在这 查看串口挂载总线 查看数据手册 根据总线图可以看出串口是挂载在APB总线上面的 找到总线时钟设置部分 使能UART1控制器时钟 原本以为要改这,但是后来发现不需要修改。。。 设置GPIO引脚复用功能 直接pd

    2024年02月14日
    浏览(35)
  • Python pd.merge()函数介绍(全)

    目录 1.前言 2.参数介绍 参数如下: 3.基础案例 3.1on演示 3.2left_on 和 right_on 3.3left_index 和 right_index 3.4数据连接的类型 3.4.1 在数据合并操作中,有两个操作函数 pd.caoncat() 和 pd.merge()   , 这两个函数在使用过程中经常会拿来比较,只要我们弄懂了其中重要

    2024年02月10日
    浏览(25)
  • 野火霸天虎 STM32F407 学习笔记_1 stm32介绍;调试方法介绍

    博主开始探索嵌入式以来,其实很早就开始玩 stm32 了。但是学了一段时间之后总是感觉还是很没有头绪,不知道在学什么。前前后后分别尝试了江协科技、正点原子、野火霸天虎三次 stm32 的课程学习。江协科技的 stm32f103c8t6 课程看了一段时间,感觉对一些外设的调用方法有

    2024年02月06日
    浏览(31)
  • HTTP项目常见状态码笔记(200,302,400,403,404,405,500...),

    目录 认识 \\\"状态码\\\" (status code) 出现200 403 Forbidden 出现404 404 Not Found 出现 405 Method Not Allowed 出现 500 Internal Server Error 504 Gateway Timeout 302 Move temporarily 301 Moved Permanently 出现 \\\"空白页面\\\"   出现 \\\"无法访问此网站\\\" 状态码表示访问一个页面的结果 . ( 是访问成功 , 还是失败 , 还是其

    2024年02月11日
    浏览(31)
  • Linux驱动开发笔记(四):设备驱动介绍、熟悉杂项设备驱动和ubuntu开发杂项设备Demo

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/134533533 红胖子网络科技博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中… 上一篇:《Linux驱动开发笔记(三

    2024年02月05日
    浏览(37)
  • 支持笔记本电脑直插直充,TOWE 65W智能快充PDU超级插座

    电源插排在我们的生活中是必不可少的电器配件。今天,我们日常生活中所使用的电子设备越来越多,无论是手机、平板、笔记本电脑还是各种家用电器,都需要电源来驱动。虽然相对于其他电器来说,插排结构比较简单,但现代家庭用电器普遍具有通电时间长、通电设备多

    2024年02月08日
    浏览(23)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包