void printk(const char *fmt, ...) { va_list va; va_start(va, fmt); while (*fmt) { if (*fmt != '%') { putk(*fmt); if (*fmt == '\n') putk('\r'); fmt++; } else { fmt++; if (*fmt == '%') { putk(*fmt); fmt++; } else if (*fmt == 'd') { printdec(va_arg(va, int)); fmt++; } else if (*fmt == 'x') { printhexL(va_arg(va, int)); fmt++; } else if (*fmt == 'X') { printhexU(va_arg(va, int)); fmt++; } else if (*fmt == 's') { printk(va_arg(va, const char *)); fmt++; } else if (*fmt == 'b') { int size = 0; fmt++; if (*fmt == 'b') size = 8; else if (*fmt == 'w') size = 16; else if (*fmt == 'd') size = 32; else { fmt -= 2; size = 32; } fmt++; printbinary(va_arg(va, int), size); } } } va_end(va); }
/* Kernel printf requires a putk() function. */ void putk(int c) { char ch = c; if (c == 0) return; if (c == '\n') putk('\r'); (void) write(2, &ch, 1); }
rtems_task Init( rtems_task_argument argument ) { TEST_BEGIN(); do_putk(); putk(""); do_printk(); putk(""); do_getchark(); TEST_END(); rtems_test_exit( 0 ); }
void do_getchark(void) { int sc; BSP_polling_getchar_function_type poll_char; poll_char = BSP_poll_char; BSP_poll_char = NULL; putk( "getchark - NULL getchar method - return -1" ); sc = getchark(); rtems_test_assert( sc == -1 ); putk( "getchark - test getchar method - returns 0x35" ); BSP_poll_char = test_getchar; sc = getchark(); rtems_test_assert( sc == 0x35 ); BSP_poll_char = poll_char; }
static inline void printhexL(u32 val) { static const char *hexn = "0123456789abcdef"; int i = 32; int k = 7; while (i >= 4) { char c = hexn[(val >> (k * 4)) & 0xF]; putk(c); k--; i -= 4; } }
static inline void printdec(u32 val) { u32 chr[DECIMAL_MAX]; memclr(chr, DECIMAL_MAX * sizeof(u32)); int i = 0; do { chr[i] = 0x30 + (val % 10); val /= 10; i++; } while ((val != 0) && (i < DECIMAL_MAX)); i--; while (i >= 0) { putk(chr[i]); i--; } }
void do_putk(void) { putk( "This is a test of putk" ); }