#include #include #include #include #include #include #include "usbn2mc.h" #define F_CPU 16000000UL #include #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; }