FreeCalypso > hg > freecalypso-sw
comparison gsm-fw/services/etm/etm_trace.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 | 13af69b6a3dc |
comparison
equal
deleted
inserted
replaced
163:5e0e41cd7c9f | 164:d78219c43fbf |
---|---|
1 /******************************************************************************** | |
2 * Enhanced TestMode (ETM) | |
3 * @file etm_trace.c | |
4 * | |
5 * @author Kim T. Peteren (ktp@ti.com) and Mads Meisner-Jensen, mmj@ti.com | |
6 * @version 0.1 | |
7 * | |
8 | |
9 * | |
10 * History: | |
11 * | |
12 * Date Modification | |
13 * ------------------------------------ | |
14 * 16/06/2003 Creation | |
15 * | |
16 * (C) Copyright 2003 by Texas Instruments Incorporated, All Rights Reserved | |
17 *********************************************************************************/ | |
18 | |
19 | |
20 #include "etm/etm_trace.h" | |
21 #include "etm/etm_env.h" | |
22 | |
23 #include "rvf/rvf_api.h" | |
24 #include "rvm/rvm_use_id_list.h" | |
25 | |
26 #include <string.h> | |
27 #include <stdio.h> | |
28 #include <stdarg.h> | |
29 | |
30 | |
31 /****************************************************************************** | |
32 * Prototypes | |
33 *****************************************************************************/ | |
34 | |
35 void trstr(unsigned int mask, char *string); | |
36 | |
37 | |
38 /****************************************************************************** | |
39 * Target Tracing | |
40 *****************************************************************************/ | |
41 | |
42 static unsigned int ttr_mask = TgTrFatal; //TgTrFatal; //TgTrAll; | |
43 | |
44 void tr_etm_init(unsigned int mask) | |
45 { | |
46 ttr_mask = mask; | |
47 } | |
48 | |
49 | |
50 void tr_etm(unsigned int mask, char *format, ...) | |
51 { | |
52 va_list args; | |
53 static char buf[256]; | |
54 | |
55 if (ttr_mask & mask) { | |
56 // build string ala tr() then call str() | |
57 va_start(args, format); | |
58 vsprintf(buf, format, args); | |
59 trstr(mask, buf); | |
60 va_end(args); | |
61 } | |
62 } | |
63 | |
64 | |
65 void trstr(unsigned int mask, char *string) | |
66 { | |
67 if (ttr_mask & mask) { | |
68 rvf_send_trace(string, strlen(string), NULL_PARAM, | |
69 RV_TRACE_LEVEL_WARNING, ETM_USE_ID); | |
70 rvf_delay(10); | |
71 } | |
72 } | |
73 | |
74 | |
75 void tr_etm_hexdump(unsigned int mask, const void *p, int size) | |
76 { | |
77 unsigned int type, module; | |
78 | |
79 if (!(ttr_mask & mask)) | |
80 return; | |
81 | |
82 hexdump_buf((char*) p, size); | |
83 } | |
84 | |
85 | |
86 /****************************************************************************** | |
87 * Hexdumping Functions | |
88 *****************************************************************************/ | |
89 | |
90 void etm_trace(char *string, int level) | |
91 { | |
92 rvf_send_trace(string, strlen(string), NULL_PARAM, level, ETM_USE_ID); | |
93 rvf_delay(20); | |
94 } | |
95 | |
96 | |
97 int sprint_int_as_hex(char *buf, unsigned int n, int width, char padding) | |
98 { | |
99 unsigned int m = n; // MUST be unsigned because it will be right shifted | |
100 int size = 0; | |
101 int i; | |
102 char digit; | |
103 char *buf_start = buf; | |
104 | |
105 // Count number of digits in <n> | |
106 do { | |
107 size++; | |
108 } while (m >>= 4); | |
109 | |
110 // Shift significant part of <n> into the top-most bits | |
111 n <<= 4 * (8 - size); | |
112 | |
113 // Pad output buffer with <padding> | |
114 if (0 < width && width <= 8) { | |
115 width = (width > size ? width - size : 0); | |
116 while (width--) | |
117 *buf++ = padding; | |
118 } | |
119 | |
120 // Convert <n>, outputting the hex digits | |
121 for (i = 0; i < size; i++) { | |
122 digit = (n >> 28) & 0xF; | |
123 digit += (digit < 10 ? '0' : 'A' - 10); | |
124 *buf++ = digit; | |
125 n <<= 4; | |
126 } | |
127 | |
128 // Null terminate | |
129 *buf = 0; | |
130 | |
131 return buf - buf_start; | |
132 } | |
133 | |
134 int printf_int_as_hex(unsigned int n, int width, char padding) | |
135 { | |
136 char string[8+1]; | |
137 int length; | |
138 | |
139 length = sprint_int_as_hex(string, n, width, padding); | |
140 etm_trace(string, RV_TRACE_LEVEL_DEBUG_LOW); | |
141 | |
142 return length; | |
143 } | |
144 | |
145 | |
146 int print_int_as_hex(unsigned int n) | |
147 { | |
148 return printf_int_as_hex(n, 0, 0); | |
149 } | |
150 | |
151 | |
152 void hexdump_buf(char *buf, int size) | |
153 { | |
154 int n, i, multiline; | |
155 char string[(8+1) + (16+1) + (3*16) + 1]; | |
156 char *s; | |
157 | |
158 multiline = (size > 16); | |
159 | |
160 while (size > 0) | |
161 { | |
162 s = string; | |
163 n = (size > 16 ? 16 : size); | |
164 | |
165 // Print address | |
166 if (multiline) { | |
167 s += sprint_int_as_hex(s, (unsigned int) buf, 8, ' '); | |
168 *s++ = ' '; | |
169 } | |
170 | |
171 // Print the textual representation | |
172 for (i = 0; i < n; i++) | |
173 *s++ = (buf[i] >= ' ' && buf[i] < 127 ? buf[i] : '.'); | |
174 | |
175 // Pad textual representation with spaces | |
176 if (multiline) | |
177 for (i = 0; i < 16 - n; i++) | |
178 *s++ = ' '; | |
179 | |
180 // Print hexedecimal bytes | |
181 for (i = 0; i < n; i++) { | |
182 *s++ = ' '; | |
183 s += sprint_int_as_hex(s, (unsigned int) buf[i] & 0xFF, 2, '0'); | |
184 } | |
185 | |
186 *s = 0; | |
187 | |
188 etm_trace(string, RV_TRACE_LEVEL_DEBUG_LOW); | |
189 | |
190 buf += 16; | |
191 size -= 16; | |
192 } | |
193 } |