uicc详解-4(uicc在UE端的初始化过程)

来源:互联网 发布:什么是观测数据 编辑:程序博客网 时间:2024/05/16 11:59

    在uim task下,一个卡槽对应一个task,默认情况下,起来三个task,task1对应slot1,task2对应slot2。由于uim的三个task使用的是同一套代码,所以使用uim_ptr->id来分分当前属于哪个task。在uim task的初始化代码中注意两个函数:uim_hotswap_init与uim_start_initial_powerup。

    uim_hotswap_init用来初始化uim的热插拔事件,主要有初始化热插拔事件所使用的队列与定时器。定时器超时函数为uim_hotswap_debounce_timer_expiry_cb,该函数中会对比当前卡状态与检测到的卡状态,然后做出相应操作,该定时器在hotswap终端中开启,本文后续会讲到。

卡状态表如下:


    uim_start_initial_powerup用来第一次重启uim卡,从而获取到ATR。该函数中调用了uim_reset_uim函数,在uim_reset_uim函数中有个关键点:

其中me_powerup开机默认设置为TRUE,这样给执行一次对卡的冷重启之后,uim_ptr的command赋值了UIM_INTERNAL_ME_PUP_F,该函数结尾调用uim_process_command->uim_process_generic_command,在uim_process_generic_command处理UIM_INTERNAL_ME_PUP_F命令,


在uim_process_generic_command中将调用uim_generic_command来执行UIM_INTERNAL_PUP_STATUS列表中的命令,执行过程参考前两章介绍,知道执行到UIM_DONE_ST命令后退出。


执行完UIM_DONE_ST命令后注意在uim_process_card_response函数中的如下代码:

在UIM_INTERNAL_PUP_STATUS列表的命令跑完后会执行uim_sm_link_established函数来开启gsdi的工作。

开启流程:uim_sm_link_established->uim_gsdi_link_est->uim_sm_modify_link_est->mmgsdi_notify_link_est_slot->mmgsdi_cmd_ext然后通过信号队列的方式把命令MMGSDI_NODIFY_LINK_EST_REQ传递给gsdi task。gsdi task收到该命令后执行mmgsdi_card_init_process_link_est,gsdi对uim task进行ADF选择,并向User上报卡插入事件,本文未详细介绍gsdi,这个待后续分析。

再注意下uim_ptr->flag.me_powerup = FALSE;这行代码,保证了每次卡起来就执行一次gsdi的链接工作。

总体流程图如下:



UICC POWER UP流程图

gsdi应用选择完成后,uicc与sim后续流程如下所示:

                 

上图是UICC POWER UP 之后,UE与UICC卡交互流程,从交互的APDU来分析开机流程如下

1.ATR

2.选择并读取2FE2(ICCID)文件

3.选择并读取2F05(PREFERRED LANGUAGES)文件

4.选择并读取2F00(EF DIR)文件,该文件在UICC详解-1中介绍过,用来UICC内有几个ADF应用。

5.选择ADF,根据从2F00读出的数据来选择使用那个ADF应用。

6.对ADF目录下文件的读写操作~

7.对UICC卡上文件操作完后,轮询发送STATUS命令,来定时查询卡的状态。


    uicc详解-1~3只是介绍了命令的传输流程及UICC初始化流程,UICC还有许多细节需要学习,比如在modem中使用全局来存放的当前EF,DF目录(对应协议的文件及目录select权限),GSDI TASK中的管理等,以后有时间再分析~


0 0
原创粉丝点击