[Bugfix][T108-GSW][bug-view-1513] gsw_get_sig_info error
Only Configure: No
Affected branch: unknown
Affected module: network
Is it affected on both ZXIC and ASR: only ASR
Self-test: yes
Doc Update: no
Change-Id: Id04aaba64e5db630606fb4672de12e0e1c2ae890
diff --git a/mbtk/libgsw_lib/gsw_nw_interface.c b/mbtk/libgsw_lib/gsw_nw_interface.c
index 774e23b..94a7630 100755
--- a/mbtk/libgsw_lib/gsw_nw_interface.c
+++ b/mbtk/libgsw_lib/gsw_nw_interface.c
@@ -17,6 +17,8 @@
#define MBTK_ERR_OK 0
#define GSW_IMEI_LENGTH 20+1
+#define INT_32_MAX (0x7FFFFFFF)
+
#ifndef FALSE
#define FALSE (0)
@@ -100,7 +102,7 @@
uint32 value3;
uint32 value4;
uint32 value5;
- uint32 value6;
+ uint32 value6;
uint32 value7;
uint32 value8;
uint32 value9;
@@ -414,7 +416,7 @@
#define LOGE(fmt, args...) \
do{ \
- char *file_ptr_1001 = __FILE__; \
+ char *file_ptr_1001 = __FILE__; \
char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
char line_1001[10] = {0}; \
sprintf(line_1001, "%d", __LINE__); \
@@ -667,114 +669,118 @@
}
}
-static int gsw_rssi_to_csq(int rssi)
+static int32_t rscp_convert_to_minus_dBm(uint8 rscp)
{
- LOGD("rssi = %d\n",rssi);
- if(rssi >= -113 && rssi <= -51)
+ if(rscp <= 96)
{
- return (rssi + 113) / 2;
+ return 121-rscp; // 96 map 25
+ // 0 map -121, below -120
}
-
else
{
- return 99;
+ return INT_32_MAX;
}
}
-static int gsw_rscp_to_csq(int rscp)
+static int32_t rsrp_convert_to_minus_dBm(uint8 rsrp)
{
- LOGD("rscp = %d\n",rscp);
- if(rscp <= -25 && rscp > -120)
+ if(rsrp <= 97)
{
- return rscp + 120;
+ return 141-rsrp; // 97 map 44
+ // 0 map 141 below 140
}
else
{
- return 255;
- }
-
-}
-
-static int gsw_rsrp_to_csq(int rsrp)
-{
- LOGD("rsrp = %d\n",rsrp);
-
- if(rsrp <= -44 && rsrp > -140)
- {
- return rsrp + 140;
- }
-
- else
- {
- return 255;
+ return INT_32_MAX;
}
}
-static int rscp_convert_to_dBm(int rscp)
+static int32_t rsrq_convert_to_minus_dB(uint8 rsrq)
{
- if(rscp <= 96 && rscp >= 0)
+ if(rsrq <= 34)
{
- return rscp - 120;
+ return (40-rsrq)/2; //=20-rsrq / 2;
+ // 34 map 3
+ // 0 map 20
}
else
{
- return -25;
+ return INT_32_MAX;
}
}
-static int8_t rssi_convert_to_dBm(uint8 rssi)
+//int ecno; /**< Valid values are positive integers. This value is the actual Ec/Io multiplied
+// * by -10. Example: If the actual Ec/Io is -12.5 dB, then this response value
+// * will be 125.*/
+//uint8 ecno; // 0: Ec/Io < -24 dB
+ // 1: -24 dB �� Ec/Io < -23.5 dB
+ // 2: -23.5 dB �� Ec/Io < -23 dB
+ // ......
+ // 47: -1 dB �� Ec/Io < -0.5 dB
+ // 48: -0.5 dB �� Ec/Io < 0 dB
+ // 49: 0 dB �� Ec/Io
+ // 255: not known or not detectabl
+static int32_t ecno_convert_to_minus_10_times_dB(uint8 ecno)
{
- if(rssi <= 31)
+ if(ecno <=49)
{
- return rssi * 2 - 113;
+ return 245-ecno*5; //49 map 0 db
+ // 1 map 240 db
+ // 0 map 245 below 240
}
- else
+ else
{
- return -125;
+ return INT_32_MAX;
}
}
-static int16_t rsrp_convert_to_dBm(uint8 rsrp)
-{
- if(rsrp <= 96)
- {
- return rsrp - 140;
- }
- else
- {
- return -44;
- }
-}
-static int16_t rsrq_convert_to_dB(uint8 rsrq)
-{
- if(rsrq >= 1 && rsrq <= 34)
- {
- return (rsrq + 1) / 2 - 20;
- }
- else
- {
- return -20;
- }
-}
-static int16_t ecno_convert_to_dB(uint8 ecno)
+/* change realCsq to level */
+static int rscpToLevel(int rscp)
{
- if(ecno >= 48)
- {
+
+ if (rscp < -110) {
return 0;
+ } else if (rscp <= -95) {
+ return rscp+111; // to 16
+ } else if (rscp >=-93 && rscp <=-90) {
+ return rscp+110; // to 20
+ } else if (rscp >=-89 && rscp <=-59) {
+ return (rscp+152)/3; // =(rscp+89)/3+21 to 31
+ } else if (rscp ==- 94) { // Geely requirement, -94 map 16
+ return 16;
+ } else if(rscp <= -25) {
+ return 31;
}
- else if(ecno == 255)
- {
- return 255;
- }
- else
- {
- return 48 - ecno;
- }
+ return 99;
}
+static int rsrpToLevel(int rsrp)
+{
+ if (rsrp < -130) {
+ return 0;
+ } else if (rsrp <= -118) {
+ return (rsrp+132)/2; // to 7
+ } else if (rsrp <=-109) {
+ return rsrp+125; // to 16
+ } else if (rsrp <=-103) {
+ return (rsrp+141)/2; // =(rsrp+109)/2+16 to 19
+ } else if (rsrp <=- 85) {
+ return (rsrp+160)/3; // =(rsrp+103)/3+19 to 25
+ } else if(rsrp <= -55) {
+ return (rsrp+210)/5; // =(rsrp+85)/5+25 to 31
+ } else if(rsrp <=-44)
+ {
+ return 31;
+ }
+ return 99;
+}
+
+
+
+
static int convert_reg_state(int reg_state_t)
{
@@ -1096,6 +1102,53 @@
fplmn_index--;
}
+static void convert_mbtk_sig_info_to_gsw_sig_info(const mbtk_signal_info_t* signal, signalStrength_t* sig_strength)
+{
+ LOGD("signal->type=%d", signal->type);
+ memset(sig_strength,0,sizeof (signalStrength_t));
+ switch(signal->type)
+ {
+ case MBTK_RADIO_TECH_E_UTRAN:
+ {
+ LOGI("rsrp = %d",signal->rsrp);
+ sig_strength->lte_sig_valid = 1;
+ sig_strength->rsrp = -rsrp_convert_to_minus_dBm(signal->rsrp);
+ sig_strength->rsrq = -rsrq_convert_to_minus_dB(signal->rsrq);
+ sig_strength->rssi =rsrpToLevel(signal->rsrp-141);
+ sig_strength->rssnr=INT_32_MAX;
+ break;
+ }
+ case MBTK_RADIO_TECH_UTRAN:
+ case MBTK_RADIO_TECH_UTRAN_HSDPA:
+ case MBTK_RADIO_TECH_UTRAN_HSUPA:
+ case MBTK_RADIO_TECH_UTRAN_HSDPA_HSUPA:
+ case MBTK_RADIO_TECH_UTRAN_HSPA:
+ {
+ LOGI("rscp = %d",signal->rscp);
+ sig_strength->wcdma_sig_valid = 1;
+ sig_strength->rscp = rscp_convert_to_minus_dBm(signal->rscp);
+ sig_strength->ecno = ecno_convert_to_minus_10_times_dB(signal->ecno);
+ sig_strength->rssi =rscpToLevel(signal->rscp-121);
+ break;
+ }
+ case MBTK_RADIO_TECH_GSM:
+ case MBTK_RADIO_TECH_GSM_COMPACT:
+ case MBTK_RADIO_TECH_GSM_EGPRS:
+ {
+ LOGI("g rssi = %d",signal->rssi);
+ sig_strength->gw_sig_valid = 1;
+ sig_strength->rssi = signal->rssi;
+ break;
+ }
+ default:
+ {
+ LOGE("[%s] unknown reg type.[%d]", __func__, signal->type);
+ }
+ }
+
+}
+
+
static void gsw_serving_info_callback_thread()
{
GSW_NW_SERVING_INFO *serving_info = (GSW_NW_SERVING_INFO*)malloc(sizeof(GSW_NW_SERVING_INFO));
@@ -1134,56 +1187,95 @@
}
+/*typedef struct
+{
+0 mbtk_radio_technology_enum type : 8; // mbtk_radio_technology_enum
+1 uint8 rssi; // 0: 113 dBm or less
+ // 1: 111 dBm
+ // 2��30: 109��53 dBm
+ // 31: 51 dBm or greater
+ // 99: not known or not detectable
+2 uint8 rxlev;// 0:rssi < -110 dBm
+ // 1: -110 dBm �� rssi < -109 dBm
+ // 2: -109 dBm �� rssi < -108 dBm
+ // ......
+ // 61: -50 dBm �� rssi < -49 dBm
+ // 62: -49 dBm �� rssi < -48 dBm
+ // 63: -48 dBm �� rssi
+ // 99: not known or not detectable
+3 uint8 ber; // 0...7 as RXQUAL values in the table in 3GPP TS 45.008 [20] subclause 8.2.4
+ // 99 not known or not detectable
+4 uint8 rscp; // 0: rscp < -120 dBm
+ // 1: -120 dBm �� rscp < -119 dBm
+ // 2: -119 dBm �� rscp < -118 dBm
+ // ......
+ // 94: -27 dBm �� rscp < -26 dBm
+ // 95: -26 dBm �� rscp < -25 dBm
+ // 96: - 25 dBm �� rscp
+ // 255: not known or not detectable
+5 uint8 ecno; // 0: Ec/Io < -24 dB
+ // 1: -24 dB �� Ec/Io < -23.5 dB
+ // 2: -23.5 dB �� Ec/Io < -23 dB
+ // ......
+ // 47: -1 dB �� Ec/Io < -0.5 dB
+ // 48: -0.5 dB �� Ec/Io < 0 dB
+ // 49: 0 dB �� Ec/Io
+ // 255: not known or not detectable
+6 uint8 rsrq; // 0: rsrq < -19.5 dB
+ // 1: -19.5 dB �� rsrq < -19 dB
+ // 2: -19 dB �� rsrq < -18.5 dB
+ // ......
+ // 32: -4 dB �� rsrq < -3.5 dB
+ // 33: -3.5 dB �� rsrq < -3 dB
+ // 34: -3 dB �� rsrq
+ // 255: not known or not detectable
+7 uint8 rsrp; // 0: rsrp < -140 dBm
+ // 1: -140 dBm �� rsrp < -139 dBm
+ // 2: -139 dBm �� rsrp < -138 dBm
+ // ......
+ // 95: -46 dBm �� rsrp < -45 dBm
+ // 96: -45 dBm �� rsrp < -44 dBm
+ // 97: -44 dBm �� rsrp
+ // 255: not known or not detectable
+8 uint8 ss_rsrq; // 0: ss_rsrq < -43 dB
+ // 1: -43 dB <= ss_rsrq < -42.5 dB
+ // 2: -42.5 dB <= ss_rsrq < -42 dB
+ // ......
+ // 125: 19 dB <= ss_rsrq < 19.5 dB
+ // 126: 19.5 dB <= ss_rsrq < 20 dB
+ // 255: not known or not detectable
+ uint8 ss_rsrp; // 0: ss_rsrp < -156 dBm
+ // 1: -156 dBm <= ss_rsrp < -155 dBm
+ // 2: -155 dBm <= ss_rsrp < -154 dBm
+ // ......
+ // 125: -32 dBm <= ss_rsrp < -31 dBm
+ // 126: -31 dBm <= ss_rsrp
+ // 255: not known or not detectable
+ uint8 ss_sinr; // 0: ss_sinr < -23 dB
+ // 1: -23 dB ss_sinr < -22.5 dB
+ // 2: -22.5 dB ss_sinr < -22 dB
+ // ......
+ // 125: 39 dB ss_sinr < 39.5 dBm
+ // 126: 39.5 dB ss_sinr < 40 dB
+ // 127: 40 dB ss_sinr
+ // 255: not known or not detectable
+} __attribute__((packed)) mbtk_signal_info_t;
+*/
static void gsw_sig_info_callback(const void* data, int data_len)
{
- LOGE("gsw_sig_info_callback start\n");
-
- if(data && data_len == 8)
+ if(data && (data_len >= sizeof (mbtk_signal_info_t)))
{
- uint8 *net_data = (uint8*)data;
- mbtk_radio_technology_enum type = (mbtk_radio_technology_enum)net_data[0];
-
signalStrength_t sig_strength;
- memset(&sig_strength, 0x0, sizeof(signalStrength_t));
-
- sig_strength.gw_sig_valid = 0;
- sig_strength.wcdma_sig_valid = 0;
- sig_strength.lte_sig_valid = 0;
- sig_strength.nr_sig_valid = 0;
-
- if(type == MBTK_RADIO_TECH_GSM || type == MBTK_RADIO_TECH_GSM_COMPACT || \
- type == MBTK_RADIO_TECH_GSM_EGPRS) //GSM
- {
- sig_strength.gw_sig_valid = 1;
- sig_strength.rssi = rssi_convert_to_dBm(net_data[1]);
- }
-
- else if(type == MBTK_RADIO_TECH_E_UTRAN)
- {
- sig_strength.lte_sig_valid = 1;
- sig_strength.rsrp = rsrp_convert_to_dBm(net_data[7]);
- sig_strength.rsrq = rsrq_convert_to_dB(net_data[6]);
- sig_strength.rssnr = -99;
- }
-
- else if (type == MBTK_RADIO_TECH_UTRAN || type == MBTK_RADIO_TECH_UTRAN_HSDPA || \
- type == MBTK_RADIO_TECH_UTRAN_HSUPA || type == MBTK_RADIO_TECH_UTRAN_HSDPA_HSUPA || \
- type == MBTK_RADIO_TECH_UTRAN_HSPA )//WCDMA
- {
- sig_strength.wcdma_sig_valid = 1;
- sig_strength.rscp = rssi_convert_to_dBm(net_data[1]);
- sig_strength.ecno = ecno_convert_to_dB(net_data[5]);
- }
-
+ convert_mbtk_sig_info_to_gsw_sig_info(( const mbtk_signal_info_t*) data,&sig_strength);
+
if(sig_cb != NULL)
{
sig_cb(sig_strength);
}
}
-
else
{
- LOGE("data is NULL\n");
+ LOGE("data is NULL or data len %d error",data_len);
}
}
@@ -1239,10 +1331,8 @@
LOGE("gsw_reject_callback end\n");
}
-
void gsw_sig_info_timer()
{
- int ret = -1;
if(nw_init_flag == 0 || nw_info_handle == NULL)
{
return;
@@ -1253,53 +1343,16 @@
while(nw_init_flag)
{
- memset(&signal, 0x0, sizeof(mbtk_signal_info_t));
- memset(&sig_strength, 0x0, sizeof(signalStrength_t));
- ret = mbtk_net_signal_get(nw_info_handle, &signal);
+ int ret = mbtk_net_signal_get(nw_info_handle, &signal);
if(ret != 0)
{
- LOGE("mbtk_net_signal_get fail\n");
+ LOGE("mbtk_net_signal_get fail, ret is %d\n",ret);
}
else
{
- LOGD("signal.type=%d\n", signal.type);
- switch(signal.type)
- {
- case MBTK_RADIO_TECH_GSM:
- case MBTK_RADIO_TECH_GSM_COMPACT:
- case MBTK_RADIO_TECH_GSM_EGPRS:
- {
- LOGD("rssi = %d\n",signal.rssi);
- sig_strength.gw_sig_valid = 1;
- sig_strength.rssi = rssi_convert_to_dBm(signal.rssi);
- break;
- }
- case MBTK_RADIO_TECH_E_UTRAN:
- {
- LOGD("rsrp = %d\n",signal.rsrp);
- sig_strength.lte_sig_valid = 1;
- sig_strength.rsrp = rsrp_convert_to_dBm(signal.rsrp);
- sig_strength.rsrq = rsrq_convert_to_dB(signal.rsrq);
- break;
- }
- case MBTK_RADIO_TECH_UTRAN:
- case MBTK_RADIO_TECH_UTRAN_HSDPA:
- case MBTK_RADIO_TECH_UTRAN_HSUPA:
- case MBTK_RADIO_TECH_UTRAN_HSDPA_HSUPA:
- case MBTK_RADIO_TECH_UTRAN_HSPA:
- {
- LOGD("rscp = %d\n",signal.rscp);
- sig_strength.wcdma_sig_valid = 1;
- sig_strength.rscp = rssi_convert_to_dBm(signal.rscp);
- sig_strength.ecno = ecno_convert_to_dB(signal.ecno);
- break;
- }
- default:
- {
- LOGD("[%s] unknown reg type.[%d]\n", __func__, signal.type);
- }
- }
+ convert_mbtk_sig_info_to_gsw_sig_info(&signal,&sig_strength);
+
}
if(sig_cb != NULL)
@@ -1909,16 +1962,13 @@
*/
int gsw_get_sig_info(int *csq_value)
{
- int ret = -1;
-
if (nw_init_flag == 0 || nw_info_handle == NULL)
{
return GSW_HAL_NORMAL_FAIL;
}
mbtk_signal_info_t signal;
- memset(&signal, 0x0, sizeof(mbtk_signal_info_t));
- ret = mbtk_net_signal_get(nw_info_handle, &signal);
+ int ret = mbtk_net_signal_get(nw_info_handle, &signal);
if(ret != 0)
{
LOGE("mbtk_net_signal_get fail\n");
@@ -1928,18 +1978,11 @@
LOGD("signal.type=%d\n", signal.type);
switch(signal.type)
{
- case MBTK_RADIO_TECH_GSM:
- case MBTK_RADIO_TECH_GSM_COMPACT:
- case MBTK_RADIO_TECH_GSM_EGPRS:
- {
- LOGD("rssi = %d\n",signal.rssi);
- *csq_value = rssi_convert_to_dBm(signal.rssi);
- break;
- }
+
case MBTK_RADIO_TECH_E_UTRAN:
{
- LOGD("rsrp = %d\n",signal.rsrp);
- *csq_value = rsrp_convert_to_dBm(signal.rsrp);
+ LOGD("lte rsrp = %d dbm",signal.rsrp-141);
+ *csq_value = rsrpToLevel(signal.rsrp-141);
break;
}
case MBTK_RADIO_TECH_UTRAN:
@@ -1948,13 +1991,21 @@
case MBTK_RADIO_TECH_UTRAN_HSDPA_HSUPA:
case MBTK_RADIO_TECH_UTRAN_HSPA:
{
- LOGD("rscp = %d\n",signal.rscp);
- *csq_value = rscp_convert_to_dBm(signal.rscp);
+ LOGD("w rscp = %d dbm",signal.rscp-121);
+ *csq_value = rscpToLevel(signal.rscp-121);
+ break;
+ }
+ case MBTK_RADIO_TECH_GSM:
+ case MBTK_RADIO_TECH_GSM_COMPACT:
+ case MBTK_RADIO_TECH_GSM_EGPRS:
+ {
+ LOGD("gsm rssi = %d (0-31)",signal.rssi);
+ *csq_value = signal.rssi;
break;
}
default:
{
- LOGD("[%s] unknown reg type.[%d]\n", __func__, signal.type);
+ LOGE("[%s] unknown reg type.[%d]", __func__, signal.type);
return GSW_HAL_NORMAL_FAIL;
}
}
@@ -2016,23 +2067,18 @@
return GSW_HAL_NORMAL_FAIL;
}
switch(netType)
- {
- case 1:
- case 2:
- case 3:
- case 4: //GSM
+ {
+ case 4:
{
- return gsw_rssi_to_csq(sigValue);
- }
-
- case 5: //WCDMA
+ return rsrpToLevel(sigValue);
+ }
+ case 3: //WCDMA
{
- return gsw_rscp_to_csq(sigValue);
- }
-
- case 6: //LTE
+ return rscpToLevel(sigValue);
+ }
+ case 2: //GSM
{
- return gsw_rsrp_to_csq(sigValue);
+ return sigValue;
}
default:
@@ -2479,7 +2525,7 @@
{
if (nw_init_flag == 0 || nw_info_handle == NULL)
{
- printf("nw sdk has not init\n");
+ printf("nw sdk has not init\n");
return GSW_HAL_NORMAL_FAIL;
}