Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2159488
  • 博文数量: 438
  • 博客积分: 3871
  • 博客等级: 中校
  • 技术积分: 6075
  • 用 户 组: 普通用户
  • 注册时间: 2011-09-10 00:11
个人简介

邮箱: wangcong02345@163.com

文章分类

全部博文(438)

文章存档

2017年(15)

2016年(119)

2015年(91)

2014年(62)

2013年(56)

2012年(79)

2011年(16)

分类: Android平台

2015-04-17 17:27:46

看一下发送CMD的过程
./driver/storage/sim/src/icc_switchControl_mtk_0.c
  1. L1sim_Cmd_Layer_MTK
  2. {
  3.     //调用L1Sim_Cmd发送select命令,返回值 status=(0x61,0x19)
  4.     status = L1sim_Cmd(tx, (kal_uint16)*txSize, rxData, (kal_uint16*)rxSize, &error, hw_cb);
  5.     if((sw1 == gp)) //若sw1==0x61则说明需要getResponse
  6.     {
  7.         //合成getResponse命令并发送
  8.         tx = sim_get_resp_sim;{0x00, 0xc0, 0x00, 0x00, 0x00 }
  9.         *rxSize = sw2; //要接收的size就是刚才返回值的sw2
  10.         //接收到的数据放在rxData中
  11.         status = L1sim_Cmd(tx, LEN_OF_CMD, rxData, (kal_uint16*)rxSize, &error, hw_cb);
  12.     }
  13. }



L1sim_Cmd_Layer_MTK
-->L1sim_Cmd()
  1. L1sim_Cmd()
  2. {
  3.   //这个函数只是重新封装了一下SIM_CMD:
  4.   //为了防止出错,最大重复发送三次SIM_CMD
  5.   //当Eroro==KAL_TRUE时会重复发送SIM_CMD
  6.   SW = SIM_CMD((kal_uint8 *)pNoncachedTx,txSize,(kal_uint8 *)pNoncachedRx,rcvSize,Error, hw_cb);
  7.   //其中返回值SW就是过程状态字段SW1与SW2
  8. }




L1sim_Cmd_Layer_MTK
  -->L1sim_Cmd()
    -->SIM_CMD
  1. SIM_CMD(kal_uint8 *txData,kal_uint16 txSize,kal_uint8 *result,kal_uint16 *rcvSize, kal_uint8 *Error, sim_HW_cb *hw_cb)
  2. {
  3.     //txData-->要发送的数据,txSize-->要发送的数据长度
  4.     //
  5.     //返回值是SW过程状态字段
  6.     
  7.     //以select[ 00 a4 08 04 02 2f 05 ]为例说明TE向SIM卡发数据的过程
  8.     //第1步先发5个字节:00 a4 08 04 02
  9.     for(index=0;index<5;index++)
  10.     {
  11.         SIM_WriteReg(SIM0_BASE_ADDR_MTK + SIM_DATA_MTK,*(txData+index));
  12.     }
  13.     sim_addMsg(SIM_CMD_TX_LOG, *(txData + 1), *(txData + 4), SIM_Reg(SIM0_BASE_ADDR_MTK + SIM_COUNT_MTK));
  14.     //第2步关闭DMA并设当前状态为IDLE
  15.     DMA_Stop(SimCard->sim_dmaport);
  16.     SIM_SetRXTIDE(1, hw_cb);
  17.     
  18.     //第3步根据参数expSize来判断需不需要接收数据来设置DMA的状态
  19.     if (expSize == 0) //若为0,说明不需要接收数据
  20.     {
  21.         SIM_SetTXTIDE(0, hw_cb);
  22.         SimCard->sim_menu.addr = (kal_uint32)(txaddr+5);
  23.         SimCard->sim_input.type = DMA_HWTX;
  24.         SimCard->sim_input.count = txSize-5; //只需要把剩余的字符2f 05发送即可
  25.         if(SimCard->sim_input.count > SIM_TX_DELAY_LEN && SimCard->Speed > Speed372)
  26.             txDelay = KAL_TRUE;
  27.         SimCard->sim_input.callback = NULL;
  28.         INS |= SIM_INS_INSD;
  29.     }
  30.     else //若不为0,说明需要接收数据
  31.     { //需要接收数据的命令长度为5,在第1次己经发送完成,
  32.          //只需接收即可,(GetResponse:00 c0 00 00 19)
  33.         SIM_SetTXTIDE(0xffff, hw_cb);
  34.         SimCard->sim_menu.addr = (kal_uint32)(rxaddr); /*1*/
  35.         SimCard->sim_input.type = DMA_HWRX; /*2*/
  36.         SimCard->sim_input.count = expSize; /*3*/
  37.         SimCard->sim_input.callback = NULL; /*4*/
  38.     }
  39.     //设置DMA的状态
  40.     DMA_Config(SimCard->sim_dmaport, &SimCard->sim_input, KAL_FALSE);
  41.     
  42.     
  43.     //第4步,设置好状态后执行Run来发送数据
  44.     DMA_Run(SimCard->sim_dmaport);
  45.     //第5步,DMA发送完成后执行DMA_STOP
  46.     DMA_Stop(SimCard->sim_dmaport);
  47.     
  48.     //第6步,若需要接收数据接收到的数据都放在SimCard->sim_menu.addr中
  49.     //即值参数result中
  50.     rxaddr = (kal_uint32)result; //几次指针的赋值,这几个addr都是一个东东
  51.     SimCard->sim_menu.addr = (kal_uint32)(rxaddr);
  52.     //第7步,获取SW并返回
  53.     SIM_ObtainSW(SW);
  54. }


阅读(1646) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~