aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--android/hw-qemud.c7
-rw-r--r--telephony/android_modem.c38
-rw-r--r--telephony/android_modem.h1
3 files changed, 37 insertions, 9 deletions
diff --git a/android/hw-qemud.c b/android/hw-qemud.c
index cc28e63..ba4ab42 100644
--- a/android/hw-qemud.c
+++ b/android/hw-qemud.c
@@ -46,6 +46,11 @@
*/
#define SUPPORT_LEGACY_QEMUD 1
+#if SUPPORT_LEGACY_QEMUD
+#include "telephony/android_modem.h"
+#include "telephony/modem_driver.h"
+#endif
+
/*
* This implements support for the 'qemud' multiplexing communication
* channel between clients running in the emulated system and 'services'
@@ -257,6 +262,8 @@ qemud_serial_read( void* opaque, const uint8_t* from, int len )
if ( !memcmp(s->data0, "001200", 6) ) {
D("%s: legacy qemud detected.", __FUNCTION__);
s->version = QEMUD_VERSION_LEGACY;
+ /* tell the modem to use legacy emulation mode */
+ amodem_set_legacy(android_modem);
} else {
D("%s: normal qemud detected.", __FUNCTION__);
s->version = QEMUD_VERSION_NORMAL;
diff --git a/telephony/android_modem.c b/telephony/android_modem.c
index 79e93b2..6e73411 100644
--- a/telephony/android_modem.c
+++ b/telephony/android_modem.c
@@ -190,6 +190,9 @@ typedef struct {
typedef struct AModemRec_
{
+ /* Legacy support */
+ char supportsNetworkDataType;
+
/* Radio state */
ARadioState radio_state;
int area_code;
@@ -349,6 +352,7 @@ amodem_create( int base_port, AModemUnsolFunc unsol_func, void* unsol_opaque
AModem modem = _android_modem;
amodem_reset( modem );
+ modem->supportsNetworkDataType = 1;
modem->base_port = base_port;
modem->unsol_func = unsol_func;
modem->unsol_opaque = unsol_opaque;
@@ -359,6 +363,12 @@ amodem_create( int base_port, AModemUnsolFunc unsol_func, void* unsol_opaque
}
void
+amodem_set_legacy( AModem modem )
+{
+ modem->supportsNetworkDataType = 0;
+}
+
+void
amodem_destroy( AModem modem )
{
asimcard_destroy( modem->sim );
@@ -444,10 +454,15 @@ amodem_set_data_registration( AModem modem, ARegistrationState state )
break;
case A_REGISTRATION_UNSOL_ENABLED_FULL:
- amodem_unsol( modem, "+CGREG: %d,%d,\"%04x\",\"%04x\",\"%04x\"\r",
- modem->data_mode, modem->data_state,
- modem->area_code, modem->cell_id,
- modem->data_network );
+ if (modem->supportsNetworkDataType)
+ amodem_unsol( modem, "+CGREG: %d,%d,\"%04x\",\"%04x\",\"%04x\"\r",
+ modem->data_mode, modem->data_state,
+ modem->area_code, modem->cell_id,
+ modem->data_network );
+ else
+ amodem_unsol( modem, "+CGREG: %d,%d,\"%04x\",\"%04x\"\r",
+ modem->data_mode, modem->data_state,
+ modem->area_code, modem->cell_id );
break;
default:
@@ -794,11 +809,16 @@ handleNetworkRegistration( const char* cmd, AModem modem )
}
} else if ( !memcmp( cmd, "+CGREG", 6 ) ) {
cmd += 6;
- if (cmd[0] == '?') {\
- return amodem_printf( modem, "+CGREG: %d,%d,\"%04x\",\"%04x\",\"%04x\"",
- modem->data_mode, modem->data_state,
- modem->area_code, modem->cell_id,
- modem->data_network );
+ if (cmd[0] == '?') {
+ if (modem->supportsNetworkDataType)
+ return amodem_printf( modem, "+CGREG: %d,%d,\"%04x\",\"%04x\",\"%04x\"",
+ modem->data_mode, modem->data_state,
+ modem->area_code, modem->cell_id,
+ modem->data_network );
+ else
+ return amodem_printf( modem, "+CGREG: %d,%d,\"%04x\",\"%04x\"",
+ modem->data_mode, modem->data_state,
+ modem->area_code, modem->cell_id );
} else if (cmd[0] == '=') {
switch (cmd[1]) {
case '0':
diff --git a/telephony/android_modem.h b/telephony/android_modem.h
index 80d22c5..828da42 100644
--- a/telephony/android_modem.h
+++ b/telephony/android_modem.h
@@ -23,6 +23,7 @@ typedef struct AModemRec_* AModem;
typedef void (*AModemUnsolFunc)( void* opaque, const char* message );
extern AModem amodem_create( int base_port, AModemUnsolFunc unsol_func, void* unsol_opaque );
+extern void amodem_set_legacy( AModem modem );
extern void amodem_destroy( AModem modem );
/* send a command to the modem */