summaryrefslogtreecommitdiffstats
path: root/cpukit
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>2000-06-12 16:37:04 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>2000-06-12 16:37:04 +0000
commit1bce63758768e6ef94426fd11d63478f2cec1306 (patch)
tree097bfe0af9f13be9fdf467fef3e5c555fb466ff5 /cpukit
parent1f5cb74eb0a87988f28ab1dabade2c35a6527397 (diff)
downloadrtems-1bce63758768e6ef94426fd11d63478f2cec1306.tar.bz2
Added printk as a generic, shared routine.
Diffstat (limited to 'cpukit')
-rw-r--r--cpukit/include/rtems/bspIo.h37
-rw-r--r--cpukit/libcsupport/src/printk.c144
2 files changed, 181 insertions, 0 deletions
diff --git a/cpukit/include/rtems/bspIo.h b/cpukit/include/rtems/bspIo.h
new file mode 100644
index 0000000000..0ff070c4c5
--- /dev/null
+++ b/cpukit/include/rtems/bspIo.h
@@ -0,0 +1,37 @@
+/* bspIo.h
+ *
+ * This include file contains declaration of interface that
+ * will be provided by the file contained in this directory.
+ *
+ *
+ * COPYRIGHT (c) 1998 valette@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$
+ */
+#ifndef _LIBBSP_I386_SHARED_IO_BSP_IO_H
+#define _LIBBSP_I386_SHARED_IO_BSP_IO_H
+
+/*
+ * All the functions declared as extern after this comment
+ * MUST be implemented in each BSP. Using this function,
+ * this directory contains shared code that export higher level
+ * functionnality described after the next command.
+ */
+typedef void (*BSP_output_char_function_type) (char c);
+typedef char (*BSP_polling_getchar_function_type) (void);
+
+extern BSP_output_char_function_type BSP_output_char;
+extern BSP_polling_getchar_function_type BSP_poll_char;
+/*
+ * All the function declared as extern after this comment
+ * are available for each ix86 BSP by compiling and linking
+ * the files contained in this directory PROVIDED definition
+ * and initialisation of the previous variable are done.
+ */
+void printk(char *fmt, ...);
+
+#endif
diff --git a/cpukit/libcsupport/src/printk.c b/cpukit/libcsupport/src/printk.c
new file mode 100644
index 0000000000..253e5f1abc
--- /dev/null
+++ b/cpukit/libcsupport/src/printk.c
@@ -0,0 +1,144 @@
+/*-------------------------------------------------------------------------+
+| printk.c v1.1 - PC386 BSP - 1997/08/07
++--------------------------------------------------------------------------+
+| (C) Copyright 1997 -
+| - NavIST Group - Real-Time Distributed Systems and Industrial Automation
+|
+| http://pandora.ist.utl.pt
+|
+| Instituto Superior Tecnico * Lisboa * PORTUGAL
++--------------------------------------------------------------------------+
+| Disclaimer:
+|
+| This file is provided "AS IS" without warranty of any kind, either
+| expressed or implied.
++--------------------------------------------------------------------------+
+| This code is based on code by: Jose Rufino - IST
+|
+| $Id$
++--------------------------------------------------------------------------*/
+
+
+#include <stdarg.h>
+#include <stdio.h>
+#include <bspIo.h>
+/* #include <libcpu/cpu.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, int maxwidth, int lead)
+{
+ long unsigned int n;
+ int count;
+ char toPrint[20];
+
+ if ( (sign == 1) && ((long)num < 0) ) {
+ BSP_output_char('-');
+ num = -num;
+ maxwidth--;
+ }
+
+ count = 0;
+ while ((n = num / base) > 0) {
+ toPrint[count++] = (num - (n*base));
+ num = n ;
+ }
+ toPrint[count++] = num;
+
+ if (maxwidth) {
+ for (n=maxwidth-count ; n ; n-- )
+ BSP_output_char(lead);
+ }
+
+ 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, width, lead;
+ /* unsigned int level; */
+
+ /* _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;
+ width = 0;
+ lead = ' ';
+ if (*fmt == '%')
+ {
+ fmt++;
+ if (*fmt == '0' ) {
+ lead = '0';
+ fmt++;
+ }
+ while (*fmt >= '0' && *fmt <= '9' ) {
+ width *= 10;
+ width += (*fmt - '0');
+ 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':
+#if defined(_TMS320C3x) || defined(_TMS320C4x)
+ BSP_output_char(va_arg(ap, int));
+#else
+ BSP_output_char(va_arg(ap, char));
+#endif
+ 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, width, lead);
+ }
+ else
+ {
+ BSP_output_char(*fmt);
+ }
+ }
+ va_end(ap); /* clean up when done */
+ /* _CPU_ISR_Enable(level); */
+
+} /* printk */
+