[RK3588-Android12] 关于如何取消usb-typec的pd充电功能

问题描述

RK3588取消usb-typec的pd充电功能


解决方案:

在dts中fusb302节点下usb_con: connector子节点下添加如下熟悉:
请添加图片描述
打上如下2个补丁

diff --git a/drivers/usb/typec/tcpm/tcpm.c b/drivers/usb/typec/tcpm/tcpm.c
index c8a4e57c9f9b..173f8cb75b8e 100644
--- a/drivers/usb/typec/tcpm/tcpm.c
+++ b/drivers/usb/typec/tcpm/tcpm.c
@@ -317,6 +317,7 @@ struct tcpm_port {struct typec_partner *partner;enum typec_cc_status cc_req;
+	enum typec_cc_status src_rp;	/* work only if pd_supported == false */enum typec_cc_status cc1;enum typec_cc_status cc2;
@@ -324,6 +325,7 @@ struct tcpm_port {bool attached;bool connected;
+	bool pd_supported;enum typec_port_type port_type;/*
@@ -827,6 +829,9 @@ static enum typec_cc_status tcpm_rp_cc(struct tcpm_port *port)int nr_pdo = port->nr_src_pdo;int i;+	if (!port->pd_supported)
+		return port->src_rp;
+/** Search for first entry with matching voltage.* It should report the maximum supported current.
@@ -3682,9 +3687,11 @@ static int tcpm_src_attach(struct tcpm_port *port)if (ret < 0)return ret;-	ret = port->tcpc->set_pd_rx(port->tcpc, true);
-	if (ret < 0)
-		goto out_disable_mux;
+	if (port->pd_supported) {
+		ret = port->tcpc->set_pd_rx(port->tcpc, true);
+		if (ret < 0)
+			goto out_disable_mux;
+	}/** USB Type-C specification, version 1.2,
@@ -3715,7 +3722,8 @@ static int tcpm_src_attach(struct tcpm_port *port)out_disable_vconn:tcpm_set_vconn(port, false);out_disable_pd:
-	port->tcpc->set_pd_rx(port->tcpc, false);
+	if (port->pd_supported)
+		port->tcpc->set_pd_rx(port->tcpc, false);out_disable_mux:tcpm_mux_set(port, TYPEC_STATE_SAFE, USB_ROLE_NONE,TYPEC_ORIENTATION_NONE);
@@ -3931,6 +3939,20 @@ static enum typec_pwr_opmode tcpm_get_pwr_opmode(enum typec_cc_status cc)}}+static enum typec_cc_status tcpm_pwr_opmode_to_rp(enum typec_pwr_opmode opmode)
+{
+	switch (opmode) {
+	case TYPEC_PWR_MODE_USB:
+		return TYPEC_CC_RP_DEF;
+	case TYPEC_PWR_MODE_1_5A:
+		return TYPEC_CC_RP_1_5;
+	case TYPEC_PWR_MODE_3_0A:
+	case TYPEC_PWR_MODE_PD:
+	default:
+		return TYPEC_CC_RP_3_0;
+	}
+}
+static void run_state_machine(struct tcpm_port *port){int ret;
@@ -4061,6 +4083,10 @@ static void run_state_machine(struct tcpm_port *port)if (port->ams == POWER_ROLE_SWAP ||port->ams == FAST_ROLE_SWAP)tcpm_ams_finish(port);
+		if (!port->pd_supported) {
+			tcpm_set_state(port, SRC_READY, 0);
+			break;
+		}port->upcoming_state = SRC_SEND_CAPABILITIES;tcpm_ams_start(port, POWER_NEGOTIATION);break;
@@ -4333,7 +4359,10 @@ static void run_state_machine(struct tcpm_port *port)current_limit = PD_P_SNK_STDBY_MW / 5;tcpm_set_current_limit(port, current_limit, 5000);tcpm_set_charge(port, true);
-			tcpm_set_state(port, SNK_WAIT_CAPABILITIES, 0);
+			if (!port->pd_supported)
+				tcpm_set_state(port, SNK_READY, 0);
+			else
+				tcpm_set_state(port, SNK_WAIT_CAPABILITIES, 0);break;}/*
@@ -4582,7 +4611,8 @@ static void run_state_machine(struct tcpm_port *port)tcpm_set_vbus(port, true);if (port->ams == HARD_RESET)tcpm_ams_finish(port);
-		port->tcpc->set_pd_rx(port->tcpc, true);
+		if (port->pd_supported)
+			port->tcpc->set_pd_rx(port->tcpc, true);tcpm_set_attached_state(port, true);tcpm_set_state(port, SRC_UNATTACHED, PD_T_PS_SOURCE_ON);break;
@@ -6121,6 +6151,7 @@ EXPORT_SYMBOL_GPL(tcpm_tcpc_reset);static int tcpm_fw_get_caps(struct tcpm_port *port,struct fwnode_handle *fwnode){
+	const char *opmode_str;const char *cap_str;int ret;u32 mw, frs_current, pd_revision;
@@ -6153,22 +6184,37 @@ static int tcpm_fw_get_caps(struct tcpm_port *port,return ret;port->typec_caps.type = ret;port->port_type = port->typec_caps.type;
+	port->pd_supported = !fwnode_property_read_bool(fwnode, "pd-disable");port->slow_charger_loop = fwnode_property_read_bool(fwnode, "slow-charger-loop");if (port->port_type == TYPEC_PORT_SNK)goto sink;-	/* Get source pdos */
-	ret = fwnode_property_count_u32(fwnode, "source-pdos");
-	if (ret <= 0)
-		return -EINVAL;
+	/* Get Source PDOs for the PD port or Source Rp value for the non-PD port */
+	if (port->pd_supported) {
+		ret = fwnode_property_count_u32(fwnode, "source-pdos");
+		if (ret == 0)
+			return -EINVAL;
+		else if (ret < 0)
+			return ret;-	port->nr_src_pdo = min(ret, PDO_MAX_OBJECTS);
-	ret = fwnode_property_read_u32_array(fwnode, "source-pdos",
-					     port->src_pdo, port->nr_src_pdo);
-	if ((ret < 0) || tcpm_validate_caps(port, port->src_pdo,
-					    port->nr_src_pdo))
-		return -EINVAL;
+		port->nr_src_pdo = min(ret, PDO_MAX_OBJECTS);
+		ret = fwnode_property_read_u32_array(fwnode, "source-pdos",
+						     port->src_pdo, port->nr_src_pdo);
+		if (ret)
+			return ret;
+		ret = tcpm_validate_caps(port, port->src_pdo, port->nr_src_pdo);
+		if (ret)
+			return ret;
+	} else {
+		ret = fwnode_property_read_string(fwnode, "typec-power-opmode", &opmode_str);
+		if (ret)
+			return ret;
+		ret = typec_find_pwr_opmode(opmode_str);
+		if (ret < 0)
+			return ret;
+		port->src_rp = tcpm_pwr_opmode_to_rp(ret);
+	}if (port->port_type == TYPEC_PORT_SRC)return 0;
@@ -6182,6 +6228,11 @@ static int tcpm_fw_get_caps(struct tcpm_port *port,if (port->typec_caps.prefer_role < 0)return -EINVAL;sink:
+	port->self_powered = fwnode_property_read_bool(fwnode, "self-powered");
+
+	if (!port->pd_supported)
+		return 0;
+/* Get sink pdos */ret = fwnode_property_count_u32(fwnode, "sink-pdos");if (ret <= 0)
@@ -6198,9 +6249,7 @@ static int tcpm_fw_get_caps(struct tcpm_port *port,return -EINVAL;port->operating_snk_mw = mw / 1000;-	port->self_powered = fwnode_property_read_bool(fwnode, "self-powered");
-
-	/* FRS can only be supported byb DRP ports */
+	/* FRS can only be supported by DRP ports */if (port->port_type == TYPEC_PORT_DRP) {ret = fwnode_property_read_u32(fwnode, "new-source-frs-typec-current",&frs_current);
-- 
diff --git a/drivers/usb/typec/tcpm/tcpm.c b/drivers/usb/typec/tcpm/tcpm.c
index 173f8cb75b8e..afeed1a05545 100644
--- a/drivers/usb/typec/tcpm/tcpm.c
+++ b/drivers/usb/typec/tcpm/tcpm.c
@@ -6512,6 +6512,13 @@ static int tcpm_psy_set_prop(struct power_supply *psy,struct tcpm_port *port = power_supply_get_drvdata(psy);int ret;+	/*
+	 * All the properties below are related to USB PD. The check needs to be
+	 * property specific when a non-pd related property is added.
+	 */
+	if (!port->pd_supported)
+		return -EOPNOTSUPP;
+switch (psp) {case POWER_SUPPLY_PROP_ONLINE:ret = tcpm_psy_set_online(port, val);
-- 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/46274.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用OpenCV寻找图像中的轮廓

引言 OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉和机器学习软件库。它提供了大量的视觉处理功能&#xff0c;包括图像和视频捕获、特征检测与匹配、图像变换、图像分割、颜色空间转换等。在图像处理中&#xff0c;寻找图像中的…

electron项目中实现视频下载保存到本地

第一种方式&#xff1a;用户自定义选择下载地址位置 渲染进程 // 渲染进程// 引入 import { ipcRenderer } from "electron";// 列表行数据下载视频操作&#xff0c;diffVideoUrl 是视频请求地址 handleDownloadClick(row) {if (!row.diffVideoUrl) {this.$message…

【数字电路学习新助手】掌握电路仿真软件,开启数字电路知识的新篇章

在信息科技日新月异的今天&#xff0c;数字电路知识的重要性不言而喻。无论是通信工程、计算机科学与技术&#xff0c;还是电子信息技术等领域&#xff0c;数字电路都是基础中的基础。然而&#xff0c;对于初学者来说&#xff0c;数字电路的学习往往充满了挑战。幸运的是&#…

Axure中继器入门:打造你的动态原型

前言 中继器 是 Axure 中的一个高级功能&#xff0c;它能够在静态页面上模拟后台数据交互的操作&#xff0c;如增加、删除、修改和查询数据&#xff0c;尽管它不具备真实数据存储能力。 中继器就像是一个临时的数据库&#xff0c;为我们在设计原型时提供动态数据管理的体验&a…

中职省培丨2024年大数据技术中职教师专业技能培训班企业参观实践圆满结束

7月17日&#xff0c;“2024年大数据技术中职教师专业技能培训班&#xff08;省培&#xff09;”参训老师莅临广东泰迪智能科技股份有限公司产教融合实训中心开展企业参观实践。泰迪智能科技董事长张良均、中职业务部总监李振林、中职业务部经理黄炳德、校企合作经理吴桂锋及来自…

.net core appsettings.json 配置 http 无法访问

1、在appsettings.json中配置"urls": "http://0.0.0.0:8188" 2、但是网页无法打开 3、解决办法&#xff0c;在Program.cs增加下列语句 app.UseAntiforgery();

vue 如何做一个动态的 BreadCrumb 组件,el-breadcrumb ElementUI

vue 如何做一个动态的 BreadCrumb 组件 el-breadcrumb ElementUI 一、ElementUI 中的 BreadCrumb 定义 elementUI 中的 Breadcrumb 组件是这样定义的 <template><el-breadcrumb separator"/"><el-breadcrumb-item :to"{ path: / }">主…

修改文件的默认打开方式

修改文件的默认打开方式 选中文件&#xff0c;右击&#xff0c;选择属性&#xff0c;如图然后点击更改&#xff0c;选择想要的打开方式&#xff0c;再依次点击 应用、保存 即可&#xff0c;如图

Redis中数据分片与分片策略

概述 数据分片是一种将数据分割并存储在多个节点上的技术&#xff0c;可以有效提高系统的扩展性和性能。在Redis中&#xff0c;数据分片主要用于解决单个实例存储容量和性能瓶颈的问题。通过将数据分散存储到多个Redis节点中&#xff0c;可以将负载均衡到不同的服务器上&#…

Visual Studio使用——在vs中给vb.net项目添加新的窗口:新建的方式、添加已有窗口的方式

目录 引出Visual Studio使用vb添加新的窗体自定义代码片段vs显示所有文件 总结Idea安装和使用0.Java下载 和 IDEA工具1.首次新建项目2.隐藏文件不必要显示文件3.目录层级设置4.Settings设置选择idea的场景提示代码不区分大小写 取消git的代码作者显示 引出 Visual Studio使用—…

基于Vue CLI 3构建Vue3项目(Vue2也可参考)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

Android Framework学习笔记(4)----Zygote进程

Zygote的启动流程 Init进程启动后&#xff0c;会加载并执行init.rc文件。该.rc文件中&#xff0c;就包含启动Zygote进程的Action。详见“RC文件解析”章节。 根据Zygote对应的RC文件&#xff0c;可知Zygote进程是由/system/bin/app_process程序来创建的。 app_process大致处…

PHP手边酒店多商户版平台小程序系统源码

&#x1f3e8;【旅行新宠】手边酒店多商户版小程序&#xff0c;一键解锁住宿新体验&#xff01;&#x1f6cc; &#x1f308;【开篇&#xff1a;旅行新伴侣&#xff0c;尽在掌握】&#x1f308; 还在为旅行中的住宿选择而纠结吗&#xff1f;是时候告别繁琐的搜索和比价过程&a…

MT6985(天玑9200)芯片性能参数_MTK联发科旗舰5G移动平台处理器

MT6985天玑 9200 旗舰移动平台拥有专业级影像、沉浸式游戏和先进移动显示技术&#xff0c;以及更快捷、覆盖更广的 5G 和 支持 Wi-Fi 7 连接&#xff0c;具有高性能、高能效、低功耗表现。率先采用 Armv9 性能核&#xff0c;全部支持纯 64 位应用&#xff0c;开启高能效架构设计…

搞定前端面试题——ES6同步与异步机制、async/await的使用以及Promise的使用!!!

文章目录 同步和异步async/awaitPromisePromise的概念 同步和异步 ​ 同步&#xff1a;代码按照编写顺序逐行执行&#xff0c;后续的代码必须等待当前正在执行的代码完成之后才能执行&#xff0c;当遇到耗时的操作&#xff08;如网络请求等&#xff09;时&#xff0c;主线程会…

Java二十三种设计模式-抽象工厂模式(3/23)

抽象工厂模式&#xff1a;复杂系统的灵活构建者 引言 在软件开发中&#xff0c;抽象工厂模式是一种提供接口以创建相关或依赖对象族的创建型设计模式。这种模式允许客户端使用一个共同的接口来创建不同的产品族&#xff0c;而无需指定具体类。 基础知识&#xff0c;java设计模…

算法 —— LRU算法

算法 —— LRU算法 LRULRU算法的工作原理&#xff1a;实现方法&#xff1a;性能考虑&#xff1a; 模拟过程splice函数对于std::list和std::forward_list基本语法&#xff1a;功能描述&#xff1a; 示例&#xff1a;注意事项&#xff1a; 如果大家已经学习过了Cache的替换算法和…

ElementUIV12相关使用方法

今日内容 零、 复习昨日 零、 复习昨日 一、Element UI Element&#xff0c;一套为开发者、设计师和产品经理准备的基于 Vue 2.0 的桌面端组件库 官网&#xff1a; https://element.eleme.cn/#/zh-CN Element Plus,基于 Vue 3&#xff0c;面向设计师和开发者的组件库 官网: htt…

C语言--递归

曾经有一个段子&#xff1a;上大学时&#xff0c;我们的c语言老师说&#xff1a;学c时&#xff0c;如果有50%的同学死在了循环上面&#xff0c;那么就有90%的同学死在了递归上面。接下来&#xff0c;就来看看递归是怎么个事&#xff1f; 一.递归的介绍 递归是指一个函数直接或…

跨平台WPF音乐商店应用程序

目录 一 简介 二 设计思路 三 源码 一 简介 支持在线检索音乐&#xff0c;支持实时浏览当前收藏的音乐及音乐数据的持久化。 二 设计思路 采用MVVM架构&#xff0c;前后端分离&#xff0c;子界面弹出始终位于主界面的中心。 三 源码 视窗引导启动源码&#xff1a; namesp…