Advertisement
M0nk3

DBGU.c //fifo

Dec 13th, 2019
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.63 KB | None | 0 0
  1. #include <string.h>
  2. #include <stdbool.h>
  3.    
  4. #include "at91sam9263.h"
  5. #include "DBGU.h"
  6.    
  7. struct FIFO fifo;
  8.    
  9. int DBGU_init(void) {
  10.     AT91C_BASE_DBGU->DBGU_IDR = 0xFFFFFFFF; /* deactivate all DBGU interrupts */
  11.     AT91C_BASE_DBGU->DBGU_CR = AT91C_US_RSTRX | AT91C_US_RXDIS; /* reset and turn off receiver */
  12.     AT91C_BASE_DBGU->DBGU_CR = AT91C_US_RSTTX | AT91C_US_TXDIS; /* reset and turn off transmitter */
  13.     AT91C_BASE_PIOC->PIO_ASR = AT91C_PC31_DTXD /* TxD */ | AT91C_PC30_DRXD; /* RxD */
  14.     AT91C_BASE_PIOC->PIO_PDR = AT91C_PC31_DTXD /* TxD */ | AT91C_PC30_DRXD; /* RxD */
  15.     AT91C_BASE_DBGU->DBGU_BRGR = PROCESSOR_CLOCK / (115200 * 16); /* throughput configuration */
  16.     AT91C_BASE_DBGU->DBGU_MR = AT91C_US_CHMODE_NORMAL | AT91C_US_PAR_NONE; /* configure operation mode */
  17.     AT91C_BASE_DBGU->DBGU_CR = AT91C_US_RXEN; // enable receiver
  18.     AT91C_BASE_DBGU->DBGU_CR = AT91C_US_TXEN; // enable transmitter
  19.     FIFO_Init(&fifo);
  20.     return 0;
  21. }
  22.    
  23. int dbgu_print_ascii() {
  24.    
  25.     char buffer;
  26.     int counter = 0;
  27.    
  28.     while (FIFO_Get(&fifo, &buffer) == 1) {
  29.         while (!(AT91C_BASE_DBGU->DBGU_CSR & AT91C_US_TXRDY)){} // wait intil Tx buffer busy – check TXRDY flag
  30.        
  31.         echo(&buffer);
  32.            
  33.         AT91C_BASE_DBGU->DBGU_THR = buffer; // write a single char to Transmitter Holding Register
  34.         ++counter;
  35.     }
  36.    
  37.     newLine();
  38.    
  39.     return counter;
  40. }
  41.    
  42. int dbgu_read_ascii() {
  43.     int counter = 0;
  44.    
  45.     while(1) {
  46.         while (!(AT91C_BASE_DBGU->DBGU_CSR & AT91C_US_RXRDY)){}; // wait until data available
  47.    
  48.         char buffer = AT91C_BASE_DBGU->DBGU_RHR & 0xFF; // read data from Receiver Holding Register
  49.    
  50.         if (buffer == RETURN)
  51.             break;
  52.    
  53.         if (is_FIFO_full(&fifo)) {
  54.             dbgu_print_warning("Overflow");
  55.         } else {
  56.             FIFO_Put(&fifo, buffer);
  57.         }
  58.    
  59.         ++counter;
  60.     }
  61.    
  62.     return counter;
  63. }
  64.    
  65. void dbgu_print_warning(char *message) {
  66.    
  67.     newLine();
  68.    
  69.     int i;
  70.     for (i = 0; i < strlen(message); ++i) {
  71.         while (!(AT91C_BASE_DBGU->DBGU_CSR & AT91C_US_TXRDY)){}
  72.         AT91C_BASE_DBGU->DBGU_THR = message[i];
  73.     }
  74.    
  75.     newLine();
  76.    
  77. }
  78.  
  79. void newLine() {
  80.     while (!(AT91C_BASE_DBGU->DBGU_CSR & AT91C_US_TXRDY)){}
  81.     AT91C_BASE_DBGU->DBGU_THR = '\n';
  82.     while (!(AT91C_BASE_DBGU->DBGU_CSR & AT91C_US_TXRDY)){}
  83.     AT91C_BASE_DBGU->DBGU_THR = '\r';
  84. }
  85.  
  86. void FIFO_Init (struct FIFO *fifo){
  87.     fifo->head = 0;
  88.     fifo->tail = 0;
  89. }
  90.    
  91. bool is_FIFO_full(struct FIFO *fifo) {
  92.     return ((fifo->tail-fifo->head)==1 || (fifo->head-fifo->tail)==BUFFERSIZE);
  93. }
  94.    
  95. int FIFO_Put (struct FIFO *fifo, char Data){
  96.     if (is_FIFO_full(fifo)) {
  97.         return -1; /* FIFO overflow */
  98.     };
  99.    
  100.     fifo->buffer[fifo->head] = Data;
  101.     fifo->head = (fifo->head + 1) & BUFFERSIZE;
  102.     return 1; /* Put 1 byte successfully */
  103. }
  104.    
  105. int FIFO_Get (struct FIFO *fifo, char *Data){
  106.     if (fifo->head!=fifo->tail){
  107.         *Data = fifo->buffer[fifo->tail];
  108.         fifo->tail = (fifo->tail + 1) & BUFFERSIZE;
  109.         return 1; /* Get 1 byte successfully */
  110.     }
  111.     else return -1; /* No data in FIFO */
  112. }
  113.  
  114. void echo(char *string) {
  115.     int i;
  116.    
  117.     for(i = 0; i < strlen(string); i++) {
  118.         if (string[i] >= 'a' && string[i] <= 'z') {
  119.             charToUpper(&string[i]);
  120.         }
  121.         else if (string[i] >= 'A' && string[i] <= 'Z') {
  122.             charToLower(&string[i]);
  123.         }
  124.     }
  125. }
  126.    
  127. void charToUpper(char *sign) {
  128.     *sign -= 32;
  129. }
  130.    
  131. void charToLower(char *sign) {
  132.     *sign += 32;
  133. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement