天天看点

【SIM卡】Sim 卡热插拔 

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 热插拔功能可以实现同一个卡槽,插拔其他卡依然可以识别。

MTK