/*****************************************************************************
 * FUNCTION
 *  tp_ps_handling_at_indication
 * DESCRIPTION
 *  This function is used to handle the response/URC data from MOD_ATCI
 *
 * PARAMETERS
 *  channelId             [IN]              
 *  buf             [IN]       
 *  iDataLen        [IN]       
 *
 * RETURNS
 * void
 *****************************************************************************/
static void tp_ps_handling_at_indication(kal_uint8  channelId, kal_char *buf, kal_uint16 iDataLen)
{
    kal_char *data;
    
    if (tp_callback == NULL || tp_port_begin == -1)
    {
        if (tp_callback == NULL)
        {
            kal_prompt_trace(
                    stack_get_active_module_id(),
                    "[Hdlr] ERROR: havn't register TP callback function");
        }
        else if (tp_port_begin == -1)
        {
            kal_prompt_trace(
                    stack_get_active_module_id(),
                    "[Hdlr] ERROR: havn't start PS, please call tp_ps_start first");
        }

        // buffer the URC
        if (channelId == RMMI_MSG_BASED_URC_CHANNEL)
        {
            kal_prompt_trace(
                    stack_get_active_module_id(),
                    "[Hdlr] Buffer the URC: %s", buf);
            if ( (tp_urc_buffer_len + iDataLen) > MAX_TP_URC_BUFFER_LENGTH)
            {
                kal_prompt_trace(
                    stack_get_active_module_id(),
                    "[Hdlr] URC buffer is full, clean the buffer", buf);

                tp_urc_buffer_len = 0;
            }
            
            if (iDataLen > MAX_TP_URC_BUFFER_LENGTH)
            {
               kal_prompt_trace(
                    stack_get_active_module_id(),
                    "[Hdlr] ERROR: the URC is too large, please increase the URC buffer");
            }
            else
            {
                kal_mem_cpy(tp_urc_buffer+tp_urc_buffer_len, buf, iDataLen);
                tp_urc_buffer_len += iDataLen;
            }
        }
    }
    else
    {

        data = get_ctrl_buffer(iDataLen);
        kal_mem_cpy(data, buf, iDataLen);
        
        tp_callback(channelId, data, iDataLen, 1);
        
        free_ctrl_buffer(data);
    }

}
/*****************************************************************************
 * FUNCTION
 *  rmmi_msgbased_send_ilm
 * DESCRIPTION
 *  This function is used to send ILM to dest_id using the msg_id with data local_param_ptr and peer_buf_ptr
 *
 * PARAMETERS
 *  dest_id             [IN]
 *  msg_id              [IN]
 *  local_param_ptr  [IN]
 *  peer_buf_ptr        [IN]
 *
 * RETURNS
 *  void
 *****************************************************************************/
static void rmmi_msgbased_send_ilm(module_type dest_id, kal_uint16 msg_id, void *local_param_ptr, void *peer_buf_ptr)
{
    module_type module = stack_get_active_module_id();
    

    msg_send6(module, dest_id, ATCI_SAP, (msg_type)msg_id, (local_para_struct *) local_param_ptr, (peer_buff_struct*) peer_buf_ptr);
}
/*****************************************************************************
 * FUNCTION
 *  tp_ps_start
 * DESCRIPTION
 *  This function is used to start message based AT command mechanism by customer
 *
 * PARAMETERS
 *  buffer             [IN]         output data
 *
 * RETURNS
 *  TP_SUCCESS or TP_ERROR
 *****************************************************************************/
kal_int32 tp_ps_start(kal_int8 channelNum) 
{
    kal_uint8 i;
    rmmi_register_channel_req_struct *req_ptr;
    
    if(channelNum > RMMI_MSG_BASED_CUSTOM_AT_CHANNEL)
    {
        kal_prompt_trace(
            stack_get_active_module_id(), 
            "[Start] Register channel number(%d) is larger than the maximum supported number: %d",
            channelNum, RMMI_MSG_BASED_CUSTOM_AT_CHANNEL);
        return TP_ERROR;
    }
    else if (tp_channelNum != 0)
    {
        kal_prompt_trace(
            stack_get_active_module_id(), 
            "[Start] We have already been started");
        return TP_ERROR;
    }

    tp_channelNum = channelNum;

    //init buffers
    for(i=0; i<channelNum; i++)
    {
        tp_buffer[i].length = 0;
        tp_buffer[i].data[0] = '\0';
        tp_buffer[i].is_sms_cmd = KAL_FALSE;
    }

    //send MSG_ID_ATCI_REGISTER_CHANNEL_REQ
    req_ptr =  (rmmi_register_channel_req_struct*)
            construct_local_para((kal_uint16) sizeof(rmmi_register_channel_req_struct), TD_RESET);

    req_ptr->ch_num = channelNum;

    rmmi_msgbased_send_ilm(
            RMMI_MSG_BASED_HANDLER_MODULE, 
            MSG_ID_RMMI_REGISTER_CHANNEL_REQ, 
            req_ptr, NULL);

    return TP_SUCCESS;
}
예제 #4
0
파일: aud_bt_a2dp.c 프로젝트: 12019/mtktest
/*****************************************************************************
 * FUNCTION
 *  aud_bt_a2dp_codec_callback
 * DESCRIPTION
 *  
 * PARAMETERS
 *  event       [IN]        
 *  param       [?]         
 * RETURNS
 *  void
 *****************************************************************************/
void aud_bt_a2dp_codec_callback(A2DP_Event event, void *param)
{
    A2DP_codec_struct* codec_p = (A2DP_codec_struct*)param;
    module_type src_mod_id;
    
    if(kal_if_hisr() != KAL_FALSE)
        src_mod_id = MOD_L1SPHISR;
    else
        src_mod_id = stack_get_active_module_id();
    bt_a2dp_send_stream_data_send_req(src_mod_id, stream_handle, codec_p);
}
/*****************************************************************************
 * FUNCTION
 *  tp_ps_exe_at_cnf_hdlr
 * DESCRIPTION
 *  This function is used to handle the message MSG_ID_RMMI_EXE_AT_CNF
 *
 * PARAMETERS
 *  local_para_ptr             [IN]              
 *  peer_buff_ptr             [IN]       
 *
 * RETURNS
 * void
 *****************************************************************************/
static void tp_ps_exe_at_cnf_hdlr(local_para_struct *local_para_ptr, peer_buff_struct *peer_buff_ptr)
{
    rmmi_exe_at_cnf_struct *cnf_ptr;
    
    cnf_ptr = (rmmi_exe_at_cnf_struct*) local_para_ptr;
    
    kal_prompt_trace(
            stack_get_active_module_id(),
            "[Hdlr] ATCI has received the request, result:%d, from port:%d", 
            cnf_ptr->result, cnf_ptr->port_id);
}
/*****************************************************************************
 * FUNCTION
 *  tp_ps_test_callback
 * DESCRIPTION
 *  This function is the test purpose callback function for testing
 *
 * PARAMETERS
 *  channelId             [IN]              always be 1
 *  buf             [IN]       
 *  iDataLen             [IN]          
 *  iFlag             [IN]          
 *
 * RETURNS
 *  TP_SUCCESS or TP_ERROR
 *****************************************************************************/
static kal_int32 tp_ps_test_callback(kal_uint8  channelId, kal_char *buf, kal_uint16 iDataLen, kal_uint8  iFlag)
{
    /*This function is used to test the tp ps functions*/
    module_type type;

    type = stack_get_active_module_id();
    
    kal_prompt_trace(
            type, 
            "[Callback] Ch: %d, length: %d, flag: %d, buf:%s", 
            channelId, iDataLen, iFlag, buf);

    return 0;
}
/*****************************************************************************
 * FUNCTION
 *  rmmi_msgbased_register_channel
 * DESCRIPTION
 *   This function is used to init source/port mapping accroding the ch_num
 * PARAMETERS
 *  ch_num        [IN]        
 * RETURNS
 *  RMMI_MSG_BASED_PORT_BEGIN
 *****************************************************************************/
kal_uint8 rmmi_msgbased_register_channel(kal_uint8 ch_num)
{
    kal_uint8 i, src;
    
    src = RMMI_MSG_AT_SRC;
    for (i=0; i<ch_num; i++)
    {
        kal_prompt_trace(
            stack_get_active_module_id(), 
            "[Reg] Register channel(%d): source: %d, port: %d",
            i, src, RMMI_MSG_BASED_PORT_BEGIN+i);

        rmmi_msgbased_port[i] = RMMI_MSG_BASED_PORT_BEGIN + i;
        rmmi_msgbased_src[i] = src++;
    }

    return RMMI_MSG_BASED_PORT_BEGIN;
}
예제 #8
0
static module_type get_current_module_id(void)
{
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    switch (stack_get_active_module_id())
    {
#ifdef __J2ME__
    case MOD_J2ME:
        return MOD_J2ME;
    case MOD_JASYN:
        return MOD_JASYN;
#endif /* __J2ME__ */
    default:
        return MOD_MMI;
    }
}
/*****************************************************************************
 * FUNCTION
 *  tp_ps_register_channel_cnf_hdlr
 * DESCRIPTION
 *  This function is used to handle the message MSG_ID_RMMI_REGISTER_CHANNEL_CNF
 *
 * PARAMETERS
 *  local_para_ptr             [IN]              
 *  peer_buff_ptr             [IN]       
 *
 * RETURNS
 * void
 *****************************************************************************/
static void tp_ps_register_channel_cnf_hdlr(local_para_struct *local_para_ptr, peer_buff_struct *peer_buff_ptr)
{
    rmmi_register_channel_cnf_struct *cnf_ptr;

    cnf_ptr = (rmmi_register_channel_cnf_struct*) local_para_ptr;
    tp_port_begin = cnf_ptr->begin_port_id;
    
    kal_prompt_trace(
            stack_get_active_module_id(),
            "[Hdlr] Receive register channel confirm, result:%d, begin_port:%d", 
            cnf_ptr->result, tp_port_begin);

    if ( !(tp_callback == NULL || tp_port_begin == -1))
    {
        if (tp_urc_buffer_len > 0)
        {
            tp_callback(
                    RMMI_MSG_BASED_URC_CHANNEL, 
                    tp_urc_buffer, 
                    tp_urc_buffer_len, 1);
        }
    }

}
/*****************************************************************************
 * FUNCTION
 *  tp_ps_urc_at_ind_hdlr
 * DESCRIPTION
 *  This function is used to handle the message relative to message based AT command mechanism
 *
 * PARAMETERS
 *  ilm_ptr             [IN]              
 *
 * RETURNS
 * void
 *****************************************************************************/
void tp_ps_message_handler(ilm_struct *ilm_ptr)
{
    kal_prompt_trace(MOD_ATCI, "Enter TP Handler");
    if (ilm_ptr->msg_id == MSG_ID_RMMI_REGISTER_CHANNEL_CNF)
    {
        tp_ps_register_channel_cnf_hdlr(ilm_ptr->local_para_ptr, ilm_ptr->peer_buff_ptr);
    }
    else if (ilm_ptr->msg_id == MSG_ID_RMMI_EXE_AT_CNF)
    {
        tp_ps_exe_at_cnf_hdlr(ilm_ptr->local_para_ptr, ilm_ptr->peer_buff_ptr);
    }
    else if (ilm_ptr->msg_id == MSG_ID_RMMI_RESPONSE_AT_IND)
    {
        tp_ps_response_at_ind_hdlr(ilm_ptr->local_para_ptr, ilm_ptr->peer_buff_ptr);
    }
    else if (ilm_ptr->msg_id == MSG_ID_RMMI_URC_AT_IND)
    {
        tp_ps_urc_at_ind_hdlr(ilm_ptr->local_para_ptr, ilm_ptr->peer_buff_ptr);
    }
    #ifdef TP_PS_NDEBUG

    else if (ilm_ptr->msg_id == MSG_ID_TST_INJECT_STRING)
    {
        kal_int8 num;
        tst_module_string_inject_struct *msg_ptr;
        msg_ptr = (tst_module_string_inject_struct*) ilm_ptr->local_para_ptr;


        switch(msg_ptr->index)
        {
            case 0: //reg_callback
                tp_ps_reg_callback(tp_ps_test_callback);
                break;
            case 1: //start
                num = atoi((kal_char *)msg_ptr->string);
                kal_prompt_trace(stack_get_active_module_id(), "NUM: %d", num);
                tp_ps_start(num);
                break;
            case 2: // send
                tp_ps_Send(1, 0, msg_ptr->string, strlen((kal_char*)msg_ptr->string));
                break;
            case 3: // send <CR>
                tp_ps_Send(1, 0, "\r", 1);
                break;
            case 4: // send <CTRL+Z>
                num = RMMI_MSGBASED_CTRLZ;
                tp_ps_Send(1, 0, (kal_uint8*) &num, 1);
                break;
            case 5: // send <ESC>
                num = RMMI_MSGBASED_ESC;
                tp_ps_Send(1, 0, (kal_uint8*) &num, 1);
                break;
            case 6: // send with invalid iFlag
                tp_ps_Send(0, 0, msg_ptr->string, strlen((kal_char*)msg_ptr->string));
                break;
            case 7: // send with invalid channel
                tp_ps_Send(1, 25, msg_ptr->string, strlen((kal_char*)msg_ptr->string));
                break;
            case 8: // send with invalid pointer
                tp_ps_Send(1, 0, NULL, strlen((kal_char*)msg_ptr->string));
                break;
            case 9: // send to max channel
                tp_ps_Send(1, RMMI_MSG_BASED_CUSTOM_AT_CHANNEL-1, msg_ptr->string, strlen((kal_char*)msg_ptr->string));
                break;
            case 10: // send <CR>
                tp_ps_Send(1, RMMI_MSG_BASED_CUSTOM_AT_CHANNEL-1, "\r", 1);
                break;
            case 11: // send <CTRL+Z>
                num = RMMI_MSGBASED_CTRLZ;
                tp_ps_Send(1, RMMI_MSG_BASED_CUSTOM_AT_CHANNEL-1, (kal_uint8*) &num, 1);
                break;
            case 12: // send <ESC>
                num = RMMI_MSGBASED_ESC;
                tp_ps_Send(1, RMMI_MSG_BASED_CUSTOM_AT_CHANNEL-1, (kal_uint8*) &num, 1);
                break;
            case 13: // send <ESC>
                tp_ps_Send(1, 0, msg_ptr->string, strlen((kal_char*)msg_ptr->string));
                tp_ps_Send(1, 0, "\r", 1);
                break;
            case 14: // send <ESC>
                tp_ps_Send(1, RMMI_MSG_BASED_CUSTOM_AT_CHANNEL-1, msg_ptr->string, strlen((kal_char*)msg_ptr->string));
                tp_ps_Send(1, RMMI_MSG_BASED_CUSTOM_AT_CHANNEL-1, "\r", 1);
                break;


            default:
                break;
        }
        
    }
    #endif

}
/*****************************************************************************
 * FUNCTION
 *  tp_ps_Send
 * DESCRIPTION
 *  This function is used to send AT command to MOD_ATCI
 *  Return success means that the command is sent, not the command is executed successfully
 * PARAMETERS
 *  iFlag             [IN]              always be 1
 *  channelId             [IN]       
 *  pDataPtr             [IN]          
 *  iDataLen             [IN]          
 *
 * RETURNS
 *  TP_SUCCESS or TP_ERROR
 *****************************************************************************/
kal_int32 tp_ps_Send(kal_uint8 iFlag, kal_uint8  channelId, kal_uint8 *pDataPtr, kal_uint16 iDataLen) 
{
    kal_uint16 i;
    kal_int32 result = TP_ERROR;
    module_type type;
    tp_queue_struct *buffer;
    rmmi_exe_at_req_struct *req_ptr;
    peer_buff_struct *peer_ptr;
    kal_uint8 *data_ptr;
    kal_uint8 cmd_string[10];
    kal_char input_hint_string[] = "\r\n> ";

    type = stack_get_active_module_id();
    if (iFlag != 1)
    {
        kal_prompt_trace(
                type,
                "[Send] Warning: iFlag shoulbe be 1: %d", iFlag);
    }

    if (tp_port_begin == -1)
    {
        kal_prompt_trace(
                type,
                "[Send] ERROR: havn't start PS, please call tp_ps_start first");
    }
    else if(pDataPtr == NULL)
    {
        kal_prompt_trace(
                type,
                "[Send] ERROR: input data pointer is NULL!!!");
    }        
    else if (tp_callback == NULL)
    {
        kal_prompt_trace(
                type,
                "[Send] ERROR: havn't register TP callback function");
    }
    else if(channelId >= tp_channelNum)
    {
        kal_prompt_trace(
                type,
                "[Send] ERROR: invalid channelID: ch:%d, max:%d ", channelId, tp_channelNum);
    }
    else
    {
        buffer = &tp_buffer[channelId];

        if ( (buffer->length + iDataLen) > MAX_TP_QUEUE_LENGTH)
        {
            kal_prompt_trace(
                    type,
                    "[Send] ERROR: buffer[%d] is full, clean the buffer!!! Org:%d, New:%d, Max: %d", 
                    channelId, buffer->length, iDataLen, 
                    MAX_TP_QUEUE_LENGTH);
            buffer->length = 0;
            buffer->is_sms_cmd = KAL_FALSE;
        }
        else
        {
            result = TP_SUCCESS;
            
            //Put the data into the buffer
            kal_mem_cpy(buffer->data+buffer->length, pDataPtr, iDataLen);

            //Update buffer length
            buffer->length += iDataLen;

            //check if the data is a complete command according to the <CR><LF>
            for(i=0; i<buffer->length;i++)
            {
                if (buffer->is_sms_cmd == KAL_FALSE &&
                    (buffer->data[i] == RMMI_MSGBASED_CR || buffer->data[i] == RMMI_MSGBASED_LF) )
                {
                    kal_mem_cpy(cmd_string, buffer->data, 10);
                    toUpper(cmd_string);
                    if (is_sms_command(cmd_string, 10) == KAL_TRUE)
                    {
                        buffer->is_sms_cmd = KAL_TRUE;

                        // send hint string
                        tp_callback(channelId, input_hint_string, strlen(input_hint_string), 1);
                        buffer->data[i] = RMMI_MSGBASED_LF;

                        kal_prompt_trace(
                            type,
                            "[Send] INFO: Enter SMS input mode");
                    }
                    break;
                }
                else if (buffer->is_sms_cmd == KAL_TRUE &&
                    (buffer->data[i] == RMMI_MSGBASED_CTRLZ || buffer->data[i] == RMMI_MSGBASED_ESC) )
                {
                    kal_prompt_trace(
                            type,
                            "[Send] INFO: Leave SMS input mode");

                    buffer->is_sms_cmd = KAL_FALSE;

                    if (buffer->data[i] == RMMI_MSGBASED_ESC)
                    {
                        tp_callback(channelId, "\r\nOK\r\n", 6, 1);
                        //clean the buffer
                        buffer->length = 0;
                        return;
                    }
                    break;
                }
            }

            
            if (i != buffer->length)
            {
                if (buffer->is_sms_cmd == KAL_TRUE)
                {
                    kal_prompt_trace(
                        type,
                        "[Send] INFO: in SMS input mode, length: %d", 
                        buffer->length);
                }
                else
                {
                    // send the command
                    req_ptr = (rmmi_exe_at_req_struct*)
                            construct_local_para((kal_uint16) sizeof(rmmi_exe_at_req_struct), TD_RESET);
                    peer_ptr = (peer_buff_struct*) construct_peer_buff(buffer->length, 0, 0, TD_RESET);
                    data_ptr= (kal_uint8 *)get_peer_buff_pdu(peer_ptr, &i);

                    req_ptr->length = buffer->length;
                    req_ptr->port_id = channelId + tp_port_begin;

                    kal_mem_cpy(data_ptr, buffer->data, buffer->length);

                    rmmi_msgbased_send_ilm(
                            RMMI_MSG_BASED_HANDLER_MODULE, 
                            MSG_ID_RMMI_EXE_AT_REQ,
                            req_ptr, peer_ptr);

                    //clean the buffer
                    buffer->length = 0;
                }
            }
        }
    }

    return result;
}
kal_bool video_renderer_task_req_msg(
  void * exec_task_name,
  video_renderer_task_exec_func_t exec_func,
  void * exec_param,
  kal_uint32 exec_param_size)
{
#if defined(__MTK_TARGET__)
#if (defined(ISP_SUPPORT))

  _video_renderer_task_local_param_t *ilm_param;
  ilm_struct *p_ilm = NULL;
  module_type eActiveModuleId;
  kal_uint32 local_param_size;
  kal_uint32 construct_size;

  // Here, I utilize some behavior of arm compilier for struct "_video_renderer_task_local_param_t"
  // 1. For exec_param, it is a pointer, and it's size must be 4 byte
  // 2. The start address of struct must be 4 byte align
  // 3. The start address of exec_param in the struct must be 4 byte align
  // Then I will put the input exec_param to stuct exec_param
  
  local_param_size = sizeof(_video_renderer_task_local_param_t);
  construct_size = local_param_size - 4 + exec_param_size; // -4 is the size of exec_param in the struct

  ilm_param = (_video_renderer_task_local_param_t*) 
                  construct_local_para(construct_size, TD_CTRL);
  ASSERT(NULL != ilm_param);

  ilm_param->exec_func = exec_func;
  kal_mem_cpy(&(ilm_param->exec_param), exec_param, exec_param_size);

  eActiveModuleId = stack_get_active_module_id();
  p_ilm = allocate_ilm(eActiveModuleId);
  ASSERT(NULL != p_ilm);

  // check target task
  // Why not use return KAL_FALSE to instead
  // When ilm was allocated but not send to msg queue, ASSERT will happen when next
  // user to try to allocate ilm in the same thread
  if (NULL == exec_task_name)
  {
    ASSERT(0);
  }
  else
  {
    if (0 == strcmp(exec_task_name, "MOD_CAL"))
    {
      p_ilm->dest_mod_id = MOD_CAL;
      p_ilm->sap_id = CAL_SAP;
      p_ilm->msg_id = (msg_type) MSG_ID_CAL_VIDEO_RENDERER_REQ;
    }
    else
    {
      ASSERT(0);
    }
  }

  p_ilm->src_mod_id = eActiveModuleId;
  p_ilm->local_para_ptr = (local_para_struct*) ilm_param;
  p_ilm->peer_buff_ptr = NULL;

  msg_send_ext_queue(p_ilm);

  return KAL_TRUE;

#else //#if (defined(ISP_SUPPORT))
  return KAL_FALSE;
#endif //#if (defined(ISP_SUPPORT))

#else //#if defined(__MTK_TARGET__)
  return KAL_FALSE;
#endif //#if defined(__MTK_TARGET__)
}