Advertisement
Guest User

Untitled

a guest
Dec 13th, 2019
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.26 KB | None | 0 0
  1. =================CHARCASE=================
  2. #include "charcase.h"
  3. #include <string.h>
  4.  
  5. void to_uppercase(char *s) {
  6. *s -= 32;
  7. }
  8.  
  9. void to_lowercase(char *s) {
  10. *s += 32;
  11. }
  12.  
  13. void invert_case(char *s) {
  14. if (*s >= 'a' && *s <= 'z') {
  15. to_uppercase(s);
  16. } else if (*s >= 'A' && *s <= 'Z') {
  17. to_lowercase(s);
  18. }
  19. }
  20.  
  21. void invert_string(char *str) {
  22. int i;
  23. for (i = 0; i < strlen(str); i++) {
  24. invert_case(&str[i]);
  25. }
  26. }
  27. =================FIFO=================
  28. #include <stdbool.h>
  29. #include "AT91SAM9263.h"
  30. #include "fifo.h"
  31.  
  32. void init_fifo (fifo *f) {
  33. f->head = 0;
  34. f->tail = 0;
  35. }
  36.  
  37. void fifo_empty (fifo *f) {
  38. f->head = f->tail;
  39. }
  40.  
  41. bool is_fifo_full(fifo *f) {
  42. return ((f->tail - f->head) == 1 || (f->head - f->tail) == BUFFERSIZE);
  43. }
  44.  
  45. int fifo_put (fifo *f, char data) {
  46. if (is_fifo_full(f)) {
  47. return -1;
  48. }
  49.  
  50. f->buffer[f->head] = data;
  51. f->head = (f->head + 1) & BUFFERSIZE;
  52. return 1;
  53. }
  54.  
  55. int fifo_get (fifo *f, char *data) {
  56. if (f->head != f->tail) {
  57. *data = f->buffer[f->tail];
  58. f->tail = (f->tail + 1) & BUFFERSIZE;
  59. return 1;
  60. } else {
  61. return -1;
  62. }
  63. }
  64.  
  65. =================DBGU=================
  66. #include <string.h>
  67.  
  68. #include "AT91SAM9263.h"
  69. #include "dbgu.h"
  70. #include "fifo.h"
  71. #include "charcase.h"
  72.  
  73. #define THROUGHPUT 115200
  74. #define NEWLINE 13
  75.  
  76. fifo f;
  77.  
  78. int init_dbgu() {
  79. AT91C_BASE_DBGU->DBGU_IDR = 0xFFFFFFFF;
  80. AT91C_BASE_DBGU->DBGU_CR = AT91C_US_RSTRX | AT91C_US_RXDIS;
  81. AT91C_BASE_DBGU->DBGU_CR = AT91C_US_RSTTX | AT91C_US_TXDIS;
  82. AT91C_BASE_PIOC->PIO_ASR = AT91C_PC31_DTXD | AT91C_PC30_DRXD;
  83. AT91C_BASE_PIOC->PIO_PDR = AT91C_PC31_DTXD | AT91C_PC30_DRXD;
  84. AT91C_BASE_DBGU->DBGU_BRGR = PROCESSOR_CLOCK / (THROUGHPUT * 16);
  85. AT91C_BASE_DBGU->DBGU_MR = AT91C_US_CHMODE_NORMAL | AT91C_US_PAR_NONE;
  86. AT91C_BASE_DBGU->DBGU_CR = AT91C_US_RXEN;
  87. AT91C_BASE_DBGU->DBGU_CR = AT91C_US_TXEN;
  88. init_fifo(&f);
  89. return 0;
  90. }
  91.  
  92. void dbgu_print_newline() {
  93. while (!(AT91C_BASE_DBGU->DBGU_CSR & AT91C_US_TXRDY)) {}
  94. AT91C_BASE_DBGU->DBGU_THR = '\n';
  95. while (!(AT91C_BASE_DBGU->DBGU_CSR & AT91C_US_TXRDY)) {}
  96. AT91C_BASE_DBGU->DBGU_THR = '\r';
  97. }
  98.  
  99. int dbgu_print_ascii() {
  100. char buf;
  101. int char_counter = 0;
  102.  
  103. while (fifo_get(&f, &buf) == 1) {
  104. while (!(AT91C_BASE_DBGU->DBGU_CSR & AT91C_US_TXRDY)) {}
  105. invert_string(&buf);
  106. AT91C_BASE_DBGU->DBGU_THR = buf;
  107. char_counter++;
  108. }
  109. dbgu_print_newline();
  110.  
  111. return char_counter;
  112. }
  113.  
  114. int dbgu_read_ascii() {
  115. int counter = 0;
  116.  
  117. while(1) {
  118. while (!(AT91C_BASE_DBGU->DBGU_CSR & AT91C_US_RXRDY)) {};
  119. char buf = AT91C_BASE_DBGU->DBGU_RHR & 0xFF;
  120.  
  121. if (buf == NEWLINE) {
  122. break;
  123. }
  124.  
  125. if (is_fifo_full(&f)) {
  126. dbgu_print_warning("fifo overflow occured");
  127. } else {
  128. fifo_put(&f, buf);
  129. }
  130.  
  131. ++counter;
  132. }
  133.  
  134. return counter;
  135. }
  136.  
  137. void dbgu_print_warning(char *msg) {
  138. dbgu_print_newline();
  139.  
  140. int i;
  141. for (i = 0; i < strlen(msg); i++) {
  142. while (!(AT91C_BASE_DBGU->DBGU_CSR & AT91C_US_TXRDY)) {}
  143. AT91C_BASE_DBGU->DBGU_THR = msg[i];
  144. }
  145.  
  146. dbgu_print_newline();
  147. }
  148. ===============MAIN===================
  149. #include "AT91SAM9263.h"
  150. #include "dbgu.h"
  151. #include <stdbool.h>
  152.  
  153. int main() {
  154. init_dbgu();
  155.  
  156. while(1) {
  157. dbgu_read_ascii();
  158. dbgu_print_ascii();
  159. }
  160. return 0;
  161. }
  162.  
  163.  
  164.  
  165.  
  166. ==================================
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement