Sapphire SoC DS Sapphire SoC UG Sapphire HP SoC DS Sapphire HP SoC UG RISC-V Embedded IDE UG Board Support Package
Loading...
Searching...
No Matches
print.h
Go to the documentation of this file.
1
2// Copyright (C) 2013-2023 Efinix Inc. All rights reserved.
3//
4// This document contains proprietary information which is
5// protected by copyright. All rights are reserved. This notice
6// refers to original work by Efinix, Inc. which may be derivitive
7// of other work distributed under license of the authors. In the
8// case of derivative work, nothing in this notice overrides the
9// original author's license agreement. Where applicable, the
10// original license agreement is included in it's original
11// unmodified form immediately below this header.
12//
13// WARRANTY DISCLAIMER.
14// THE DESIGN, CODE, OR INFORMATION ARE PROVIDED “AS IS” AND
15// EFINIX MAKES NO WARRANTIES, EXPRESS OR IMPLIED WITH
16// RESPECT THERETO, AND EXPRESSLY DISCLAIMS ANY IMPLIED WARRANTIES,
17// INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
18// MERCHANTABILITY, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR
19// PURPOSE. SOME STATES DO NOT ALLOW EXCLUSIONS OF AN IMPLIED
20// WARRANTY, SO THIS DISCLAIMER MAY NOT APPLY TO LICENSEE.
21//
22// LIMITATION OF LIABILITY.
23// NOTWITHSTANDING ANYTHING TO THE CONTRARY, EXCEPT FOR BODILY
24// INJURY, EFINIX SHALL NOT BE LIABLE WITH RESPECT TO ANY SUBJECT
25// MATTER OF THIS AGREEMENT UNDER TORT, CONTRACT, STRICT LIABILITY
26// OR ANY OTHER LEGAL OR EQUITABLE THEORY (I) FOR ANY INDIRECT,
27// SPECIAL, INCIDENTAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES OF ANY
28// CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF
29// GOODWILL, DATA OR PROFIT, WORK STOPPAGE, OR COMPUTER FAILURE OR
30// MALFUNCTION, OR IN ANY EVENT (II) FOR ANY AMOUNT IN EXCESS, IN
31// THE AGGREGATE, OF THE FEE PAID BY LICENSEE TO EFINIX HEREUNDER
32// (OR, IF THE FEE HAS BEEN WAIVED, $100), EVEN IF EFINIX SHALL HAVE
33// BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO
34// NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR
35// CONSEQUENTIAL DAMAGES, SO THIS LIMITATION AND EXCLUSION MAY NOT
36// APPLY TO LICENSEE.
37//
39#ifndef _PRINT_H_
40#define _PRINT_H_
41
42#include <stdarg.h>
43#include <stdlib.h>
44#include <stdint.h>
45#include <math.h>
46#include <string.h>
47#include "bsp.h"
48
49
50#if (ENABLE_BSP_PRINTF)
51 static void _putchar(char character){
52 #if (ENABLE_SEMIHOSTING_PRINT == 1)
53 sh_writec(character);
54 #else
55 bsp_putChar(character);
56 #endif // (ENABLE_SEMIHOSTING_PRINT == 1)
57 }
58
59 static void _putchar_s(char *p)
60 {
61 #if (ENABLE_SEMIHOSTING_PRINT == 1)
62 sh_write0(p);
63 #else
64 while (*p)
65 _putchar(*(p++));
66 #endif // (ENABLE_SEMIHOSTING_PRINT == 1)
67 }
68
69 static void bsp_printHex(uint32_t val)
70 {
71 uint32_t digits;
72 digits =8;
73
74 for (int i = (4*digits)-4; i >= 0; i -= 4) {
75 _putchar("0123456789ABCDEF"[(val >> i) % 16]);
76 }
77 }
78
79 static void bsp_printHex_lower(uint32_t val)
80 {
81 uint32_t digits;
82 digits =8;
83
84 for (int i = (4*digits)-4; i >= 0; i -= 4) {
85 _putchar("0123456789abcdef"[(val >> i) % 16]);
86
87 }
88 }
89
90 #if (ENABLE_FLOATING_POINT_SUPPORT)
91 /* reverse: reverse string s in place */
92 static void reverse(char s[])
93 {
94 int i, j, len;
95 char c;
96
97 for (i = 0, j = strlen(s)-1; i<j; i++, j--) {
98 c = s[i];
99 s[i] = s[j];
100 s[j] = c;
101 }
102 }
103
104 /* itos: convert integer n to characters in s */
105 static void itos(int n, char s[])
106 {
107 int i, sign;
108
109 if ((sign = n) < 0) /* record sign */
110 n = -n; /* make n positive */
111 i = 0;
112 do { /* generate digits in reverse order */
113 s[i++] = n % 10 + '0'; /* get next digit */
114 } while ((n /= 10) > 0); /* delete it */
115 if (sign < 0)
116 s[i++] = '-';
117 s[i] = '\0';
118 reverse(s);
119 }
120
121 // Converts a floating-point/double number to a string.
122 static void ftoa(double n, char* res1, char* res2)
123 {
124 float fpart_f;
125 int afterpoint=4;
126
127 // Extract integer part
128 int ipart = (int)n;
129
130 // Extract floating part
131 double fpart = n - (double)ipart;
132
133 // convert integer part to string
134 itos(n, res1);
135
136 // add dot
137 *res2 = '.';
138 res2++;
139
140 // convert fraction part to string
141 fpart_f = (float)fpart * pow(10, afterpoint);
142 if (fpart_f<0)
143 {
144 *res2 = '-';
145 res2++;
146 fpart_f = -(fpart_f);
147 }
148 // handling of 0 after decimal point e.g. 1.003
149 for (int i=afterpoint; i>0; i--)
150 {
151 if ((fpart_f<(1 * pow(10, i-1))) && (fpart_f>0))
152 {
153 *res2='0';
154 res2++;
155 }
156 }
157
158 itos((int)fpart_f, res2);
159 }
160
161 static void print_dec(uint32_t val)
162 {
163 char sval[10];
164 itos(val, sval);
165 _putchar_s(sval);
166
167 }
168 static void print_float(double val)
169 {
170 int i, j, neg;
171 neg=0;
172 i=2;
173 j=19;
174 char sval[21], fval[10];
175 ftoa(val, sval, fval);
176 if (fval[1] == '-')
177 {
178 neg = 1;
179 while (i<10)
180 {
181 fval[i-1] = fval[i];
182 i++;
183 }
184
185 }
186 strcat(sval, fval);
187 if ((sval[0] != '-') && (neg == 1))
188 {
189 while (j>=0)
190 {
191 sval[j+1] = sval[j];
192 j--;
193 }
194 sval[0] = '-';
195 }
196 _putchar_s(sval);
197 }
198
199 #endif //#if (ENABLE_FLOATING_POINT_SUPPORT)
200
201
202
203 static void bsp_printf_c(int c)
204 {
205 _putchar(c);
206 }
207
208 static void bsp_printf_s(char *p)
209 {
210 _putchar_s(p);
211 }
212
213
214
215 static void bsp_printf_d(int val)
216 {
217 char buffer[32];
218 char *p = buffer;
219 if (val < 0) {
220 bsp_printf_c('-');
221 val = -val;
222 }
223 while (val || p == buffer) {
224 *(p++) = '0' + val % 10;
225 val = val / 10;
226 }
227 while (p != buffer)
228 bsp_printf_c(*(--p));
229 }
230
231 static void bsp_printf_x(int val)
232 {
233 int i,digi=2;
234
235 for(i=0;i<8;i++)
236 {
237 if((val & (0xFFFFFFF0 <<(4*i))) == 0)
238 {
239 digi=i+1;
240 break;
241 }
242 }
243 bsp_printHex_lower(val);
244 }
245
246 static void bsp_printf_X(int val)
247 {
248 int i,digi=2;
249
250 for(i=0;i<8;i++)
251 {
252 if((val & (0xFFFFFFF0 <<(4*i))) == 0)
253 {
254 digi=i+1;
255 break;
256 }
257 }
258 bsp_printHex(val);
259 }
260#if (ENABLE_SEMIHOSTING_PRINT == 0)
261 static int bsp_printf(const char *format, ...)
262 {
263 int i;
264 va_list ap;
265
266 va_start(ap, format);
267
268 for (i = 0; format[i]; i++){
269 if (format[i] == '\n') {
270 bsp_printf_c('\r'); // Carriage Return (move to start of line)
271 bsp_printf_c('\n'); // Line Feed (move down)
272 continue;
273 }
274 if (format[i] == '%') {
275 while (format[++i]) {
276 if (format[i] == 'c') {
277 bsp_printf_c(va_arg(ap,int));
278 break;
279 }
280 else if (format[i] == 's') {
281 bsp_printf_s(va_arg(ap,char*));
282 break;
283 }
284 else if (format[i] == 'd') {
285 bsp_printf_d(va_arg(ap,int));
286 break;
287 }
288 else if (format[i] == 'X') {
289 bsp_printf_X(va_arg(ap,int));
290 break;
291 }
292 else if (format[i] == 'x') {
293 bsp_printf_x(va_arg(ap,int));
294 break;
295 }
296#if (ENABLE_FLOATING_POINT_SUPPORT)
297 else if (format[i] == 'f') {
298 print_float(va_arg(ap,double));
299 break;
300 }
301#elif (ENABLE_PRINTF_WARNING)
302 else if (format[i] == 'f') {
303 bsp_printf_s("<Floating point printing not enable. Please Enable it at bsp.h first...>");
304 break;
305 }
306#endif //#if (ENABLE_FLOATING_POINT_SUPPORT)
307 }
308 } else
309 bsp_printf_c(format[i]);
310 }
311 va_end(ap);
312 }
313
314#else // #if (ENABLE_SEMIHOSTING_PRINT == 1)
315 #include "print_full.h"
316 static int bsp_printf(const char* format, ...)
317 {
318 va_list va;
319 va_start(va, format);
320
321 char buffer[MAX_STRING_BUFFER_SIZE];
322 const int ret = _vsnprintf(_out_buffer, buffer, (size_t)-1, format, va);
323 _putchar_s(buffer);
324
325 va_end(va);
326 return ret;
327 }
328
329
330#endif // #if (ENABLE_SEMIHOSTING_PRINT == 0)
331#endif //#if (ENABLE_BSP_PRINTF)
332#endif //_PRINT_H_
#define bsp_putChar(c)
Definition bsp.h:42