Advertisement
Guest User

Untitled

a guest
Jun 19th, 2018
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.41 KB | None | 0 0
  1. #include "/opt/arm_user/include/AT91SAM9263.h"
  2.  
  3. #define DBGU_DALL 0xFFFFFFFF
  4. #define P_DTXD (0x1 << 31)
  5. #define P_DRXD (0x1 << 30)
  6.  
  7. #define CD 54
  8. #define ASCII_MASK 0x7F
  9. #define ASCII_CASE (0x1 << 5)
  10. #define BUF_SIZE 16
  11.  
  12. void dbgu_print_ascii(const char* string){};
  13.  
  14. void Init_DBGU() {
  15.  
  16. *AT91C_DBGU_IDR = DBGU_DALL;
  17. *AT91C_DBGU_CR = AT91C_US_TXDIS | AT91C_US_RXDIS | AT91C_US_RSTTX | AT91C_US_RSTRX;
  18. *AT91C_PIOC_PDR = P_DRXD | P_DTXD;
  19. *AT91C_PIOC_ASR = P_DRXD | P_DTXD;
  20. *AT91C_DBGU_MR = AT91C_US_CHMODE_NORMAL | AT91C_US_PAR_NONE;
  21. *AT91C_DBGU_BRGR = CD;
  22. *AT91C_DBGU_CR = AT91C_US_TXEN | AT91C_US_RXEN;
  23. }
  24.  
  25. char receive_DBGU() {
  26. while((*AT91C_DBGU_CSR & AT91C_US_RXRDY) == 0);
  27. return *AT91C_DBGU_RHR & ASCII_MASK;
  28. }
  29.  
  30. void transmit_DBGU(char wyslijchar) {
  31. while((*AT91C_DBGU_CSR & AT91C_US_TXRDY) == 0);
  32. *AT91C_DBGU_THR = wyslijchar;
  33. }
  34.  
  35. char swap_case(char AZ) {
  36. if (AZ >= 'A' && AZ <= 'Z') {
  37. return AZ | ASCII_CASE;
  38. } else if (AZ >= 'a' && AZ <= 'z') {
  39. return AZ & ~ASCII_CASE;
  40. } else {
  41. return AZ;
  42. }
  43. }
  44.  
  45. typedef struct FIFO {
  46. char String[BUF_SIZE + 1];
  47. int head;
  48. int tail;
  49. } FIFO;
  50.  
  51. FIFO Buffer;
  52.  
  53. void Init_FIFO(FIFO *Queue) {
  54. Queue->head = 0;
  55. Queue->tail = 0;
  56. int i = BUF_SIZE;
  57. while (i--) {
  58. Queue->String[i] = 0;
  59. }
  60. }
  61.  
  62. int dequeue_FIFO(FIFO *Queue, char *chrToBeWritten) {
  63. if (Queue->head == Queue->tail) return 0;
  64. *chrToBeWritten = Queue->String[Queue->tail++];
  65. if (Queue->tail > BUF_SIZE) Queue->tail = 0;
  66. return 1;
  67. }
  68.  
  69. int enqueue_FIFO(FIFO *Queue, char *chrToWrite) {
  70. if ((Queue->tail - Queue->head) == 1 || (Queue->tail == 0 && Queue->head == BUF_SIZE)) return 0;
  71. Queue->String[Queue->head++] =*chrToWrite;
  72. if (Queue->head > BUF_SIZE) Queue->head = 0;
  73. return 1;
  74. }
  75.  
  76. void Empty_FIFO(FIFO *Queue) {
  77. Queue->head = Queue->tail;
  78. }
  79.  
  80. void println(char *drukuj) {
  81. int i = 0;
  82. while (drukuj[i] != '\0') {
  83. transmit_DBGU(*(drukuj+i++));
  84. }
  85. transmit_DBGU('\n');
  86. transmit_DBGU('\r');
  87. }
  88.  
  89. void println_sc(char *drukuj) {
  90. int i = 0;
  91. char chr;
  92. while (drukuj[i] != '\0') {
  93. chr = swap_case(*(drukuj+i++));
  94. transmit_DBGU(chr);
  95. }
  96. transmit_DBGU('\n');
  97. transmit_DBGU('\r');
  98. }
  99.  
  100. void perr_overflow() {
  101. char error[] = "max 16 znakow";
  102. println(error);
  103. }
  104.  
  105. void print_from_FIFO(FIFO *Queue) {
  106. int get_result = 0;
  107. int i;
  108. char chr_TxD, drukuj[BUF_SIZE + 1];
  109. for (i=0; i < BUF_SIZE; i++) {
  110. get_result = dequeue_FIFO(Queue, &chr_TxD);
  111. if (!get_result) {
  112. drukuj[i] = '\0';
  113. break;
  114. }
  115. drukuj[i] = swap_case(chr_TxD);
  116. }
  117. drukuj[BUF_SIZE] = '\0';
  118. println(drukuj);
  119. }
  120.  
  121. void print_male() {
  122. char chr;
  123. for (chr='a'; chr<='z'; chr++) {
  124. transmit_DBGU(chr);
  125. }
  126. transmit_DBGU('\n');
  127. transmit_DBGU('\r');
  128. }
  129.  
  130. void print_duze() {
  131. char chr;
  132. for (chr='A'; chr<='Z'; chr++) {
  133. transmit_DBGU(chr);
  134. }
  135. transmit_DBGU('\n');
  136. transmit_DBGU('\r');
  137. }
  138.  
  139. void hello() {
  140. char nosiema[] = "Hello World!";
  141. println_sc(nosiema);
  142. }
  143.  
  144.  
  145. int main() {
  146. Init_DBGU();
  147. Init_FIFO(&Buffer);
  148. char chr_RxD;
  149. int post_result = 0;
  150. print_male();
  151. print_duze();
  152. hello();
  153. while(1) {
  154. chr_RxD = receive_DBGU();
  155. if (chr_RxD == '\n' || chr_RxD == '\r') {
  156. print_from_FIFO(&Buffer);
  157. } else {
  158. post_result = enqueue_FIFO(&Buffer, &chr_RxD);
  159. if (!post_result) {
  160. perr_overflow();
  161. Empty_FIFO(&Buffer);
  162. }
  163. }
  164. }
  165.  
  166. return 0;
  167. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement