summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/arm/shared/io/printk.c
diff options
context:
space:
mode:
Diffstat (limited to 'c/src/lib/libbsp/arm/shared/io/printk.c')
-rw-r--r--c/src/lib/libbsp/arm/shared/io/printk.c113
1 files changed, 113 insertions, 0 deletions
diff --git a/c/src/lib/libbsp/arm/shared/io/printk.c b/c/src/lib/libbsp/arm/shared/io/printk.c
new file mode 100644
index 0000000000..d53699a3de
--- /dev/null
+++ b/c/src/lib/libbsp/arm/shared/io/printk.c
@@ -0,0 +1,113 @@
+/*-------------------------------------------------------------------------+
+| printk.c - ARM BSP
++--------------------------------------------------------------------------+
+|
+| COPYRIGHT (c) 2000 Canon Research France SA.
+| Emmanuel Raguet, mailto:raguet@crf.canon.fr
+|
+| The license and distribution terms for this file may be
+| found in found in the file LICENSE in this distribution or at
+| http://www.OARcorp.com/rtems/license.html.
+|
+| $Id$
++--------------------------------------------------------------------------*/
+
+
+#include <stdarg.h>
+#include <stdio.h>
+#include <bspio.h>
+
+/*-------------------------------------------------------------------------+
+| Function: printNum
+| Description: print number in a given base.
+| Global Variables: None.
+| Arguments: num - number to print, base - base used to print the number.
+| Returns: Nothing.
++--------------------------------------------------------------------------*/
+static void
+printNum(long unsigned int num, int base, int sign)
+{
+ long unsigned int n;
+ int count;
+ char toPrint[20];
+
+ if ( (sign == 1) && ((long)num < 0) ) {
+ BSP_output_char('-');
+ num = -num;
+ }
+
+ count = 0;
+ while ((n = num / base) > 0) {
+ toPrint[count++] = (num - (n*base));
+ num = n ;
+ }
+ toPrint[count++] = num;
+
+ for (n = 0; n < count; n++){
+ BSP_output_char("0123456789ABCDEF"[(int)(toPrint[count-(n+1)])]);
+ }
+} /* printNum */
+
+
+/*-------------------------------------------------------------------------+
+| Function: printk
+| Description: a simplified version of printf intended for use when the
+ console is not yet initialized or in ISR's.
+| Global Variables: None.
+| Arguments: as in printf: fmt - format string, ... - unnamed arguments.
+| Returns: Nothing.
++--------------------------------------------------------------------------*/
+void
+printk(char *fmt, ...)
+{
+ va_list ap; /* points to each unnamed argument in turn */
+ char c, *str;
+ int lflag, base, sign;
+
+ _CPU_ISR_Disable(level);
+
+ va_start(ap, fmt); /* make ap point to 1st unnamed arg */
+ for (; *fmt != '\0'; fmt++)
+ {
+ lflag = 0;
+ base = 0;
+ sign = 0;
+ if (*fmt == '%')
+ {
+ if ((c = *++fmt) == 'l')
+ {
+ lflag = 1;
+ c = *++fmt;
+ }
+ switch (c)
+ {
+ case 'o': case 'O': base = 8; sign = 0; break;
+ case 'd': case 'D': base = 10; sign = 1; break;
+ case 'u': case 'U': base = 10; sign = 0; break;
+ case 'x': case 'X': base = 16; sign = 0; break;
+ case 's':
+ for (str = va_arg(ap, char *); *str; str++)
+ BSP_output_char(*str);
+ break;
+ case 'c':
+ BSP_output_char(va_arg(ap, char));
+ break;
+ default:
+ BSP_output_char(c);
+ break;
+ } /* switch*/
+
+ if (base)
+ printNum(lflag ? va_arg(ap, long int) : (long int)va_arg(ap, int),
+ base, sign);
+ }
+ else
+ {
+ BSP_output_char(*fmt);
+ }
+ }
+ va_end(ap); /* clean up when done */
+ _CPU_ISR_Enable(level);
+
+} /* printk */
+