From 324c5ba9098c1010d0aa8c1e26b95509878ce9f2 Mon Sep 17 00:00:00 2001 From: Yves Fischer Date: Tue, 11 Oct 2011 21:50:49 +0200 Subject: Mini-Octopus build from r@171 --- firmware/io.c | 512 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 512 insertions(+) create mode 100644 firmware/io.c (limited to 'firmware/io.c') diff --git a/firmware/io.c b/firmware/io.c new file mode 100644 index 0000000..280f892 --- /dev/null +++ b/firmware/io.c @@ -0,0 +1,512 @@ +/* + * Copyright (c) 2007 Embedded Projects (http://www.embedded-projects.net) + * Author: Benedikt Sauter = 1 && pin <= 19) || (pin >= 26 && pin <= 44)) + { + io_set_pin_direction_out(pin); + return RSP_OK; + } + return RSP_UNKOWN_PIN; +} + +void io_init_usb(uint8_t pin) +{ + answer[0] = CMD_IO_INIT_PIN; + answer[1] = (unsigned char)io_init(pin); + answer[2] = 0; + CommandAnswer(3); +} + +uint8_t io_init_port(uint8_t port) +{ + /* TODO implement this function */ + return RSP_OK; +} + +void io_init_port_usb(uint8_t port) +{ + answer[0] = CMD_IO_INIT_PORT; + answer[1] = (unsigned char)io_init_port(port); + answer[2] = 0; + CommandAnswer(3); +} + +uint8_t io_set_port_direction_out(uint8_t port,uint8_t mask) +{ + /* TODO + switch (port) + { + case 1: DDRB = mask; break; + case 2: DDRC = mask; break; // PC7 = /CS (output) - do we need to mask this ? + case 3: DDRD = mask; break; + case 4: DDRE = mask; break; // PE4 = INT4 (input) - do we need to mask this ? + case 5: DDRF = mask; break; + default: return RSP_UNKOWN_PIN; + } + */ + return RSP_OK; +} + +uint8_t io_set_port_direction_in(uint8_t port,uint8_t mask) +{ + /* TODO implement */ + return RSP_OK; +} + +uint8_t io_set_port_direction_tri(uint8_t port,uint8_t mask) +{ + /* TODO implement */ + return RSP_OK; +} + +void io_set_port_direction_out_usb (uint8_t port, uint8_t mask) +{ + answer[0] = CMD_IO_PORT_DIRECTION_OUT; + answer[1] = (unsigned char)io_set_port_direction_out (port, mask); + answer[2] = 0; + CommandAnswer(3); +} + +void io_set_port_direction_in_usb(uint8_t port, uint8_t mask) +{ + answer[0] = CMD_IO_PORT_DIRECTION_IN; + answer[1] = (unsigned char)io_set_port_direction_in (port, mask); + answer[2] = 0; + CommandAnswer(3); +} +void io_set_port_direction_tri_usb(uint8_t port, uint8_t mask) +{ + answer[0] = CMD_IO_PORT_DIRECTION_TRI; + answer[1] = (unsigned char)io_set_port_direction_tri (port, mask); + answer[2] = 0; + CommandAnswer(3); +} + + +uint8_t io_set_pin_direction_out(uint8_t pin) +{ + if((pin >= 1 && pin <= 19) || (pin >=26 && pin <=44) ) + { + octopus.ports[pin] = PIN_OUT; + + switch(pin) + { + case 1: OX_DDR1 |=(1<= 1 && pin <= 19) || (pin >=26 && pin <=44) ) + { + octopus.ports[pin] = PIN_IN; + switch (pin) + { + case 1: OX_DDR1 &=~(1<= 1 && pin <= 19) || (pin >=26 && pin <=44) ) + { + octopus.ports[pin] = PIN_TRI; + io_set_pin_direction_out(pin); + io_set_pin(pin,1); + return RSP_OK; + } + else + { + return RSP_UNKOWN_PIN; + } +} + + +void io_set_pin_direction_out_usb(uint8_t pin) +{ + answer[0] = CMD_IO_PIN_DIRECTION_OUT; + answer[1] = (unsigned char)io_set_pin_direction_out(pin); + answer[2] = 0; + CommandAnswer(3); +} + +void io_set_pin_direction_in_usb(uint8_t pin) +{ + answer[0] = CMD_IO_PIN_DIRECTION_IN; + answer[1] = (unsigned char)io_set_pin_direction_in(pin); + answer[2] = 0; + CommandAnswer(3); +} + +void io_set_pin_direction_tri_usb(uint8_t pin) +{ + answer[0] = CMD_IO_PIN_DIRECTION_TRI; + answer[1] = (unsigned char)io_set_pin_direction_tri(pin); + answer[2] = 0; + CommandAnswer(3); +} + + + +uint8_t io_get_port (uint8_t port, uint8_t *pvalue) +{ + uint8_t value; + + *pvalue = 0; + switch (port) + { + case 1: value = PINB; break; + case 2: value = PINC; break; /* PC7 = /CS */ + case 3: value = PIND; break; + case 4: value = PINE; break; /* PE4 = INTR */ + case 5: value = PINF; break; + default: return RSP_UNKOWN_PORT; + } + *pvalue = value; + return RSP_OK; +} + +void io_get_port_usb (uint8_t port) +{ + uint8_t value; + + answer[0] = CMD_IO_PORT_GET; + answer[1] = (unsigned char)io_get_port (port, &value); + answer[2] = (unsigned char)value; + CommandAnswer(3); +} + +uint8_t io_set_port(uint8_t port, uint8_t value) +{ + switch (port) + { + case 1: PORTB = value; break; + case 2: PORTC = value; break; // PC7 = /CS + case 3: PORTD = value; break; + case 4: PORTE = value; break; // PE4 = INTR + case 5: PORTF = value; break; + default: return RSP_UNKOWN_PIN; + } + return RSP_OK; +} + +void io_set_port_usb (uint8_t port, uint8_t value) +{ + answer[0] = CMD_IO_PORT_SET; + answer[1] = (unsigned char)io_set_port (port, value); + answer[2] = 0; + CommandAnswer(3); +} + + +void io_set_pin_usb(uint8_t pin, uint8_t value) +{ + answer[0] = CMD_IO_PIN_SET; + answer[1] = (unsigned char)io_set_pin(pin,value); + answer[2] = 0; + CommandAnswer(3); +} + + +uint8_t io_set_pin(uint8_t pin, uint8_t value) +{ + if(octopus.ports[pin] == PIN_OUT) + { + switch(pin) + { + case 1: if(value) OX_PORT1 |=(1<