[DESCRIPTION]
network mode的常见类型有
WCDMA preferred : 0
GSM only : 1
WCDMA only : 2
GSM UMTS : 3
CDMA : 4
... (参考RILConstants.java)
是透过AT+ERAT把mode的值丢给modem,让modem设定对应的mode。 如果是TDD手机,那么其network mode的值和TD-SCDMA是对应的。
WCDMA preferred -- TD-SCDMA preferred
WCDMA only -- TD-SCDMA only
这个network mode在第一次开机时会有一个参数来记录默认值,这个参数就是PREFERRED_NETOK_MODE,该参数定义在在RILConstants.java中。在SettingProvider loading的时候,这个参数的值就写到Settings.Global.PREFERRED_NETWOK_MODE当中(参考SettingsProvider中的DatabasHelper.java)。然后在make default phone的时候就根据Settings.Global.PREFERRED_NETWOK_MODE取出来的值来使用。
注:因为network mode是End user可以通过操作setting菜单切换的,所以本FAQ只是修改download完第一次开机的network mode默认值
2、修改为系统默认不支持的网络模式
原生的NETWORK_MODE_*宏只定义了部分网络模式,一些特殊的网络模式组合可能不支持,例如L版本默认不支持2G/4G这种模式。如果要新增一种网络模式,可以参考下面的修改方案(KK版本默认支持4G/2G模式).
2.1. Java层改动
(1)alps\frameworks\base\telephony\java\com\android\internal\telephony\RILConstants.java
增加"4G/2G" network mode
//MTK-START: add for LTE
int NETWORK_MODE_MTK_BASE = 30;
// "4G/2G" item
int NETWORK_MODE_LTE_GSM = NETWORK_MODE_MTK_BASE+5;
int NETWORK_MODE_LTE_GSM_MMDC = NETWORK_MODE_MTK_BASE+6;
//MTK-END: add for LTE
(2)alps\frameworks\opt\telephony\src\java\com\android\internal\telephony\Phone.java
增加"4G/2G"
int NT_MODE_LTE_GSM = RILConstants.NETWORK_MODE_LTE_GSM;
2.2. RILD的处理
(1)alps\vendor\mediatek\proprietary\hardware\ril\mtk-ril\Ril_nw.h
typedef enum
{
NT_WCDMA_PREFERRED_TYPE, // WCDMA preferred (auto mode)
NT_GSM_TYPE, // GSM only
NT_WCDMA_TYPE, // WCDMA only
NT_AUTO_TYPE, // AUTO
NT_LTE_GSM_WCDMA_TYPE = 9,
NT_LTE_ONLY_TYPE = 11,
NT_LTE_WCDMA_TYPE = 12
增加"4G/2G" item
//MTK-START: add for LTE
,NT_MODE_MTK_BASE_TYPE = 30
//for "4G/2G" item
,NT_LTE_GSM_TYPE = (NT_MODE_MTK_BASE_TYPE+5)
,NT_LTE_GSM_MMDC_TYPE = (NT_MODE_MTK_BASE_TYPE+6)
//MTK-END: add for LTE
} NETWORK_TYPE;
(2)alps\vendor\mediatek\proprietary\hardware\ril\mtk-ril\Ril_nw.c
void requestSetPreferredNetworkType(void * data, size_t datalen, RIL_Token t) {
switch(req_type)
{
......
增加"4G/2G" item 的处理
//for "4G/2G" item rat only mode
case NT_LTE_GSM_TYPE:
rat = 4;
rat1= 0;
break;
}
(3)alps\vendor\mediatek\proprietary\hardware\ril\mtk-ril\Ril_nw.c
void requestGetPreferredNetworkType(void * data, size_t datalen, RIL_Token t)
{
......
} else if(nt_type == 5 && prefer_type == 0) {
// 4G/3G
return_type = NT_LTE_WCDMA_TYPE;
} else {
goto error;
}
修改为:
} else if(nt_type == 5 && prefer_type == 0) {
// 4G/3G
return_type = NT_LTE_WCDMA_TYPE;
} else if(nt_type == 4 && prefer_type == 0) {
// 4G/2G (auto)
return_type = NT_LTE_GSM_TYPE;
//for LTE -- END
} else {
goto error;
}
2.3.将添加的2G/4G模式设置为开机的默认模式
alps/framework/base/telephony/java/com/android/internal/telephony/RILConstants.java
//for LTE the preferred nw tyep is "4G preferred"
int PREFERRED_NETWORK_MODE = FeatureOption.MTK_LTE_SUPPORT? NETWORK_MODE_LTE_GSM_WCDMA:NETWORK_MODE_WCDMA_PREF;
改为 "4G/2G":
int PREFERRED_NETWORK_MODE = FeatureOption.MTK_LTE_SUPPORT? NETWORK_MODE_LTE_GSM:NETWORK_MODE_WCDMA_PREF;
由于NETWORK_MODE_LTE_GSM的定义在 int PREFERRED_NETWORK_MODE 之后
麻烦把int PREFERRED_NETWORK_MODE 的定义移到 NETWORK_MODE_LTE_GSM之后,否则会有编译错误。
二、修改3G switch/SIM switch后主卡默认的网络模式
1.KK版本
如果在发生3G switch/SIM switch时也需要修改默认network mode,那么请在GSMPhone.java中的getMaxPreferredNetworkType方法中返回需要的值。
2.L0版本
如果在发生3G switch/SIM switch时也需要修改默认network mode,那么请在DataSubSelector.java中的setCapability方法中修改switch后具备3G/4G capability的sim卡的network mode:
PhoneRatFamily[] rat = new PhoneRatFamily[mPhoneNum];
for (int i = 0; i < mPhoneNum; i++) {
if (phoneId == i) {
log("SIM switch to Phone" + i);
phoneRat[i] = PhoneRatFamily.PHONE_RAT_FAMILY_4G
| PhoneRatFamily.PHONE_RAT_FAMILY_3G
| PhoneRatFamily.PHONE_RAT_FAMILY_2G;
} else {
phoneRat[i] = PhoneRatFamily.PHONE_RAT_FAMILY_2G;
}
3.L1版本
如果在发生3G switch/SIM switch时也需要修改默认network mode,那么请在DataSubSelector.java中的setCapability方法中修改switch后具备3G/4G capability的sim卡的network mode---如下图红色圈起部分: