MTK通话函数流程
【转】Andriod通话处理流程

【转】Andriod通话处理流程一、总览1、从java端发送at命令的处理流程。
2、unsolicited 消息从modem上报到java的流程。
3、猫相关的各种状态的监听和通知机制。
4、通话相关的图标变换的工作原理。
5、gprs拨号上网的通路原理。
6、通话相关的语音通路切换原理、震动接口。
7、通话相关的notification服务。
8、通话相关的各种server。
第一部分:从java端发送at命令的处理流程。
拨出电话流程:1、contacts的androidmanifest.xml android:process="android.process.acore"说明此应用程序运行在acore进程中。
DialtactsActivity的intent-filter的action属性设置为main,catelog属性设置为launcher,所以此activity能出现在主菜单中,并且是点击此应用程序的第一个界面。
dialtactsactivity包含四个tab,分别由TwelveKeyDialer、RecentCallsListActivity,两个activity-alias DialtactsContactsEntryActivity和DialtactsFavoritesEntryActivity 分别表示联系人和收藏tab,但是正真的联系人列表和收藏是由ContactsListActivity负责。
2、进入TwelveKeyDialer OnClick方法,按住的按钮id为:R.id.digits,执行placecall()Intent intent = new Intent(Intent.ACTION_CALL_PRIVILEGED, Uri.fromParts("tel", number, null));intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);startActivity(intent);3、intert.ACTION_CALL_PRIVILEGED实际字符串为android.intent.action.CALL_PRIVILEGED,通过查找知道了packegs/phone下面的androidmanifest.xml中PrivilegedOutgoingCallBroadcaster activity-alias设置了intent-filter,所以需要找到其targetactivity为OutgoingCallBroadcaster。
volte信令流程

VOLTE_MO_MT 流程1. VoLTE 语音呼叫路由原则1.1:VoLTE 主叫(1)VoLTE 用户附着在LTE,如果被叫是VoLTE 用户,则将呼叫路由至被叫归属IMS 域,由被叫归属IMS 进行被叫域选,根据域选结果进行后续路由;(2)VoLTE 用户附着在LTE,如果被叫是CS 用户,则呼叫从主叫归属IMS 域直接进入CS 域,由CS 域完成后续呼叫;(3)VoLTE 用户附着在CS,如果被叫是VoLTE 用户,通过被叫锚定方案将语音接续到被叫归属IMS 域,由被叫归属IMS 进行被叫域选,根据域选结果进行后续路由;(4)VoLTE 用户附着在CS,如果被叫是CS 用户,呼叫同现网CS 用户呼叫CS 用户。
1.2:VoLTE 被叫(1)主叫是VoLTE 用户,附着在LTE,被叫是VoLTE 用户,则将呼叫路由至被叫归属IMS 域,由被叫归属IMS 进行被叫域选,并根据域选结果进行后续路由;(2)主叫是VoLTE 用户,附着在CS,被叫是VoLTE 用户,通过锚定方案将语音接续到被叫归属IMS 域,由被叫归属IMS 进行被叫域选,根据域选结果进行后续路由;(3)主叫是CS 用户,被叫是VoLTE 用户,通过锚定方案将语音接续到被叫归属IMS 域,由归属IMS 进行被叫域选,根据域选结果进行后续路由;1.3:Precondition建立媒体PDP 上下文的过程称为资源预留。
对于双方的UE 而言,建立PDP 上下文的执行过程是相互独立的。
这意味着在资源被成功预留之前,根本无法保证所协商的媒体会话是否可以建立起来。
因此,Precondition 作用主要是为了保证在确认本地和主叫方的资源预留都已成功之前,被叫方不应振铃,以最大程度减少被叫方振铃但接听电话又失败的情况1.4:VoLTE 信令包过渡(((diameter or sip or gtpv2 or megaco or dns or camel or bicc or gsm_map) && !(diameter.cmd.code == 280)) && !(diameter.cmd.code == 257)) && !(diameter.cmd.code == 282)2.VoLTE 用户(LTE 附着)呼叫VoLTE 用户(LTE/CS 附着)2.1VoLTE 用户呼叫VoLTE 用户,主被叫均附着在LTE1主叫用户UE(O)的呼叫请求发送到主叫PCSCF。
mtk中的一些函数作用

1. HandleIdleScreenDigitEntry()
判断是否处飞行静音模式
2. IdleScreenDigitHandler()
ShowCategory16Screen()建立拨号输入框,并且注册每个按键的响应
执行数字键‘1’的响应:MMI_key_1_down()
g_ucm_p->call_misc.curr_action = MMI_UCM_DIAL;
装载g_ucm_p->call_list.group_info[freeTab]信息(group_id, call_type, call_state)
装载g_ucm_p->call_list.group_info[freeTab].call_info[0]信息
装载消息结构,发送消息:PRT_USSDVSS_REQ(到L4层分析号码)
L4层分析号码后,返回消息:PRT_USSDVSS_RSP,进入CBACK:
1.PsCBackSetCallFeatures()
根据拨出号码,设置到PHB查找,设置gPhoneNumberStruct
判断是否是紧急呼叫:mmi_ucm_is_sos_number()--CheckValidEmergencyNo1()
判断是否是空号码
判断是否已经存在SOS
判断UCM是否忙:mmi_ucm_is_busy()--没有需要处理的Call,没有OUTGOING, INCOMING的group,没有emergency call。
SetCurrentState(CM_OUTGOING_STATE);
AddNewCallInfo()
MakePsInitiateCall((PU8)MsgStruct, (void*)OutgoingCallConnected);
MTK Dialing Screen流程

◆ 拨号界面1)坐标调整wgui.h设置断点,跟踪IdleScreenDigitHandler()--ÆShowCategory16Screen()--Æset up_dialing_keypad(&dialing_keypad)Wgui_inputs.c中setup_dialing_keypad()函数将wgui.h中各个赋的值赋给结构变量dialing_keypad的各个成员变量附:(调试、跟踪过程)1.Dialing inputbox(如何画拨号数字框及显示拨号数字图片)在dm_redraw_category_screen处下一个断点,跟踪,画控件DM_DIALER_INPUT_BOX1(拨号输入框)跟进函数dm_setup_and_draw_dialer_inputbox()里去,看到函数show_dialer_inputbox()跟进去,看到如下代码:gui_show_dialer_input_box(&MMI_dialer_inputbox);再跟进去:gui_show_dialer_input_box_ext(b, (-1), (-1));1.Dialing inputbox(如何在拨号框画拨号数字图片)进入ShowCategory16Screen()1)wgui_setup_dialer_inputbox() 画拨号界面输入框2)产生触摸屏事件后,拨号界面显示(例:触摸屏按下按钮8后,产生一个MMI_PEN_EVENT_DOWN事件,显示数字键8的拨号图片在拨号框)◆注册触摸屏事件(当触摸屏产生MMI_PEN_EVENT_DOWN、MMI_PEN_EVENT_UP、MMI_PEN_EVENT_MOVE、MMI_PEN_EVENT_REPEAT、MMI_PEN_EVENT_LONG_TAP、MMI_PEN_EVENT_ABORT等动作时,执行的函数)◆以MMI_PEN_EVENT_DOWN事件为例:进入Cate16CategoryControlAreaPenDownHandler()函数此处,产生了一个KEY_EVENT_DOWN事件(此处key_type常用的分为KEY_EVENT_DOWN,KEY_EVENT_UP,KEY_EVENT_LONG_PRESS,值分别为0,1,2)此处赋值后,dialing_keypad.key_type为选定的按键值,此处值为8跟进去ExecuteDialKeyPadKeyHandler(),此函数执行拨号界面的按键事件判断如果按键在数字键区[1,*)之内,播放按键音,执行当前按键事件句柄ExecuteCurrKeyHandler(),开始单步跟踪。
mtk手机听筒声音调节

mtk手机听筒声音调节
下面是连上m888点read读出的数据。
出现绿色pass字样且下方显示read XXXX successful表示读取成功模式选择有三种正常模式耳机模式免提模式修改的时候选的是正常模式,手机设置的情景模式是一般模式
参数说明:
Llevel0-level6代表手机上的七级音量,下方数字代表音量的大小speech调整指听筒音量调整
Melody调整指喇叭音量调整(也就是外放喇叭)
side tone 是所谓的魔音设置,说是噪音也可以
mic调整即送话器调整
试的时候,因为我通话中音量设置是最高,也就是level6,所以我只修改了speech中level6的数据; 结果是:把数据修改成50,明显感觉到声音变小,把数据修改成300,明显感觉声音变大。
因为没有长时间测试,目前尚不知道,数据修改得太大会不会对听筒产生损害。
所以再重复提醒一次,请谨慎。
可以边打电话边修改,只要一按ADJ即时生效。
补充:修改值超过255后,再重新读取,值仍然为255.但改成270无杂音(此值比较适合),改成300有杂音。
说明超过255的数值还是起作用的,软件显示255可能是因为是软件是单字节读取。
超过255只显示
255.
修改耳机听歌时的音量
选择模式为耳机模式修改melody里面的数据(耳机接电话的音量是修改speech里面的数据)
比较合适完美数据
melody调整:16 48 80 112 147 190 210。
mtkclient用法

mtkclient是一个用于与MTK芯片进行通信的工具,可以用于下载、上传文件以及读取和写入注册表等操作。
使用mtkclient时,需要按照以下步骤进行操作:
1.连接手机和电脑。
使用mtkclient时,需要将手机和电脑进行连接。
可以通
过USB数据线或网络连接等方式进行连接。
2.打开mtkclient窗口。
在电脑中打开mtkclient窗口,可以通过在命令行输
入mtkclient命令或者在应用商店下载mtkclient应用程序等方式打开。
3.输入命令。
在mtkclient窗口中,可以根据需要输入相应的命令来下载、上
传文件以及读取和写入注册表等操作。
例如,输入“mtkclient r boot,vbmeta boot.img,vbmeta.img”命令可以读取boot和vbmeta文件。
4.查看输出信息。
在输入命令后,可以在mtkclient窗口中查看输出信息,以
确定操作是否成功。
如果操作成功,将显示相应的提示信息。
5.断开连接。
在完成相应的操作后,需要断开手机和电脑的连接。
可以通过
点击mtkclient窗口中的“断开连接”按钮或者在命令行中输入相应的命令来断开连接。
需要注意的是,使用mtkclient时需要按照相应的操作步骤进行操作,并且需要保证手机和电脑的连接稳定可靠。
同时,也需要根据实际情况进行相应的调整和处理。
MTK音频参数调试方法

音频参数调试方法:
输入*#3646633#进入工程模式,进入第三项“音频”.
菜单中“正常”是普通使用不插耳机、不开免提地情况下地参数,
“LoudSp Mode”是通话时开免提地情况下地参数,
“Headset Mode”是插入耳机时地参数;
每个模式中又有6个具体参数:
“speech”是通话音量,在“正常”模式下调speech
调
应.
量3
不要超过208,凡调整speaker时参数不要超过148,调整mic 时参数不要超过232.
另外,如果mic、receiver音量还是达不到要求,可以在“音频”菜单地“语音增强”选项地“正常”下,调整参数7,参数7是由两位16进制数转换地10进制数,两位16进制数地前一位是receiver参数,后一位是mic参数.如:想给receiver增大6、mic增大11,则对应16进制数为6B,转
换为10进制数是107,那参数7中就输入107;再如想给receiver增大4、mic增大3,则对应16进制数为43,转换为10进制数是67,那参数7中就输入67.。
MTK应用入门

MTK MMI应用入门:1、初始化例程,注册一系列处理函数,比如协议事件处理函数、按键事件处理函数、消息事件处理函数、选中菜单处理函数等等。
2、选中菜单处理函数(Highlight Handler functions)。
即根据用户的定义,选择某菜单时需要执行的函数。
3、完成入口函数(Entry functions)。
即当前应用被其他应用覆盖,其他应用结束后回到当前应用所需要调用的函数。
4、完成退出函数(Exit functions)。
即当前应用被其他应用覆盖时,为保存当前应用的一些现场数据而需要调用的函数。
5、完成业务逻辑,在不同screen之间的进行切换调用。
MMI 采用screen流的方式进行屏幕之间的转换,进入新的screen之前,执行被覆盖screen 的exit函数,并将相关信息存入历史记录,然后进入新的screen, 从新的screen退出后从history数据库取出上一screen的信息,进入其entry函数。
以下代码片段的API都是系统提供的,可在头文件中找到其原形。
初始化函数代码片断://以下两个API参考eventGprot.hV oid MMSInitialization(void){//设事件处理函数如下闹钟超时处理时间SetProtocolEventHandler(AlmExpiryHandler, MSG_ID_MMI_EQ_ALARM_IND);//设置Highlight Handler函数当点mms菜单后调用相应函数HighlightMMSHandler SetHiliteHandler (MESSAGES_MENU_MMS_MENUID, HighlightMMSHandler);}入口函数代码片断:// 本例为进入短信主菜单的处理函数相关接口函数可在对应的头文件中查找void EntrySMSMainMenuList (void){U8* guiBuffer;U16 nStrItemList[MAX_SUB_MENUS];U16 numItems;U16 itemIcons[MAX_SUB_MENUS];U8* popUpList[MAX_SUB_MENUS];U32 menuItemId=-1;U32 menuItemId1=-1;U32 maskingByte=-1;U8** pPopUpList=NULL;//进入入口函数必须首先调用EntryNewScreen, 该函数执行上一屏幕的退出函数,并记录当前屏幕的入口和退出函数EntryNewScreen(SCR_ID_MSG_SMS_MAIN_MENU, mmi_msg_exit_generic, EntrySMSMainMenuList, NULL);//设置当前screen IDSetMessagesCurrScrnID(SCR_ID_MSG_SMS_MAIN_MENU);//获取当前screen 的gui buffer,用于被当前screen被覆盖后存入历史记录guiBuffer = GetCurrGuiBuffer (SCR_ID_MSG_SMS_MAIN_MENU);//设置当前screen的父menu IDSetParentHandler (MESSAGES_MENU_SMS_MENUID);//注册Highlighthandler处理函数RegisterHighlightHandler (ExecuteCurrHiliteHandler);//获取当前菜单子菜单数目numItems = GetNumOfChild (MESSAGES_MENU_SMS_MENUID);//获取子菜单的stringGetSequenceStringIds(MESSAGES_MENU_SMS_MENUID, nStrItemList);//获取子菜单IconGetSequenceImageIds(MESSAGES_MENU_SMS_MENUID, itemIcons);mmi_msg_set_msg_num_hint (msgbox_info.totalinbox, msgbox_info.totaloutbox, msgbox_info.totaldraftbox);ConstructHintsList(MESSAGES_MENU_SMS_MENUID, popUpList);mmi_msg_set_msg_menu_highlight_handler();if (g_msg_cntx.msg_init){pPopUpList = popUpList;}else{pPopUpList = NULL;}menuItemId=GetChildMenuIDIndexByParentMenuID(MESSAGES_MENU_SMS_MENUI D, MESSAGES_MENU_INBOX_MENUID);if(menuItemId!=-1){if(IsResetCSPGroupService(CSP_TELESERVICES_SERVICE_GROUP,CSP_SM_MT)){ResetBit(maskingByte,menuItemId/*1*/);}}menuItemId=GetChildMenuIDIndexByParentMenuID(MESSAGES_MENU_SMS_MENUI D, MESSAGES_MENU_WMESSAGE_MENU_ID);menuItemId1=GetChildMenuIDIndexByParentMenuID(MESSAGES_MENU_SMS_MENU ID, MESSAGES_MENU_OUTBOX_MENUID);if(menuItemId!=-1 && menuItemId1!=-1){if(IsResetCSPGroupService(CSP_TELESERVICES_SERVICE_GROUP,CSP_SM_MO)) {ResetBit(maskingByte, menuItemId/*0*/);ResetBit(maskingByte,menuItemId1/*2*/);}}menuItemId=GetChildMenuIDIndexByParentMenuID(MESSAGES_MENU_SMS_MENUI D, MESSAGES_MENU_CB_MENUID);if(menuItemId!=-1){if(IsResetCSPGroupService(CSP_TELESERVICES_SERVICE_GROUP,CSP_SM_CB)) ResetBit(maskingByte,menuItemId/*6*/);}menuItemId=GetChildMenuIDIndexByParentMenuID(MESSAGES_MENU_SMS_MENUI D, MESSAGES_MENU_VMAIL_MENUID);if(menuItemId!=-1){if(IsResetCSPGroupService(CSP_V ALUE_ADDED_SERVICES_SERVICE_GROUP,CSP_ VPS))ResetBit(maskingByte,menuItemId/*5*/);}MaskStringItems(popUpList,(U8)numItems,maskingByte);MaskItems(itemIcons,(U8)numItems,maskingByte);numItems=MaskItems(nStrItemList,(U8)numItems,maskingByte);MaskHiliteItems(MAIN_MENU_MESSAGES_MENUID, maskingByte);g_msg_cntx.currBoxIndex=0;// show category 函数,将上面准备好的参数传递进去,show当前screen ,show category 系统已经提供了足够多风格的函数选择,可根据需要调用对应的showcategory函数.ShowCategory52Screen (STR_SMS_MENUENTRY, IMG_SMS_ENTRY_SCRN_CAPTION,STR_GLOBAL_OK, IMG_SMS_COMMON_NOIMAGE,STR_GLOBAL_BACK, IMG_SMS_COMMON_NOIMAGE,numItems,nStrItemList, itemIcons,(U8 **) pPopUpList ,0, 0,guiBuffer );//注册右软件处理函数返回键SetRightSoftkeyFunction (GoBackHistory, KEY_EVENT_UP);//同上SetKeyHandler (GoBackHistory, KEY_LEFT_ARROW, KEY_EVENT_DOWN);}退出函数代码片断:退出函数在进入函数的EntryNewScreen中第二个参数被注册,进入当前screen时执行上仪screen的exit函数。
MTK编译过程

MTK的编译过程1.1. 编写目的本文编写的目的主要是为了从整体上理解MTK的编译过程,以便能够较快的处理编译中遇到的问题,同时为以后可能的优化编译过程提供参考。
1.2. 简介MTK的编译过程主要是在windows命令行下通过MakeFile文件来执行相应的perl脚本或c程序,将资源包生成c源程序,并与相应模块的c程序生成.o,.lib或.obj的中间代码,最终生成在手机上使用的.bin文件和在模拟器上使用的mmiresource.dll资源文件。
1.3. 编译命令1.4. 编译相关的文件1.5. 常见编译错误1、mtk_resgenerator.exe不能正常运行。
可能是ResGenerator文件夹中的某些文件有错误。
一个原因是在ResGenerator文件夹中缺少temp.rgb这个文件,并且不能自动生成。
2、240X320屏的Font_res.c文件的错误,因为打开了中文字体的编译开关,只需要将mmi_featurespluto.h文件中__MMI_LANG_SM_CHINESE__的编译开关关闭即可。
3、出现以下错误,"plutommi\mmi\FunAndGames\FunAndGamesSrc\Game.c", line 349: Error: C2455E: array [0] found"plutommi\mmi\FunAndGames\FunAndGamesSrc\Game.c", line 350: Error: C2455E: array [0] found因为默认的240X320屏幕打开的关于游戏的编译开关下没有游戏,所以需要打开mmi_featurespluto.h文件中的__MMI_GAME_VSMJ_240x320__编译开关。
4、现象:mmiresource模块生成错误:"plutommi\Customer\custresource\custimgmapext.c", line 31: Error: C2456E: undeclared name, inventing 'extern int MAX_IMAGE_IDS'"plutommi\Customer\custresource\custimgmapext.c", line 31: Serious error: C2958E: illegal in constant expression: non constant 'MAX_IMAGE_IDS'plutommi\Customer\custresource\custimgmapext.c: 0 warnings, 1 error, 1 serious error原因:改变了屏幕大小后,128X160目录下的图片资源有问题。
MTK常用函数说明

得到系统资源(1)
根据ID得到串地址 GetString 得到mainmenu的标题icon GetRootTitleIcon 根据菜单项ID得到对应的串ID GetStringIdOfItem 根据菜单ID得到所有子项的image id 子项系列有可能是image,也有可能是串 GetSequenceImageIds
MTK常用函数 MTK常用函数
内存分配函数
OslMalloc OslFree
字符串和整形数据的转换
一、ascii和unicodeString的转换 AnsiiToUnicodeString AnsiiNToUnicodeString 二、unicode和ansii的转换 UnicodeToAnsii UnicodeNToAnsii
得到系统资源(3)
根据父亲菜单ID和子项索引得到对应子 项的字串或者image id GetSeqItemId_Ext 根据父亲菜单ID和子项索引得到对应子 项的image id GetSeqItemImageId_Ext
屏幕操作函数
SetParentHandler
串操作函数(1)
pfnUnicodeToEncodingScheme pfnEncodingSchemeToUnicode pfnUnicodeStrlen pfnUnicodeStrcpy pfnUnicodeStrncpy
串操作函数(2)
pfnUnicodeStrcmp pfnUnicodeStrncmp pfnUnicodeStrcat pfnUnicodeStrncat pfnUnicodeStrtok
关于MTK平台CC相关的Log查询

关于MTK平台CC相关的Log查询关于MTK平台CC相关的Log查询在外场问题中,经常会出现通话相关的故障。
这⾥简单总结⼀下通话相关log的分析点:主叫⽅:主叫⽅,是指主动发起通话的⼀⽅。
1. 初步定位问题,⽤户发起通话时,AP端的拨号指令最终会通过AT到达modem,所以可以通过查看radio_log中相关的拨号AT指令来判断问题出现在AP还是BP。
11-04 11:06:06.397 484 487 D AT : AT> ATD137********;11-04 11:06:06.397 484 487 D AT : ATD137********;如果出现问题的时间点没有对应的ATD指令,可以推断AP端没有向Modem发送拨号指令,基本可以断定是AP的问题;如果ATD已经下发,可以将问题归属到modem端。
AP端,定位AP端的问题主要根据main_log来跟踪代码的执⾏流程。
在MTK Androd平台上⼤致的执⾏流程如下:OutgoingCallBroadcast.javaPhoneGlobals.getInstance().callController.placeCall(intent);CallController.javaCallStatusCode status = placeCallInternal(intent);PhoneUtils.placeCall (***);PhoneUtils.javaConnection = app.mCM.dial(phone, numberToDial);CallManager.javaResult = basePhone.dial(dialString);GsmPhone.javaReturn mCT.dial(newDialString, uusInfo);cm.dial(*****, obtainCompleteMessage(EVENT_DIAL_CALL_RESULT));此后,AP端通过RIL.java将拨号发送⾄libril,最终到达modem。
MTK音频调试非常详细明了

MTK音频调试非常详细明了
MTK音频调试流程
一.发送曲线:
先测出原始曲线,参数改为下图:
将UPL测出的曲线数据保存为.TRC,如下图:
打开META,如下图:
设置如下:
把刚才保存的.|TRC文件导入,如下图:
如果曲线中有不太理想的地方,可以用鼠标拖动,然后再Run,如下图:
选择文件名tx和路径,并保存:
然后Run,退出该窗口:
把刚才保存的tx Load进来:
Downloan到手机里:
最后,点击Disconnect:
二.接收曲线:
调试方法同发送曲线。
三.接收响度:
过CTA时,最大音量的参数不要大于196。
四.发送响度:
五.STMR:
注意:两个响度和STMR都是反着调。
六.MIDI音量:
七.MP3音量:
上图中红色是调最大音量的,蓝色是调音阶大小,最后生成一个.c 文件给软件。
CTA标准:
发送响度:SLR值(5 -11db) ;8 接收响度:
REC_NOM RLR值(-1 -5db) 2 REC_MAX RLR值(大于13db )
测音掩蔽:STMR值(8-18db)18 *#3646633#。
MTK通话函数流程

MTK通话函数流程来电:1. PsCBackCallIncoming()ProcessIncomingEvents(CM_PS_CALL_INCOMING, info);2.ProcessIncomingCallEvent(info)AddNewCallInfo()在这里,cm_p->state_info.AllCalls[index].group_id = GetUnUsedGroupID();如果是MO,那么就先设置为255,然后在PsCBackSetCallFeature( )中在设置为GetUnUsedGroupID()CMSetupAlertForMT(); 准备提示信息3. mmi_gsm_ring_ind()mmi_ucm_ring_ind_struct ring_ind;装载ring_indmmi_ucm_dispatch_ind(MMI_UCM_RING_IND, (void *)&ring_ind);4. mmi_ucm_ring_ind(void *act_struct) 参数就是上面的ring_ind如果(当前没有OUTGOING, INCOMING group,不存在紧急电话,不是黑名单号码){mmi_ucm_sync_call_list(ind->call_list); 同步cm_p与g_ucm_p 把参数带进来的消息拷贝到g_ucm_p->mo_mt_display和g_ucm_p->call_misc.l4c_info中mmi_ucm_entry_marker()mdi_audio_stop_all()}否则 //自动拒接来电{mmi_ucm_pre_send_req(MMI_UCM_AUTO_REJECT,&(ind->uid_info), NULL, NULL);mmi_ucm_pre_send_req(MMI_UCM_FORCE_RELEASE,&(ind->uid_info), NULL, NULL);}5. mmi_ucm_entry_incoming_call()根据g_ucm_p->mo_mt_display,设置一些提示信息:tone id, path, image……ShowCategory17Screen()注册按键相应:任意键接听:mmi_ucm_incoming_call_sendkey()右软件,END键拒接:mmi_ucm_incoming_call_endkey()SEND键接听:mmi_ucm_incoming_call_endkey()mmi_ucm_play_incoming_tone()分2中:ring tone, wait tone拒接来电1.mmi_ucm_incoming_call_endkey()mmi_ucm_stop_incoming_tone()如果已经启动自动接听,则停止定时器UCM_AUTO_ANSWER_TIMERmmi_ucm_end_single_action_with_index(groupIndex, 0)2. mmi_ucm_end_single_action_with_index( )mmi_ucm_id_info_struct actionId;显示processing….装载actionIdmmi_ucm_pre_send_req(MMI_UCM_END_SINGLE, &actionId, NULL, NULL);3. mmi_ucm_pre_send_req( )mmi_ucm_single_call_struct singleReq;用上面的actionId装载singleReqmmi_ucm_send_req(op_code, first_ptr->call_type, &singleReq);4. mmi_ucm_send_req( )mmi_gsm_ucm_act_req(MMI_UCM_END_SINGLE, act_struct);5. mmi_gsm_ucm_act_req( )设置:cm_p->ucm_action_type = MMI_GSM_UCM_NORMAL, cm_p->ucm_operation = MMI_GSM_UCM_END_SINGLE mmi_gsm_end_single(act_struct);6. mmi_gsm_end_single( ) 所有的挂断电话都是在这里处理由于此时只有一通来电,因此执行:else if(GetT otalCallCount() == 1 && GetCurrentState() == CM_INCOMING_STATE) 这个分支SetCallflag(CM_HANGUP_REQUESTED)MakePsAthRequest((void*)PsCBackIncomingCallRejected);7. MakePsAthRequest( )发送消息:PRT_ATH_REQathReq->op_code = L4C_DISCONNECT_NONE;L4C返回消息:PRT_ATH_REQ_SUCCESS,进入CBACK:1. PsCBackIncomingCallRejected( )ProcessIncomingEvents(CM_PS_INCOMING_CALL_REJECTED, info); J进入状态机g_bUserReject = TRUE;gIncomingCallDroppedFlag = TRUE2. ProcessIncomingCallRejected()装载cm_p->disc_callResetCallflag(CM_HANGUP_REQUESTED)设置CM的状态PurgeIncomingCallStructure()清除了该来电在cm_p中的信息。
MTK环境及工具开发简介

2.
BROM_DLL
BROM_DLL的功能与流程
1. 2. 3. 4. 5. 6. 7. 创建和加载句柄 DA_HANDLE_T:Download Agent,ROM识别等。 AUTH_HANDLE_T:针对加密的基带芯片。 DL_HANDLE_T:下载文件加载。 DL_HANDLE_LIST_T:多下载文件加载。 RB_HANDLE_T:从手机读取内容。 连接到手机 Advanced API Set(用FlashTool_Connect或FlashTool_Connect_ByhCom函数) All-In-One API Set(可省略3-6步) 设置波特率 FlashTool_ChangeBaudrate() DA操作唤醒 断开前处理 FlashTool_PostProcess() 与手机断开 FlashTool_Disconnect() 释放资源 释放句柄等操作。
3.2 往手机里写入一项NVRAM值
主函数
开始 否 初始化Database 回调函数 进入 Database初始化完成 是 设置缓存区里某项NVRAM的值 定义NVRAMMan的回调函数 用NVRAMMan写入数据到手机 等待p_WriteOver_Event 成功 重置事件 p_WriteOver_Event 结束 超时 报警提示失败 结束
2.2 与手机通信的底层库
1. BROM.DLL:负责与手机启动时的握手协议。 META.DLL:负责与手机通信。 META-LAB:TX/RX/AFC控制、NVRAM读写、铃声测 试;不需仪器支持,用于开发。 META-FACTORY:产线RF校准。 SLA_Challenge.dll:安全认证的库。
设置事件 p_WriteOver_Event
mtk平台函数

DIARYMTK 2010-06-07 14:07:18 阅读90 评论0 字号:大中小May.19LCD移植static const s_lcd_probe gLcdProbe[] = {...{"ILI9328", LCD_IsILI9328, &LCD_func_ILI9328},{"LP4948", NULL, &LCD_func_LP4948},}原来{"LP4948", NULL, &LCD_func_LP4948},放在{"ILI9328", LCD_IsILI9328, &LCD_func_ILI9328},前面导致开机白屏,原因是void LCD_FunConfigNew(void){#if 1kal_uint32 i;for (i = 0; i < LCD_PROBE_NUM; i ++) {if ((gLcdProbe[i].lcd_probe == NULL) || (KAL_TRUE == (gLcdProbe[i].lcd_probe)())) {break;}}gLcdSeq = i;MainLCD = gLcdProbe[gLcdSeq].lcd_func;#endif// MainLCD = &LCD_func_ILI9225;}当走到"LP4948"项时,由于其对应的lcd_probe为"NULL",导致退出循环,使得LCD相应的功能函数都指向"LP4948"对应的函数。
双卡改单卡。
SINGLE_SIM_MMI_ONLY某个菜单项STR_ID不显示。
原来是其子菜单个数与实际个数不相符。
键盘定义Custom/drv/Drv_tool/DrvGen.exeCustom/drv/misc_drv/MT6225_08A_GEMMI_BB/Codegen/codegen.dws分布式编译某个模块出问题了。
Telephony关键流程总结

Telephony 关键流程总结一、 T elephony 通话关键操作Phone StateCall State在Telephony 中,主要操作是拨号、挂断、接听、来电、保持通话以及接听等待,相互之间的操作见上图。
Driver Call State 是从RIL 接口更新的状态,它具有6个状态,分别是:ACTIVE 、HOLDING 、DIALING 、ALERTING 、INCOMING 、WAITING ;正好对应Ril.h 中的RIL_CallState 。
当下发RIL_REQUEST_GET_CURRENT_CALLS request 后,DriverCall State ,会根据response 携带的状态信息更新自己的状态。
Call State 同样包含DriverCall 所具有的6个状态,但同时Call 还有3种状态:IDLE 、DISCONNECTING、DISCONNECTED,当Call 每次执行handlePollCalls时,会根据driver call 来更新ACTIVE,HOLDING,DIALING, ALERTING,INCOMING,WAITING这6种状态,对于IDLE, DISCONNECTING and DISCONNECTED这三种额外的状态.如果一个Call是空的,那么它就是在IDLE状态; 如果本机挂断这个Call。
这时Call会变成DISCONNECTING状态; 如果对方来电,但是这个connection因为本地拒接(REJECTED)或者无人接听(MISSED)。
或者正在活动的connection因本地挂断或者对方挂断等原因中断,又或者播出的电话是无效的。
那么这个connection就会被标记为disconnected。
Phone State则是根据updatePhoneState方法,从Call State更新的。
如果振铃呼叫(ringingCall)是处在INCOMING/WAITING状态,这时Phone State就是RINGING 状态。
一次通话典型信令流程HW

主叫流程
主叫流程是指UE呼叫其它用户(例如PSTN用户)的过程。
具体流程如图a所示,主叫流程大体经过了如下几个过程:
(1) RRC连接建立:UE发起RRC连接建立过程,建立起与RNC之间的信令连接。
(2) 信令连接建立:RNC建立起与CN之间的信令连接。
(3) RAB建立:CN响应UE的业务请求,要求RNC建立相应的无线接入承载,建立成功后,对方应答,双方通话。
(4) 信令连接释放:通话过程结束,首先释放RNC和CN之间的信令连接。
(5) RAB释放:释放无线接入承载。
(6) RRC释放:如果没有其他的无线接入承载,将释放UE和RNC之间的RRC连接。
被叫流程
被叫流程是指网络侧有寻呼请求,呼叫UE,UE响应寻呼的过程。
UE接收到寻呼消息后,将发起RRC连接建立过程。
被叫流程大体经过如下几个过程:
(1) 寻呼
网络侧寻呼UE。
(2) RRC连接建立
UE应答呼叫,发起与RNC之间的RRC连接建立过程。
(3) 信令连接建立及直传过程
RNC建立起与CN之间的信令连接。
(4) RAB建立
CN要求RNC建立相应的无线接入承载。
建立成功后,UE和CN交互信令,应答进入通话状态。
(5) 信令连接释放
通话结束,释放RNC与CN之间的信令连接。
(6) RAB释放
释放无线接入承载。
(7) RRC释放
如果没有其他的无线接入承载,将释放UE与RNC之间的RRC连接。
MTK文件操作常用函数

1. int FS_Open(const WCHAR*FileName, UINT Flag)该函数用来打开一个文件,FielName为文件路径及文件名,Flag为文件的操作属性,其值可为FS_READ_WRITE,FS_READ_ONLY,FS_OPEN_SHARED等。
如果文件打开成功,该函数返回一个大于等于0的值,否则返回一个小于0 的值。
具体操作方法可如下:FS_HANDLE h;if((h = (FS_HANDLE)FS_Open((constWCHAR*)filename,FS_READ_WRITE|FS_OPEN_SHARED|FS_CREATE)) >= 0){FS_Close(h);}注意,这里的路径要转换成Unicode字符串,可以通过AnsiiToUnicodeString(S8 * pOutBuffer, S8 *pInBuffer)函数来实现。
比如我们在D盘的example 文件夹下有一个test.c 文件需要对其进行修改(D:\example\test.c),则:FS_HANDLE h;S8UnicodeName[100];AnsiiToUnicodeString((S8*) UnicodeName, (S8 *)”D:\\example\\test.c”);if((h = (FS_HANDLE)FS_Open((const WCHAR *)UnicodeName,FS_READ_WRITE|FS_OPEN_SHARED|FS_CREATE)) >= 0){FS_Close(h);}也可使用FS_Open((const WCHAR *)L”D:\\example\\t est.c”,FS_READ_WRITE|FS_OPEN_SHARED|FS_CREATE)方式打开。
当对文件修改完成后,要使用函数FS_Close()将其关闭。
2. intFS_Close(FS_HANDLEFileHandle)用来关闭一个已经打开的文件。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
来电:1. PsCBackCallIncoming()ProcessIncomingEvents(CM_PS_CALL_INCOMING, info);2.ProcessIncomingCallEvent(info)AddNewCallInfo()在这里,cm_p->state_info.AllCalls[index].group_id = GetUnUsedGroupID();如果是MO,那么就先设置为255,然后在PsCBackSetCallFeature( )中在设置为GetUnUsedGroupID()CMSetupAlertForMT(); 准备提示信息3. mmi_gsm_ring_ind()mmi_ucm_ring_ind_struct ring_ind;装载ring_indmmi_ucm_dispatch_ind(MMI_UCM_RING_IND, (void *)&ring_ind);4. mmi_ucm_ring_ind(void *act_struct) 参数就是上面的ring_ind如果(当前没有OUTGOING, INCOMING group,不存在紧急电话,不是黑名单号码){mmi_ucm_sync_call_list(ind->call_list); 同步cm_p与g_ucm_p把参数带进来的消息拷贝到g_ucm_p->mo_mt_display和g_ucm_p->call_misc.l4c_info中mmi_ucm_entry_marker()mdi_audio_stop_all()}否则 //自动拒接来电{mmi_ucm_pre_send_req(MMI_UCM_AUTO_REJECT, &(ind->uid_info), NULL, NULL);mmi_ucm_pre_send_req(MMI_UCM_FORCE_RELEASE, &(ind->uid_info), NULL, NULL);}5. mmi_ucm_entry_incoming_call()根据g_ucm_p->mo_mt_display,设置一些提示信息:tone id, path, image……ShowCategory17Screen()注册按键相应:任意键接听:mmi_ucm_incoming_call_sendkey()右软件,END键拒接:mmi_ucm_incoming_call_endkey()SEND键接听:mmi_ucm_incoming_call_endkey()mmi_ucm_play_incoming_tone()分2中:ring tone, wait tone拒接来电1.mmi_ucm_incoming_call_endkey()mmi_ucm_stop_incoming_tone()如果已经启动自动接听,则停止定时器UCM_AUTO_ANSWER_TIMERmmi_ucm_end_single_action_with_index(groupIndex, 0)2. mmi_ucm_end_single_action_with_index( )mmi_ucm_id_info_struct actionId;显示processing….装载actionIdmmi_ucm_pre_send_req(MMI_UCM_END_SINGLE, &actionId, NULL, NULL);3. mmi_ucm_pre_send_req( )mmi_ucm_single_call_struct singleReq;用上面的actionId装载singleReqmmi_ucm_send_req(op_code, first_ptr->call_type, &singleReq);4. mmi_ucm_send_req( )mmi_gsm_ucm_act_req(MMI_UCM_END_SINGLE, act_struct);5. mmi_gsm_ucm_act_req( )设置:cm_p->ucm_action_type = MMI_GSM_UCM_NORMAL, cm_p->ucm_operation = MMI_GSM_UCM_END_SINGLEmmi_gsm_end_single(act_struct);6. mmi_gsm_end_single( ) 所有的挂断电话都是在这里处理由于此时只有一通来电,因此执行:else if(GetTotalCallCount() == 1 && GetCurrentState() == CM_INCOMING_STATE) 这个分支SetCallflag(CM_HANGUP_REQUESTED)MakePsAthRequest((void*)PsCBackIncomingCallRejected);7. MakePsAthRequest( )发送消息:PRT_ATH_REQathReq->op_code = L4C_DISCONNECT_NONE;L4C返回消息:PRT_ATH_REQ_SUCCESS,进入CBACK:1. PsCBackIncomingCallRejected( )ProcessIncomingEvents(CM_PS_INCOMING_CALL_REJECTED, info); J进入状态机g_bUserReject = TRUE;gIncomingCallDroppedFlag = TRUE2. ProcessIncomingCallRejected()装载cm_p->disc_callResetCallflag(CM_HANGUP_REQUESTED)设置CM的状态PurgeIncomingCallStructure()清除了该来电在cm_p中的信息。
但是在cm_p->disc_call中仍然存在mmi_gsm_release_ind(GetCallEndCause());mmi_gsm_end_single_rsp(TRUE, NULL);3.mmi_gsm_release_ind( )mmi_ucm_release_ind_struct release_ind;用cm_p->disc_call来装载release_indmmi_gsm_get_call_list(release_ind.call_list); 获取cm_p中的电话信息mmi_ucm_dispatch_ind(MMI_UCM_RELEASE_IND, (void *)&release_ind);4. mmi_ucm_release_ind()mmi_ucm_stop_inband_tone();mmi_ucm_stop_incoming_tone();因为是来电,start_time时间无效,因此log call装载g_ucm_p->call_endmmi_ucm_sync_call_list(ind->call_list); 同步cm_p与g_ucm_p。
此时,2个变量中除了disc_call和call_end,再也没有其他关于被挂断电话的信息了。
mmi_ucm_entry_call_end()提示信息:结束(需要利用g_ucm_p->call_end的信息)恢复一些必要的变量到原始状态清除g_ucm_p->call_end信息5. mmi_gsm_end_single_rsp()mmi_ucm_act_rsp_struct end_single_rsp;设置:cm_p->ucm_action_type = MMI_GSM_UCM_NO_ACTION, cm_p->ucm_operation = MMI_GSM_UCM_IDLEmmi_gsm_get_call_list(end_single_rsp.call_list);ResetRedialAttempts() 清除自动重拨信息mmi_ucm_dispatch_rsp(MMI_UCM_END_SINGLE, MMI_UCM_VOICE_CALL_TYPE, (void *)&end_single_rsp);6. mmi_ucm_end_act_rsp()mmi_ucm_sync_call_list(rsp->call_list);mmi_ucm_set_process_state(-1, -1, MMI_UCM_DO_PROCESS_STATE, MMI_UCM_COMP_PROCESS_STATE);mmi_ucm_set_process_state(-1, -1, MMI_UCM_COMP_PROCESS_STATE, MMI_UCM_IDLE_PROCESS_STATE);拒接接听1.mmi_ucm_incoming_call_sendkey()mmi_ucm_stop_incoming_tone();判断该如何去接听2. mmi_ucm_accept_action()mmi_ucm_id_info_struct actionId;显示processing…..g_ucm_p->call_misc.curr_action = MMI_UCM_ACCEPT;装载actionId;mmi_ucm_pre_send_req(MMI_UCM_ACCEPT, &actionId, NULL, NULL);3. mmi_ucm_send_req(op_code, first_ptr->call_type, &singleReq);4. mmi_gsm_ucm_act_req(MMI_UCM_ACCEPT, act_struct);设置cm_p->ucm_action_type = MMI_GSM_UCM_NORMAL, cm_p->ucm_operation = MMI_GSM_UCM_ACCEPT5. mmi_gsm_accept(act_struct)MakePsCallAcceptIncoming((void*)PsCBackIncomingCallAccepted);发送消息:PRT_INCOMINGCALL_ACCEPT_EVENTL4返回消息PRT_INCOMINGCALL_ACCEPT_SUCCESS,进入CBACK:1.PsCBackIncomingCallAccepted()ProcessIncomingEvents(CM_PS_INCOMING_CALL_CONNECTED, info); 进入状态机2. ProcessAcceptIncomingCall()设置CM的状态SetIncomingCallStateActive();mmi_gsm_accept_rsp(TRUE, NULL);3. mmi_gsm_accept_rsp( )mmi_ucm_act_rsp_struct accept_rsp;设置cm_p->ucm_action_type = MMI_GSM_UCM_NO_ACTION, cm_p->ucm_operation = MMI_GSM_UCM_IDLEmmi_gsm_get_call_list(accept_rsp.call_list); 获取cm_p电话信息mmi_ucm_dispatch_rsp(MMI_UCM_ACCEPT, MMI_UCM_VOICE_CALL_TYPE, (void *)&accept_rsp);4. mmi_ucm_accept_act_rsp(act_struct);Log callmmi_ucm_sync_call_list(rsp->call_list); 同步cm_p与g_ucm_p mmi_ucm_set_process_state(-1, -1, MMI_UCM_DO_PROCESS_STATE, MMI_UCM_COMP_PROCESS_STATE);mmi_ucm_set_process_state(-1, -1, MMI_UCM_COMP_PROCESS_STATE, MMI_UCM_IDLE_PROCESS_STATE);mmi_ucm_go_back_screen_check();5. mmi_ucm_go_back_screen_check() 此时这个来电信息已经变成ACTIVEmmi_ucm_tab_highlight(); 设置显示的tab信息mmi_ucm_entry_in_call();笔记:1. 先看个重要的数据结构MMI_PHB_LLOKUP_NODE_STRUCT LookUpTable[MAX_LLOKUP_TABLE_COUNT];Typedef struct{U16 store_index; /*Store Index of Phonebook,Begin from 0 */U32 number;}MMI_PHB_LOOKUP_NODE_STRUCT;注意此处存储的number的int 值,也即是atol(PS8) number转化后的值。