summaryrefslogtreecommitdiff
path: root/firmware/uart.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/uart.c')
-rw-r--r--firmware/uart.c381
1 files changed, 381 insertions, 0 deletions
diff --git a/firmware/uart.c b/firmware/uart.c
new file mode 100644
index 0000000..02b4a87
--- /dev/null
+++ b/firmware/uart.c
@@ -0,0 +1,381 @@
+#include <inttypes.h>
+#include <avr/io.h>
+
+#include "uart.h"
+#include "common.h"
+#include "protocol.h"
+
+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);
+ break;
+ case 1:
+ octopus.ports[14] = PIN_UART;
+ octopus.ports[15] = PIN_UART;
+ /* enable transmitter receiver */
+ UCSR1B = (1 << RXEN1) | (1 << TXEN1);
+ 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:
+ /* Wait for empty transmit buffer */
+ while (!(UCSR0A & (1 << UDRE0)));
+ /* Put data into buffer, sends the data */
+ UDR0 = data;
+ break;
+ case 1:
+ /* Wait for empty transmit buffer */
+ while (!(UCSR1A & (1 << UDRE1)));
+ /* Put data into buffer, sends the data */
+ UDR1 = data;
+ 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];
+
+ 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;
+}
+
+/*
+unsigned char AsciiToHex(unsigned char high,unsigned char low)
+{
+ unsigned char new;
+
+ // check if lower equal 9 ( ascii 57 )
+ if(high <= 57) // high is a number
+ high = high -48;
+ else // high is a letter
+ high = high -87;
+
+ high = high << 4;
+ high = high & 0xF0;
+
+ // check if lower equal 9 ( ascii 57 )
+ if(low <= 57) // high is a number
+ low = low -48;
+ else // high is a letter
+ low = low -87;
+ low = low & 0x0F;
+
+ new = high | low;
+
+ return new;
+}
+
+void SendHex(unsigned char hex)
+{
+ unsigned char high,low;
+ // get highnibble
+ high = hex & 0xF0;
+ high = high >> 4;
+
+ // get lownibble
+ low = hex & 0x0F;
+
+ if(high<=9)
+ UARTPutChar(high+48);
+ else
+ UARTPutChar(high+87);
+
+
+ if(low<=9)
+ UARTPutChar(low+48);
+ else
+ UARTPutChar(low+87);
+
+}
+*/