summaryrefslogtreecommitdiff
path: root/firmware/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/main.c')
-rw-r--r--firmware/main.c344
1 files changed, 189 insertions, 155 deletions
diff --git a/firmware/main.c b/firmware/main.c
index ef802a2..6bd7c32 100644
--- a/firmware/main.c
+++ b/firmware/main.c
@@ -16,19 +16,19 @@
#include "protocol.h"
#include "wait.h"
-#include "io.h"
+#include "93c46.h"
#include "adc.h"
+#include "can.h"
+#include "eeprom.h"
#include "i2c.h"
-#include "spi.h"
+#include "io.h"
#include "pwm.h"
+#include "spi.h"
#include "uart.h"
-#include "93c46.h"
+#include <stdio.h>
#include "debug.h"
-//#define DEBUG 1
-
-
SIGNAL (SIG_INTERRUPT4)
{
@@ -48,185 +48,218 @@ SIGNAL (SIG_OVERFLOW0)
}
-void
-USBCommandRX (char *buf)
+void USBCommandRX (char *buf)
{
int i;
-#ifdef DEBUG
- debug_write("get \0");
- debug_SendHex(buf[1]);
- debug_write("\r\n");
-#endif
+ debugf("receiving command: %X (length: %u)\n", buf[1]);
/* 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];
+ {
+ debugf("get next\n");
+
+ for (i = 0; i < 64; i++)
+ request[octopus.long_rx_index + i] = buf[i];
- octopus.long_rx_index = octopus.long_rx_index + 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);
- }
- }
+ 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];
- }
- }
+ {
+ debugf("get and execute\n");
+
+ 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)
+void USBMessageIn (char *buf)
{
octopus.long_index = 0;
octopus.long_running = 0;
- STATUS_LED_on;
-#ifdef DEBUG
- debug_write("parser\r\n\0");
-#endif
+ if(octopus.status_led)
+ STATUS_LED_on;
+
int check = ((int) buf[0] >> 4) & 0x0F;
+ debugf("parser, check: %X, command: %X\n", check, buf[0]);
+
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);
- }
+ {
+ case 0:
+ if (buf[0] == CMD_EXTERNAL_DEVICE)
+ {
+ switch (buf[2])
+ {
+ case CMD_EXTERNAL_93C46:
+ flash_93c46_parser(buf);
+ break;
+ }
+ }
+ else
+ common_parser(buf);
+
+ break;
+
+ case 1:
+ debugf("calling io_parser\n");
+ io_parser (buf);
+ break;
+ case 2:
+ debugf("calling adc_parser\n");
+ adc_parser (buf);
+ break;
+ case 3:
+ debugf("calling i2c_parser\n");
+ i2c_parser (buf);
+ break;
+ case 4:
+ debugf("calling spi_parser\n");
+ spi_parser (buf);
+ break;
+ case 5:
+ debugf("calling pwm_parser\n");
+ pwm_parser (buf);
+ break;
+ case 6:
+ debugf("calling adc_parser\n");
+ uart_parser (buf);
+ break;
+ case 7:
+#ifdef OCTOPUS_CAN
+ debugf("calling can_parser\n");
+ can_parser ((uint8_t *)buf);
+#else
+ debugf("can't call can_parser - no CAN-support\n");
+#endif
+ break;
+ case 8:
+ debugf("calling eeprom_parser\n");
+ eeprom_parser(buf);
+ break;
+ default:
+ debugf("unknown cmd\n");
+ answer[0] = buf[0];
+ answer[1] = RSP_UNKOWN_CMD;
+ answer[2] = 0;
+ CommandAnswer(3);
+ }
+
+ if(octopus.status_led)
+ STATUS_LED_off;
+}
- STATUS_LED_off;
+
+unsigned int strlen(volatile unsigned char *str)
+{
+ unsigned int len = 0;
+
+ while (*str++)
+ len++;
+
+ return len;
}
-void
-CommandAnswer (unsigned int length)
+void CommandAnswer(unsigned int length)
{
int i;
- // if first packet of a lang message
+ // if first packet of a long message
if (length > 64 && octopus.long_running == 0)
- {
- octopus.long_index = 0;
- octopus.long_bytes = length;
- octopus.long_running = 1;
- length = 64;
- }
+ {
+ debugf("first packet of a long message (length: %d)\n", length);
+ 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]);
+ 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;
- }
+ {
+ USBNWrite (FIFOTXC1, TX_LAST + TX_EN + TX_TOGL);
+ octopus.datatogl = 0;
+ }
else
- {
- USBNWrite (FIFOTXC1, TX_LAST + TX_EN);
- octopus.datatogl = 1;
- }
+ {
+ USBNWrite (FIFOTXC1, TX_LAST + TX_EN);
+ octopus.datatogl = 1;
+ }
}
-void
-CommandAnswerRest (void)
+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;
- }
- }
- }
+ {
+ debugf("octopus long running message\n");
+ if (octopus.long_index < octopus.long_bytes)
+ {
+ debugf("octopus.long_index < octopus.long_bytes\n");
+ int diff = octopus.long_bytes - octopus.long_index;
+ octopus.long_index = octopus.long_index + 64;
+
+ if (diff > 64)
+ {
+ debugf("not last packet: diff > 64\n");
+ CommandAnswer (64);
+ }
+ else
+ {
+ debugf("last packet\n");
+ /* last packet */
+ CommandAnswer (diff);
+ octopus.long_running = 0;
+ }
+ }
+ }
}
-int
-main (void)
+int main(void)
{
- DDRB = 0xFF;
- PORTB = 0xFF;
+ cli();
+ USBNInitMC ();
+ USBNStartClock();
+
+ DDRB = 0xFF;
+ PORTB = 0x00;
+
+ /* use status led */
+ octopus.status_led = 1;
int interf;
int conf;
-
STATUS_LED_off;
USBNInit ();
@@ -237,17 +270,19 @@ main (void)
USBNDeviceBCDDevice (0x0001); // you can use it as version e.g. version 1.02
char lang[] = { 0x09, 0x04, 0x00 };
- _USBNAddStringDescriptor (lang); // language descriptor
+ _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");
+ //USBNDeviceProduct ("Octopus USB v3.3");
+ USBNDeviceSerialNumber ("20090718");
conf = USBNAddConfiguration ();
- USBNConfigurationPower (conf, 100);
+ // we reserve 500mA, because users could drive LEDs and need more power
+ USBNConfigurationPower (conf, 200);
interf = USBNAddInterface (conf, 0);
USBNAlternateSetting (conf, interf, 0);
@@ -255,33 +290,32 @@ main (void)
/* communication */
USBNAddInEndpoint (conf, interf, 1, 0x01, BULK, 64, 0, &CommandAnswerRest);
USBNAddOutEndpoint (conf, interf, 1, 0x01, BULK, 64, 0, &USBCommandRX);
-
- USBNInitMC ();
+ //USBNAddOutEndpoint (conf, interf, 1, 0x02, BULK, 64, 0, NULL);
octopus.datatogl = 0;
octopus.long_rx_cmd = 0;
- /* start usb chip */
- USBNStart ();
-
/* UARTInit2(38400,8,'N',1); */
- #ifdef DEBUG
- debug_init();
- #endif
+ debug_init();
/* hello world led pattern */
- DDRC = 0xFF;
- PORTC = 0xAA;
+ DDRC = 0x7F;
+ PORTC = 0x2A;
delay_250ms ();
- PORTC = 0xD5;
+ PORTC = 0x55;
delay_250ms ();
- PORTC = 0x80;
+ PORTC = 0x00;
- // testpin
- //PORTB = 0xFF;
- //PORTB = 0x00;
+ common_init();
- while (1);
+ /* init connection between avr and usbn9604 */
+ USBNInitMC ();
+ /* start usb chip */
+ USBNStart ();
+ sei();
+
+ while (1);
return 0;
}
+