原理:pinctrl基础

原有GPIO配置框架:
之前所有的gpio操作都是通过gpiolib来实现,常用的api包括:
staticinline int gpio_request(unsigned gpio, const char *label);
staticinline int gpio_direction_input( unsigned gpio);
staticinline int gpio_direction_output(unsigned gpio, int value);
staticinline void gpio_set_value(unsigned gpio, int value);
staticinline void gpio_free(unsigned gpio);
在硬件设计确定了某个设备需要使用哪些gpio之后,软件需要做的是( 以msm8916平台tp的中断为例):
1)在msm8916-cdp.dsi中定义使用哪个gpio
i2c@f9924000{
goodix@5d{
compatible= "goodix,gt9xx";
reg= <0x5d>;
interrupt-parent= <&msmgpio>;
interrupts= <13 0x2>;
interrupt-gpios= <&msm_gpio 13 0x00>;
};
}
2)在board-8916-gpiomux.c中定义gpio的suspend和active状态
staticstruct gpiomux_setting  atmel_int_act_cfg  = {
.func =GPIOMUX_FUNC_GPIO,
.drv = GPIOMUX_DRV_2MA,
.pull = GPIOMUX_PULL_UP,
};
staticstruct gpiomux_setting  atmel_int_sus_cfg  = {
.func =GPIOMUX_FUNC_GPIO,
.drv = GPIOMUX_DRV_2MA,
.pull =GPIOMUX_PULL_NONE,
};
staticstruct msm_gpiomux_config  msm_touch_configs [] __initdata = {
.gpio =  13 ,
.settings = {
[GPIOMUX_ACTIVE] =& atmel_int_act_cfg ,
[GPIOMUX_SUSPENDED]= & atmel_int_sus_cfg ,
},
},
PinControl 框架
Gpiolib方式的缺点在于:当同一套代码对应多个board设计时,需要在board--gpiomux.c文件中加宏进行区分。如在同一个分支上支持3个项目,在board-msm8974-gpiomux.c文件中添加了很多宏控。
pinctrl方式可以避免代码中的这种冗余代码,它将board--gpiomux.c文件中的配置信息移到-pinctrl.dtsi;这样,针对不同project的board设计,分别在各自project的-pinctrl.dtsi中定义各自的gpio配置信息。
Pinctrlsubsystem 分为3部分:Pinctrl core、Pinmux和Pinconf。
pinctrlcore是pincontrol子系统的核心,提供了和devicedriver交互的API;
pinmux用于实现pin的复用;
pinconf用于实现pin的配置,如输入/输出、pulldown/pull up、driverstrength等;另外还提供了用于debug的接口。
与gpio子系统的交互
虽然pinctrl提供了pinctrl_request_gpio()这样的API,但在代码中不可以直接调用pinctrl_request_gpio(),在该函数的定义处也有说明,如下:
“*This function should *ONLY* be used from gpiolib-based GPIO drivers,
*as part of their gpio_request() semantics, platforms and individualdrivers
*shall *NOT* request GPIO pins to be muxed in.”
当设备驱动申请一个gpio时,仍然需要调用gpio_request(),这里会调用pinctrl_request_gpio()。调用过程如下:
gpio_request()
gpiod_request()
chip->request(chip,gpio_chip_hwgpio(desc));
在pinctrl_msm.c中,重新定义了chip->request()。
msm_pinctrl_probe()
msm_register_gpiochip()
gc->request= msm_pinctrl_request_gpio;
这里msm_pinctrl_request_gpio()会调pinctrl_request_gpio();
同样地,对于pinctrl_free_gpio()、pinctrl_gpio_direction_input()和pinctrl_gpio_direction_output()也有类似说明。
因此在clientdevice驱动中,申请和释放gpio仍然要调gpio_request()、gpio_free();设置gpio为input/output仍然要调gpio_direction_input()和gpio_direction_output()。
Pinctrl注册
全文以msm8916平台为例进行分析。
当tlmm加载时,msm_tlmm_v4_probe()最后会调msm_pinctrl_probe(),其中会将pinctrl.dtsi中定义的pinctrlinfo解析出来,并且重新定义chip->request()、chip->free()等函数。
具体的调用关系如下图所示:
postcore_initcall(msm_tlmm_v4_drv_register); //Pinctrl-msm-tlmm-v4.c
msm_tlmm_v4_probe //匹配pinctrl.dtsi定义的compatible
msm_pinctrl_probe //pinctrl_msm.c
msm_pinctrl_get_drvdata(dd,pdev); //解析pinctrl.dtsi,保存到dd
msm_pinctrl_dt_parse_pintype(node,dd);
msm_pinctrl_dt_parse_pins(node,dd);
msm_register_gpiochip(dd); //定义gpio_request()、gpio_free()
gc->request= msm_pinctrl_request_gpio;
gc->free= msm_pinctrl_free_gpio;
msm_register_pinctrl(dd);
dd->pctl_dev= pinctrl_register(ctrl_desc, dd->dev, dd);
Pinstates
一个pinstate对应对pin脚的一种配置,一个pin脚可以配置多个状态,对状态的个数也没有限制。
state的定义和电源管理关系比较紧密,例如当设备active的时候,我们需要pincontroller将相关的一组pin设定为具体的设备功能,而当设备进入sleep状态的时候,需要pincontroller将相关的一组pin设定为普通GPIO,并精确的控制GPIO状态以便节省系统的功耗。
Pinctrl-state.h中给出了常用的3种状态:
        default
default状态表示设备处于active时的状态,一般在设备驱动的.resume中配置,另外在启动时也会配置pin脚为default状态。
        idle
idle状态表示系统处于idle时需要配置的pin脚状态,此时系统并没有进入深度休眠。
        sleep
sleep状态表示系统处于深度休眠时的pin脚状态,一般在设备驱动的.suspend中配置。
当然我们也可以定义任意形式的state,如“on”、“off”等。
goodix@5d{
compatible= "goodix,gt9xx";
reg= <0x5d>;
pinctrl-names= "gt9xx_int_active", "gt9xx_int_suspend";
pinctrl-0= <&gt9xx_int_active>;
pinctrl-1= <&gt9xx_int_sleep>;
interrupt-parent= <&msm_gpio>;
interrupts= <13 0x2>;
……
}
pinctrl-names定义了clientdevice用到的state列表。state有两种标识,一种就是pinctrl-names定义的字符串列表,另外一种就是ID。ID从0开始,依次加一。根据例子中的定义,stateID等于0(名字是"gt9xx_int_active")的state对应pinctrl-0属性,stateID等于1(名字是"gt9xx_int_suspend")的state对应pinctrl-1属性。
pinctrl-x是一个句柄(phandle)列表,每个句柄指向一个pinconfiguration。
Boot时配置default状态
如果pin只定义了default状态,那么在设备驱动中不需要再对该pin作处理,因为在启动时会自动设为default状态。
在加载驱动模块时,如果驱动和设备匹配,最终就会调到driver定义的probe函数。在这个过程中,如果使能了pinctrl,而且定义了pin的default状态,就会配置pin脚为该状态。
具体代码流程如下:
driver_probe_device(structdevice_driver *drv, struct device *dev)
really_probe(dev,drv);
pinctrl_bind_pins(dev);
if(dev->bus->probe) {
ret= dev->bus->probe(dev);
}else if (drv->probe) {
ret= drv->probe(dev);
}
pinctrl_bind_pins(dev)的调用过程如下:
pinctrl_bind_pins(dev);
dev->pins->p= devm_pinctrl_get(dev);
dev->pins->default_state= pinctrl_lookup_state(dev->pins->p,
PINCTRL_STATE_DEFAULT);
pinctrl_select_state(dev->pins->p,dev->pins->default_state);
对于不使用pinctrl的平台,pinctrl_bind_pins(dev)直接返回0;
Pingroups
SOC上需要同时配置一组gpio来支持某些功能,如I2C、SPI、UART、SDC等,在-pinctrl.dtsi中将这些pin定义为一个group。
配置统一的情况
一组gpio在各个状态下的配置都相同,这种配置比较常见也比较简单。如i2c,在active和suspend状态下,SDA和SCL的配置都相同:active状态下都是配置为8mA上拉,suspend状态下都配置为2mA和nopull。
首先在msm8916_pinctrl.c中定义suspend和active状态下的pin脚配置信息,如下:
pmx_i2c_0{

qcom,pins= <&gp 7>, <&gp 6>; //使用gpio_6和gpio_7
qcom,num-grp-pins= <2>; //共两个gpio
qcom,pin-func= <3>; //复用功能为i2c
label= "pmx_i2c_0"; //表示同一组
i2c_0_active:i2c_0_active {
drive-strength= <8>;
bias-pull-up;
};
i2c_0_sleep:i2c_0_sleep {
drive-strength= <2>;
bias-disable;
};
};
然后在msm8916.dtsi中增加pinctrlinfo的引用:
i2c_0:i2c@78b6000 {
compatible= "qcom,i2c-msm-v2";
reg-names= "qup_phys_addr", "bam_phys_addr";
reg= <0x78b6000 0x600>,
<0x7884000 0x23000>;
interrupt-names= "qup_irq", "bam_irq";
interrupts= <0 96 0>, <0 238 0>;
clocks= <&clock_gcc clk_gcc_blsp1_ahb_clk>,
<&clock_gcc clk_gcc_blsp1_qup2_i2c_apps_clk>;
clock-names= "iface_clk", "core_clk";
qcom,clk-freq-out= <100000>;
qcom,clk-freq-in = <19200000>;
pinctrl-names= "i2c_active", "i2c_sleep";
pinctrl-0= <&i2c_0_active>;
pinctrl-1= <&i2c_0_sleep>;
qcom,master-id= <86>;
};
配置不统一的情况
如SDC,每个pin脚的active和sleep状态配置各不相同,需要分开设置。
1)在msm8916_pinctrl.c中分别定义各个pin的suspend和active状态下的配置信息,如下:

sdc:sdc {
qcom,pin-type-sdc;

qcom,num-pins= <6>;



#qcom,pin-cells= <1>;
};
pmx_sdc1_clk{
qcom,pins= <&sdc 0>;
qcom,num-grp-pins= <1>;
label= "sdc1-clk";
sdc1_clk_on:clk_on {
bias-disable;
drive-strength= <16>;
};
sdc1_clk_off:clk_off {
bias-disable;
drive-strength= <2>;
};
};
pmx_sdc1_cmd{
qcom,pins= <&sdc 1>;
qcom,num-grp-pins= <1>;
label= "sdc1-cmd";
sdc1_cmd_on:cmd_on {
bias-pull-up;
drive-strength= <10>;
};
sdc1_cmd_off:cmd_off {
bias-pull-up;
drive-strength= <2>;
};
};
pmx_sdc1_data{
qcom,pins= <&sdc 2>;
qcom,num-grp-pins= <1>;
label= "sdc1-data";
sdc1_data_on:data_on {
bias-pull-up;
drive-strength= <10>;
};
sdc1_data_off:data_off {
bias-pull-up;
drive-strength= <2>;
};
};
2)msm8916-cdp.dtsi中作出相应修改:
&sdhc_1{
vdd-supply= <&pm8916_l8>;
qcom,vdd-voltage-level= <2900000 2900000>;
qcom,vdd-current-level= <200 400000>;
vdd-io-supply= <&pm8916_l5>;
qcom,vdd-io-always-on;
qcom,vdd-io-lpm-sup;
qcom,vdd-io-voltage-level= <1800000 1800000>;
qcom,vdd-io-current-level= <200 60000>;
//qcom,pad-pull-on= <0x0 0x3 0x3>;
//qcom,pad-pull-off= <0x0 0x3 0x3>;
//qcom,pad-drv-on= <0x4 0x4 0x4>;
//qcom,pad-drv-off= <0x0 0x0 0x0>;
pinctrl-names= "active", "sleep";
pinctrl-0= <&sdc1_clk_on &sdc1_cmd_on &sdc1_data_on>;
pinctrl-1= <&sdc1_clk_off &sdc1_cmd_off &sdc1_data_off>;
qcom,nonremovable;
status= "ok";
};
对sdhc_2也是同样的配置。
另外还有一种情况,对于一组gpio,在不同state下pin_func定义不同的情况,如wifi,在active状态设置为wifi功能,在suspend状态下设置为普通gpio。
pinctrl@fd511000{
...
pmx-wcnss-5wire-active{
qcom,pins= <&gp 40>, <&gp 41>, <&gp 42>, <&gp43>.
<&gp44>;
qcom,pin-func= <1>;
qcom,num-grp-pins= <5>;
label= "wcnss-5wire-active";
wcnss-5wire-active:wcnss-active {
drive-strength= <6>; / * 6MA */
bias-pull-up;
};
};
pmx-wcnss-5wire-suspend{
qcom,pins= <&gp 40>, <&gp 41>, <&gp 42>, <&gp43>.
<&gp44>;
qcom,pin-func= <0>;
qcom,num-grp-pins= <5>;
label= "wcnss-5wire-suspend";
wcnss-5wire-sleep:wcnss-sleep {
drive-strength= <6>; / * 6MA */
bias-pull-down;
};
};
};
PinctrlAPI
structpinctrl *devm_pinctrl_get(struct device *dev);
获取该device对应的pinctrlhandler。
structpinctrl_state *pinctrl_lookup_state(struct pinctrl *p, const char*name);
查找name指定的pinctrlstate。
intpinctrl_select_state(struct pinctrl *p, struct pinctrl_state *state);
配置pin脚为指定的state。
Usecase
下面举例配置tp的中断脚。
1)在msm8916-pinctrl.dtsi中定义pinctrlinfo:
&soc{
tlmm_pinmux:pinctrl@1000000
gt9xx_int_pin{
qcom,pins= <&gp 13>;
qcom,num-grp-pins= <1>;
qcom,pin-func= <0>;
label= "gt9xx_int_pin";

gt9xx_int_active :active {
drive-strength= <2>;      
bias-pull-up;
};

gt9xx_int_sleep :sleep {
drive-strength= <2>;
bias-disable;
};
};
}
2)在msm8916-cdp.dtsi中tp的节点中添加引用:
goodix@5d{
compatible= "goodix,gt9xx";
reg= <0x5d>;
pinctrl-names= "gt9xx_int_active", "gt9xx_int_suspend";
pinctrl-0= <&gt9xx_int_active>;
pinctrl-1= <&gt9xx_int_sleep>;
interrupt-parent= <&msm_gpio>;
interrupts= <13 0x2>;
……
}
3)在tp驱动中添加配置。
a.定义pinctrl_info:
#defineGOODIX_PINCTRL_STATE_SLEEP "gt9xx_int_suspend"
#defineGOODIX_PINCTRL_STATE_DEFAULT "gt9xx_int_active"
structgtp_pinctrl_info{
structpinctrl *pinctrl;
structpinctrl_state *gpio_state_active;
structpinctrl_state *gpio_state_suspend;
};
staticstruct gtp_pinctrl_info gt9xx_pctrl;
staticint  gtp_pinctrl_init (struct device *dev)
{
gt9xx_pctrl.pinctrl=  devm_pinctrl_get (dev);
if(IS_ERR_OR_NULL(gt9xx_pctrl.pinctrl)) {
pr_err("%s:%dGetting pinctrl handle failed\n",
__func__,__LINE__);
return-EINVAL;
}
gt9xx_pctrl.gpio_state_active= pinctrl_lookup_state(
gt9xx_pctrl.pinctrl,
GOODIX_PINCTRL_STATE_DEFAULT);
if(IS_ERR_OR_NULL(gt9xx_pctrl.gpio_state_active)) {
pr_err("%s:�ailed to get the active state pinctrl handle\n",
__func__,__LINE__);
return-EINVAL;
}
gt9xx_pctrl.gpio_state_suspend= pinctrl_lookup_state(
gt9xx_pctrl.pinctrl,
GOODIX_PINCTRL_STATE_SLEEP);
if(IS_ERR_OR_NULL(gt9xx_pctrl.gpio_state_suspend)) {
pr_err("%s:�ailed to get the suspend state pinctrl handle\n",
__func__,__LINE__);
return-EINVAL;
}
return0;
}
b.在probe函数中初始化pinctrl_info,并设置state:
staticint goodix_ts_probe(struct i2c_client *client, const structi2c_device_id *id)
{
goodix_parse_dt(&client->dev,pdata);
gtp_request_io_port(ts);
gtp_pinctrl_init(&ts->client->dev);
pinctrl_select_state(gt9xx_pctrl.pinctrl,gt9xx_pctrl.gpio_state_active);
……
}
c.在suspend()和resume()中分别设置为activestate和suspendstate:
staticint goodix_ts_suspend(struct device *dev)
{
structgoodix_ts_data *ts = dev_get_drvdata(dev);
intret = 0, i;
ret= pinctrl_select_state(gt9xx_pctrl.pinctrl,
gt9xx_pctrl.gpio_state_suspend);
if(ret)
pr_err("%s:�annot set pin to suspend state",
__func__,__LINE__);
……
if(ts->use_irq)
gtp_irq_disable(ts);
……
returnret;
}
staticint goodix_ts_resume(struct device *dev)
{
structgoodix_ts_data *ts = dev_get_drvdata(dev);
intret = 0;
ret= pinctrl_select_state(gt9xx_pctrl.pinctrl,
gt9xx_pctrl.gpio_state_active);
if(ret)
pr_err("%s:�annot set pin to suspend state",
__func__,__LINE__);
……
if(ts->use_irq)
gtp_irq_enable(ts);
……
returnret;
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. Which type of virtualization is provided by the SAN Volume Controller (SVC)? A. In band B. Out of band C. Host based Software virtualization D. Hardware virtualization within the storage subsystem controller Answer: A 2. A customer is using LAN-based Tivoli Storage Manager for backups and plans to increase the number of servers in the data center to be backed up. Which one of the following options should be suggested if no new disk space can be purchased? A. Add an additional TSM server. B. Add an IBM SAN Volume Controller. C. Implement GPFS to increase the disk pool. D. Add Virtual Tape Library and implement LAN-free backups. Answer: C 3. The initial meeting with a large customer's IT team made it clear that they are experiencing storage performance problems. For the next meeting, which tool should be used to help evaluate their storage performance? A. IBM Disk Magic for Windows B. IBM Tivoli Storage Manager C. IBM Capacity Magic for Windows D. IBM TotalStorage Productivity Center Answer: D 4. Which of the following IBM products would be recommended to compete with the EMC CX3-80? A. IBM Systems Storage DS4200 B. IBM Systems Storage DS4700 C. IBM Systems Storage DS5100 D. IBM Systems Storage DS8100 Answer: C 5. A customer has a mainframe with 32 IBM TotalStorage Tape Drives (3490) and six IBM TotalStorage Pass4Side IBM 000-960 Pass4Side Help you pass any IT Exams! Enterprise Tape Drives (3590). The customer is looking for a tape consolidation solution to reduce floor space, increase cartridge utilization, and improve tape mount performance. Which of the following is the best solution for their needs? A. IBM System Storage TS7700 Virtual Tape Server B. IBM System Storage SAN Volume Controller (SVC) C. IBM System Storage TS3500 UltraScalable Tape Library D. IBM TotalStorage 3590 Enterprise Tape Drive with ACF Answer: A 6. Which of the following IBM publications provide best practice and product information, configuration, and suggestions for storage products? A. Redbooks B. White Papers C. Product Literature D. Solution Assurance Guides Answer: A 7. What key strength is included in Total Storage Productivity Center Standard Edition over EMC ControlCenter? A. Offering for the SMB market B. More storage management features C. Integration with systems management products D. Total Storage Productivity Center for Replication Answer: B 8. A customer needs to provide a centrally managed, common pool of storage for its Microsoft Windows servers located at three remote offices. Due to budget constraints, existing IP protocol needs to be utilized at both the headquarters and the remote locations. Which device best satisfies these requirements? A. IBM System Storage DS3400 B. IBM System Storage N3700 C. IBM System Storage DS4800 D. IBM System Storage SAN Volume Controller Pass4Side IBM 000-960 Pass4Side Help you pass any IT Exams! Answer: B 9. Which of the following functions does Hitachi Data Systems claim about the HDS USP V (Universal Storage Platform)? A. Scalable cache up to 32 GB with non-definable usage B. Internal bandwidth equates to increased storage performance C. Performance increases as more devices are added to FC-AL loop D. Priority I/O queuing feature is supported on both mainframes and open systems Answer: B 10. A customer has an On-Line Transaction Processing (OLTP) application that is currently running on an IBM System p server. The OLTP database resides on an IBM System Storage DS8000. The customer wants to test multiple OLTP application changes without impacting the current application's database. Which of the following advanced functions would best support the customer's requirement? A. FlashCopy B. Metro Mirror C. Global Mirror D. FlashCopy Space Efficiency (SE) Answer: D 11. A multiple vendor storage environment is being refreshed. What would be one of the potential customer benefits when installing a SAN Volume Controller? A. The potential to manage the components within the SAN. B. The ability to share data between different server types. C. The ability to capture and analyze storage subsystem performance data. D. The potential to migrate data between different storage subsystems with minimum disruption. Answer: D 12. An IBM System z server customer with two locations 400 kilometers apart, is constantly struggling to balance workload across the two locations. Which of the following IBM System Storage DS8000 capabilities most cost effectively meets the customer's need without impacting performance? A. FlashCopy B. Metro Mirror Pass4Side IBM 000-960 Pass4Side Help you pass any IT Exams! C. Global Mirror D. Parallel Access Volumes Answer: C 13. A company currently has Microsoft Windows and UNIX servers running various applications. They are looking for a cost effective 10 TB storage solution that includes a mirrored site 10 km to meet their requirements of at least a tier 6 disaster recovery plan. Which of the following solutions should be recommended? A. Two IBM SAN Volume Controller clusters running FlashCopy and Metro Mirror B. Two IBM System Storage DS4700 storage servers running FlashCopy and Volume Copy C. Two IBM System Storage DS8300 storage servers running FlashCopy and Metro Mirror D. Two IBM System Storage DS5100 storage servers running FlashCopy and Enhanced Remote Mirror Answer: D 14. Which of the following software applications provides non-erasable and non-rewriteable data protection on the IBM System Storage N3700? A. SnapLock B. SnapShot C. SnapVault D. SnapMirror Answer: A 15. A mixed server environment (UNIX and Microsoft Windows) customer has decided to purchase an IBM BladeCenter. The customer requires 200 GB of storage now, but up to 10 TB in the future. Their backup needs are less than 1 TB per week using Tivoli Storage Manager. What is the best solution for this customer? A. IBM TotalStorage EXP24 and TS3100 B. IBM System Storage DS4700 and DR550 C. IBM System Storage DS4200 and TS3500 D. IBM System Storage DS3400 and TS3100 Answer: D 16. A customer has 10TB of unstructured data stored on a DS5300. The growth rate of the data is 50% Pass4Side IBM 000-960 Pass4Side Help you pass any IT Exams! per year. The majority of the data rapidly becomes reference data and is not frequently accessed. The customer would like to implement a content addressable storage solution that would automatically migrate the reference data to a less expensive disk. Cost is a key factor in their decision, which of the following would be most cost effective? A. Write a script to migrate .mp3 and .jpg files to tape. B. Implement TSM to archive data to a second tier storage device. C. Use TSM to migrate the operating system to tape once the system boots up. D. Implement TSM with Space Management to migrate inactive data to a second tier storage device. Answer: D 17. From a performance standpoint, which feature from the IBM System Storage N series product (Netapp) lines distinguishes it from the other NAS offerings available in the market today? A. LockVault B. SnapMirror C. Write Anywhere File Layout (WAFL) D. Common Integrated File System (CIFS) Answer: C 18. A customer has Sun, Microsoft and Mainframe servers in their environment. They are initially looking for 10 TB of disk, but expect to double in capacity within the next year. The customer's main concern is cost versus performance. What should the storage specialist recommend? A. IBM System Storage DS4800 B. IBM System Storage DS5100 C. IBM System Storage DS6800 D. IBM System Storage DS8300 Answer: C 19. Which vendor has positioned themselves as the leading Information Lifecycle Management (ILM) company? A. HP B. IBM C. HDS D. EMC Pass4Side IBM 000-960 Pass4Side Help you pass any IT Exams! Answer: D 20. What Major Storage Vendor has a single operating system across its entire Storage product line? A. EMC B. NetApp C. HDS (Hitachi Data Systems) D. IBM (International Business Machines) Answer: B

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值