FreeCalypso > hg > ffs-editor
comparison src/cs/services/etm/etm_api.c @ 0:92470e5d0b9e
src: partial import from FC Selenite
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Fri, 15 May 2020 01:28:16 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:92470e5d0b9e |
---|---|
1 /******************************************************************************* | |
2 * Enhanced TestMode (ETM) | |
3 * @file etm_api.c | |
4 * | |
5 * API for ETM SWE. | |
6 * | |
7 * @author Kim T. Peteren (ktp@ti.com) | |
8 * @version 0.1 | |
9 * | |
10 | |
11 * | |
12 * History: | |
13 * | |
14 * Date Modification | |
15 * ------------------------------------ | |
16 * 11/06/2003 Creation | |
17 * | |
18 * (C) Copyright 2003 by Texas Instruments Incorporated, All Rights Reserved | |
19 ******************************************************************************/ | |
20 | |
21 | |
22 #include "etm/etm.h" | |
23 #include "etm/etm_env.h" | |
24 #include "etm/etm_messages_i.h" | |
25 #include "etm/etm_trace.h" | |
26 | |
27 #include "etm/etm_misc.h" | |
28 | |
29 #include "rvf/rvf_api.h" | |
30 | |
31 #include <string.h> | |
32 | |
33 extern T_ETM_ENV_CTRL_BLK *etm_env_ctrl_blk; | |
34 | |
35 | |
36 /******************************************************************************* | |
37 * Registers the SWE to the ETM instance. | |
38 * | |
39 * This is a bridge function. It sends the T_ETM_REGISTRATION_REQ | |
40 * message to the ETM SWE. | |
41 * It is the first function that should be called. | |
42 * | |
43 * @return ETM_NOMEM in case of a memory error, | |
44 * the return value of rvf_send_msg otherwise. | |
45 ******************************************************************************/ | |
46 | |
47 int etm_register(char name[], int mid, int task_id, T_RVF_ADDR_ID addr_id, ETM_CALLBACK_FUNC callback) | |
48 { | |
49 /* Type for a registration event. */ | |
50 T_ETM_REGISTER_REQ *etm_registration_p; | |
51 | |
52 tr_etm(TgTrEtmLow, "ETM API: _register bridge function(%s)", name); | |
53 | |
54 /* Allocate the memory for the message to send */ | |
55 if ((etm_registration_p = (T_ETM_REGISTER_REQ*) etm_malloc(sizeof(T_ETM_REGISTER_REQ))) == NULL) | |
56 return ETM_NOMEM; | |
57 | |
58 /* Fill the message id */ | |
59 etm_registration_p->header.msg_id = ETM_REGISTER_REQ; | |
60 | |
61 /* Fill the address source id */ | |
62 etm_registration_p->header.src_addr_id = rvf_get_taskid(); | |
63 etm_registration_p->header.dest_addr_id = etm_env_ctrl_blk->addr_id; | |
64 etm_registration_p->header.callback_func = NULL; | |
65 | |
66 /* Fill the message parameters */ | |
67 memcpy(etm_registration_p->name, name, strlen(name)); | |
68 etm_registration_p->mid = mid; | |
69 etm_registration_p->task_id = task_id; | |
70 etm_registration_p->addr_id = addr_id; | |
71 etm_registration_p->rx_callback_func = callback; | |
72 | |
73 /* Send the message using mailbox. */ | |
74 return rvf_send_msg(etm_env_ctrl_blk->addr_id, | |
75 (void*) etm_registration_p); | |
76 } | |
77 | |
78 | |
79 /******************************************************************************* | |
80 * Cleans ETM register tables, i.e. set/clean the variable at their initialization | |
81 * state for a specific entity. | |
82 * This function can be used to reinitialize ETM register database without having to | |
83 * start/stop it. | |
84 * | |
85 * This is a bridge function. It sends ETM_UNREGISTER message to ETM. | |
86 * | |
87 * @return ETM_NOMEM in case of a memory error, | |
88 * the return value of rvf_send_msg otherwise. | |
89 ******************************************************************************/ | |
90 | |
91 int etm_unregister(char name[], int mid, int task_id, T_RVF_ADDR_ID addr_id, ETM_CALLBACK_FUNC callback) | |
92 { | |
93 /* Type for a start input event. */ | |
94 T_ETM_UNREGISTER *etm_unregister_p; | |
95 | |
96 tr_etm(TgTrEtmLow, "ETM API: _unregister bridge function"); | |
97 | |
98 /* Allocate the memory for the message to send */ | |
99 if ((etm_unregister_p = (T_ETM_UNREGISTER*) etm_malloc(sizeof(T_ETM_UNREGISTER))) == NULL) | |
100 return ETM_NOMEM; | |
101 | |
102 /* Fill the message id */ | |
103 etm_unregister_p->header.msg_id = ETM_UNREGISTER; | |
104 | |
105 /* Fill the address source id */ | |
106 etm_unregister_p->header.src_addr_id = rvf_get_taskid(); | |
107 etm_unregister_p->header.dest_addr_id = etm_env_ctrl_blk->addr_id; | |
108 etm_unregister_p->header.callback_func = NULL; | |
109 | |
110 /* Fill the message parameters */ | |
111 memcpy(etm_unregister_p->name, name, strlen(name)); | |
112 etm_unregister_p->mid = mid; | |
113 etm_unregister_p->task_id = task_id; | |
114 etm_unregister_p->addr_id = addr_id; | |
115 etm_unregister_p->rx_callback_func = callback; | |
116 | |
117 /* Send the message using mailbox. */ | |
118 return rvf_send_msg(etm_env_ctrl_blk->addr_id, | |
119 (void*) etm_unregister_p); | |
120 } | |
121 | |
122 | |
123 /******************************************************************************* | |
124 * Get data from a ETM packet structur. Get either 8, 16 or 32 value | |
125 * Used to unpack data | |
126 * | |
127 * This is helpers | |
128 * | |
129 * @return the return value of the point of the ETM packet. | |
130 ******************************************************************************/ | |
131 | |
132 int etm_get8(void *buf) | |
133 { | |
134 unsigned char *p = buf; | |
135 | |
136 int value = *p; | |
137 | |
138 tr_etm(TgTrEtmLow, "ETM API: _get8(%d)", value); | |
139 | |
140 return value; | |
141 } | |
142 | |
143 int etm_get16(void *buf) | |
144 { | |
145 unsigned char *p = buf; | |
146 | |
147 int value = | |
148 (*p++ | (*p << 8)); | |
149 | |
150 tr_etm(TgTrEtmLow, "ETM API: _get16(%d)", value); | |
151 | |
152 return value; | |
153 } | |
154 | |
155 int etm_get32(void *buf) | |
156 { | |
157 unsigned char *p = buf; | |
158 int value = 0; | |
159 | |
160 value = *p; | |
161 p++; | |
162 value |= (*p << 8); | |
163 p++; | |
164 value |= (*p << 16); | |
165 p++; | |
166 value |= (*p << 24); | |
167 | |
168 tr_etm(TgTrEtmLow, "ETM API: _get32(%d)", value); | |
169 | |
170 return value; | |
171 } | |
172 | |
173 | |
174 /******************************************************************************* | |
175 * Put data into a ETM packet structur. Put either 8, 16 or 32 value | |
176 * Used to pack data | |
177 * | |
178 * This is helpers | |
179 * | |
180 * @return Return ETM_PACKET of ETM_OK. | |
181 ******************************************************************************/ | |
182 | |
183 #define max_ul_data_size 240 | |
184 | |
185 int etm_pkt_put8(T_ETM_PKT *pkt, int value) | |
186 { | |
187 tr_etm(TgTrEtmLow, "ETM API: _pkt_put8(*, %d)", value); | |
188 | |
189 if (pkt->index + 1 > max_ul_data_size) | |
190 return ETM_PACKET; | |
191 | |
192 pkt->data[pkt->index] = value; | |
193 pkt->index += 1; | |
194 | |
195 pkt->size += 1; | |
196 | |
197 return ETM_OK; | |
198 } | |
199 | |
200 int etm_pkt_put16(T_ETM_PKT *pkt, int value) | |
201 { | |
202 tr_etm(TgTrEtmLow, "ETM API: _pkt_put16(*, %d)", value); | |
203 | |
204 if (pkt->index + 2 > max_ul_data_size) | |
205 return ETM_PACKET; | |
206 | |
207 memcpy(&pkt->data[pkt->index], &value, 2); | |
208 pkt->index += 2; | |
209 | |
210 pkt->size += 2; | |
211 | |
212 return ETM_OK; | |
213 } | |
214 | |
215 int etm_pkt_put32(T_ETM_PKT *pkt, int value) | |
216 { | |
217 tr_etm(TgTrEtmLow, "ETM API: _pkt_put32(*, %d)", value); | |
218 | |
219 if (pkt->index + 4 > max_ul_data_size) | |
220 return ETM_PACKET; | |
221 | |
222 memcpy(&pkt->data[pkt->index], &value, 4); | |
223 pkt->index += 4; | |
224 | |
225 pkt->size += 4; | |
226 | |
227 return ETM_OK; | |
228 } | |
229 | |
230 int etm_pkt_putdata(T_ETM_PKT *pkt, const void *buf, int size) | |
231 { | |
232 tr_etm(TgTrEtmLow, "ETM API: _pkt_putdata(*, %d)", size); | |
233 | |
234 if (pkt->index + size > max_ul_data_size) | |
235 return ETM_PACKET; | |
236 memcpy(&pkt->data[pkt->index], buf, size); | |
237 pkt->index += size; | |
238 | |
239 pkt->size += size; | |
240 | |
241 return ETM_OK; | |
242 } | |
243 | |
244 | |
245 /******************************************************************************* | |
246 * This function is used to send an ETM Packet to the PC | |
247 * | |
248 * This is helpers | |
249 * | |
250 * @return Return value of rvf_send_trace_cpy. | |
251 ******************************************************************************/ | |
252 | |
253 int etm_pkt_send(T_ETM_PKT *pkt) | |
254 { | |
255 extern unsigned char etm_trace_user_id; | |
256 uint8 *buf, cksum = 0; | |
257 uint16 sendsize, size; | |
258 int error = ETM_OK; | |
259 | |
260 buf = (uint8 *) &pkt->mid; | |
261 sendsize = size = pkt->size + 2; //one for mid, one for status | |
262 | |
263 tr_etm(TgTrEtmLow, "ETM API: _pkt_send: size(%d)", sendsize); | |
264 | |
265 while (size-- ) { | |
266 cksum ^= *buf++; | |
267 } | |
268 *buf = cksum; | |
269 | |
270 sendsize += 1; // one for checksum | |
271 | |
272 tr_etm_hexdump(TgTrEtmLow, &pkt->mid, sendsize); | |
273 | |
274 error = rvt_send_trace_cpy((uint8 *) &pkt->mid, etm_trace_user_id, | |
275 sendsize, RVT_BINARY_FORMAT); | |
276 if(error < 0) | |
277 tr_etm(TgTrFatal, "ETM API: _pkt_send: ERROR(%d)", error); | |
278 | |
279 return error; | |
280 } | |
281 |