From 8e8a5096bf4c940b5bc69c677b00b1da90ac3680 Mon Sep 17 00:00:00 2001 From: Nicolas Schodet Date: Wed, 3 Apr 2013 23:10:58 +0200 Subject: digital/dev2/src/usb_serial_isp: added shared GPIO mode --- digital/dev2/src/usb_serial_isp/Makefile | 2 +- digital/dev2/src/usb_serial_isp/descriptors.c | 4 ++-- digital/dev2/src/usb_serial_isp/descriptors.h | 4 ++++ digital/dev2/src/usb_serial_isp/main.c | 34 ++++++++++++++++++++++++--- 4 files changed, 38 insertions(+), 6 deletions(-) (limited to 'digital/dev2/src') 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; } } -- cgit v1.2.3