puts.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  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. }