Advertisement
Guest User

Untitled

a guest
Mar 25th, 2019
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.48 KB | None | 0 0
  1. #include <stdint.h>
  2.  
  3. #define NULL 0
  4.  
  5. //#define LED (*(volatile uint32_t*)0x02000000)
  6. #define LED (*(volatile uint32_t*)0x03000000)
  7.  
  8. #define reg_uart_clkdiv (*(volatile uint32_t*)0x02000004)
  9. #define reg_uart_data (*(volatile uint32_t*)0x02000008)
  10.  
  11. //#define F_CPU 25000000 // Hz
  12. #define F_CPU 12000000 // Hz
  13. #define BAUD_RATE 115200 // bit/s
  14.  
  15. int getchar_available()
  16. {
  17. return reg_uart_data & 0x100;
  18. }
  19.  
  20. char getchar()
  21. {
  22. return reg_uart_data & 0xFF;
  23. }
  24.  
  25. void putchar(char c)
  26. {
  27. if (c == '\n')
  28. putchar('\r');
  29. reg_uart_data = c;
  30. }
  31.  
  32. void main(void)
  33. {
  34. int c, cnt, pos, val, len;
  35. char *cp;
  36. void *base_addr = NULL;
  37.  
  38. reg_uart_clkdiv = F_CPU/BAUD_RATE; // sets baudrate (115200 @ 25 MHz)
  39.  
  40. /* Appease gcc's uninitialized variable warnings */
  41. val = 0;
  42.  
  43. cp = NULL; /* shut up uninitialized use warnings */
  44.  
  45. prompt:
  46. pos = 0;
  47.  
  48. c = 0x76720A0D; /* "\r\nrv" */
  49. do {
  50. putchar(c);
  51. c >>= 8;
  52. if (c == 0 && pos == 0) {
  53. pos = -1;
  54. c = 0x203E3233; /* "32> " */
  55. }
  56. } while (c != 0);
  57.  
  58. next:
  59. pos = -1;
  60. len = 255;
  61. cnt = 2;
  62.  
  63. loop:
  64. /* Blink LEDs while waiting for serial input */
  65. do {
  66. #if 0
  67. if (pos < 0) {
  68. // RDTSC(val);
  69. val++;
  70. if (val & 0x08000000)
  71. c = 0xff;
  72. else
  73. c = 0;
  74. if ((val & 0xff) > ((val >> 19) & 0xff))
  75. LED = c ^ 0x0f;
  76. else
  77. LED = c ^ 0xf0;
  78. } else
  79. LED = (int) cp >> 8;
  80. #endif
  81. c = reg_uart_data;
  82. } while ( (c & 0x100) == 0);
  83. // c = getchar();
  84. c &= 0xFF;
  85. LED = c;
  86.  
  87. if (pos < 0) {
  88. if (c == 'S')
  89. pos = 0;
  90. else {
  91. if (c == '\r') /* CR ? */
  92. goto prompt;
  93. /* Echo char */
  94. if (c >= 32)
  95. putchar(c);
  96. }
  97. val = 0;
  98. goto loop;
  99. }
  100. if (c >= 10 && c <= 13) /* CR / LF ? */
  101. goto next;
  102.  
  103. val <<= 4;
  104. if (c >= 'a')
  105. c -= 32;
  106. if (c >= 'A')
  107. val |= c - 'A' + 10;
  108. else
  109. val |= c - '0';
  110. pos++;
  111.  
  112. /* Address width */
  113. if (pos == 1) {
  114. if (val >= 7 && val <= 9)
  115. {
  116. __asm __volatile__(
  117. // "li s0, 0x00008000;" /* 32K RAM top = stack address */
  118. // "li s0, 0x00002000;" /* 8K RAM top = stack address */
  119. "li s0, 0x00000400;" /* 1K RAM top = stack address */
  120. "mv ra, zero;"
  121. "jr %0;"
  122. :
  123. : "r" (base_addr)
  124. );
  125. }
  126. if (val <= 3)
  127. len = (val << 1) + 5;
  128. val = 0;
  129. goto loop;
  130. }
  131.  
  132. /* Byte count */
  133. if (pos == 3) {
  134. cnt += (val << 1);
  135. val = 0;
  136. goto loop;
  137. }
  138.  
  139. /* Valid len? */
  140. if (len < 6)
  141. goto loop;
  142.  
  143. /* End of address */
  144. if (pos == len) {
  145. cp = (char *) val;
  146. if (base_addr == NULL)
  147. base_addr = (void *) val;
  148. goto loop;
  149. }
  150.  
  151. if (pos > len && (pos & 1) && pos < cnt)
  152. *cp++ = val;
  153.  
  154. goto loop;
  155. /* Unreached */
  156. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement