diff options
Diffstat (limited to 'firmware/uart_fifo.c')
-rw-r--r-- | firmware/uart_fifo.c | 368 |
1 files changed, 0 insertions, 368 deletions
diff --git a/firmware/uart_fifo.c b/firmware/uart_fifo.c deleted file mode 100644 index d4da869..0000000 --- a/firmware/uart_fifo.c +++ /dev/null @@ -1,368 +0,0 @@ -#include <inttypes.h> -#include <avr/io.h> - -#include "uart.h" -#include "common.h" -#include "protocol.h" -#include "fifo.h" - -#define BUFSIZE_IN 5 -#define BUFSIZE_OUT 5 - -uint8_t inbuf0[BUFSIZE_IN]; -uint8_t inbuf1[BUFSIZE_IN]; -fifo_t infifo0; -fifo_t infifo1; - -uint8_t outbuf1[BUFSIZE_OUT]; -uint8_t outbuf0[BUFSIZE_OUT]; -fifo_t outfifo0; -fifo_t outfifo1; - - -void uart_parser(char *buf) -{ - answer[0] = buf[0]; - - switch(buf[0]) - { - case CMD_UART_INIT: - uart_init_usb((char)buf[2]); - break; - case CMD_UART_DEINIT: - uart_deinit_usb((char)buf[2]); - break; - - case CMD_UART_BAUDRATE: - uart_baudrate_usb((char)buf[2], (char)buf[3], (char)buf[4], (char)buf[5], (char)buf[6]); - break; - case CMD_UART_STOPBITS: - uart_stopbits_usb((char)buf[2], (char)buf[3]); - break; - case CMD_UART_DATABITS: - uart_stopbits_usb((char)buf[2], (char)buf[3]); - break; - case CMD_UART_PARITY: - uart_parity_usb((char)buf[2], (char)buf[3]); - break; - - case CMD_UART_SEND: - uart_send_usb((char)buf[2], (char)buf[3], &buf[4]); - break; - case CMD_UART_RECV: - uart_recv_usb((char)buf[2], (char)buf[3]); - break; - default: - answer[1] = RSP_UNKOWN_CMD; - answer[2] = 0; - CommandAnswer(3); - } -} - -void uart_init_usb(char uartport) -{ - answer[1] = (unsigned char)uart_init(uartport); - answer[2] = 0; - - CommandAnswer(3); -} - -char uart_init(char uartport) -{ - switch(uartport) - { - case 0: - octopus.ports[41] = PIN_UART; - octopus.ports[42] = PIN_UART; - /* enable transmitter receiver */ - UCSR0B = (1 << RXEN0) | (1 << TXEN0) | (1 << RXCIE0); - break; - case 1: - octopus.ports[14] = PIN_UART; - octopus.ports[15] = PIN_UART; - /* enable transmitter receiver */ - UCSR1B = (1 << RXEN1) | (1 << TXEN1) | (1 << RXCIE1); - break; - default: - return RSP_UNKOWN_PIN; - } - - return RSP_OK; -} - -void uart_deinit_usb(char uartport) -{ - answer[1] = (unsigned char)uart_deinit(uartport); - answer[2] = 0; - - CommandAnswer(3); -} - -char uart_deinit(char uartport) -{ - switch(uartport) - { - case 0: - octopus.ports[41] = PIN_NONE; - octopus.ports[42] = PIN_NONE; - UBRR0H = 0; - UBRR0L = 0; - UCSR0B = 0; - UCSR0C = 0; - break; - case 1: - octopus.ports[14] = PIN_NONE; - octopus.ports[15] = PIN_NONE; - UBRR1H = 0; - UBRR1L = 0; - UCSR1B = 0; - UCSR1C = 0; - break; - default: - return RSP_UNKOWN_PIN; - } - - return RSP_OK; -} - -void uart_baudrate_usb(char uartport, char ubrrll, char ubrrlh, char ubrrhl, char ubrrhh) -{ - answer[1] = (unsigned char)uart_baudrate(uartport, ubrrll, ubrrlh, ubrrhl, ubrrhh); - answer[2] = 0; - - CommandAnswer(3); -} - -char uart_baudrate(char uartport, char ubrrll, char ubrrlh, char ubrrhl, char ubrrhh) -{ - switch(uartport) - { - case 0: - UBRR0H = (ubrrhh << 8) | ubrrhl; - UBRR0L = (ubrrhl << 8) | ubrrll; - break; - case 1: - UBRR1H = (ubrrhh << 8) | ubrrhl; - UBRR1L = (ubrrhl << 8) | ubrrll; - break; - default: - return RSP_UNKOWN_PIN; - } - - return RSP_OK; -} - -void uart_stopbits_usb(char uartport, char stopbits) -{ - answer[1] = (unsigned char)uart_stopbits(uartport, stopbits); - answer[2] = 0; - - CommandAnswer(3); -} - -char uart_stopbits(char uartport, char stopbits) -{ - char usbs; - - switch(stopbits) - { - case 1: usbs = 0; break; - case 2: usbs = 2; break; - default: usbs = 0; break; - } - - switch(uartport) - { - case 0: - UCSR0C |= (usbs << USBS0); - break; - case 1: - UCSR1C |= (usbs << USBS1); - break; - default: - return RSP_UNKOWN_PIN; - } - - return RSP_OK; -} - -void uart_databits_usb(char uartport, char databits) -{ - answer[1] = (unsigned char)uart_databits(uartport, databits); - answer[2] = 0; - - CommandAnswer(3); -} - -char uart_databits(char uartport, char databits) -{ - char ucsz1,ucsz0; - - switch(databits) { - case 5: ucsz1 = 0; ucsz0 = 0; break; - case 6: ucsz1 = 0; ucsz0 = 1; break; - case 7: ucsz1 = 1; ucsz0 = 0; break; - case 8: ucsz1 = 1; ucsz0 = 1; break; - default: ucsz1 = 1; ucsz0 = 1; break; - } - - switch(uartport) - { - case 0: - UCSR0C |= (ucsz1 << UCSZ01) | (ucsz0 << UCSZ00); - break; - case 1: - UCSR1C |= (ucsz1 << UCSZ11) | (ucsz0 << UCSZ10); - break; - default: - return RSP_UNKOWN_PIN; - } - - return RSP_OK; -} - -void uart_parity_usb(char uartport, char parity) -{ - answer[1] = (unsigned char)uart_databits(uartport, parity); - answer[2] = 0; - - CommandAnswer(3); -} - -char uart_parity(char uartport, char parity) -{ - char upm1, upm0; - switch(parity) - { - case 'N': upm1 = 0; upm0 = 0; break; - case 'E': upm1 = 1; upm0 = 0; break; - case 'O': upm1 = 1; upm0 = 1; break; - default: upm1 = 0; upm0 = 0; break; - } - - switch(uartport) - { - case 0: - UCSR0C |= (upm1 << UPM01) | (upm0 << UPM00); - break; - case 1: - UCSR1C |= (upm1 << UPM11) | (upm0 << UPM10); - break; - default: - return RSP_UNKOWN_PIN; - } - - return RSP_OK; -} - -void uart_send_usb(char uartport, char length, char *buf) -{ - answer[1] = (unsigned char)uart_send(uartport, length, buf); - answer[2] = 0; - - CommandAnswer(3); -} - - -char uart_send(char uartport, unsigned int length, char *buf) -{ - if(uartport != 0 && uartport != 1) - return RSP_UNKOWN_PIN; - - while(length--) - uart_putchar(uartport, *buf++); - - return RSP_OK; -} - -char uart_putchar(char uartport, char data) -{ - switch(uartport) - { - case 0: - fifo_put (&outfifo0, data); - UCSR0B |= (1 << UDRIE0); - break; - case 1: - fifo_put (&outfifo1, data); - UCSR1B |= (1 << UDRIE1); - break; - default: - return RSP_UNKOWN_PIN; - } - - return RSP_OK; -} - - -void uart_recv_usb(char uartport, int length) -{ - char data[length]; - int i; - - answer[1] = (char)uart_recv(uartport, data, length); - - for(i = 0; i < length; i++) - answer[2+i] = data[i]; - - answer[2+length] = 0; - - CommandAnswer(3+length); -} - -char uart_recv(char uartport, char * buf, int length) -{ - if(uartport != 0 && uartport != 1) - return RSP_UNKOWN_PIN; - - while(length-- > 0) - *buf++ = uart_getchar(uartport); - - return RSP_OK; -} - -char uart_getchar(char uartport) -{ - char c; - - switch(uartport) - { - case 0: - while (!(UCSR0A & (1 << RXC0))); - c = UDR0; - break; - case 1: - while (!(UCSR1A & (1 << RXC1))); - c = UDR1; - break; - default: - return RSP_UNKOWN_PIN; - } - - return c; -} - -// Empfangene Zeichen werden in die Eingabgs-FIFO gespeichert und warten dort -//SIGNAL (SIG_UART0_RECV) -//{ -// _inline_fifo_put (&infifo0, UDR0); -//} - -// Ein Zeichen aus der Ausgabe-FIFO lesen und ausgeben -// Ist das Zeichen fertig ausgegeben, wird ein neuer SIG_UART_DATA-IRQ getriggert -// Ist die FIFO leer, deaktiviert die ISR ihren eigenen IRQ. -SIGNAL (SIG_UART0_DATA) -{ - PORTC ^= 5; - if (outfifo0.count > 0) - { - PORTC ^= 2; - UDR0 = _inline_fifo_get (&outfifo0); - } - else - { - PORTC ^= 3; - UCSR0B &= ~(1 << UDRIE0); - } -} - |