尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

RK3588 Type-C PD充电问题排查:从DTS配置到内核驱动

发布时间:2026/9/29 2:43:22

资讯中心
01
ARTICLE

RK3588 Type-C PD充电问题排查:从DTS配置到内核驱动

RK3588 Type-C PD充电问题排查:从DTS配置到内核驱动
做RK3588Android12方案的兄弟应该都有过这种经历Type-C口硬件看起来一切正常充电器插上去却始终只有5V/2A快充图标根本不亮或者更邪门的是原厂开发板上好好的自己的板子上PD充电偶尔断连、协商失败。我前阵子帮客户调一块RK3588主板的PD充电问题从设备树一路查到内核驱动最后发现问题出在一个大家都容易忽略的pinctrl复用上。今天就把这条完整的排查链路写出来Type-C PD充电在RK3588平台上DTS该配哪些节点、每个属性背后是什么意思、什么时候必须动内核驱动、以及出问题以后怎么一步步定位。这篇文章篇幅不短但不涉及废话适合正在做RK3588 BSP驱动、或者打算在RK3588/Android12方案上做USB-C PD快充的嵌入式工程师。新手也能读我会把PD协商的基础概念一并讲清楚。1. 先看清全链路Type-C PD充电在RK3588上到底经过哪些“部门”1.1 PD协商不是“一根线通就供电”而是两端的商务谈判很多人一提到PD充电下意识就是“Type-C口能快充”。其实Type-C口本身只负责物理连接和方向识别能不能快充、能给多大功率要看CC引脚上的PDPower Delivery协议有没有谈成功。在PD协议里充电器和设备的关系很明确充电器是Source供电源手机/平板是Sink耗电源。一开始Source会在CC引脚上发出一个Source Capability消息相当于递出一张菜单上面写着“我能提供5V/3A、9V/3A、15V/2A、20V/1.5A”之类的选项Sink看菜单后挑一个自己支持且需要的档位发回一个Request消息“我要9V/3A”Source确认后回Accept再发PS_Ready然后VBUS才真正抬到协商的电压。这个过程和商务谈判完全一样报菜单、点菜、确认、上菜。如果这个没谈成结果就是VBUS维持在Type-C接口刚插入时的默认5V。所以你会看到很多板子“插上能充电但只有5V”本质上不是硬件坏了而是PD协商压根没成功或者根本没发起。1.2 RK3588 SoC内部那些参与PD的成员清单RK3588是一个高度集成方案但PD充电这条路线上涉及的硬件模块和软件驱动相当多每个环节都可能是问题源。我建议先把这个名单记下来后面排查时会反复用到模块对应设备树节点/驱动职责USB3.0 DRD控制器usbdrd3_0 / usbdrd3_1DWC3 IP负责USB数据枚举、OTG角色切换Type-C/USBDP PHYtcphy0 / tcphy1rockchip,rk3588-usbdp-phy处理CC引脚电平、USB2/USB3/DP信号复用TCPC/TCPMPD协议状态机usbc0内建TCPM方案或外挂FUSB302/HUSB311等I2C节点感知CC状态、执行PD协商状态机Charger ICbq25700、rk826_charger、sc8886等控制VBUS到电池的充电路径、限流限压power_supply子系统内核驱动注册的battery/usb/charger域把充电状态上报给Android Healthd/SystemUIAndroid上层Healthd、Charging HAL、SystemUI显示充电状态、执行充电策略这里有一个关键区别需要先搞清楚RK3588参考设计里有两种常见PD方案。第一种是SoC内建TCPM方案。硬件上不挂独立的PD协议芯片CC引脚直接进RK3588的USBPHY相关引脚PD状态机跑在AP侧的驱动里。设备树里会有一个类似usbc0的节点compatible通常是rockchip,rk3588-type-c。第二种是外挂TCPC方案。比如板上有一颗FUSB302、HUSB311、CH224之类的PD协议芯片挂在某个I2C总线上SoC通过I2C读写这颗芯片实现PD协商。这类方案里DTS配的是I2C子节点而不是usbc0节点。这两个方案对应的DTS结构完全不一样混用必炸。很多工程师拿着原厂参考设计改自己的板子第一件事就栽在这里原理图上明明有PD芯片却照抄了内建TCMP的节点或者反过来DTS里挂了FUSB302但Hardware上CC根本没连到这颗芯片上。动手前先看原理图确认方案能省掉一半时间。1.3 从物理插头到系统状态栏的“消息传递顺序”整个PD充电从物理插上到Android状态栏显示快充信息流大致是这个顺序插入Type-C头CC1/CC2上的Rp/Rd上拉下拉关系被PHY检测到PHY触发一个CC_INT中断。TCPC/TCPM感知CC状态变化判断插入方向正反插、确认设备角色Sink/Source/DRP。发起或响应SOP消息双方进入PD协商确认PDO档位。协商成功后VBUS从默认5V抬到目标电压同时Charger IC开通充电路径。Charger驱动通过power_supply子系统注册电池电压、充电电流、充电状态。Android的Healthd读取power_supply域里的uevent更新电池状态栏、充电策略。这六步里任何一步挂了表现都不一样插上没反应、只能5V充电、能充但是断断续续、状态栏显示“充电缓慢”、或者干脆检测不到充电器。所以排查PD问题不要一上来就猜是某个环节而是先看现象对应哪一级链路再往下钻。2. DTS配置解剖RK3588设备树里写“PD充电”这件事的各个节点2.1 先确认方案内建TCMP还是外挂TCPC打开你的原理图找Type-C接口的CC1/CC2引脚确认它们最终接去了哪里。如果CC引脚直接连到RK3588的USBPHY相关引脚中间只有一个RC滤波网络或TVS管大概率是内建TCMP方案如果中间有一颗PD控制芯片看丝印FUSB302、HUSB311、CH224等这颗芯片的I2C引脚又接去了RK3588的某个I2C总线那就是外挂TCPC方案。这两者在DTS里的外观差异非常明显内建方案设备树里会有usbc0这样的顶层节点compatible为rockchip,rk3588-type-c它和usbdrd3_0通过extcon属性发生关联。外挂方案I2C总线下挂一个子节点compatible为fcs,fusb302、hx,hx90225之类同时usbdrd3_0节点里的extcon一般会指向这个外挂PD芯片节点。用一句话概括内建方案是“PHY直连SoC驱动里跑协议”外挂方案是“PHY连PD芯片驱动通过I2C操作芯片”。你的板子是哪一种DTS就必须按哪一种配这一条可以直接写进你们团队的硬件设计检查清单。2.2 内建TCMP方案的核心DTS骨架RK3588 SDK里内建TCMP方案的典型结构基于实际SDK简化大致长这样usbdrd3_0: usbdrd3_0 { compatible rockchip,rk3588-dwc3; status okay; extcon usbc0; usbdrd_dwc3_0: dwc3fc000000 { compatible snps,dwc3; reg 0x0 0xfc000000 0x0 0x400000; dr_mode otg; phys u2phy0_otg, usbdp_phy0_u3; phy-names usb2-phy, usb3-phy; usb-role-switch; role-switch-default-mode none; status okay; }; }; usbc0: usbc0 { compatible rockchip,rk3588-type-c; rockchip,usb-controller usbdrd3_0; rockchip,usbphy usbdp_phy0; rockchip,typec_connector usbdp_phy0_typec_connector; interrupts GIC_SPI 191 IRQ_TYPE_LEVEL_HIGH; status okay; pd-data { pd,source-pdo-size 1; pd,source-pdo-data 0x00019096; pd,sink-pdo-size 3; pd,sink-pdo-data 0x00019096 0x0001912c 0x0002d12c; }; };这里有几个属性是理解整个配置的关键extcon usbc0DWC3控制器通过extcon机制感知PD角色状态。USB控制器需要知道自己现在是Host还是Device、VBUS有没有升起、数据线是否接通。TCMP驱动的状态变化会以extcon事件的形式通知DWC3DWC3据此切换USB角色。rockchip,usb-controllerTCMP认识自己管理的USB控制器是哪一棵。RK3588一般有两路Type-C口分别对应usbdrd3_0和usbdrd3_1别把两路绑错。rockchip,usbphyTCMP需要直接操作Type-C PHY来读取CC引脚状态、控制角色切换。这个PHY节点通常是tcphy0或usbdp_phy0。pd-dataPDO配置区域。pd,sink-pdo-size声明了设备端支持多少个Sink PDOpd,sink-pdo-data数组则是具体的PDO编码。上面的值里0x00019096代表5V/1500mA0x0001912c代表5V/3000mA0x0002d12c代表9V/3000mA。你要特别注意pd-data里的PDO数组。SDK默认提供的PDO列表不一定满足你们产品的需求比如产品需要支持20V输入默认里可能就没有20V的档位协商自然跳不过去。注意不同SDK版本里这个节点的字段名可能不一样有的叫pd,sink-pdo-data有的叫rockchip,pd-sink-pdo。改之前先在SDK里搜pd,sink-pdo-size或者在rockchip,rk3588-type-c的驱动源码里搜对应解析函数确认你的SDK认哪个字段再动手改。2.3 外挂TCPC方案的DTS结构外挂PD协议芯片的DTS相对独立以FUSB302为例i2c6 { status okay; fusb302: fusb30222 { compatible fcs,fusb302; reg 0x22; interrupt-parent gpio3; interrupts RK_PB2 IRQ_TYPE_LEVEL_LOW; pinctrl-names default; pinctrl-0 fusb302_int_l; vbus-supply vcc5v0_otg; status okay; connector { compatible usb-c-connector; label USB-C; >i2c7 { status okay; bq25700: bq257006b { compatible ti,bq25700; reg 0x6b; interrupt-parent gpio1; interrupts RK_PB4 IRQ_TYPE_LEVEL_LOW; ti,charge-current 2000000; ti,max-charge-voltage 8750000; ti,input-current-limit 3000000; extcon usbc0; status okay; }; };Charger DTS配置的核心思路是给芯片一个“安全运行边界”ti,charge-current是目标充电电流ti,max-charge-voltage是电池满充电压ti,input-current-limit是从VBUS抽取的最大输入电流。这三个值不是拍脑袋写的要根据电池规格书和热设计确定比如两串电池充到8.4V那max-charge-voltage就不能超过8.75V否则有过充风险。extcon属性在Charger节点里也经常出现它连接TCMP/USBC0节点作用是让Charger驱动知道当前插入的是普通USB口SDP只有500mA/900mA还是PD快充口允许大电流抽取从而动态调整输入电流限流。如果这个extcon没接通会出现一种很隐蔽的现象PD已经协商到9V/3A了但Charger驱动还把自己限制在USB默认的500mA充电比以前还慢。另外Charger芯片的I2C从机地址同样要核对。bq25700的地址在不同批次和不同配置脚上有0x6B和0x6C之分。上电后用i2cdetect扫描确认你的实际地址再回填DTS别直接抄参考设计。2.5 pinctrl与GPIO复用高频翻车现场DTS里最容易被忽视、却最容易导致PD问题百出的地方就是pinctrl配置。我遇到过不止一个板子硬件上用示波器量PD芯片的INT引脚明明是正常跳变的但系统里的TCMP驱动却始终收不到中断。最后排查发现这个GPIO的iomux被另一个DTS节点里的pinctrl配成了普通输出口还把电平拉高了。这类问题在RK3588上特别常见因为RK3588引脚功能复用非常多同一个引脚可能同时出现在SPI、I2C、UART、GPIO、PWM等多个功能选项里。DTS里不同节点对同一引脚的配置后加载的会把先加载的冲掉。排查这类问题的思路上电后在串口执行以下命令查看引脚的mux状态cat /sys/kernel/debug/pinctrl/pinctrl-rockchip-pinctrl/pinmux-pins | grep GPIO3_B2如果GPIO3_B2被配成了其他功能输出里能看到对应的function名。grep -rn GPIO3_B2 arch/arm64/boot/dts/rockchip/检查板级DTS里还有哪个节点引用了同一个引脚。对比原理图的iomux表格确认当前mux配置是否符合预期。另外中断触发类型的选择也直接影响稳定性。对于PD芯片的INT引脚我强烈建议使用电平触发IRQ_TYPE_LEVEL_LOW而不是边沿触发IRQ_TYPE_EDGE_FALLING。原因是PD协商过程中会有连续的数据包交互INT信号在逻辑分析仪上是一连串的低电平脉冲用边沿触发极易漏掉中断导致协议状态机卡死电平触发只要引脚处于低电平就会反复上报状态机可以稳定处理。3. 当DTS已经配好但PD还是“谈不拢”内核驱动侧的真实改动场景3.1 哪些需求绕不开驱动修改DTS能解决的大多是“外设挂没挂上、引脚连得对不对、初始化参数是多少”这层问题但PD充电还有很多需求是DTS没有对应字段、或者SDK默认代码做不了你要的效果的。最常见的几类默认SNK_PDO列表不符合产品需求比如你要支持20V输入但DTS里sink-pdo没有20V档位。你的板子作为Source比如Type-C扩展坞、带OTG对外供电的设备需要配置source PDO而SDK可能默认只做了sink。需要支持PPS可编程电源3.3V~21V连续可调档位但驱动里的PDO类型标记不对。外挂TCPC芯片型号比较新SDK里的tcpci驱动不完全兼容需要适配寄存器映射。Android系统休眠时PD协商状态无法保持唤醒后充电电流异常需要动驱动里的电源管理逻辑。这些情况改DTS字段已经不解决问题了必须进驱动源码。3.2 修改PDO的两种姿势优先DTS不行再动代码如果你只是要调整支持哪些电压电流档位第一选择仍然是DTS里的pd-data节点。以9V/3A和20V/1.5A两个Sink PDO为例pd-data { pd,sink-pdo-size 2; pd,sink-pdo-data 0x0002d12c 0x0003712c; };这里每个PDO是32位编码拆开来看bit31: 0固定电压PDObit30~29: 00Fixedbit28: 0bit27~16: 电压值单位50mV。9V就是9 / 0.05 180十六进制0xB4放在bit27~16。bit15~0: 最大电流单位10mA。3A就是3000mA / 10 300十六进制0x12C。所以0x0002d12c拆开就是(0xB4 16) | 0x12C即电压9V电流3A。20V/1.5A对应(400 16) | 1500x1900096不对20V/0.05400即0x1901.5A/0.01150即0x96组合起来就是0x01900096。写DTS时按十六进制填对即可。这个编码算错一位PD协商就可能失败或者输出电压异常我吃过一次大亏把一个PDO的bit29写错结果驱动把固定电压档位识别成了可编程电源档位充电器直接拒绝协商。如果你改了DTS但发现驱动里并不读取pd-data说明SDK版本的TCMP驱动在初始化时直接硬编码了PDO数组DTS字段只是摆设。这个时候就要动源码常见位置是drivers/usb/typec/tcpm/下对应的驱动文件搜snk_pdo或sink_pdostatic const u32 snk_pdo[] { PDO_FIXED(5000, 1500, PDO_FIXED_FLAG_DUAL_ROLE), /* 5V/1.5A */ PDO_FIXED(5000, 3000, PDO_FIXED_FLAG_DUAL_ROLE), /* 5V/3A */ PDO_FIXED(9000, 3000, 0), /* 9V/3A */ PDO_FIXED(20000, 1500, 0), /* 20V/1.5A */ };改完重新编译内核烧录验证。判断DTS和驱动哪个优先最粗暴的办法改DTS里的pd,sink-pdo-size为一个不存在的数值然后开机看dmesg里打印的PDO列表。打印出来的和DTS一致说明DTS生效不一致说明驱动源码里的静态数组才是真正的来源。3.3 Charger驱动适配的坑I2C上“聊得起来”不代表充得进去Charger驱动是另一块经常需要改代码的地方。我见过不少工程师I2C通信验证通过了、寄存器也能读了就以为万事大吉结果充电电流死活上不去。问题往往出在驱动对芯片寄存器映射的理解上。拿bq25700举例驱动里REG09是ChargeCurrent寄存器REG0A是MaxChargeVoltage寄存器REG0B是InputCurrentLimit寄存器。但不同批次的bq25700或不同的寄存器映射版本位移和掩码可能不一样。改变充电电流寄存器# 读取当前ChargeCurrentREG09 i2cget -y 7 0x6b 0x09 # 设置ChargeCurrent为3A不同芯片寄存器格式不同这只是示例 i2cset -y 7 0x6b 0x09 0x30如果写这个寄存器后电流实测没有变化要么是寄存器地址写错了要么是芯片内部还有一个Watchdog使能位超时后芯片自动回落到默认安全状态。很多Charger芯片都有Watchdog机制驱动初始化时必须周期喂狗否则芯片会在几十秒后停止充电。这个细节在参考设计的驱动里一般是处理好的但你自己写驱动时非常容易漏。另外Charger芯片的电流采样电阻sense resistor阻值会在驱动里以宏或DTS属性的形式写死。某款参考设计用10mΩ采样电阻如果你们的原理图为了省成本换成了20mΩ但驱动还按10mΩ换算电流那么ADC读数就会偏大一倍实际充电电流打五折。这类问题DTS层面可能有一个类似rsense-mohm的属性如果没有就必须改驱动里的换算系数。3.4 power_supply域对接上层“睁眼瞎”的经典原因还有一种特别气人的现象底层明明一切都正常——VBUS已经升到20V、充电电流已经达到1.5A、用万用表量的电流清清楚楚——但Android状态栏一直显示“未充电”。这种问题十有八九出在power_supply域的对接上。Linux内核的power_supply子系统里每个充电相关驱动会注册一个域比如battery、usb、charger、ac。Android的Healthd会去读特定名字的power_supply域来获取当前电源状态。如果你的Charger驱动把usb域注册成了bq25700-usb而Healthd期望的域名字是usb或者uevent里的POWER_SUPPLY_TYPE字段不是预期值上层就会认为没有插入充电器。排查方法很简单在adb shell里执行cat /sys/class/power_supply/*/uevent每个power_supply域的uevent文件里都有POWER_SUPPLY_NAME、POWER_SUPPLY_TYPE、POWER_SUPPLY_STATUS、POWER_SUPPLY_VOLTAGE_NOW等字段。对照日志确认USB/充电器对应的域是否真的存在。TYPE字段是否为USB_DCP、USB_CDP、USB_PD之一而不是Battery或者Unknown。STATUS字段是否为Charging而不是Not charging或Discharging。VOLTAGE_NOW是否已经抬到9V或20V。如果TYPE不对就要去Charger驱动或者TCMP驱动里看设置POWER_SUPPLY_TYPE的地方确保PD协商成功后将类型切换为USB_PD。这个字段不对Healthd会按照普通USB的5V/500mA去限制充电电流哪怕底层已经能拉到3A也会被上层策略掐死。4. 实测未通过按这套查找顺序快速定位PD充电问题4.1 把问题分到三个层面硬件层、内核驱动层、系统上层PD充电问题的定位难点在于链路太长一个现象可能对应多个层面的原因。我的习惯是先把现象归类再从最可能的层面下手。现象优先排查层面关注点插上完全无反应VBUS没有任何电压变化硬件层CC引脚连接、Rp/Rd电阻、TCPC供电、PHY初始化有默认5V但协商不到更高电压内核驱动层TCMP/TCPC中断触发、PDO列表、PD协议状态机日志协商成功但充电电流上不去内核驱动层Charger输入电流限制、寄存器配置、采样电阻参数能充电但断断续续时好时坏硬件层驱动层GPIO干扰、中断丢失、I2C总线稳定性底层电压电流正常状态栏显示异常系统上层power_supply域、Healthd策略、uevent里的TYPE字段4.2 必会的调试命令和日志过滤技巧调试PD问题日志和sysfs节点就是你的眼睛。我常用的命令如下# 1. 看PD协议状态机的debug日志重点关注tcpm/tcpci/fusb字样 dmesg | grep -iE tcpm|tcpci|fusb|typec|pd # 2. 查看Type-C端口当前角色 cat /sys/class/typec/port0/data_role cat /sys/class/typec/port0/power_role cat /sys/class/typec/port0/port_type # 3. 实时查看充电器域状态 cat /sys/class/power_supply/bq25700/uevent # 替换成你板子上的实际域名称 cat /sys/class/power_supply/usb/voltage_now cat /sys/class/power_supply/battery/status # 4. 扫描I2C总线上挂载的设备 i2cdetect -l i2cdetect -y -r 7如果日志里没有tcpm相关的打印先确认驱动有没有编译进去、有没有probe成功。dmesg | grep -iE fusb302|tcpm|type-c里应该能看到probe或者注册TCMP Port Manager的信息。一个很实用的技巧是在TCMP驱动里临时加dev_info打印在tcpm_pd_send_request、tcpm_pd_handle_state这些关键函数里输出协商步骤这样能直观看到状态机走到哪一步卡住了。4.3 三个真实踩坑复盘中断触发、PDO方向、charger ADC这里放三个我真实踩过、并且具有代表性的坑基本把上面讲到的检查点都串起来了。坑1中断触发类型选错导致CC事件丢失客户的一块板子外挂FUSB302症状是偶尔插入Type-C后系统完全没反应。我拉了串口日志dmesg里连fusb302的中断事件都没有。用逻辑分析仪勾CC1和FUSB302的INT引脚发现插入瞬间INT引脚确实拉低了但内核中断没有触发。查DTS发现配的是IRQ_TYPE_EDGE_FALLING。修改为IRQ_TYPE_LEVEL_LOW后插入稳定触发中断问题解决。中断触发类型这个细节在PD这种连续事件密集的场景下差异非常大。坑2Source/Sink PDO方向搞反外部设备拿不到电另一个项目是做车载无线充电模块RK3588作为Source对外供电。DTS里配了pd,source-pdo-size和数组但实际测试中外部手机只能进入5V普通充电无法触发PD快充。排查发现驱动里的src_pdo数组压根没被DTS覆盖PDO还是SDK默认的sink配置。修改驱动源码里的src_pdo并在初始化时强制走SRC状态机后解决。这个坑说明要确认你的SDK到底是从DTS读PDO还是从源码读不能想当然。坑3Charger ADC采样电阻参数不对电流实际只有一半一个快充方案实测PD协商到9V/3A了但充电电流始终只有1.4A左右。用万用表串联测量电流确实被限制在1.4A。翻原理图发现采样电阻用的20mΩ而驱动里硬编码的换算系数是10mΩ导致ADC读到的电流值被放大了一倍驱动认为电流已经到3A了于是自动降低目标。把驱动里的采样电阻换算系数改成20mΩ后电流正常跑满3A。这个案例提醒我凡是通过ADC回读电流的Charger采样电阻阻值必须和代码保持一致。4.4 别忘了内核defconfig里的开关最后再强调一个DTS之外、但和驱动修改强相关的点内核配置项。DTS节点写得再完整如果驱动没编译进内核一切都白搭。RK3588 Android12 PD充电相关的主要config项如下配置项作用CONFIG_TYPECType-C子系统总开关CONFIG_TYPEC_TCPMTCPMType-C Port Manager核心CONFIG_TYPEC_TCPCITCPCI标准接口驱动CONFIG_TYPEC_FUSB302FUSB302外挂PD芯片驱动视芯片而定CONFIG_USB_DWC3DWC3 USB控制器驱动CONFIG_POWER_SUPPLYpower_supply子系统CONFIG_CHARGER_BQ25700bq25700充电芯片驱动视芯片而定验证方法zcat /proc/config.gz | grep -E TYPEC|TCPM|TCPCI|FUSB302|DWC3|BQ25700如果某项是y或m说明编译进去了如果是空的就要去kernel/arch/arm64/configs/rockchip_defconfig或你们项目的defconfig里补上重新编译内核。我见过一个很经典的案例DTS、驱动代码全都检查过了最后才发现CONFIG_TYPEC_TCPM没打开TCMP驱动根本没加载自然死活协商不起来。5. 一点真实感受PD充电这类功能最忌讳“头疼医头”。一看到充电没起来就一头扎进Charger驱动一看到没检测到插入就去翻GPIO配置很容易南辕北辙。我自己现在的习惯是拿到一块新板子先把从Type-C口到电池的完整链路图画出来标注每一级的检查方法然后拿着万用表、I2C工具、串口日志三样东西按链路逐级确认现状再决定动哪里。大多数棘手的问题最后都落在中断触发类型、PDO编码、pinctrl复用这几个不起眼的细节上而不是什么高深算法。另外一个实用的小建议调试初期不要急着去抠Android上层的充电策略先把内核态的/sys/class/power_supply和dmesg吃透确认PD协商、Charger芯片都工作正常再去看SystemUI和Healthd。这样能把问题快速框定在某一层不会在多层之间来回折腾。如果你也在RK3588或类似RK平台上调过PD充电欢迎把你的踩坑经历发在评论区尤其是那些“排查了两三天最后发现是个低级失误”的案例——这种案例往往比任何官方文档都值钱。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。