summaryrefslogtreecommitdiffhomepage
path: root/digital
diff options
context:
space:
mode:
authorNicolas Schodet2013-04-03 23:10:58 +0200
committerNicolas Schodet2013-04-03 23:26:48 +0200
commit8e8a5096bf4c940b5bc69c677b00b1da90ac3680 (patch)
treeaec69ffd859a147e51150090434d87ea2f504f81 /digital
parent1b0e39a3eeab73de59e5b6fe982bff67021afc78 (diff)
digital/dev2/src/usb_serial_isp: added shared GPIO mode
Diffstat (limited to 'digital')
-rw-r--r--digital/dev2/src/usb_serial_isp/Makefile2
-rw-r--r--digital/dev2/src/usb_serial_isp/descriptors.c4
-rw-r--r--digital/dev2/src/usb_serial_isp/descriptors.h4
-rw-r--r--digital/dev2/src/usb_serial_isp/main.c34
4 files changed, 38 insertions, 6 deletions
diff --git a/digital/dev2/src/usb_serial_isp/Makefile b/digital/dev2/src/usb_serial_isp/Makefile
index 6034b9b0..9c48696a 100644
--- a/digital/dev2/src/usb_serial_isp/Makefile
+++ b/digital/dev2/src/usb_serial_isp/Makefile
@@ -1,6 +1,6 @@
BASE = ../../../avr
AVR_PROGS = dev2_serial_isp
-dev2_serial_isp_SOURCES = main.c descriptors.c serial.c select.c usb_isp.c
+dev2_serial_isp_SOURCES = main.c descriptors.c serial.c select.c usb_isp.c gpio.c
MODULES = usb uart isp spi
CONFIGFILE = avrconfig.h
AVR_MCU = at90usb162
diff --git a/digital/dev2/src/usb_serial_isp/descriptors.c b/digital/dev2/src/usb_serial_isp/descriptors.c
index b1f52566..1f4240b1 100644
--- a/digital/dev2/src/usb_serial_isp/descriptors.c
+++ b/digital/dev2/src/usb_serial_isp/descriptors.c
@@ -156,8 +156,8 @@ USB_Descriptor_String_t PROGMEM ManufacturerString =
USB_Descriptor_String_t PROGMEM ProductString =
{
- Header: { Size: USB_STRING_LEN (15), Type: DTYPE_String },
- UnicodeString: L"dev2 serial isp"
+ Header: { Size: USB_STRING_LEN (20), Type: DTYPE_String },
+ UnicodeString: L"dev2 serial isp gpio"
};
uint16_t
diff --git a/digital/dev2/src/usb_serial_isp/descriptors.h b/digital/dev2/src/usb_serial_isp/descriptors.h
index e2dba02f..8fcc81e7 100644
--- a/digital/dev2/src/usb_serial_isp/descriptors.h
+++ b/digital/dev2/src/usb_serial_isp/descriptors.h
@@ -34,5 +34,9 @@
#define ISP_TX_EPSIZE 16
#define ISP_RX_EPNUM 4
#define ISP_RX_EPSIZE 16
+#define GPIO_TX_EPNUM 3
+#define GPIO_TX_EPSIZE 16
+#define GPIO_RX_EPNUM 4
+#define GPIO_RX_EPSIZE 16
#endif /* descriptors_h */
diff --git a/digital/dev2/src/usb_serial_isp/main.c b/digital/dev2/src/usb_serial_isp/main.c
index aad4dbe8..45e0c7c6 100644
--- a/digital/dev2/src/usb_serial_isp/main.c
+++ b/digital/dev2/src/usb_serial_isp/main.c
@@ -33,6 +33,7 @@
#include "descriptors.h"
#include "common/serial.h"
#include "common/usb_isp.h"
+#include "common/gpio.h"
#include "common/select.h"
HANDLES_EVENT (USB_Connect);
@@ -40,7 +41,7 @@ HANDLES_EVENT (USB_Disconnect);
HANDLES_EVENT (USB_ConfigurationChanged);
HANDLES_EVENT (USB_UnhandledControlPacket);
-volatile uint8_t usb_connected, usb_configured;
+volatile uint8_t usb_connected, usb_configured, gpio_mode;
int
main (void)
@@ -62,7 +63,10 @@ main (void)
if (usb_configured)
{
serial_task ();
- usb_isp_task ();
+ if (!gpio_mode)
+ usb_isp_task ();
+ else
+ gpio_task ();
}
}
}
@@ -87,7 +91,8 @@ EVENT_HANDLER (USB_ConfigurationChanged)
Endpoint_ConfigureEndpoint (SERIAL_RX_EPNUM, EP_TYPE_BULK,
ENDPOINT_DIR_OUT, SERIAL_RX_EPSIZE,
ENDPOINT_BANK_SINGLE);
- /* Setup Rx and Tx Endpoints for the second port. */
+ /* Setup Rx and Tx Endpoints for the second port.
+ * Port shared between ISP and GPIO, use control packet to switch. */
Endpoint_ConfigureEndpoint (ISP_TX_EPNUM, EP_TYPE_BULK,
ENDPOINT_DIR_IN, ISP_TX_EPSIZE,
ENDPOINT_BANK_SINGLE);
@@ -96,6 +101,7 @@ EVENT_HANDLER (USB_ConfigurationChanged)
ENDPOINT_BANK_SINGLE);
/* Start tasks. */
usb_configured = 1;
+ gpio_mode = 0;
}
EVENT_HANDLER (USB_UnhandledControlPacket)
@@ -128,9 +134,13 @@ EVENT_HANDLER (USB_UnhandledControlPacket)
Endpoint_ClearSetupReceived ();
/* Select output. */
serial_uninit ();
+ if (gpio_mode)
+ gpio_uninit ();
select_out (output);
if (select_active (output))
serial_init ();
+ /* Disable GPIO mode. */
+ gpio_mode = 0;
/* Send acknowledgement. */
Endpoint_ClearSetupIN ();
}
@@ -149,6 +159,24 @@ EVENT_HANDLER (USB_UnhandledControlPacket)
Endpoint_ClearSetupIN ();
}
break;
+ /* Set GPIO. */
+ case 0x80:
+ if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_VENDOR |
+ REQREC_DEVICE))
+ {
+ /* GPIO parameter. */
+ uint8_t ddr = Endpoint_Read_Byte ();
+ uint8_t port = Endpoint_Read_Byte ();
+ Endpoint_ClearSetupReceived ();
+ /* Set GPIO. */
+ DDRD = ddr;
+ PORTD = port;
+ /* Also switch to GPIO mode. */
+ gpio_mode = 1;
+ /* Send acknowledgement. */
+ Endpoint_ClearSetupIN ();
+ }
+ break;
}
}