print.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:2k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * print.c: Simple print fascility
  3.  *
  4.  * Copyright (C) 1998 Gleb Raiko & Vladimir Roganov
  5.  */
  6. #include <stdarg.h>
  7. #include <linux/kernel.h>
  8. #include <linux/init.h>
  9. #include <asm/baget/baget.h>
  10. /*
  11.  *  Define this to see 'baget_printk' (debug) messages
  12.  */
  13. // #define BAGET_PRINTK
  14. /* 
  15.  *  This function is same for BALO and Linux baget_printk,
  16.  *  and normally prints characted to second (UART A) console.
  17.  */
  18. static void delay(void) {}
  19. static void outc_low(char c)
  20. {
  21.         int i;
  22.         vac_outb(c, VAC_UART_B_TX);
  23.         for (i=0; i<10000; i++) 
  24.                 delay();
  25. }
  26. void outc(char c)
  27. {
  28.         if (c == 'n')
  29.                 outc_low('r');
  30.         outc_low(c);
  31. }
  32. void outs(char *s) 
  33. {
  34.         while(*s) outc(*s++);
  35. }
  36. void baget_write(char *s, int l)
  37. {
  38.         while(l--)
  39.                 outc(*s++);
  40. }
  41. int baget_printk(const char *fmt, ...)
  42. {
  43. #ifdef BAGET_PRINTK
  44.         va_list args;
  45.         int i;
  46.         static char buf[1024];
  47.         va_start(args, fmt);
  48.         i = vsprintf(buf, fmt, args); /* hopefully i < sizeof(buf)-4 */
  49.         va_end(args);
  50.         baget_write(buf, i);
  51.         return i;
  52. #else
  53. return 0;
  54. #endif
  55. }
  56. static __inline__ void puthex( int a )
  57. {
  58.         static char s[9];
  59.         static char e[] = "0123456789ABCDEF";
  60.         int i;
  61.         for( i = 7; i >= 0; i--, a >>= 4 ) s[i] = e[a & 0x0F];
  62.         s[8] = '';
  63.         outs( s );
  64. }
  65. void __init balo_printf( char *f, ... )
  66. {
  67.         int *arg = (int*)&f + 1;
  68.         char c; 
  69.         int format = 0;
  70.         while((c = *f++) != 0) {
  71.                 switch(c) {
  72.                 default:
  73.                         if(format) {
  74.                                 outc('%');
  75.                                 format = 0;
  76.                         }
  77.                         outc( c );
  78.                         break;
  79.                 case '%':
  80.                         if( format ){
  81.                                 format = 0;
  82.                                 outc(c);
  83.                         } else format = 1;
  84.                         break;
  85.                 case 'x':
  86.                         if(format) puthex( *arg++ );
  87.                         else outc(c);
  88.                         format = 0;
  89.                         break;
  90.                 case 's':
  91.                         if( format ) outs((char *)*arg++);
  92.                         else outc(c);
  93.                         format = 0;
  94.                         break;
  95.                 }
  96.         }
  97. }
  98. void __init balo_hungup(void)
  99.         outs("Hunging up.n");
  100.         while(1); 
  101. }