diff options
Diffstat (limited to 'firmware/main.c')
-rw-r--r-- | firmware/main.c | 287 |
1 files changed, 287 insertions, 0 deletions
diff --git a/firmware/main.c b/firmware/main.c new file mode 100644 index 0000000..ef802a2 --- /dev/null +++ b/firmware/main.c @@ -0,0 +1,287 @@ +#include <stdlib.h> +#include <avr/io.h> +#include <stdint.h> +#include <avr/interrupt.h> +#include <inttypes.h> +#include <avr/pgmspace.h> + +#include "usbn2mc.h" +#define F_CPU 16000000UL +#include <util/delay.h> + +#include "../usbn2mc/main/usbnapi.h" +#include "usbn2mc.h" + +#include "common.h" +#include "protocol.h" +#include "wait.h" + +#include "io.h" +#include "adc.h" +#include "i2c.h" +#include "spi.h" +#include "pwm.h" +#include "uart.h" + +#include "93c46.h" +#include "debug.h" + +//#define DEBUG 1 + + + +SIGNAL (SIG_INTERRUPT4) +{ + USBNInterrupt (); +} + +SIGNAL (SIG_UART0_RECV) +{ + +} + +/* internal timer */ +SIGNAL (SIG_OVERFLOW0) +{ + common_scheduler (); + TCNT0 = octopus.latency_timer; +} + + +void +USBCommandRX (char *buf) +{ + int i; + +#ifdef DEBUG + debug_write("get \0"); + debug_SendHex(buf[1]); + debug_write("\r\n"); +#endif + + /* a paket can be max 255 bytes */ + if (octopus.long_rx_cmd == 1) + { +#ifdef DEBUG + debug_write("get next\r\n"); +#endif + for (i = 0; i < 64; i++) + request[octopus.long_rx_index + i] = buf[i]; + + octopus.long_rx_index = octopus.long_rx_index + i; + + if (octopus.long_rx_index >= octopus.long_rx_bytes) + { + octopus.long_rx_cmd = 0; + USBMessageIn (request); + } + } + else + { +#ifdef DEBUG + debug_write("get and execute\r\n\0"); +#endif + octopus.long_rx_index = 0; + for (i = 0; i < 64; i++) + request[octopus.long_rx_index + i] = buf[i]; + + octopus.long_rx_index = i; + + if ((unsigned int) buf[1] < 64) + { + octopus.long_rx_cmd = 0; + USBMessageIn (request); + } + else + { + octopus.long_rx_cmd = 1; + octopus.long_rx_bytes = (unsigned int) buf[1]; + } + } +} + +/* is called when received data from pc */ +void +USBMessageIn (char *buf) +{ + octopus.long_index = 0; + octopus.long_running = 0; + + STATUS_LED_on; +#ifdef DEBUG + debug_write("parser\r\n\0"); +#endif + int check = ((int) buf[0] >> 4) & 0x0F; + + switch (check) + { + case 0: + if (buf[0] == CMD_EXTERNAL_DEVICE) + { + switch (buf[2]) + { + case CMD_EXTERNAL_93C46: + flash_93c46_parser (buf); + break; + default: + ; + } + } + else + common_parser (buf); + break; + case 1: + io_parser (buf); + break; + case 2: + adc_parser (buf); + break; + case 3: + i2c_parser (buf); + break; + case 4: + spi_parser (buf); + break; + case 5: + pwm_parser (buf); + break; + case 6: + uart_parser (buf); + break; + default: + answer[0] = buf[0]; + answer[1] = RSP_UNKOWN_CMD; + answer[2] = 0; + CommandAnswer (3); + } + + STATUS_LED_off; +} + + +void +CommandAnswer (unsigned int length) +{ + int i; + + // if first packet of a lang message + if (length > 64 && octopus.long_running == 0) + { + octopus.long_index = 0; + octopus.long_bytes = length; + octopus.long_running = 1; + length = 64; + } + + USBNWrite (FIFOTXC1, FLUSH); + + for (i = 0; i < length; i++) + USBNWrite (TXD1, answer[octopus.long_index + i]); + + /* control togl bit */ + if (octopus.datatogl == 1) + { + USBNWrite (FIFOTXC1, TX_LAST + TX_EN + TX_TOGL); + octopus.datatogl = 0; + } + else + { + USBNWrite (FIFOTXC1, TX_LAST + TX_EN); + octopus.datatogl = 1; + } +} + + +void +CommandAnswerRest (void) +{ + if (octopus.long_running == 1) + { + if (octopus.long_index < octopus.long_bytes) + { + int dif = octopus.long_bytes - octopus.long_index; + octopus.long_index = octopus.long_index + 64; + + if (dif > 64) + CommandAnswer (64); + + else + { + /* last packet */ + CommandAnswer (dif); + octopus.long_running = 0; + } + } + } +} + + +int +main (void) +{ + DDRB = 0xFF; + PORTB = 0xFF; + + + int interf; + int conf; + + + STATUS_LED_off; + + USBNInit (); + + // setup your device + USBNDeviceVendorID (0x1781); // 0x0400 is the number from national + USBNDeviceProductID (0x0c65); // add your product id + USBNDeviceBCDDevice (0x0001); // you can use it as version e.g. version 1.02 + + char lang[] = { 0x09, 0x04, 0x00 }; + _USBNAddStringDescriptor (lang); // language descriptor + + + /* Attention!!! Descriptors must be a factor of 8 (error in the stack) */ + USBNDeviceManufacture ("EmbeddedProjects"); + USBNDeviceProduct ("OctopusUSB Interface Converter and I/O Extension"); + USBNDeviceSerialNumber ("20081108"); + + conf = USBNAddConfiguration (); + + USBNConfigurationPower (conf, 100); + + interf = USBNAddInterface (conf, 0); + USBNAlternateSetting (conf, interf, 0); + + /* communication */ + USBNAddInEndpoint (conf, interf, 1, 0x01, BULK, 64, 0, &CommandAnswerRest); + USBNAddOutEndpoint (conf, interf, 1, 0x01, BULK, 64, 0, &USBCommandRX); + + USBNInitMC (); + + octopus.datatogl = 0; + octopus.long_rx_cmd = 0; + + /* start usb chip */ + USBNStart (); + + /* UARTInit2(38400,8,'N',1); */ + #ifdef DEBUG + debug_init(); + #endif + + /* hello world led pattern */ + DDRC = 0xFF; + PORTC = 0xAA; + delay_250ms (); + PORTC = 0xD5; + delay_250ms (); + PORTC = 0x80; + + // testpin + //PORTB = 0xFF; + //PORTB = 0x00; + + while (1); + + return 0; +} |