Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- =================CHARCASE=================
- #include "charcase.h"
- #include <string.h>
- void to_uppercase(char *s) {
- *s -= 32;
- }
- void to_lowercase(char *s) {
- *s += 32;
- }
- void invert_case(char *s) {
- if (*s >= 'a' && *s <= 'z') {
- to_uppercase(s);
- } else if (*s >= 'A' && *s <= 'Z') {
- to_lowercase(s);
- }
- }
- void invert_string(char *str) {
- int i;
- for (i = 0; i < strlen(str); i++) {
- invert_case(&str[i]);
- }
- }
- =================FIFO=================
- #include <stdbool.h>
- #include "AT91SAM9263.h"
- #include "fifo.h"
- void init_fifo (fifo *f) {
- f->head = 0;
- f->tail = 0;
- }
- void fifo_empty (fifo *f) {
- f->head = f->tail;
- }
- bool is_fifo_full(fifo *f) {
- return ((f->tail - f->head) == 1 || (f->head - f->tail) == BUFFERSIZE);
- }
- int fifo_put (fifo *f, char data) {
- if (is_fifo_full(f)) {
- return -1;
- }
- f->buffer[f->head] = data;
- f->head = (f->head + 1) & BUFFERSIZE;
- return 1;
- }
- int fifo_get (fifo *f, char *data) {
- if (f->head != f->tail) {
- *data = f->buffer[f->tail];
- f->tail = (f->tail + 1) & BUFFERSIZE;
- return 1;
- } else {
- return -1;
- }
- }
- =================DBGU=================
- #include <string.h>
- #include "AT91SAM9263.h"
- #include "dbgu.h"
- #include "fifo.h"
- #include "charcase.h"
- #define THROUGHPUT 115200
- #define NEWLINE 13
- fifo f;
- int init_dbgu() {
- AT91C_BASE_DBGU->DBGU_IDR = 0xFFFFFFFF;
- AT91C_BASE_DBGU->DBGU_CR = AT91C_US_RSTRX | AT91C_US_RXDIS;
- AT91C_BASE_DBGU->DBGU_CR = AT91C_US_RSTTX | AT91C_US_TXDIS;
- AT91C_BASE_PIOC->PIO_ASR = AT91C_PC31_DTXD | AT91C_PC30_DRXD;
- AT91C_BASE_PIOC->PIO_PDR = AT91C_PC31_DTXD | AT91C_PC30_DRXD;
- AT91C_BASE_DBGU->DBGU_BRGR = PROCESSOR_CLOCK / (THROUGHPUT * 16);
- AT91C_BASE_DBGU->DBGU_MR = AT91C_US_CHMODE_NORMAL | AT91C_US_PAR_NONE;
- AT91C_BASE_DBGU->DBGU_CR = AT91C_US_RXEN;
- AT91C_BASE_DBGU->DBGU_CR = AT91C_US_TXEN;
- init_fifo(&f);
- return 0;
- }
- void dbgu_print_newline() {
- while (!(AT91C_BASE_DBGU->DBGU_CSR & AT91C_US_TXRDY)) {}
- AT91C_BASE_DBGU->DBGU_THR = '\n';
- while (!(AT91C_BASE_DBGU->DBGU_CSR & AT91C_US_TXRDY)) {}
- AT91C_BASE_DBGU->DBGU_THR = '\r';
- }
- int dbgu_print_ascii() {
- char buf;
- int char_counter = 0;
- while (fifo_get(&f, &buf) == 1) {
- while (!(AT91C_BASE_DBGU->DBGU_CSR & AT91C_US_TXRDY)) {}
- invert_string(&buf);
- AT91C_BASE_DBGU->DBGU_THR = buf;
- char_counter++;
- }
- dbgu_print_newline();
- return char_counter;
- }
- int dbgu_read_ascii() {
- int counter = 0;
- while(1) {
- while (!(AT91C_BASE_DBGU->DBGU_CSR & AT91C_US_RXRDY)) {};
- char buf = AT91C_BASE_DBGU->DBGU_RHR & 0xFF;
- if (buf == NEWLINE) {
- break;
- }
- if (is_fifo_full(&f)) {
- dbgu_print_warning("fifo overflow occured");
- } else {
- fifo_put(&f, buf);
- }
- ++counter;
- }
- return counter;
- }
- void dbgu_print_warning(char *msg) {
- dbgu_print_newline();
- int i;
- for (i = 0; i < strlen(msg); i++) {
- while (!(AT91C_BASE_DBGU->DBGU_CSR & AT91C_US_TXRDY)) {}
- AT91C_BASE_DBGU->DBGU_THR = msg[i];
- }
- dbgu_print_newline();
- }
- ===============MAIN===================
- #include "AT91SAM9263.h"
- #include "dbgu.h"
- #include <stdbool.h>
- int main() {
- init_dbgu();
- while(1) {
- dbgu_read_ascii();
- dbgu_print_ascii();
- }
- return 0;
- }
- ==================================
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement