Add DS support.
Change-Id: Ib8bc4e171dd5ca526f8e151ff3d467097582a8cb
diff --git a/mbtk/mbtk_rild_v2/src/atchannel.c b/mbtk/mbtk_rild_v2/src/atchannel.c
index 80f8e68..54313d0 100755
--- a/mbtk/mbtk_rild_v2/src/atchannel.c
+++ b/mbtk/mbtk_rild_v2/src/atchannel.c
@@ -38,20 +38,21 @@
#define HANDSHAKE_TIMEOUT_MSEC 500
#define AT_BUFF_MAX 1024
-static pthread_t s_tid_reader[ATPORTTYPE_NUM];
-static int s_at_fd[ATPORTTYPE_NUM] = {-1}; /* fd of the AT channel */
-static int s_uart_fd = -1; /* fd of the UART channel */
+static pthread_t s_tid_reader[ATPORTID_NUM];
+static int s_at_fd[ATPORTID_NUM] = {-1}; /* fd of the AT channel */
+static int s_uart_fd[MBTK_SIM_NUM] = {-1}; /* fd of the UART channel */
-static ATUnsolHandler s_unsolHandler;
+static ATUnsolHandler s_unsolHandler[MBTK_SIM_NUM];
/* for input buffering */
-static char s_ATBuffer[ATPORTTYPE_NUM][MAX_AT_RESPONSE+1];
-static char *s_ATBufferCur[ATPORTTYPE_NUM] = {s_ATBuffer[ATPORTTYPE_0], s_ATBuffer[ATPORTTYPE_1], s_ATBuffer[ATPORTTYPE_2]};
-static char s_UartBuffer[MAX_AT_RESPONSE+1];
-static char *s_UartBufferCur = s_UartBuffer;
+static char s_ATBuffer[ATPORTID_NUM][MAX_AT_RESPONSE+1];
+static char *s_ATBufferCur[ATPORTID_NUM] = {s_ATBuffer[ATPORTID_SIM1_0], s_ATBuffer[ATPORTID_SIM1_0], s_ATBuffer[ATPORTID_SIM1_0],
+ s_ATBuffer[ATPORTID_SIM2_0], s_ATBuffer[ATPORTID_SIM2_0], s_ATBuffer[ATPORTID_SIM2_0]};
+static char s_UartBuffer[MBTK_SIM_NUM][MAX_AT_RESPONSE+1];
+static char *s_UartBufferCur[MBTK_SIM_NUM] = {s_UartBuffer[MBTK_SIM_1], s_UartBuffer[MBTK_SIM_2]};
-static mbtk_ril_at_state_enum at_state[ATPORTTYPE_NUM] = {RIL_AT_STATE_CLOSED};
+static mbtk_ril_at_state_enum at_state[ATPORTID_NUM] = {RIL_AT_STATE_CLOSED};
#if AT_DEBUG
void AT_DUMP(const char* prefix, const char* buff, int len)
@@ -72,22 +73,22 @@
*/
// "Wait" when AT process...
-static pthread_mutex_t s_commandmutex[ATPORTTYPE_NUM] = {PTHREAD_MUTEX_INITIALIZER};
-static pthread_cond_t s_commandcond[ATPORTTYPE_NUM] = {PTHREAD_COND_INITIALIZER};
+static pthread_mutex_t s_commandmutex[ATPORTID_NUM] = {PTHREAD_MUTEX_INITIALIZER};
+static pthread_cond_t s_commandcond[ATPORTID_NUM] = {PTHREAD_COND_INITIALIZER};
-static ATCommandType s_type[ATPORTTYPE_NUM];
-static const char *s_responsePrefix[ATPORTTYPE_NUM] = {NULL};
-static const char *s_smsPDU[ATPORTTYPE_NUM] = {NULL};
-static ATResponse *sp_response[ATPORTTYPE_NUM] = {NULL};
-static char s_curr_at[ATPORTTYPE_NUM][AT_BUFF_MAX];
+static ATCommandType s_type[ATPORTID_NUM];
+static const char *s_responsePrefix[ATPORTID_NUM] = {NULL};
+static const char *s_smsPDU[ATPORTID_NUM] = {NULL};
+static ATResponse *sp_response[ATPORTID_NUM] = {NULL};
+static char s_curr_at[ATPORTID_NUM][AT_BUFF_MAX];
static void (*s_onTimeout)(void) = NULL;
static void (*s_onReaderClosed)(void) = NULL;
static int s_readerClosed;
-static void onReaderClosed(ATPortType_enum port);
-static int writeCtrlZ (ATPortType_enum port, const char *s);
-static int writeline (ATPortType_enum port, const char *s);
+static void onReaderClosed(ATPortId_enum port);
+static int writeCtrlZ (ATPortId_enum port, const char *s);
+static int writeline (ATPortId_enum port, const char *s);
typedef struct
{
@@ -137,7 +138,7 @@
/** add an intermediate response to sp_response*/
-static void addIntermediate(ATPortType_enum port, const char *line)
+static void addIntermediate(ATPortId_enum port, const char *line)
{
ATLine *p_new;
@@ -170,7 +171,7 @@
"NO ANSWER",
"NO DIALTONE",
};
-static int isFinalResponseError(ATPortType_enum port, const char *line)
+static int isFinalResponseError(ATPortId_enum port, const char *line)
{
size_t i;
@@ -220,7 +221,7 @@
* See 27.007 annex B
* WARNING: NO CARRIER and others are sometimes unsolicited
*/
-static int isFinalResponse(ATPortType_enum port, const char *line)
+static int isFinalResponse(ATPortId_enum port, const char *line)
{
return isFinalResponseSuccess(line) || isFinalResponseError(port, line);
}
@@ -252,7 +253,7 @@
/** assumes s_commandmutex is held */
-static void handleFinalResponse(ATPortType_enum port, const char *line)
+static void handleFinalResponse(ATPortId_enum port, const char *line)
{
sp_response[port]->finalResponse = strdup(line);
@@ -260,22 +261,22 @@
pthread_cond_signal(&s_commandcond[port]);
}
-static void handleUnsolicited(const char *line)
+static void handleUnsolicited(ATPortId_enum port, const char *line)
{
- if (s_unsolHandler != NULL)
+ if (s_unsolHandler[port < ATPORTID_SIM2_0 ? MBTK_SIM_1 : MBTK_SIM_2] != NULL)
{
- s_unsolHandler(line, NULL);
+ s_unsolHandler[port < ATPORTID_SIM2_0 ? MBTK_SIM_1 : MBTK_SIM_2](line, NULL);
}
}
-static void processLine(ATPortType_enum port, const char *line)
+static void processLine(ATPortId_enum port, const char *line)
{
pthread_mutex_lock(&s_commandmutex[port]);
// LOGD("LINE : %s", line);
if (sp_response[port] == NULL)
{
/* no command pending */
- handleUnsolicited(line);
+ handleUnsolicited(port, line);
}
else if (isFinalResponseSuccess(line))
{
@@ -297,7 +298,7 @@
else switch (s_type[port])
{
case NO_RESULT:
- handleUnsolicited(line);
+ handleUnsolicited(port, line);
break;
case NUMERIC:
if (sp_response[port]->p_intermediates == NULL
@@ -310,7 +311,7 @@
{
/* either we already have an intermediate response or
the line doesn't begin with a digit */
- handleUnsolicited(line);
+ handleUnsolicited(port, line);
}
break;
case SINGLELINE:
@@ -343,7 +344,7 @@
else
{
/* we already have an intermediate response */
- handleUnsolicited(line);
+ handleUnsolicited(port, line);
}
break;
case MULTILINE:
@@ -353,13 +354,13 @@
}
else
{
- handleUnsolicited(line);
+ handleUnsolicited(port, line);
}
break;
default: /* this should never be reached */
LOGE("Unsupported AT command type %d\n", s_type[port]);
- handleUnsolicited(line);
+ handleUnsolicited(port, line);
break;
}
@@ -398,7 +399,7 @@
* have buffered stdio.
*/
-static const char *readline(ATPortType_enum port)
+static const char *readline(ATPortId_enum port)
{
ssize_t count;
@@ -500,7 +501,7 @@
return ret;
}
-static const char *readlineUrc(ATPortType_enum port)
+static const char *readlineUrc(ATPortId_enum port)
{
ssize_t count;
@@ -508,37 +509,40 @@
char *p_eol = NULL;
char *ret;
+ mbtk_sim_type_enum sim_id = port < ATPORTID_SIM2_0 ? MBTK_SIM_1 : MBTK_SIM_2;
+
+
/* this is a little odd. I use *s_ATBufferCur == 0 to
* mean "buffer consumed completely". If it points to a character, than
* the buffer continues until a \0
*/
- if (*s_UartBufferCur == '\0')
+ if (*s_UartBufferCur[sim_id] == '\0')
{
/* empty buffer */
- s_UartBufferCur = s_UartBuffer;
- *s_UartBufferCur = '\0';
- p_read = s_UartBuffer;
+ s_UartBufferCur[sim_id] = s_UartBuffer[sim_id];
+ *s_UartBufferCur[sim_id] = '\0';
+ p_read = s_UartBuffer[sim_id];
}
else /* *s_ATBufferCur != '\0' */
{
/* there's data in the buffer from the last read */
// skip over leading newlines
- while (*s_UartBufferCur == '\r' || *s_UartBufferCur == '\n')
- s_UartBufferCur++;
+ while (*s_UartBufferCur[sim_id] == '\r' || *s_UartBufferCur[sim_id] == '\n')
+ s_UartBufferCur[sim_id]++;
- p_eol = findNextEOL(s_UartBufferCur);
+ p_eol = findNextEOL(s_UartBufferCur[sim_id]);
if (p_eol == NULL)
{
/* a partial line. move it up and prepare to read more */
size_t len;
- len = strlen(s_UartBufferCur);
+ len = strlen(s_UartBufferCur[sim_id]);
- memmove(s_UartBuffer, s_UartBufferCur, len + 1);
- p_read = s_UartBuffer + len;
- s_UartBufferCur = s_UartBuffer;
+ memmove(s_UartBuffer[sim_id], s_UartBufferCur[sim_id], len + 1);
+ p_read = s_UartBuffer[sim_id] + len;
+ s_UartBufferCur[sim_id] = s_UartBuffer[sim_id];
}
/* Otherwise, (p_eol !- NULL) there is a complete line */
/* that will be returned the while () loop below */
@@ -546,19 +550,19 @@
while (p_eol == NULL)
{
- if (0 == MAX_AT_RESPONSE - (p_read - s_UartBuffer))
+ if (0 == MAX_AT_RESPONSE - (p_read - s_UartBuffer[sim_id]))
{
LOGE("ERROR: Input line exceeded buffer\n");
/* ditch buffer and start over again */
- s_UartBufferCur = s_UartBuffer;
- *s_UartBufferCur = '\0';
- p_read = s_UartBuffer;
+ s_UartBufferCur[sim_id] = s_UartBuffer[sim_id];
+ *s_UartBufferCur[sim_id] = '\0';
+ p_read = s_UartBuffer[sim_id];
}
do
{
- count = read(s_uart_fd, p_read,
- MAX_AT_RESPONSE - (p_read - s_UartBuffer));
+ count = read(s_uart_fd[sim_id], p_read,
+ MAX_AT_RESPONSE - (p_read - s_UartBuffer[sim_id]));
usleep(10000);
}
while (count < 0 && errno == EINTR);
@@ -570,10 +574,10 @@
p_read[count] = '\0';
// skip over leading newlines
- while (*s_UartBufferCur == '\r' || *s_UartBufferCur == '\n')
- s_UartBufferCur++;
+ while (*s_UartBufferCur[sim_id] == '\r' || *s_UartBufferCur[sim_id] == '\n')
+ s_UartBufferCur[sim_id]++;
- p_eol = findNextEOL(s_UartBufferCur);
+ p_eol = findNextEOL(s_UartBufferCur[sim_id]);
p_read += count;
}
else if (count <= 0)
@@ -593,18 +597,17 @@
/* a full line in the buffer. Place a \0 over the \r and return */
- ret = s_UartBufferCur;
+ ret = s_UartBufferCur[sim_id];
*p_eol = '\0';
- s_UartBufferCur = p_eol + 1; /* this will always be <= p_read, */
+ s_UartBufferCur[sim_id] = p_eol + 1; /* this will always be <= p_read, */
/* and there will be a \0 at *p_read */
- LOGD("[Port-%d]URC< %s", port, ret);
+ LOGD("[Sim-%d,Port-%d]URC< %s", sim_id, port, ret);
return ret;
}
-
-static void onReaderClosed(ATPortType_enum port)
+static void onReaderClosed(ATPortId_enum port)
{
LOGD("onReaderClosed()");
if (s_onReaderClosed != NULL && s_readerClosed == 0)
@@ -633,7 +636,7 @@
static void *readerLoop(void *arg)
{
UNUSED(arg);
- ATPortType_enum *port = (ATPortType_enum*)arg;
+ ATPortId_enum *port = (ATPortId_enum*)arg;
for (;;)
{
const char * line;
@@ -673,9 +676,9 @@
break;
}
- if (s_unsolHandler != NULL)
+ if (s_unsolHandler[*port < ATPORTID_SIM2_0 ? MBTK_SIM_1 : MBTK_SIM_2] != NULL)
{
- s_unsolHandler (line1, line2);
+ s_unsolHandler[*port < ATPORTID_SIM2_0 ? MBTK_SIM_1 : MBTK_SIM_2] (line1, line2);
}
free(line1);
}
@@ -695,7 +698,7 @@
static void *readerUrcLoop(void *arg)
{
UNUSED(arg);
- ATPortType_enum *port = (ATPortType_enum*)arg;
+ ATPortId_enum *port = (ATPortId_enum*)arg;
for (;;)
{
const char *line;
@@ -707,7 +710,7 @@
break;
}
- handleUnsolicited(line);
+ handleUnsolicited(*port, line);
}
onReaderClosed(*port);
@@ -725,7 +728,7 @@
* This function exists because as of writing, android libc does not
* have buffered stdio.
*/
-static int writeline (ATPortType_enum port, const char *s)
+static int writeline (ATPortId_enum port, const char *s)
{
size_t cur = 0;
size_t len = strlen(s);
@@ -776,7 +779,7 @@
return 0;
}
-static int writeCtrlZ (ATPortType_enum port, const char *s)
+static int writeCtrlZ (ATPortId_enum port, const char *s)
{
size_t cur = 0;
size_t len = strlen(s);
@@ -824,7 +827,7 @@
return 0;
}
-static void clearPendingCommand(ATPortType_enum port)
+static void clearPendingCommand(ATPortId_enum port)
{
if (sp_response[port] != NULL)
{
@@ -841,21 +844,21 @@
* Starts AT handler on stream "fd'
* returns 0 on success, -1 on error
*/
-int at_open(ATPortType_enum port, int at_fd, int uart_fd, ATUnsolHandler h)
+int at_open(ATPortId_enum port, int at_fd, int uart_fd, ATUnsolHandler h)
{
int ret;
pthread_attr_t attr;
s_at_fd[port] = at_fd;
- s_uart_fd = uart_fd;
- s_unsolHandler = h;
+ s_uart_fd[port < ATPORTID_SIM2_0 ? MBTK_SIM_1 : MBTK_SIM_2] = uart_fd;
+ s_unsolHandler[port < ATPORTID_SIM2_0 ? MBTK_SIM_1 : MBTK_SIM_2] = h;
s_readerClosed = 0;
s_responsePrefix[port] = NULL;
s_smsPDU[port] = NULL;
sp_response[port] = NULL;
- ATPortType_enum *at_port_ptr = (ATPortType_enum*)malloc(sizeof(ATPortType_enum));
- ATPortType_enum *urc_port_ptr = (ATPortType_enum*)malloc(sizeof(ATPortType_enum));
+ ATPortId_enum *at_port_ptr = (ATPortId_enum*)malloc(sizeof(ATPortId_enum));
+ ATPortId_enum *urc_port_ptr = (ATPortId_enum*)malloc(sizeof(ATPortId_enum));
*at_port_ptr = port;
*urc_port_ptr = port;
@@ -868,7 +871,7 @@
return -1;
}
- if(port == ATPORTTYPE_0) { // URC only for ATPORTTYPE_0
+ if(port == ATPORTID_SIM1_0 || port == ATPORTID_SIM2_0) { // URC only for ATPORTTYPE_0
pthread_t uart_tid_reader;
ret = pthread_create(&uart_tid_reader, &attr, readerUrcLoop, urc_port_ptr);
if (ret < 0)
@@ -882,19 +885,19 @@
}
/* FIXME is it ok to call this from the reader and the command thread? */
-void at_close(ATPortType_enum port)
+void at_close(ATPortId_enum port)
{
LOGD("at_close()");
if (s_at_fd[port] >= 0)
{
close(s_at_fd[port]);
}
- if (s_uart_fd >= 0)
+ if (s_uart_fd[port < ATPORTID_SIM2_0 ? MBTK_SIM_1 : MBTK_SIM_2] >= 0)
{
- close(s_uart_fd);
+ close(s_uart_fd[port < ATPORTID_SIM2_0 ? MBTK_SIM_1 : MBTK_SIM_2]);
}
s_at_fd[port] = -1;
- s_uart_fd = -1;
+ s_uart_fd[port < ATPORTID_SIM2_0 ? MBTK_SIM_1 : MBTK_SIM_2] = -1;
pthread_mutex_lock(&s_commandmutex[port]);
s_readerClosed = 1;
@@ -976,7 +979,7 @@
*
* timeoutMsec == 0 means infinite timeout
*/
-static int at_send_command_full_nolock (ATPortType_enum port, const char *command, ATCommandType type,
+static int at_send_command_full_nolock (ATPortId_enum port, const char *command, ATCommandType type,
const char *responsePrefix, const char *smspdu,
long long timeoutMsec, ATResponse **pp_outResponse)
{
@@ -1074,7 +1077,7 @@
*
* timeoutMsec == 0 means infinite timeout
*/
-static int at_send_command_full (ATPortType_enum port, const char *command, ATCommandType type,
+static int at_send_command_full (ATPortId_enum port, const char *command, ATCommandType type,
const char *responsePrefix, const char *smspdu,
long long timeoutMsec, ATResponse **pp_outResponse)
{
@@ -1119,14 +1122,14 @@
* if non-NULL, the resulting ATResponse * must be eventually freed with
* at_response_free
*/
-int at_send_command (ATPortType_enum port, const char *command, ATResponse **pp_outResponse)
+int at_send_command (ATPortId_enum port, const char *command, ATResponse **pp_outResponse)
{
return at_send_command_full (port, command, NO_RESULT, NULL,
NULL, 0, pp_outResponse);
}
-int at_send_command_singleline (ATPortType_enum port, const char *command,
+int at_send_command_singleline (ATPortId_enum port, const char *command,
const char *responsePrefix,
ATResponse **pp_outResponse)
{
@@ -1149,7 +1152,7 @@
return err;
}
-int at_send_command_singleline_with_timeout (ATPortType_enum port, const char *command,
+int at_send_command_singleline_with_timeout (ATPortId_enum port, const char *command,
const char *responsePrefix,
ATResponse **pp_outResponse,long long timeoutMsec)
{
@@ -1174,7 +1177,7 @@
-int at_send_command_numeric (ATPortType_enum port, const char *command,
+int at_send_command_numeric (ATPortId_enum port, const char *command,
ATResponse **pp_outResponse)
{
int err;
@@ -1197,7 +1200,7 @@
}
-int at_send_command_sms (ATPortType_enum port, const char *command,
+int at_send_command_sms (ATPortId_enum port, const char *command,
const char *pdu,
const char *responsePrefix,
ATResponse **pp_outResponse)
@@ -1222,7 +1225,7 @@
}
-int at_send_command_multiline (ATPortType_enum port, const char *command,
+int at_send_command_multiline (ATPortId_enum port, const char *command,
const char *responsePrefix,
ATResponse **pp_outResponse)
{
@@ -1258,7 +1261,7 @@
* Periodically issue an AT command and wait for a response.
* Used to ensure channel has start up and is active
*/
-int at_handshake(ATPortType_enum port)
+int at_handshake(ATPortId_enum port)
{
// int i;
int err = 0;
@@ -1340,12 +1343,12 @@
return ret;
}
-mbtk_ril_at_state_enum at_state_get(ATPortType_enum port)
+mbtk_ril_at_state_enum at_state_get(ATPortId_enum port)
{
return at_state[port];
}
-void at_state_set(ATPortType_enum port, mbtk_ril_at_state_enum state)
+void at_state_set(ATPortId_enum port, mbtk_ril_at_state_enum state)
{
at_state[port] = state;
}
@@ -1358,7 +1361,7 @@
return true;
}
-void unused_func(ATPortType_enum port)
+void unused_func(ATPortId_enum port)
{
isFinalResponse(port, NULL);
}