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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  *
  3.  * BRIEF MODULE DESCRIPTION
  4.  * Low level uart routines to directly access a 16550 uart.
  5.  *
  6.  * Copyright 2000,2001 MontaVista Software Inc.
  7.  * Author: MontaVista Software, Inc.
  8.  *          ppopov@mvista.com or source@mvista.com
  9.  *
  10.  *  This program is free software; you can redistribute  it and/or modify it
  11.  *  under  the terms of  the GNU General  Public License as published by the
  12.  *  Free Software Foundation;  either version 2 of the  License, or (at your
  13.  *  option) any later version.
  14.  *
  15.  *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
  16.  *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
  17.  *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
  18.  *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
  19.  *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  20.  *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
  21.  *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
  22.  *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
  23.  *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  24.  *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  25.  *
  26.  *  You should have received a copy of the  GNU General Public License along
  27.  *  with this program; if not, write  to the Free Software Foundation, Inc.,
  28.  *  675 Mass Ave, Cambridge, MA 02139, USA.
  29.  */
  30. #include <linux/types.h>
  31. #define SERIAL_BASE   0xB4011800 /* it8172 */
  32. #define SER_CMD       5
  33. #define SER_DATA      0x00
  34. #define TX_BUSY       0x20
  35. #define TIMEOUT       0xffff
  36. #undef SLOW_DOWN
  37. static const char digits[16] = "0123456789abcdef";
  38. static volatile unsigned char *const com1 = (unsigned char *) SERIAL_BASE;
  39. #ifdef SLOW_DOWN
  40. static inline void slow_down()
  41. {
  42. int k;
  43. for (k = 0; k < 10000; k++);
  44. }
  45. #else
  46. #define slow_down()
  47. #endif
  48. void putch(const unsigned char c)
  49. {
  50. unsigned char ch;
  51. int i = 0;
  52. do {
  53. ch = com1[SER_CMD];
  54. slow_down();
  55. i++;
  56. if (i > TIMEOUT) {
  57. break;
  58. }
  59. } while (0 == (ch & TX_BUSY));
  60. com1[SER_DATA] = c;
  61. }
  62. void puts(unsigned char *cp)
  63. {
  64. unsigned char ch;
  65. int i = 0;
  66. while (*cp) {
  67. do {
  68. ch = com1[SER_CMD];
  69. slow_down();
  70. i++;
  71. if (i > TIMEOUT) {
  72. break;
  73. }
  74. } while (0 == (ch & TX_BUSY));
  75. com1[SER_DATA] = *cp++;
  76. }
  77. putch('r');
  78. putch('n');
  79. }
  80. void fputs(unsigned char *cp)
  81. {
  82. unsigned char ch;
  83. int i = 0;
  84. while (*cp) {
  85. do {
  86. ch = com1[SER_CMD];
  87. slow_down();
  88. i++;
  89. if (i > TIMEOUT) {
  90. break;
  91. }
  92. } while (0 == (ch & TX_BUSY));
  93. com1[SER_DATA] = *cp++;
  94. }
  95. }
  96. void put64(uint64_t ul)
  97. {
  98. int cnt;
  99. unsigned ch;
  100. cnt = 16; /* 16 nibbles in a 64 bit long */
  101. putch('0');
  102. putch('x');
  103. do {
  104. cnt--;
  105. ch = (unsigned char) (ul >> cnt * 4) & 0x0F;
  106. putch(digits[ch]);
  107. } while (cnt > 0);
  108. }
  109. void put32(unsigned u)
  110. {
  111. int cnt;
  112. unsigned ch;
  113. cnt = 8; /* 8 nibbles in a 32 bit long */
  114. putch('0');
  115. putch('x');
  116. do {
  117. cnt--;
  118. ch = (unsigned char) (u >> cnt * 4) & 0x0F;
  119. putch(digits[ch]);
  120. } while (cnt > 0);
  121. }