M0nk3

DBGU.c //inter

Dec 15th, 2019
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.77 KB | None | 0 0
  1. #include <stdbool.h>
  2. #include <string.h>
  3.    
  4. #include "at91sam9263.h"
  5. #include "DBGU.h"
  6.    
  7. unsigned int overrun_error_counter = 0;
  8. unsigned int framing_error_counter = 0;
  9. unsigned int parity_error_counter = 0;
  10. unsigned int other_dgbu_interrupt_counter = 0;
  11. unsigned int other_interrupt_counter = 0;
  12. struct FIFO fifo;
  13.    
  14. int DBGU_init(void) {
  15.     AT91C_BASE_DBGU->DBGU_IDR = 0xFFFFFFFF;
  16.     AT91C_BASE_DBGU->DBGU_CR = AT91C_US_RSTRX | AT91C_US_RXDIS;
  17.     AT91C_BASE_DBGU->DBGU_CR = AT91C_US_RSTTX | AT91C_US_TXDIS;
  18.     AT91C_BASE_PIOC->PIO_ASR = AT91C_PC31_DTXD | AT91C_PC30_DRXD;
  19.     AT91C_BASE_PIOC->PIO_PDR = AT91C_PC31_DTXD | AT91C_PC30_DRXD;
  20.     AT91C_BASE_DBGU->DBGU_BRGR = PROCESSOR_CLOCK / (THROUGHPUT * 16);
  21.     AT91C_BASE_DBGU->DBGU_MR = AT91C_US_CHMODE_NORMAL | AT91C_US_PAR_NONE;
  22.     DBGU_interrupt_init();
  23.     AT91C_BASE_DBGU->DBGU_CR = AT91C_US_RXEN;
  24.     AT91C_BASE_DBGU->DBGU_CR = AT91C_US_TXEN;
  25.     FIFO_Init(&fifo);
  26.     return 0;
  27. }
  28.    
  29. void DBGU_interrupt_init() {
  30.     AT91C_BASE_AIC->AIC_IDCR = 1 << AT91C_ID_SYS;
  31.     AT91C_BASE_AIC->AIC_SVR[AT91C_ID_SYS] = (unsigned int) interruptHandler;
  32.     AT91C_BASE_AIC->AIC_SMR[AT91C_ID_SYS] = (AT91C_AIC_SRCTYPE & AT91C_AIC_SRCTYPE_INT_EDGE_TRIGGERED) | (AT91C_AIC_SRCTYPE & AT91C_AIC_SRCTYPE_EXT_POSITIVE_EDGE) | (AT91C_AIC_PRIOR & AT91C_AIC_PRIOR_HIGHEST);
  33.     AT91C_BASE_AIC->AIC_ICCR = 1 << AT91C_ID_SYS;
  34.     AT91C_BASE_AIC->AIC_IECR = 1 << AT91C_ID_SYS;
  35.     AT91C_BASE_DBGU->DBGU_IER = AT91C_US_OVRE | AT91C_US_FRAME | AT91C_US_PARE | AT91C_US_RXRDY;
  36. }
  37.    
  38. void interruptHandler() {
  39.    
  40.     if (AT91C_BASE_DBGU->DBGU_CSR & AT91C_BASE_DBGU->DBGU_IMR) {
  41.    
  42.         if ((AT91C_BASE_DBGU->DBGU_IMR & AT91C_US_TXRDY) && (AT91C_BASE_DBGU->DBGU_CSR & AT91C_US_TXRDY)) {
  43.             dbgu_print_string();
  44.         }
  45.         else if ((AT91C_BASE_DBGU->DBGU_IMR & AT91C_US_RXRDY) && (AT91C_BASE_DBGU->DBGU_CSR & AT91C_US_RXRDY)) {
  46.             dbgu_read_ascii();
  47.         }
  48.         else if ((AT91C_BASE_DBGU->DBGU_IMR & AT91C_US_OVRE) && (AT91C_BASE_DBGU->DBGU_CSR & AT91C_US_OVRE)) {
  49.             overrun_error_counter += 1;
  50.         }
  51.         else if ((AT91C_BASE_DBGU->DBGU_IMR & AT91C_US_FRAME) && (AT91C_BASE_DBGU->DBGU_CSR & AT91C_US_FRAME)) {
  52.             framing_error_counter += 1;
  53.         }
  54.         else if ((AT91C_BASE_DBGU->DBGU_IMR & AT91C_US_PARE) && (AT91C_BASE_DBGU->DBGU_CSR & AT91C_US_PARE)) {
  55.             parity_error_counter += 1;
  56.         }
  57.         else {
  58.             other_dgbu_interrupt_counter += 1;
  59.         }
  60.     }
  61.     else {
  62.         other_interrupt_counter += 1;
  63.     }
  64. }
  65.    
  66. void dbgu_print_string() {
  67.     char buffer;
  68.    
  69.     if (FIFO_Get(&fifo, &buffer) == SUCCESS) {
  70.         AT91C_BASE_DBGU->DBGU_THR = buffer;
  71.     }
  72.     else {
  73.          newLine();
  74.          AT91C_BASE_DBGU->DBGU_IDR = AT91C_US_TXRDY;
  75.     }
  76.    
  77. }
  78.  
  79. void dbgu_read_ascii() {
  80.    
  81.     char buffer = AT91C_BASE_DBGU->DBGU_RHR & 0xFF;
  82.    
  83.     if (buffer == KEY_RETURN) {
  84.         AT91C_BASE_DBGU->DBGU_IER = AT91C_US_TXRDY;
  85.     }
  86.     else {
  87.         if (is_FIFO_full(&fifo)) {
  88.             dbgu_print_warning("Overflow");
  89.         }
  90.         else {
  91.             FIFO_Put(&fifo, buffer);
  92.         }
  93.     }
  94. }
  95.    
  96. void newLine() {
  97.     while (!(AT91C_BASE_DBGU->DBGU_CSR & AT91C_US_TXRDY)){}
  98.     AT91C_BASE_DBGU->DBGU_THR = '\n';
  99.     while (!(AT91C_BASE_DBGU->DBGU_CSR & AT91C_US_TXRDY)){}
  100.     AT91C_BASE_DBGU->DBGU_THR = '\r';
  101. }
  102.    
  103. void dbgu_print_warning(char *message) {
  104.    
  105.     newLine();
  106.    
  107.     int i;
  108.     for (i = 0; i < strlen(message); ++i) {
  109.         while (!(AT91C_BASE_DBGU->DBGU_CSR & AT91C_US_TXRDY)){}
  110.         AT91C_BASE_DBGU->DBGU_THR = message[i];
  111.     }
  112.    
  113.     newLine();
  114.    
  115. }
  116.  
  117. void FIFO_Init (struct FIFO *fifo){
  118.     fifo->head = 0;
  119.     fifo->tail = 0;
  120. }
  121.    
  122. bool is_FIFO_full(struct FIFO *fifo) {
  123.     return ((fifo->tail-fifo->head)==1 || (fifo->head-fifo->tail)==BUFFERSIZE);
  124. }
  125.    
  126. int FIFO_Put (struct FIFO *fifo, char Data){
  127.     if (is_FIFO_full(fifo)) {
  128.         return FAIL;
  129.     };
  130.    
  131.     fifo->buffer[fifo->head] = Data;
  132.     fifo->head = (fifo->head + 1) & BUFFERSIZE;
  133.     return SUCCESS;
  134. }
  135.    
  136. int FIFO_Get (struct FIFO *fifo, char *Data){
  137.     if (fifo->head!=fifo->tail){
  138.         *Data = fifo->buffer[fifo->tail];
  139.         fifo->tail = (fifo->tail + 1) & BUFFERSIZE;
  140.         return SUCCESS;
  141.     }
  142.     else return FAIL;
  143. }
  144.  
  145. void invertCase(char *string) {
  146.     int i;
  147.    
  148.     for(i = 0; i < strlen(string); i++) {
  149.         if (string[i] >= 'a' && string[i] <= 'z') {
  150.             charToUpper(&string[i]);
  151.         }
  152.         else if (string[i] >= 'A' && string[i] <= 'Z') {
  153.             charToLower(&string[i]);
  154.         }
  155.     }
  156. }
  157.    
  158. void charToUpper(char *sign) {
  159.     *sign -= 32;
  160. }
  161.    
  162. void charToLower(char *sign) {
  163.     *sign += 32;
  164. }
Add Comment
Please, Sign In to add comment