1.1. 熱插拔功能簡單介紹
對于非熱插拔的項目,隻有在modem 開機時才會啟動檢卡流程,如果開機時沒有檢測到卡,後面就不會再走檢卡流程!為了實作在開機後使用者可以自由的進行插卡和拔卡的動作而不需要關機->插卡->再開機,sim 卡熱插拔的feature 應運而生。熱插拔功能是靠中斷來實作的,是以要支援sim 卡熱插卡,硬體上需要特殊的sim 卡座,這種卡座會有個detect pin(也就是中斷pin),當使用者插入或者拔出卡時,中斷電平會發生高低變化,進而觸發中斷,軟體會根據中斷的狀态來判定目前是插卡還是拔卡,進而執行檢卡或者停卡動作。目前我們隻支援一種熱插拔類型的卡座: 插卡是高(低)電平,拔卡是低(高)電平。請注意插卡和拔卡的間隔一定要在2s 以上,低于2s 的快速熱插拔動作會導緻熱插拔功能異常!
1.2. 熱插拔feature option 說明
MODEM 側:
xxAMDWxxx_xxx_xxx\make\[project_custom].mak
modem 端
SIM_HOT_SWAP = NONE //關閉sim 熱插拔功能
DUAL_SIM_HOT_SWAP_CO_DECK= FALSE #雙卡不共卡座
SIM_HOT_SWAP = sim_slot_1 //開啟sim 熱插拔功能
AP 端
Project.mk
MTK_SIM_HOT_SWAP =yes //開啟sim 熱插拔功能
MTK_SIM_HOT_SWAP =no //關閉sim 熱插拔功能
MTK_SIM_HOT_SWAP_COMMON_SLOT=no #雙卡不共卡座
注:當使用者需要關閉熱插拔來做一些檢卡的實驗時,可以隻将modem 側的feature 關閉,build modem image,push 進手機進行驗證即可,這樣會比較節省時間。但驗證後要記得恢複哦~
注:sim 卡熱插拔功能在SP 項目上default 就是支援,客戶可以自行開關,不需要申請patch 或者Flavor build.
1.3. 中斷配置
對于內建了modem 的SP 平台,sim 卡相關的gpio 配置,包含sim interface 和中斷pin,都是在AP的codegen.dws 中配置由AP 生成配置檔案,并在kernel 初始化時進行gpio 及eint 初始化的,modem在啟動過程中做sim 卡初始化時,會通過CCCI 接口向AP 要中斷資訊,再來注冊中斷的。
Sim 熱插拔不能正常work,基本上都是中斷沒有正确配置的原因,是以接下來的内容這裡大家一定要
認真再認真看哦~
配置sim 卡熱插拔的中斷,主要有兩點:
a) Hw 上選的eint pin 通常都是與gpio 複用的,是以需要在driver tool 的gpio setting 頁面将對應的gpio 配置為MD_EINT mode;
Note: sim 卡的中斷pin 必須選用具有MD_EINT 模式的gpio,隻有這類gpio 才能直接觸發modem 中斷,普通的gpio 僅具有EINT mode,隻能觸發AP 中斷。
b) 在MD1_EINT setting 頁面配置對應的eint:
EINT debounce time: enable,100
Sensitivity_level: Level
Polarity:配置為拔卡的電平
1.4. 分平台舉例說明中斷配置方法:
MT6582/MT6592 平台:
ID: FAQ17406 MT6582/MT6592 平台sim 卡熱插拔配置
MT6572 平台:
配置方法與82/92 相同,隻是需要注意在gpio setting 頁面的MD_EINTx 序号跟MD1_EINT setting 頁面序号不同,說明如下:
MT6589 平台:
ID: FAQ17407 MT6589 平台sim 卡熱插拔配置
82/92+90 熱插拔配置方法:
ID: FAQ12120 使用MT6290 作為md 時,如何配置sim 熱插拔
MT6595 平台:
請參考Sim hot plug configure about MT6595.pptx,可以上dcc 上下載下傳到.
MT6580 平台:
與MT6572 平台配置方法相同。gpio setting 頁面的MD_EINTx 序号跟MD1_EINT setting 頁面序号的對應關系也與MT6752 平台相同。
MT6735/MT6753/MT6795/MT6797/MT6755 等LTE 平台:
早期MT6589 之前(包含MT6589),MD1_EINT setting 頁面配置哪個序号需要對照GPIO setting 頁面所選的模式
這裡需要說明的是LTE 平台,MD1_EINT setting 頁面多了一列:Src Pin, 這個配置務必要正确,否則熱插拔不會work.Src Pin 要配置為所用的gpio pad 名稱。例如:MT6753 平台客戶使用GPIO21 來作為卡2 的中斷,則需要配置Src Pin 為PAD_ANT_SEL2.
對于有Src Pin 配置的平台,MD1_EINT setting 頁面的編号與卡對應關系如下:
MD1_EINT0 – MD1_SIM1_HOT_PLUG_EINT
MD1_EINT1 – MD1_SIM2_HOT_PLUG_EINT
也就是說,如果要配置卡1 的中斷,必須配置MD1_EINT0 這行;如果要配置卡2 的中斷,必須配置MD1_EINT1 這行。Polarity 的配置不變,仍然是配置為拔卡後的中斷電平狀态。
舉例:MT6735 平台,客戶中斷使用如下:
GPIO9 -- 卡1 中斷 -- 拔卡後是高電平
Gpio8 -- 卡2 中斷 -- 拔卡後是低電平
1.5. 熱插拔功能如何驗證
按照上面的方法配置好熱插拔功能後,可以用下面的方法來驗證!
簡單的驗證方法如下:
(1) 不插卡開機,開機後再插入卡,看是否可以識别,若可以,說明熱插拔功能ok;
(2) 插A 卡開機,開機後拔出A 卡,換B 卡插入,若B 卡也可以很快識别,說明熱插拔功能ok;
同一張卡拔出再插入可以識别并不是能說明熱插拔功能ok,很有可能走的是掉卡救卡流程,
也可以通過log 做進一步确認:
抓取log 時記錄拔卡和插卡的時間(插卡和拔卡的動作間隔最好超過1min,比較好對應log),然後對照md log 的system trace,搜尋關鍵字“Insert”和“Remove”看是否與你記錄的時間比對,比對的話說明熱插拔配置ok.
例如:在10:12 分拔卡,10:13 分插卡,log 如下:
26013, 0, 139943, 10:12:23:219 2015/11/26, MOD_NIL, , TRACE_INFO, [SIM_CUS_DRV:506]Remove SIM : 0, 0, 1, 1, 1, 1, 4ecc7
43844, 0, 1385397, 10:13:42:928 2015/11/26, MOD_NIL, , TRACE_INFO, [SIM_CUS_DRV:540]Insert SIM : 0, 0, 0, 0, 0, 0, 2cc75e
這部分trace 是在中斷處理函數中列印的,是以判定是否有進入中斷,看這個是最準确的。
1.6. 熱插拔功能異常排查方法:
如果熱插拔功能能不正常,可以按照下面的方法進行排查:
1. 檢查mdlog,在PS Intergrated 中搜尋關鍵字“EINT”,檢視中斷資訊是否與codegen.dws配置一緻
Note1:雙卡共卡座設計,卡2 與卡1 公用中斷,并且default 是公用卡1 的中斷,是以codegen.dws 中不需要配置卡2 的中斷資訊,log 中卡2 的中斷資訊将會顯示如上。
Note2: 如果log 中列印的中斷資訊與您在codegen.dws 中配置的不一緻,請檢查AP 側幾個路徑下的codegen.dws 配置是否一緻,可以參考FAQ13193 進行排查。
2. 如果中斷資訊正确,但就是沒有觸發中斷,接下來要量取中斷的波形;
分别在插卡和不插卡的狀态下量取中斷波形,看中斷電平是否有正确發生變化。
3. 如果1 和2 都檢查無誤,接下來就需要cat 中斷pin 的狀态。
Cat 的方法在之前的部落格中有介紹。需要分别cat 插卡和不插卡兩種狀态下的值。
a) 确認DIN 是否有正确變化。
b) 确認模式是否正确;
如果模式不正确,可以檢查下是否是sim_switch.c 中修改了模式,可以把這部分代碼注釋掉再試試看。
static int set_sim_gpio(unsigned int mode)
{
SSW_DBG("set_sim_gpio: %d\n", mode);
switch(mode)
{
case SINGLE_TALK_MDSYS:
#if (defined(GPIO_SIM1_HOT_PLUG) && defined(GPIO_SIM2_HOT_PLUG))
// mt_set_gpio_mode(GPIO_SIM1_HOT_PLUG,5);
// mt_set_gpio_mode(GPIO_SIM2_HOT_PLUG,4);
#endif
//SIM1=> MD1 SIM1IF
// mt_set_gpio_mode(GPIO_SIM1_SCLK,1);
// mt_set_gpio_mode(GPIO_SIM1_SRST,1);
// mt_set_gpio_mode(GPIO_SIM1_SIO ,1);
//SIM2=> MD1 SIM2IF
// mt_set_gpio_mode(GPIO_SIM2_SCLK,1);
// mt_set_gpio_mode(GPIO_SIM2_SRST,1);
// mt_set_gpio_mode(GPIO_SIM2_SIO ,1);
break;
case SINGLE_TALK_MDSYS_LITE:
#if (defined(GPIO_SIM1_HOT_PLUG) && defined(GPIO_SIM2_HOT_PLUG))
// mt_set_gpio_mode(GPIO_SIM1_HOT_PLUG,2);
// mt_set_gpio_mode(GPIO_SIM2_HOT_PLUG,4);
#endif
//SIM1=> MD3 SIM1IF
// mt_set_gpio_mode(GPIO_SIM1_SCLK,4);
// mt_set_gpio_mode(GPIO_SIM1_SRST,4);
// mt_set_gpio_mode(GPIO_SIM1_SIO ,4);
//SIM2=> MD1 SIM2IF
// mt_set_gpio_mode(GPIO_SIM2_SCLK,1);
MEDIATEK CONFIDENTIAL
FOR xujikui.roco@ foxmail.com USE ONLY
[email protected],time=2015-12-19 01:26:48,ip=14.153.125.200,doctitle=SIM_debug_SOP.docx,company=JOYA_TABLET
// mt_set_gpio_mode(GPIO_SIM2_SRST,1);
// mt_set_gpio_mode(GPIO_SIM2_SIO ,1);
break;
…}
基本上通過以上3 步就可以定位到問題原因,中斷本身就這麼簡單!
1.7. 如何從log 中檢視中斷資訊:
在mdlog 中搜尋關鍵字“EINT”可以看到下面的資訊:EINT: 0, 0 0 100 0 0 1
後面7 個資料的含義分别表示如下:
[Application]:0 - sim1, 1 – sim2
[擷取eint number 是否成功]:0 表示成功;負數表示失敗
[Eint number];
[debounce time]:
[polarity] :0 – low,1- high;
[Sensitive] :0 – level,1 – edge;
[socket type]:0 (隻支援這種插卡為高(低)電平,拔卡為低(高)電平)
1.8. PLUG IN/OUT ignore 原因
在插卡和拔卡時log 中會有如下資訊:
【System trace】
Insert SIM : …. //插卡
Remove SIM : … //拔卡
【PS Integrated log】
正常情況下driver 在收到插卡和拔卡中斷後會執行回調函數,回調函數是在sim task 裡面(這部分代碼不向客戶開放),在回調函數中sim task 會發msg 出來,您可以在log 中看到如下資訊:這個資訊不是一定會有的,有時候在system trace 中有看到“Insert SIM...”或者“Remove SIM...”,但在Primitive log 中卻看不到MSG_ID_SIM_PLUG_IN_IND 或者MSG_ID_SIM_PLUG_OUT_IND,這
時候在system trace 中會看到如下log:
SIM Plug In but ignore!!!
SIM Plug Out but ignore!!!
為什麼會出現這樣的log 呢?這樣的log 是正常還是異常呢?下面我們來說明在什麼情況下會列印這兩條trace!
(1) Plug In ignore 原因
a. 卡槽内有卡; (Ex:中斷異常、誤觸發)
b. SIM Task 初始化未完成; (Ex:開機階段插卡,Modem 啟動過程中)
c. SIM Task 處于power off 狀态; (Ex:modem 關閉/啟動過程中:關機,飛行模式,SIM Switch)
d. 上一個plug in 還未處理完。 (Ex:中斷異常重複觸發)
(2) Plug Out ignore 原因
a. 卡槽内有卡; (Ex:中斷異常、誤觸發)
b. SIM Task 初始化未完成; (Ex:開機階段插卡,Modem 啟動過程中)
c. SIM Task 處于power off 狀态; (Ex:modem 關閉/啟動過程中:關機,飛行模式,SIM Switch)
d. 上一個plug in 還未處理完。 (Ex:中斷異常重複觸發)
【注意】:我們不支援在modem 啟動/關閉過程中的熱插拔,如果測試熱插拔feature 請注意以下場景:
(1) 開啟SIM SWITCH 功能(MTK_DISABLE_CAPABILITY_SWITCH = no)時,不要做兩張卡交替熱插拔;
(2) MTK_FLIGHT_MODE_POWER_OFF_MD = yes 的情況下,不要将開關飛行模式與SIM卡熱插拔混測;
(3) 熱插拔中有電信卡時,插入卡請确認識卡之後,再做拔卡動作。
1.9. sim 卡熱插拔與full recovery 差別
很多客戶回報說插入卡後要過将近1 分鐘才能識别到卡,送出log 上來,基本上都是因為熱插拔功能并沒有配置成功導緻。這種現象實際是full recovery 在其作用并不是熱插拔功能。因為他之前是插卡開機,開機時有識别到卡,後來又拔卡(實際判斷為了掉卡),後面又插卡過了近1 分鐘才檢到卡實際是full recovery 将卡救起,并非熱插拔中斷響應到。另外,full recovery 隻針對同一張sim 卡,若開機時插的A 卡,識别到後将A 卡拔掉再換插B 卡,對于不支援熱插拔的項目是不能識别B 卡的。Sim 熱插拔功能可以實作同一個卡槽,插拔其他卡依然可以識别。