view src/cs/services/etm/etm_api.c @ 275:79cfefc1e2b4

audio mode load: gracefully handle mode files of wrong AEC version Unfortunately our change of enabling L1_NEW_AEC (which is necessary in order to bring our Calypso ARM fw into match with the underlying DSP reality) brings along a change in the audio mode file binary format and file size - all those new tunable AEC parameters do need to be stored somewhere, after all. But we already have existing mode files in the old format, and setting AEC config to garbage when loading old audio modes (which is what would happen without the present change) is not an appealing proposition. The solution implemented in the present change is as follows: the audio mode loading code checks the file size, and if it differs from the active version of T_AUDIO_MODE, the T_AUDIO_AEC_CFG structure is cleared - set to the default (disabled AEC) for the compiled type of AEC. We got lucky in that this varying T_AUDIO_AEC_CFG structure sits at the end of T_AUDIO_MODE!
author Mychaela Falconia <falcon@freecalypso.org>
date Fri, 30 Jul 2021 02:55:48 +0000
parents 4e78acac3d88
children
line wrap: on
line source

/*******************************************************************************
 * Enhanced TestMode (ETM)
 * @file    etm_api.c
 *
 * API for ETM SWE.
 *
 * @author  Kim T. Peteren (ktp@ti.com)
 * @version 0.1
 *

 *
 * History:
 *
 *  Date        Modification
 *  ------------------------------------
 *  11/06/2003  Creation
 *
 * (C) Copyright 2003 by Texas Instruments Incorporated, All Rights Reserved
 ******************************************************************************/


#include "etm/etm.h"
#include "etm/etm_env.h"
#include "etm/etm_messages_i.h"
#include "etm/etm_trace.h"

#include "etm/etm_misc.h"

#include "rvf/rvf_api.h"

#include <string.h> 

extern T_ETM_ENV_CTRL_BLK *etm_env_ctrl_blk;


/*******************************************************************************
 * Registers the SWE to the ETM instance.
 *
 * This is a bridge function. It sends the T_ETM_REGISTRATION_REQ
 * message to the ETM SWE.
 * It is the first function that should be called.
 *
 * @return  ETM_NOMEM in case of a memory error,
 *          the return value of rvf_send_msg otherwise.
 ******************************************************************************/

int etm_register(char name[], int mid, int task_id, T_RVF_ADDR_ID addr_id, ETM_CALLBACK_FUNC callback)
{
    /* Type for a registration event. */
    T_ETM_REGISTER_REQ *etm_registration_p;

    tr_etm(TgTrEtmLow, "ETM API: _register bridge function(%s)", name);

    /* Allocate the memory for the message to send */
    if ((etm_registration_p = (T_ETM_REGISTER_REQ*) etm_malloc(sizeof(T_ETM_REGISTER_REQ))) == NULL)
            return ETM_NOMEM; 

    /* Fill the message id */
    etm_registration_p->header.msg_id        = ETM_REGISTER_REQ;
 
    /* Fill the address source id */
    etm_registration_p->header.src_addr_id   = rvf_get_taskid(); 
    etm_registration_p->header.dest_addr_id  = etm_env_ctrl_blk->addr_id;
    etm_registration_p->header.callback_func = NULL;

    /* Fill the message parameters */
    memcpy(etm_registration_p->name, name, strlen(name));
    etm_registration_p->mid              = mid;
    etm_registration_p->task_id          = task_id;
    etm_registration_p->addr_id          = addr_id;
    etm_registration_p->rx_callback_func = callback; 

    /* Send the message using mailbox. */
    return rvf_send_msg(etm_env_ctrl_blk->addr_id,
                        (void*) etm_registration_p);
}


/*******************************************************************************
 * Cleans ETM register tables, i.e. set/clean the variable at their initialization
 * state for a specific entity.
 * This function can be used to reinitialize ETM register database without having to
 * start/stop it.
 *
 * This is a bridge function. It sends ETM_UNREGISTER message to ETM.
 *
 * @return  ETM_NOMEM in case of a memory error,
 *          the return value of rvf_send_msg otherwise.
 ******************************************************************************/

int etm_unregister(char name[], int mid, int task_id, T_RVF_ADDR_ID addr_id, ETM_CALLBACK_FUNC callback)
{
    /* Type for a start input event. */
    T_ETM_UNREGISTER *etm_unregister_p;
    
    tr_etm(TgTrEtmLow, "ETM API: _unregister bridge function");
    
    /* Allocate the memory for the message to send */
    if ((etm_unregister_p = (T_ETM_UNREGISTER*) etm_malloc(sizeof(T_ETM_UNREGISTER))) == NULL)
            return ETM_NOMEM; 

    /* Fill the message id */
    etm_unregister_p->header.msg_id        = ETM_UNREGISTER;
 
    /* Fill the address source id */
    etm_unregister_p->header.src_addr_id   = rvf_get_taskid(); 
    etm_unregister_p->header.dest_addr_id  = etm_env_ctrl_blk->addr_id;
    etm_unregister_p->header.callback_func = NULL;

    /* Fill the message parameters */
    memcpy(etm_unregister_p->name, name, strlen(name));
    etm_unregister_p->mid              = mid;
    etm_unregister_p->task_id          = task_id;
    etm_unregister_p->addr_id          = addr_id;
    etm_unregister_p->rx_callback_func = callback;

    /* Send the message using mailbox. */
    return rvf_send_msg(etm_env_ctrl_blk->addr_id,
                        (void*) etm_unregister_p);
}


/*******************************************************************************
 * Get data from a ETM packet structur. Get either 8, 16 or 32 value
 * Used to unpack data 
 * 
 * This is helpers
 *
 * @return  the return value of the point of the ETM packet.
 ******************************************************************************/

int etm_get8(void *buf)
{
    unsigned char *p = buf;

    int value = *p;

    tr_etm(TgTrEtmLow, "ETM API: _get8(%d)", value);

    return value;
}

int etm_get16(void *buf)
{
   unsigned char *p = buf;

    int value =
        (*p++ | (*p << 8));

    tr_etm(TgTrEtmLow, "ETM API: _get16(%d)", value);

    return value;
}

int etm_get32(void *buf)
{
    unsigned char *p = buf;
    int value = 0;
   
    value = *p;
    p++;
    value |= (*p << 8);
    p++;
    value |= (*p << 16);
    p++;
    value |= (*p << 24);

    tr_etm(TgTrEtmLow, "ETM API: _get32(%d)", value);

    return value;
}


/*******************************************************************************
 * Put data into a ETM packet structur. Put either 8, 16 or 32 value
 * Used to pack data 
 * 
 * This is helpers
 *
 * @return  Return ETM_PACKET of ETM_OK.
 ******************************************************************************/

#define max_ul_data_size 240

int etm_pkt_put8(T_ETM_PKT *pkt, int value)
{
    tr_etm(TgTrEtmLow, "ETM API: _pkt_put8(*, %d)", value);

    if (pkt->index + 1 > max_ul_data_size) 
        return ETM_PACKET;
    
    pkt->data[pkt->index] = value;
    pkt->index += 1;

    pkt->size += 1;

    return ETM_OK;
}

int etm_pkt_put16(T_ETM_PKT *pkt, int value)
{
    tr_etm(TgTrEtmLow, "ETM API: _pkt_put16(*, %d)", value);

    if (pkt->index + 2 > max_ul_data_size) 
        return ETM_PACKET;

    memcpy(&pkt->data[pkt->index], &value, 2);
    pkt->index += 2;

    pkt->size += 2;

    return ETM_OK;
}

int etm_pkt_put32(T_ETM_PKT *pkt, int value)
{
    tr_etm(TgTrEtmLow, "ETM API: _pkt_put32(*, %d)", value);

    if (pkt->index + 4 > max_ul_data_size) 
        return ETM_PACKET;

    memcpy(&pkt->data[pkt->index], &value, 4);
    pkt->index += 4;

    pkt->size += 4;

    return ETM_OK;
}

int  etm_pkt_putdata(T_ETM_PKT *pkt, const void *buf, int size)
{
    tr_etm(TgTrEtmLow, "ETM API: _pkt_putdata(*, %d)", size);

    if (pkt->index + size > max_ul_data_size)
        return ETM_PACKET;
    memcpy(&pkt->data[pkt->index], buf, size);
    pkt->index += size;

    pkt->size += size;
  
    return ETM_OK;
}


/*******************************************************************************
 * This function is used to send an ETM Packet to the PC
 *
 * This is helpers
 *
 * @return  Return value of rvf_send_trace_cpy.
 ******************************************************************************/

int etm_pkt_send(T_ETM_PKT *pkt)
{
    extern unsigned char etm_trace_user_id; 
    uint8 *buf, cksum = 0;
    uint16 sendsize, size;
    int error = ETM_OK;

    buf = (uint8 *) &pkt->mid;
    sendsize = size = pkt->size + 2; //one for mid, one for status

    tr_etm(TgTrEtmLow, "ETM API: _pkt_send: size(%d)", sendsize);

    while (size-- ) {
        cksum ^= *buf++;
    }
    *buf = cksum;

    sendsize += 1; // one for checksum

    tr_etm_hexdump(TgTrEtmLow, &pkt->mid, sendsize);

    error = rvt_send_trace_cpy((uint8 *) &pkt->mid, etm_trace_user_id,
                               sendsize, RVT_BINARY_FORMAT);
    if(error < 0)
        tr_etm(TgTrFatal, "ETM API: _pkt_send: ERROR(%d)", error);

    return error;
}