diff services/etm/etm_at.c @ 0:75a11d740a02

initial import of gsm-fw from freecalypso-sw rev 1033:5ab737ac3ad7
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 09 Jun 2016 00:02:41 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/services/etm/etm_at.c	Thu Jun 09 00:02:41 2016 +0000
@@ -0,0 +1,464 @@
+/********************************************************************************
+ * Enhanced TestMode (ETM)
+ * @file	etm_at.c (Support for AT-commands)
+ *
+ * @author	Kim T. Peteren (ktp@ti.com)
+ * @version 0.2
+ *
+
+
+ *
+ * History:
+ *
+ * 	Date       	Modification
+ *  ------------------------------------
+ *  16/06/2003	Creation
+ *  06/11/2003  Small updates 
+ *  18/02/2004  Major updating, the event handling has been updated
+ *
+ *
+ * (C) Copyright 2003 by Texas Instruments Incorporated, All Rights Reserved
+ *********************************************************************************/
+
+//#include "aci_msg.h"
+
+#include "etm/etm.h"          
+#include "etm/etm_api.h"
+#include "etm/etm_at.h"
+#include "etm/etm_trace.h"
+
+#include "rv/rv_general.h"
+#include "rvf/rvf_api.h"
+
+#include "atp/atp_env.h"  // FixMe
+#include "atp/atp_i.h"    // FixMe    
+//#include "atp/atp_general.h"  // FixMe
+
+#include "atp/atp_api.h"
+#include "atp/atp_messages.h" 
+
+#include <string.h>
+
+// Defined in aci_msg.h
+extern T_XAT_SYNC_MESSAGE;
+extern SYNC_PORT_NUM;
+extern ASYNC_PORT_NUM;
+extern T_RAT_CALLBACK_MESSAGE;
+
+
+/******************************************************************************
+ * Globals
+ *****************************************************************************/
+
+static T_ATP_SW_ENTITY_NAME  ETM_AT_ADAPTER      = "ETMATA"; // max 5 caracter
+static T_ATP_SW_ENTITY_ID    etm_at_id;     
+static T_ATP_PORT_NB         etm_at_to_aaa_port  = 0x01;     // equal to SYNC_PORT_NUM
+
+static T_ATP_SW_ENTITY_NAME  aaa_name            = "AAA";     // ACIA ADAPTER
+//static T_ATP_SW_ENTITY_NAME  aaa_name            = "GSM";     // GSM ADAPTER
+static T_ATP_SW_ENTITY_ID    aaa_entity_id;
+static T_ATP_ENTITY_MODE     aaa_mode;       
+
+static T_ATP_CALLBACK etm_at_return_path;
+static T_ATP_ENTITY_MODE etm_at_mode;
+
+//extern T_ETM_ENV_CTRL_BLK *etm_env_ctrl_blk;
+
+static int etm_at_initialized  = 0;
+static int etm_at_event_status = 0;
+
+static char etm_at_latest_cmd[9] = { 0 };
+
+
+/******************************************************************************
+ * Internal prototypes 
+ *****************************************************************************/
+
+int  etm_at_init(void);
+int  etm_at_reg_req(void);
+int  etm_at_open_port_req(void);
+//T_RV_HDR *etm_at_wait_for_atp_event (UINT16 event_code);
+int etm_at_atp_txt_cmd_rdy( T_ATP_TXT_CMD_RDY *msg);
+void etm_at_callback_for_ATP(void *event_from_atp_p);
+
+
+/******************************************************************************
+ * AT commands List 
+ *****************************************************************************/
+
+struct at_async_trans_s {
+//    const short index;  // index for ...
+    const char *name;   // parameter
+};
+
+static struct at_async_trans_s at_cmd[] =
+{
+    {  "TEST"  },
+    {  "atd"   },
+    {  NULL    }
+};
+
+
+int at_cmd_search(char *at_string)
+{
+    struct at_async_trans_s *at_p = at_cmd;
+    int size, error;
+
+    size = strlen(at_string);
+    tr_etm(TgTrCore, "ETM CORE: _cmd_search: at_string size(%d)", size);
+
+    if (size > 8)
+        strncpy(&etm_at_latest_cmd[0], at_string, 8);
+    else
+        strncpy(&etm_at_latest_cmd[0], at_string, size);
+
+//    if ((etm_at_latest_cmd[2]== '+') || (etm_at_latest_cmd[2] == '%'))
+//        return ETM_OK;
+    
+    while (at_p->name) {
+        error = strncmp(&etm_at_latest_cmd[0], at_p->name, strlen(at_p->name));
+        if (error == 0)
+            strcpy(&etm_at_latest_cmd[0], at_p->name);
+        tr_etm(TgTrCore, "ETM CORE: _cmd_search: AT list(%s)", at_p->name);
+        at_p++;
+    }
+
+    tr_etm(TgTrCore, "ETM CORE: _cmd_search: text(%s)", &etm_at_latest_cmd[0]);
+
+    return ETM_OK;
+}
+
+
+/******************************************************************************
+ * AT command to ACI
+ *****************************************************************************/
+
+int etm_at_adapter(char *command)
+{
+    int error;
+    T_ATP_TXT_CMD txt_cmd_p = NULL;
+       
+    if (!etm_at_initialized){
+        if ((etm_at_init() == ETM_OK) && (etm_at_event_status == ETM_OK)) {
+            // read etm_at_event_status
+            tr_etm(TgTrCore, "ETM CORE: _at_adapter: initialization - OK");
+            etm_at_initialized = 1;
+        }
+        else {
+            tr_etm(TgTrCore, "ETM CORE: _at_adapter: initialization - FAILED");
+            return ETM_FATAL;
+        }
+    }
+
+    // Creating ETM_AT data buffer, will be fread by atp_send_txt_cmd()
+    if ((txt_cmd_p = etm_malloc(strlen(command)+1)) == NULL)
+        return ETM_NOMEM;
+
+    strcpy(txt_cmd_p, command);
+
+    // Find AT command
+    //at_cmd_search(command);
+
+    // Send AT command to AAA
+    if ((error = atp_send_txt_cmd(etm_at_id, etm_at_to_aaa_port, AT_CMD, txt_cmd_p)) != RV_OK) {
+        tr_etm(TgTrCore, "ETM CORE: _at_adapter: send_txt_cmd - FAILED");
+        return ETM_FATAL;
+    }
+
+    return ETM_OK;
+}
+
+
+/******************************************************************************
+ * ETM AT Adapter Initialization
+ *****************************************************************************/
+
+int etm_at_init(void)
+{
+    int error;
+
+    // Check if ATP has been started if NOT 
+    // Turn ATP module ON - necessary for RVM 
+    if (atp_swe_state != ATP_STARTED)
+        if (atp_start() != RV_OK)
+            return ETM_FATAL;
+   
+ 
+    // Registration of ETM_AT to ATP  
+    if ((error = etm_at_reg_req()) != ETM_OK) {
+        tr_etm(TgTrCore, "ETM CORE: _at_init: Registration ERROR(%d)", error); 
+       return error;    
+    }    
+
+    // Open a port to ACI adapter
+    if ((error = etm_at_open_port_req()) != ETM_OK) {
+        tr_etm(TgTrCore, "ETM CORE: _at_init: Open port ERROR(%d)", error);
+        return error;
+    }
+
+    return ETM_OK;
+}
+
+
+// Register of ETM AT adapter with ATP.
+
+int etm_at_reg_req(void)
+{
+    int result;
+
+     // Registration of ETM_AT in ATP
+    etm_at_return_path.addr_id        = NULL; // mailbox identifier - unused when callback mechanism in use
+    etm_at_return_path.callback_func  = etm_at_callback_for_ATP;  // Pointer to callback fn ...
+
+    // Set modes supported by SWE 
+    etm_at_mode.cmd_mode         = TXT_MODE;  // INTERPRETED_MODE/TXT_MODE
+    etm_at_mode.cp_mode          = COPY_OFF;
+    etm_at_mode.cmd_support_mode = CMD_SUPPORT_ON;
+
+    // Registration of ETM_AT to ATP
+    if ((result = (atp_reg(ETM_AT_ADAPTER, etm_at_return_path, etm_at_mode, &etm_at_id)))
+        != RV_OK) {
+        tr_etm(TgTrCore, "ETM CORE: _at_reg_req: ERROR(%d)", result);
+        return ETM_RV_FATAL;    
+    }
+
+    // Check ETM_AT Registration
+    if ((result = (atp_reg_info(ETM_AT_ADAPTER, &etm_at_id, &etm_at_mode)))
+        != RV_OK){
+        tr_etm(TgTrCore, "ETM CORE: _at_reg_req: FAILED");
+        return ETM_RV_NOT_SUPPORTED;
+    }
+
+    return ETM_OK;
+}
+
+
+// Open a port with ATP.
+
+int etm_at_open_port_req(void)
+{
+    int result;
+    T_ATP_NO_COPY_INFO etm_no_copy_info;
+    T_ATP_PORT_INFO etm_port_info;
+    T_ATP_CUSTOM_INFO *cust_info_p = NULL;
+//    T_RV_HDR *message_p;
+    T_RVF_MB_ID etm_mb_id;
+
+    if (rvf_get_mb_id("ETM_PRIM", &etm_mb_id) != RVF_OK) {
+        tr_etm(TgTrCore, "ETM CORE: _at_open_port_req: Memory bank ETM does not exist!");
+        return ETM_RV_FATAL;
+    }
+         
+	/* Test header and trailer removal from ATP so: trailers and headers equal 0 */
+	etm_no_copy_info.tx_mb		    = etm_mb_id;   /* MB used by ATP is from ETM */ 
+	etm_no_copy_info.rx_mb		    = etm_mb_id;   /* MB used by ATP is from ETM */
+	etm_no_copy_info.rx_head_mode   = RX_HEADER_OFF;
+    etm_no_copy_info.rx_head_size   = 0x00;
+    etm_no_copy_info.rx_trail_size  = 0x00;
+	etm_no_copy_info.tx_head_mode   = TX_HEADER_OFF;
+    etm_no_copy_info.tx_head_size   = 0x00;
+    etm_no_copy_info.tx_trail_size  = 0x00;
+	etm_no_copy_info.packet_mode    = NORMAL_PACKET;     /* No L2CAP packet... */
+
+    //  Port info 
+    etm_port_info.port_config = NOT_DEFINED_CONFIG;
+    etm_port_info.ring_type   = ATP_NO_RING_TYPE;
+    etm_port_info.signal_mask = (T_ATP_SIGNAL_MASK) ATP_ALL_THE_SIGNAL_UNMASK; /* Get all signal changed event */
+    etm_port_info.dce_mask[0] = 0x0000; /* No requirement in term of DCE */ 
+
+    // Test AA Adapter Registration
+    if (atp_reg_info(aaa_name, &aaa_entity_id, &aaa_mode) != RV_OK) {
+        tr_etm(TgTrCore, "ETM CORE: _at_open_port_req: AAA is not registered to ATP");
+        return ETM_RV_NOT_SUPPORTED;
+    }
+
+    // Open a virtual port between ETM AT adapter and ACI adapter 
+    if ((result = atp_open_port_rqst(etm_at_id, aaa_entity_id, etm_at_to_aaa_port, 
+                                     etm_port_info, etm_no_copy_info, cust_info_p)) != RV_OK) {
+        tr_etm(TgTrCore, "ETM CORE: _at_open_port_req: FAILED");
+        return ETM_RV_FATAL;
+    }
+
+    // etm_at_callback_for_ATP should receive event: ATP_OPEN_PORT_CFM 
+    rvf_wait(0xffff, 100); // Timeout 100 ticks
+    tr_etm(TgTrCore, "ETM CORE: _at_open_port_req: STATUS(%d)", etm_at_event_status);
+
+    return ETM_OK;
+}
+
+
+/******************************************************************************
+ * Close Port
+ *****************************************************************************/
+
+int etm_at_port_close_req(void)
+{ 
+    int error;
+
+    error = atp_close_port(etm_at_id, etm_at_to_aaa_port);
+    if (error != RV_OK) {
+    tr_etm(TgTrCore, "ETM CORE: _at_port_close_req: FAILED");
+        return ETM_FATAL;
+    }        
+    
+    // etm_at_callback_for_ATP should receive event: ATP_PORT_CLOSED 
+    rvf_wait(0xffff, 100); // Timeout 100 ticks
+    tr_etm(TgTrCore, "ETM CORE: _at_open_port_req: STATUS(%d)", etm_at_event_status);
+
+    etm_at_initialized = 0;
+    return ETM_OK;
+}
+
+
+/******************************************************************************
+ * Callback function for ATP
+ *****************************************************************************/
+
+//   PURPOSE : Decipher and route incoming messages from ATP.
+
+void etm_at_callback_for_ATP(void *event_from_atp_p)
+{
+	// This function is ATP context.
+	
+//    tr_etm(TgTrEtmLow,"ETM: CORE: etm_at_callback_for_ATP: recv. event (0x%x)", ((T_RV_HDR *) event_from_atp_p)->msg_id);
+
+    // What type of event?
+    switch (((T_RV_HDR *) event_from_atp_p)->msg_id)
+    {
+    case ATP_CMD_RDY:
+        tr_etm(TgTrCore,"ETM CORE: _at_callback_for_AT: UNSUPPORTED"); 
+        break;
+    case ATP_OPEN_PORT_CFM:
+        if (((T_ATP_OPEN_PORT_CFM *) event_from_atp_p)->result == OPEN_PORT_OK) {
+            tr_etm(TgTrCore, "ETM CORE: _at_callback_for_ATP: rev. event ATP_OPEN_PORT_CFM - OPEN_PORT_OK");
+//            tr_etm(TgTrCore, "ETM CORE: _at_callback_for_ATP: rev. event ATP_OPEN_PORT_CFM - Port Number (%d)",
+//                   ((T_ATP_OPEN_PORT_CFM *) event_from_atp_p)->initiator_port_nb);
+        }
+        else {
+            tr_etm(TgTrCore, "ETM CORE: _at_callback_for_ATP: rev. event ATP_OPEN_PORT_CFM - OPEN_PORT_NOK");
+            etm_at_event_status = ETM_FATAL;
+        }
+//            tr_etm(TgTrCore, "ETM CORE: _at_callback_for_ATP: rev. event ATP_OPEN_PORT_CFM - Port Number (%d)",
+//                   ((T_ATP_OPEN_PORT_CFM *) event_from_atp_p)->initiator_port_nb);
+        break;
+    case ATP_TXT_CMD_RDY:
+        etm_at_atp_txt_cmd_rdy((T_ATP_TXT_CMD_RDY *) event_from_atp_p);
+        break;
+    case ATP_PORT_CLOSED:
+        tr_etm(TgTrCore, "ETM CORE: _at_callback_for_ATP: rev. event ATP_PORT_CLOSED");
+        break;
+    case ATP_OPEN_PORT_IND:
+        tr_etm(TgTrCore, "ETM CORE: _at_callback_for_ATP: rev. event ATP_OPEN_PORT_IND");
+        break;
+    default:
+        tr_etm(TgTrCore, "ETM CORE: _at_callback_for_ATP: rev. unknown event(0x%x)- UNSUPPORTED", 
+               ((T_RV_HDR *) event_from_atp_p)->msg_id);
+    }
+    
+    /* Free memmory that is allocated within ATP */
+    etm_free(event_from_atp_p);
+}      
+
+
+// This is called when the result of the AT cmd is received 
+// (in a primetive) from the ATP entity.
+int etm_at_atp_txt_cmd_rdy(T_ATP_TXT_CMD_RDY *msg)
+{
+/* Send reply to PC
+   The status type depend of the event from ATP module: 
+       last_result = 0, means more data is sent to HOST (PC)
+       last_result = 1, means last data is sent to HOST (PC)
+       last_result = 2, means data is not sent to HOST (PC)  */
+
+    T_ETM_PKT  *pkt;
+    char *text, last_result = 1;
+    int error = 0, length;
+
+    if ((pkt = (T_ETM_PKT *) etm_malloc(sizeof(T_ETM_PKT))) == NULL) {
+        rvf_dump_mem();
+        return ETM_NOMEM;
+    }
+    
+    // Init. of return packet
+    pkt->mid    = ETM_CORE;
+    pkt->status = ETM_OK;
+    pkt->size   = 0;
+    pkt->index  = 0;
+    etm_pkt_put8(pkt, 'G'); // 'G' is indcator for AT command respons
+
+
+    tr_etm(TgTrCore, "ETM CORE: _at_atp_txt_cmd_rdy: ATP_TXT_CMD_RDY with cmd_type(%d)",
+           msg->cmd_type);
+ 
+    switch (msg->cmd_type){
+    case AT_CMD:                                                   // Type: 0
+    case CUSTOM_CMD:                                               // Type: 4
+    case CMD_ABORT:                                                // Type: 5
+    case UNKNOWN:                  error = ETM_MESSAGE; break;     // Type: 6
+    case PRELIMINARY_RESULT_CODE:  last_result = 0;     break;     // Type: 7
+//    case INFORMATION_TXT:          last_result = 0;     break;     // Type: 3
+    case RESULT_CODE:              last_result = 1;     break;     // Type: 1
+    case UNSOLICITED_RESULT:       last_result = 2;     break;     // Type: 2
+    default:
+        tr_etm(TgTrCore,"ETM CORE: _at_atp_txt_cmd_rdy: cmd_tpye(%d) - FAILED", msg->cmd_type); 
+        error = ETM_NOSYS;
+    }
+
+    if (last_result == 2) 
+        goto etm_at_atp_txt_cmd_rdy_end;
+    
+    text = ((char *) msg->txt_cmd_p);
+    length = strlen(text);
+    etm_pkt_putdata(pkt, text, length);
+    tr_etm(TgTrCore, "ETM CORE: _at_atp_txt_cmd_rdy: text(%s) length(%d)", text, length);
+
+    // Status will be set to ETM_OK_MORE when more data is send.
+    // Add one because of string length is also returned as part of the result
+    pkt->status = (last_result ? ETM_OK : -ETM_OK_MORE);
+
+    if (error < 0) {
+//        tr_etm(TgTrCore,"ETM CORE: _at_atp_txt_cmd_rdy: ERROR(%d)", error); 
+        pkt->status = -error;
+    }
+
+    etm_pkt_send(pkt);
+
+etm_at_atp_txt_cmd_rdy_end:
+    etm_free(pkt);
+
+    return ETM_OK;
+}
+
+
+/******************************************************************************
+ * ETM AT - Main Task 
+ *****************************************************************************/
+
+// Structur of protocol data dl-link: |target|at_cmd|
+int etm_at(T_ETM_PKT *pkt, char *buf)
+{
+    int error = ETM_NOSYS;
+    int sw_entity;
+
+//    sw_entity = *buf++;
+
+    // FIXME pkt should be use in etm_at_adapter()
+    error = etm_at_adapter((char *) buf);
+
+#if 0 
+    switch (sw_entity) {
+    case GSM: 
+  
+        break;
+    case BLUE: 
+        //error = etm_at_blue(*buf++); 
+        break;
+    default:
+        tr_etm(TgTrCore,"ETM CORE: _at: ERROR(%d)", error); 
+        error = ETM_NOSYS; 
+    }
+#endif
+
+    return error;
+}
+