FreeCalypso > hg > freecalypso-sw
diff gsm-fw/services/etm/etm_api.c @ 164:d78219c43fbf
gsm-fw/services/etm: initial import from the Leonardo semi-src
author | Michael Spacefalcon <msokolov@ivan.Harhan.ORG> |
---|---|
date | Mon, 18 Nov 2013 06:39:44 +0000 |
parents | |
children | 9dbf3248a197 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gsm-fw/services/etm/etm_api.c Mon Nov 18 06:39:44 2013 +0000 @@ -0,0 +1,280 @@ +/******************************************************************************** + * 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, 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; +} +