首页 > 其他分享 >typec CC脚检测中断

typec CC脚检测中断

时间:2023-07-07 17:35:53浏览次数:26  
标签:lib chg CC typec 中断 mode rc smblite

	[TYPEC_ATTACH_DETACH_IRQ] = {
		.name		= "typec-attach-detach",
		.handler	= smblite_typec_attach_detach_irq_handler,
		.wake		= true,
	},

 

irqreturn_t smblite_typec_attach_detach_irq_handler(int irq, void *data)
{
        struct smb_irq_data *irq_data = data;
        struct smb_charger *chg = irq_data->parent_data;
        u8 stat;
        bool attached = false;
        int rc;

        /* IRQ not expected to be executed for uUSB, return */
        if (chg->connector_type == POWER_SUPPLY_CONNECTOR_MICRO_USB)
                return IRQ_HANDLED;

        smblite_lib_dbg(chg, PR_INTERRUPT, "IRQ: %s\n", irq_data->name);

        rc = smblite_lib_read(chg, TYPE_C_STATE_MACHINE_STATUS_REG, &stat);
        if (rc < 0) {
                smblite_lib_err(chg, "Couldn't read TYPE_C_STATE_MACHINE_STATUS_REG rc=%d\n",
                        rc);
                return IRQ_HANDLED;
        }

        attached = !!(stat & TYPEC_ATTACH_DETACH_STATE_BIT);

        if (attached) {
                rc = smblite_lib_read(chg, TYPE_C_MISC_STATUS_REG, &stat);
                if (rc < 0) {
                        smblite_lib_err(chg, "Couldn't read TYPE_C_MISC_STATUS_REG rc=%d\n",
                                rc);
                        return IRQ_HANDLED;
                }

                if (smblite_lib_get_prop_dfp_mode(chg) ==
                                POWER_SUPPLY_TYPEC_SINK_AUDIO_ADAPTER) {
                        chg->sink_src_mode = AUDIO_ACCESS_MODE;
                        typec_ra_ra_insertion(chg);
                } else if (stat & SNK_SRC_MODE_BIT) {
                        chg->sink_src_mode = SRC_MODE;
                        typec_sink_insertion(chg);  //mode的切换
                } else {
                        chg->sink_src_mode = SINK_MODE;
                        typec_src_insertion(chg);//mode的切换
                }

                rc = typec_partner_register(chg);
                if (rc < 0)
                        smblite_lib_err(chg, "Couldn't to register partner rc =%d\n",
                                        rc);
        } else {
                switch (chg->sink_src_mode) {
                case SRC_MODE:
                        typec_sink_removal(chg);  
                        break;
                case SINK_MODE:
                case AUDIO_ACCESS_MODE:
                        typec_src_removal(chg);
                        break;
                case UNATTACHED_MODE:
                default:
                        typec_mode_unattached(chg);
                        break;
                }

                if (!chg->pr_swap_in_progress)
                        chg->sink_src_mode = UNATTACHED_MODE;

                /*
                 * Restore DRP mode on type-C cable disconnect if role
                 * swap is not in progress, to ensure forced sink or src
                 * mode configuration is reset properly.
                 */

                if (chg->typec_port && !chg->pr_swap_in_progress) {
                        /*
                         * Schedule the work to differentiate actual removal
                         * of cable and detach interrupt during role swap,
                         * unregister the partner only during actual cable
                         * removal.
                         */
                        cancel_delayed_work(&chg->pr_swap_detach_work);
                        vote(chg->awake_votable, DETACH_DETECT_VOTER, true, 0);
                        schedule_delayed_work(&chg->pr_swap_detach_work,
                                msecs_to_jiffies(TYPEC_DETACH_DETECT_DELAY_MS));
                        smblite_lib_force_dr_mode(chg, TYPEC_PORT_DRP);

                        /*
                         * To handle cable removal during role
                         * swap failure.
                         */
                        chg->typec_role_swap_failed = false;
                }
        }

        rc = smblite_lib_masked_write(chg, USB_CMD_PULLDOWN_REG,
                        EN_PULLDOWN_USB_IN_BIT,
                        attached ?  0 : EN_PULLDOWN_USB_IN_BIT);
        if (rc < 0)
                smblite_lib_err(chg, "Couldn't configure pulldown on USB_IN rc=%d\n",
                                rc);

        power_supply_changed(chg->usb_psy);

        return IRQ_HANDLED;
}

  

标签:lib,chg,CC,typec,中断,mode,rc,smblite
From: https://www.cnblogs.com/yuanqiangfei/p/17535599.html

相关文章

  • mono_inertial_euroc.cc
    从main函数开始讲解,##表示源码判断参数是否大于等于5个,否则,输入有误,直接返回,正确执行参数如下./Examples/Monocular-Inertial/mono_inertial_euroc./Vocabulary/ORBvoc.txt./Examples/Monocular-Inertial/EuRoC.yaml${dir}/MH01./Examples/Monocular-Inertial/EuRoC_TimeS......
  • mac执行npm或yarn命令时报Error: EACCES: permission denied,
    npm下载的时候会告知权限没有这是由于之前使用了sudo去下载一些东西,导致文件拥有者都变成了root,只需要修改权限即可。Error:EACCES:permissiondenied,symlink‘…/lib/node_modules/json-server/lib/cli/bin.js’->‘/usr/local/bin/json-server’解决方法:找到......
  • 有关access_token与refresh_token 理解
    下面是对接各种平台api的流程一般操作流程是下面的1始通过用户授权获取code,2然后通过code获取到  access_token和 refresh_token   3访问api必须携带  access_token 举例access_token:aaaaexpires_in:10分钟refresh_token :  bbbrefresh_expires_......
  • 中断子系统-1.中断相关结构体描述
    1.irq_desc数组位于include/linux/irqdesc.hstructirq_desc{ structirq_common_data irq_common_data; structirq_data irq_data; unsignedint__percpu *kstat_irqs; irq_flow_handler_t handle_irq; structirqaction *action; /*IRQactionlist*/ unsignedi......
  • MegEngine 使用小技巧:如何使用 MegCC 进行模型编译
    MegEngine 作为一个训推一体的AI框架,为用户提供了模型训练以及部署的能力。但是在部署模型时,由于会存在对于部署的模型计算来说不必要的代码,导致SDK体积比较大。为了解决上述问题,我们提供了新的工具:AI编译器 MegCC。MegCC有以下特性:只生成完成输入模型计算的必要的ke......
  • mac安装gcc7
    查看gcc版本gcc--version1、安装gccbrewinstallgcc@7cd/usr/local/Cellar改名mvgcc\@7/gcc 2、打开mac的SIP防护,因为要修改文件csrutilstatus为开启状态则不需要修改重启后按command+r打开控制台输入csrutildisable重启后即可修改/usr/local下文件csrutilena......
  • 第三届计算机应用与信息安全国际会议(ICCAIS2023)
    由湖北省众科地质与环境技术服务中心主办的2023第三届计算机应用与信息安全国际会议(ICCAIS2023)将于2023年12月20-22日在中国武汉召开。 ICCAIS2023力图建立 一个国际化的计算机应用与信息安全领域的学术交流平台,分享最新进展和研究成果。期待您的参与。 ★重要信息大会时间:20......
  • 正点原子内存管理实验室,keil mdk 和stm32cubeide gcc的函数替换
    https://www.cnblogs.com/RegressionWorldLine/p/11968467.html转载记录下 STM32.ld链接文件分析及一次bug解决过程问题描述原子板的代码中含有一个关于使用外部SRAM的功能,由于本人的开发板的SRAM只有512K,因此稍微修改了一下代码,同时使用GCC进行编译,但是这里却报错了,源码如......
  • 2023年7月5日,生产者消费者模型,线程的休眠、礼让、合并、中断、生命周期、守护线程
    线程复习1.线程的休眠需求:编写一个抽取学员回答问题的程序,要求倒数三秒后输出被抽中的学员姓名分析:1.创建String数组存放学员姓名2.利用随机数获取学员下标3.通过下标获取学员姓名4.倒计时3秒通过for循环使用Thread.sleep(1000)来实现,Thread.sleep(1000);此方法为静态......
  • PHP应用出现500 : The page cannot be displayed because an internal server error h
    问题描述PHP应用突然遇见了500 Thepagecannotbedisplayedbecauseaninternalservererrorhasoccurred.错误,但是如果访问一个静态HTML页面,就可以成功。只要是PHP页面,就是500。 问题解答登录AppService的Kudu站点,查看日志发现一句:  scriptProcessorcouldnotbefoun......