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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * BK Id: SCCS/s.adb.c 1.5 05/17/01 18:14:23 cort
  3.  */
  4. /*
  5.  * Copyright (C) 1996 Paul Mackerras.
  6.  */
  7. #include "nonstdio.h"
  8. #include "privinst.h"
  9. #define scanhex xmon_scanhex
  10. #define skipbl xmon_skipbl
  11. #define ADB_B (*(volatile unsigned char *)0xf3016000)
  12. #define ADB_SR (*(volatile unsigned char *)0xf3017400)
  13. #define ADB_ACR (*(volatile unsigned char *)0xf3017600)
  14. #define ADB_IFR (*(volatile unsigned char *)0xf3017a00)
  15. static inline void eieio(void) { asm volatile ("eieio" : :); }
  16. #define N_ADB_LOG 1000
  17. struct adb_log {
  18.     unsigned char b;
  19.     unsigned char ifr;
  20.     unsigned char acr;
  21.     unsigned int time;
  22. } adb_log[N_ADB_LOG];
  23. int n_adb_log;
  24. void
  25. init_adb_log(void)
  26. {
  27.     adb_log[0].b = ADB_B;
  28.     adb_log[0].ifr = ADB_IFR;
  29.     adb_log[0].acr = ADB_ACR;
  30.     adb_log[0].time = get_dec();
  31.     n_adb_log = 0;
  32. }
  33. void
  34. dump_adb_log(void)
  35. {
  36.     unsigned t, t0;
  37.     struct adb_log *ap;
  38.     int i;
  39.     ap = adb_log;
  40.     t0 = ap->time;
  41.     for (i = 0; i <= n_adb_log; ++i, ++ap) {
  42. t = t0 - ap->time;
  43. printf("b=%x ifr=%x acr=%x at %d.%.7dn", ap->b, ap->ifr, ap->acr,
  44.        t / 1000000000, (t % 1000000000) / 100);
  45.     }
  46. }
  47. void
  48. adb_chklog(void)
  49. {
  50.     struct adb_log *ap = &adb_log[n_adb_log + 1];
  51.     ap->b = ADB_B;
  52.     ap->ifr = ADB_IFR;
  53.     ap->acr = ADB_ACR;
  54.     if (ap->b != ap[-1].b || (ap->ifr & 4) != (ap[-1].ifr & 4)
  55. || ap->acr != ap[-1].acr) {
  56. ap->time = get_dec();
  57. ++n_adb_log;
  58.     }
  59. }
  60. int
  61. adb_bitwait(int bmask, int bval, int fmask, int fval)
  62. {
  63.     int i;
  64.     struct adb_log *ap;
  65.     for (i = 10000; i > 0; --i) {
  66. adb_chklog();
  67. ap = &adb_log[n_adb_log];
  68. if ((ap->b & bmask) == bval && (ap->ifr & fmask) == fval)
  69.     return 0;
  70.     }
  71.     return -1;
  72. }
  73. int
  74. adb_wait(void)
  75. {
  76.     if (adb_bitwait(0, 0, 4, 4) < 0) {
  77. printf("adb: ready wait timeoutn");
  78. return -1;
  79.     }
  80.     return 0;
  81. }
  82. void
  83. adb_readin(void)
  84. {
  85.     int i, j;
  86.     unsigned char d[64];
  87.     if (ADB_B & 8) {
  88. printf("ADB_B: %xn", ADB_B);
  89. return;
  90.     }
  91.     i = 0;
  92.     adb_wait();
  93.     j = ADB_SR;
  94.     eieio();
  95.     ADB_B &= ~0x20;
  96.     eieio();
  97.     for (;;) {
  98. if (adb_wait() < 0)
  99.     break;
  100. d[i++] = ADB_SR;
  101. eieio();
  102. if (ADB_B & 8)
  103.     break;
  104. ADB_B ^= 0x10;
  105. eieio();
  106.     }
  107.     ADB_B |= 0x30;
  108.     if (adb_wait() == 0)
  109. j = ADB_SR;
  110.     for (j = 0; j < i; ++j)
  111. printf("%.2x ", d[j]);
  112.     printf("n");
  113. }
  114. int
  115. adb_write(unsigned char *d, int i)
  116. {
  117.     int j;
  118.     unsigned x;
  119.     if ((ADB_B & 8) == 0) {
  120. printf("r: ");
  121. adb_readin();
  122.     }
  123.     for (;;) {
  124. ADB_ACR = 0x1c;
  125. eieio();
  126. ADB_SR = d[0];
  127. eieio();
  128. ADB_B &= ~0x20;
  129. eieio();
  130. if (ADB_B & 8)
  131.     break;
  132. ADB_ACR = 0xc;
  133. eieio();
  134. ADB_B |= 0x20;
  135. eieio();
  136. adb_readin();
  137.     }
  138.     adb_wait();
  139.     for (j = 1; j < i; ++j) {
  140. ADB_SR = d[j];
  141. eieio();
  142. ADB_B ^= 0x10;
  143. eieio();
  144. if (adb_wait() < 0)
  145.     break;
  146.     }
  147.     ADB_ACR = 0xc;
  148.     eieio();
  149.     x = ADB_SR;
  150.     eieio();
  151.     ADB_B |= 0x30;
  152.     return j;
  153. }
  154. void
  155. adbcmds(void)
  156. {
  157.     char cmd;
  158.     unsigned rtcu, rtcl, dec, pdec, x;
  159.     int i, j;
  160.     unsigned char d[64];
  161.     cmd = skipbl();
  162.     switch (cmd) {
  163.     case 't':
  164. for (;;) {
  165.     rtcl = get_rtcl();
  166.     rtcu = get_rtcu();
  167.     dec = get_dec();
  168.     printf("rtc u=%u l=%u dec=%x (%d = %d.%.7d)n",
  169.    rtcu, rtcl, dec, pdec - dec, (pdec - dec) / 1000000000,
  170.    ((pdec - dec) % 1000000000) / 100);
  171.     pdec = dec;
  172.     if (cmd == 'x')
  173. break;
  174.     while (xmon_read(stdin, &cmd, 1) != 1)
  175. ;
  176. }
  177. break;
  178.     case 'r':
  179. init_adb_log();
  180. while (adb_bitwait(8, 0, 0, 0) == 0)
  181.     adb_readin();
  182. break;
  183.     case 'w':
  184. i = 0;
  185. while (scanhex(&x))
  186.     d[i++] = x;
  187. init_adb_log();
  188. j = adb_write(d, i);
  189. printf("sent %d bytesn", j);
  190. while (adb_bitwait(8, 0, 0, 0) == 0)
  191.     adb_readin();
  192. break;
  193.     case 'l':
  194. dump_adb_log();
  195. break;
  196.     }
  197. }