start_8xx.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:4k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * BK Id: SCCS/s.start_8xx.c 1.10 09/14/01 18:01:17 trini
  3.  */
  4. /*
  5.  * Copyright (C) 1996 Paul Mackerras.
  6.  * Copyright (C) 2000 Dan Malek.
  7.  * Quick hack of Paul's code to make XMON work on 8xx processors.  Lots
  8.  * of assumptions, like the SMC1 is used, it has been initialized by the
  9.  * loader at some point, and we can just stuff and suck bytes.
  10.  * We rely upon the 8xx uart driver to support us, as the interface
  11.  * changes between boot up and operational phases of the kernel.
  12.  */
  13. #include <linux/string.h>
  14. #include <asm/machdep.h>
  15. #include <asm/io.h>
  16. #include <asm/page.h>
  17. #include <linux/kernel.h>
  18. #include <asm/processor.h>
  19. #include <asm/8xx_immap.h>
  20. #include <asm/mpc8xx.h>
  21. #include <asm/commproc.h>
  22. extern void xmon_printf(const char *fmt, ...);
  23. extern int xmon_8xx_write(char *str, int nb);
  24. extern int xmon_8xx_read_poll(void);
  25. extern int xmon_8xx_read_char(void);
  26. void prom_drawhex(uint);
  27. void prom_drawstring(const char *str);
  28. static int use_screen = 1; /* default */
  29. #define TB_SPEED 25000000
  30. static inline unsigned int readtb(void)
  31. {
  32. unsigned int ret;
  33. asm volatile("mftb %0" : "=r" (ret) :);
  34. return ret;
  35. }
  36. void buf_access(void)
  37. {
  38. }
  39. void
  40. xmon_map_scc(void)
  41. {
  42. cpmp = (cpm8xx_t *)&(((immap_t *)IMAP_ADDR)->im_cpm);
  43. use_screen = 0;
  44. prom_drawstring("xmon uses serial portn");
  45. }
  46. static int scc_initialized = 0;
  47. void xmon_init_scc(void);
  48. int
  49. xmon_write(void *handle, void *ptr, int nb)
  50. {
  51. char *p = ptr;
  52. int i, c, ct;
  53. if (!scc_initialized)
  54. xmon_init_scc();
  55. return(xmon_8xx_write(ptr, nb));
  56. }
  57. int xmon_wants_key;
  58. int
  59. xmon_read(void *handle, void *ptr, int nb)
  60. {
  61. char *p = ptr;
  62. int i;
  63. if (!scc_initialized)
  64. xmon_init_scc();
  65. for (i = 0; i < nb; ++i) {
  66. *p++ = xmon_8xx_read_char();
  67. }
  68. return i;
  69. }
  70. int
  71. xmon_read_poll(void)
  72. {
  73. return(xmon_8xx_read_poll());
  74. }
  75. void
  76. xmon_init_scc()
  77. {
  78. scc_initialized = 1;
  79. }
  80. #if 0
  81. extern int (*prom_entry)(void *);
  82. int
  83. xmon_exit(void)
  84. {
  85.     struct prom_args {
  86. char *service;
  87.     } args;
  88.     for (;;) {
  89. args.service = "exit";
  90. (*prom_entry)(&args);
  91.     }
  92. }
  93. #endif
  94. void *xmon_stdin;
  95. void *xmon_stdout;
  96. void *xmon_stderr;
  97. void
  98. xmon_init(void)
  99. {
  100. }
  101. int
  102. xmon_putc(int c, void *f)
  103. {
  104.     char ch = c;
  105.     if (c == 'n')
  106. xmon_putc('r', f);
  107.     return xmon_write(f, &ch, 1) == 1? c: -1;
  108. }
  109. int
  110. xmon_putchar(int c)
  111. {
  112.     return xmon_putc(c, xmon_stdout);
  113. }
  114. int
  115. xmon_fputs(char *str, void *f)
  116. {
  117.     int n = strlen(str);
  118.     return xmon_write(f, str, n) == n? 0: -1;
  119. }
  120. int
  121. xmon_readchar(void)
  122. {
  123.     char ch;
  124.     for (;;) {
  125. switch (xmon_read(xmon_stdin, &ch, 1)) {
  126. case 1:
  127.     return ch;
  128. case -1:
  129.     xmon_printf("read(stdin) returned -1rn", 0, 0);
  130.     return -1;
  131. }
  132.     }
  133. }
  134. static char line[256];
  135. static char *lineptr;
  136. static int lineleft;
  137. #if 0
  138. int xmon_expect(const char *str, unsigned int timeout)
  139. {
  140. int c;
  141. unsigned int t0;
  142. timeout *= TB_SPEED;
  143. t0 = readtb();
  144. do {
  145. lineptr = line;
  146. for (;;) {
  147. c = xmon_read_poll();
  148. if (c == -1) {
  149. if (readtb() - t0 > timeout)
  150. return 0;
  151. continue;
  152. }
  153. if (c == 'n')
  154. break;
  155. if (c != 'r' && lineptr < &line[sizeof(line) - 1])
  156. *lineptr++ = c;
  157. }
  158. *lineptr = 0;
  159. } while (strstr(line, str) == NULL);
  160. return 1;
  161. }
  162. #endif
  163. int
  164. xmon_getchar(void)
  165. {
  166.     int c;
  167.     if (lineleft == 0) {
  168. lineptr = line;
  169. for (;;) {
  170.     c = xmon_readchar();
  171.     if (c == -1 || c == 4)
  172. break;
  173.     if (c == 'r' || c == 'n') {
  174. *lineptr++ = 'n';
  175. xmon_putchar('n');
  176. break;
  177.     }
  178.     switch (c) {
  179.     case 0177:
  180.     case 'b':
  181. if (lineptr > line) {
  182.     xmon_putchar('b');
  183.     xmon_putchar(' ');
  184.     xmon_putchar('b');
  185.     --lineptr;
  186. }
  187. break;
  188.     case 'U' & 0x1F:
  189. while (lineptr > line) {
  190.     xmon_putchar('b');
  191.     xmon_putchar(' ');
  192.     xmon_putchar('b');
  193.     --lineptr;
  194. }
  195. break;
  196.     default:
  197. if (lineptr >= &line[sizeof(line) - 1])
  198.     xmon_putchar('a');
  199. else {
  200.     xmon_putchar(c);
  201.     *lineptr++ = c;
  202. }
  203.     }
  204. }
  205. lineleft = lineptr - line;
  206. lineptr = line;
  207.     }
  208.     if (lineleft == 0)
  209. return -1;
  210.     --lineleft;
  211.     return *lineptr++;
  212. }
  213. char *
  214. xmon_fgets(char *str, int nb, void *f)
  215. {
  216.     char *p;
  217.     int c;
  218.     for (p = str; p < str + nb - 1; ) {
  219. c = xmon_getchar();
  220. if (c == -1) {
  221.     if (p == str)
  222. return 0;
  223.     break;
  224. }
  225. *p++ = c;
  226. if (c == 'n')
  227.     break;
  228.     }
  229.     *p = 0;
  230.     return str;
  231. }
  232. void
  233. prom_drawhex(uint val)
  234. {
  235. unsigned char buf[10];
  236. int i;
  237. for (i = 7;  i >= 0;  i--)
  238. {
  239. buf[i] = "0123456789abcdef"[val & 0x0f];
  240. val >>= 4;
  241. }
  242. buf[8] = '';
  243. xmon_fputs(buf, xmon_stdout);
  244. }
  245. void
  246. prom_drawstring(const char *str)
  247. {
  248. xmon_fputs(str, xmon_stdout);
  249. }