MT6572 耳机驱动笔记

13 篇文章 0 订阅
9 篇文章 1 订阅

1.MTK平台耳机检测原理简介

1.1EINT+AuxADC

【检测原理】 
(1) 耳机检测方式为EINT+AuxADC。
(2) EINT HISR为AUX_EINT_HISR,在aux_task_main中注册中断。插入耳机,若是高电平触发中断,需要保证AUX_EINT_STATE为1,否则为0。
(3) hook key的检测采用ADC。当耳机plug in,trigger AUX_EINT_HISR,此时turn on micbias, double check plug in state后,再发送msg AUX_ID_EARPHONE给UEM。  
然后turn off micbias。当aux收到来电消息,也会turn on micbias,检测SENDKEY ADC,直到挂断电话,才turn off micbias。
【软件配置】ACCDET_SUPPORT=FALSE
【典型平台】MT6236,MT6252 

1.2.ACCDET

【检测原理】  
(1) 耳机检测方式为ACCDET only。
(2) HISR为ACCDET_HISR,在ACCDET_INIT注册。
(3) hook key的检测采用ACCDET。
(4) 耳机状态与accdet处的电压对应关系如下表: 
表(一)
| Earphone state | Accdet voltage | Comparator AB state |
|-----------------|---------------|---------------------|
|Plug out|1.9V|A=1,B=1|
|Plug in|0.4V~1.7V|A=0,B=1|
|Hook key pressed|0V|A=0,B=0| 
【软件配置】ACCDET_SUPPORT=TRUE
【典型平台】MT6276,MT6250D/MT6250

1.3.EINT_ACCDET

【检测原理】
(1) 耳机检测方式为EINT+ACCDET。
(2) EINT HISR为AUX_EINT2_HISR,在ACCDET_INIT注册。插入耳机,若是高电平触发中断,需要将AUX_EINT_STATE置为1,否则置为0。
(3) hook key的检测采用accdet。
(4) 耳机状态与accdet处的电压对应关系同表(一)。
(5) 耳机插入,触发eint之后,enable ACCDET,耳机拔出之后会disable ACCDET。
【软件配置】ACCDET_SUPPORT=EINT_ACCDET
【典型平台】MT6255,MT6250/MT6250D

耳机按键

单键耳机实现播放,暂停

alps\mediatek\platform\mt6572\kernel\drivers\accdet下accdet.c 函数check_cable_type中case MIC_BIAS:下添加如下代码:

if(call_status == 0) 

if(is_long_press()) 

ACCDET_DEBUG("[Accdet]send long press remote button event %d \n",ACC_END_CALL); 
notify_sendKeyEvent(ACC_END_CALL); 
} else { 
ACCDET_DEBUG("[Accdet]send short press remote button event %d\n",ACC_MEDIA_PLAYPAUSE); 
notify_sendKeyEvent(ACC_MEDIA_PLAYPAUSE); 


if(call_status != 0) 

if(is_long_press()) 

ACCDET_DEBUG("[Accdet]send long press remote button event %d \n",ACC_MEDIA_PREVIOUS); 
notify_sendKeyEvent(ACC_MEDIA_PREVIOUS); 
} else { 
ACCDET_DEBUG("[Accdet]send short press remote button event %d\n",ACC_MEDIA_PLAYPAUSE); 
notify_sendKeyEvent(ACC_MEDIA_PLAYPAUSE); 

}

备注:KEY_****相关宏都定义在input.h文件中

KEY_PREVIOUSSONG:上一曲

实现下一曲(在框架层)

有些耳机只有一个按键, 需要通过一个按键来实现播放,暂停,下一首,上一首的功能 
功能定义: 
单击: 播放/暂停 
双击: 下一首 
三击: 上一首

[SOLUTION]

完整方案如下,只需要修改 phoneWindowManager.java 
1: 加入定义:

<code class="hljs cs has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">long</span> preLastHeadsethookDownTime=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>,preLastHeadsethookUpTime=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>, lastHeadsethookDownTime = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>, lastHeadsethookUpTime = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">long</span> thisHeadsethookDownTime = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>, thisHeadsethookUpTime = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> clickCount = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>

2:加入方法:

<code class="hljs cs has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">sendHeadsetBroadcast</span>(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> clickCount){
  Log.d(TAG,<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"clickCount="</span>+clickCount);
  KeyEvent <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">event</span>;
   <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">switch</span>(clickCount){ 
  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>:
   <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">event</span> = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> KeyEvent(thisHeadsethookUpTime,thisHeadsethookDownTime, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_PREVIOUS, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>);
   <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">break</span>;
  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>:
   <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">event</span> = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> KeyEvent(thisHeadsethookUpTime,thisHeadsethookDownTime,KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_NEXT,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>);
   <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">break</span>;
  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>:
  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">default</span>:
   <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">event</span> = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> KeyEvent(thisHeadsethookUpTime,thisHeadsethookDownTime,KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_HEADSETHOOK,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>);
   <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">break</span>;
  }
  Log.d(TAG,<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"keycode = "</span>+<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">event</span>.getKeyCode());
  Intent intent = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> Intent();
     intent.setAction(Intent.ACTION_MEDIA_BUTTON);
     intent.putExtra(Intent.EXTRA_KEY_EVENT,<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">event</span>);
        mContext.sendBroadcast(intent);
  intent = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> Intent();
  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">event</span> = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">event</span>.changeAction(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">event</span>,KeyEvent.ACTION_UP);
     intent.setAction(Intent.ACTION_MEDIA_BUTTON);
     intent.putExtra(Intent.EXTRA_KEY_EVENT,<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">event</span>);
        mContext.sendBroadcast(intent); 
    }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li></ul>

3: interceptKeyBeforeQueueing 方法内 
在参考行 
int result; 
之后加入如下语句:

<code class="hljs lasso has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(keyCode <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">==</span> KeyEvent<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>KEYCODE_HEADSETHOOK <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*KeyEvent.KEYCODE_VOLUME_DOWN*/</span>){ 
         <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(down){
          <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//this is headsethook down             </span>
          preLastHeadsethookDownTime <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> lastHeadsethookDownTime;
          lastHeadsethookDownTime <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> thisHeadsethookDownTime;
          thisHeadsethookDownTime <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> event<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>getEventTime();
         }<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span>{
    preLastHeadsethookUpTime <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> lastHeadsethookUpTime;
          lastHeadsethookUpTime <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> thisHeadsethookUpTime;
          thisHeadsethookUpTime <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> event<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>getEventTime();
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">Log</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>d(<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">TAG</span>,<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"thisHeadsethookUpTime="</span><span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">+</span>thisHeadsethookUpTime<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">+</span><span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">",thisHeadsethookDownTime="</span><span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">+</span>thisHeadsethookDownTime);
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">Log</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>d(<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">TAG</span>,<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"lastHeadsethookUpTime="</span><span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">+</span>lastHeadsethookUpTime<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">+</span><span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">",lastHeadsethookDownTime="</span><span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">+</span>lastHeadsethookDownTime);
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">Log</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>d(<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">TAG</span>,<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"preLastHeadsethookUpTime="</span><span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">+</span>preLastHeadsethookUpTime<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">+</span><span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">",preLastHeadsethookDownTime="</span><span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">+</span>preLastHeadsethookDownTime);
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>((thisHeadsethookUpTime <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-</span> thisHeadsethookDownTime) <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;"><</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">500</span>){
     <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>((thisHeadsethookDownTime<span class="hljs-attribute" style="box-sizing: border-box;">-lastHeadsethookDownTime</span>)<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">></span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">500</span>){
      <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">Log</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>d(<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">TAG</span>,<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"new click serial detected"</span>);
      clickCount <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>;
      mHandler<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>postDelayed(<span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">new</span> Runnable(){
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">void</span> run() {
         <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">Log</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>d(<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">TAG</span>,<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"call sendHeadsetBroadcast clickCount="</span><span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">+</span>clickCount);
        sendHeadsetBroadcast(clickCount);
        }
      }, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1000</span>);
     }<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span>{
      <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">Log</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>d(<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">TAG</span>,<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"click serial runing"</span>);
      <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>((thisHeadsethookUpTime <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-</span> preLastHeadsethookUpTime)<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">></span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1000</span>){
       <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">Log</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>d(<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">TAG</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"double click detect"</span>);
       clickCount <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>;
      }<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span>{
       <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">Log</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>d(<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">TAG</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"triple click detect"</span>);
       clickCount <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>;
      }
     }
    }
   }
   result <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;
   result <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">&=</span> ~ACTION_PASS_TO_USER;
   <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> result;
  }</code>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值