summaryrefslogtreecommitdiff
path: root/digital/dev2/src
diff options
context:
space:
mode:
authorNicolas Schodet2009-04-17 00:26:06 +0200
committerNicolas Schodet2009-04-17 00:26:06 +0200
commit54a97038d99c00de98b30dcc97ae95822bacea9d (patch)
tree10d7e3346dac83387b32d5a3bbd16415802f4a23 /digital/dev2/src
parent2d884e20d4c5d18be53c1141dae73794f66b1a91 (diff)
* digital/dev2/src/usb_serial_isp:
- added isp calls.
Diffstat (limited to 'digital/dev2/src')
-rw-r--r--digital/dev2/src/usb_serial_isp/Makefile2
-rw-r--r--digital/dev2/src/usb_serial_isp/avrconfig.h10
-rw-r--r--digital/dev2/src/usb_serial_isp/main.c43
3 files changed, 54 insertions, 1 deletions
diff --git a/digital/dev2/src/usb_serial_isp/Makefile b/digital/dev2/src/usb_serial_isp/Makefile
index 29230cb0..d2124ae1 100644
--- a/digital/dev2/src/usb_serial_isp/Makefile
+++ b/digital/dev2/src/usb_serial_isp/Makefile
@@ -1,7 +1,7 @@
BASE = ../../../avr
AVR_PROGS = dev2_serial_isp
dev2_serial_isp_SOURCES = main.c descriptors.c serial.c select.c
-MODULES = usb uart
+MODULES = usb uart isp
CONFIGFILE = avrconfig.h
AVR_MCU = at90usb162
# -O2 : speed
diff --git a/digital/dev2/src/usb_serial_isp/avrconfig.h b/digital/dev2/src/usb_serial_isp/avrconfig.h
index 085aed8b..37b1b21e 100644
--- a/digital/dev2/src/usb_serial_isp/avrconfig.h
+++ b/digital/dev2/src/usb_serial_isp/avrconfig.h
@@ -73,6 +73,16 @@
#define AC_UART1_SEND_BUFFER_FULL WAIT
#define AC_UART1_HOST_DRIVER PTS
+/* isp - ISP module. */
+/** Size of isp_frame buffer. */
+#define AC_ISP_FRAME_BUFFER_SIZE 275
+/** Should be implemented by the user to send a character. */
+#define AC_ISP_FRAME_SEND_CHAR isp_send_char
+/** Should be implemented by the user (isp_proto) to accept a frame. */
+#define AC_ISP_FRAME_ACCEPT_FRAME isp_proto_accept
+/** Should be implemeted by the user to send a frame. */
+#define AC_ISP_PROTO_SEND isp_frame_send_frame
+
/* usb */
#include "modules/usb/lufaconfig.h"
diff --git a/digital/dev2/src/usb_serial_isp/main.c b/digital/dev2/src/usb_serial_isp/main.c
index d8694fe6..849b9942 100644
--- a/digital/dev2/src/usb_serial_isp/main.c
+++ b/digital/dev2/src/usb_serial_isp/main.c
@@ -25,6 +25,7 @@
#include "common.h"
#include "modules/usb/usb.h"
+#include "modules/isp/isp_frame.h"
#include "io.h"
#include <avr/wdt.h>
@@ -40,6 +41,47 @@ HANDLES_EVENT (USB_UnhandledControlPacket);
volatile uint8_t usb_connected, usb_configured;
+uint8_t isp_sent;
+
+void
+isp_send_char (uint8_t c)
+{
+ Endpoint_SelectEndpoint (ISP_TX_EPNUM);
+ /* Wait endpoint to become ready. */
+ while (!Endpoint_ReadWriteAllowed ())
+ ;
+ Endpoint_Write_Byte (c);
+ /* If at end of endpoint buffer, send. */
+ if (!Endpoint_ReadWriteAllowed ())
+ Endpoint_ClearCurrentBank ();
+ /* Select back RX endpoint. */
+ Endpoint_SelectEndpoint (ISP_RX_EPNUM);
+ /* Will need extra clear at end of all transfers. */
+ isp_sent = 1;
+}
+
+static void
+isp_task (void)
+{
+ Endpoint_SelectEndpoint (ISP_RX_EPNUM);
+ /* If data is available from USB: */
+ if (Endpoint_ReadWriteAllowed ())
+ {
+ /* Read as much as possible, and clear endpoint. */
+ do {
+ isp_frame_accept_char (Endpoint_Read_Byte ());
+ } while (Endpoint_ReadWriteAllowed ());
+ Endpoint_ClearCurrentBank ();
+ }
+ /* If data has been sent, sent a ZLP or finalise last packet. */
+ if (isp_sent)
+ {
+ Endpoint_SelectEndpoint (ISP_TX_EPNUM);
+ Endpoint_ClearCurrentBank ();
+ isp_sent = 0;
+ }
+}
+
int
main (void)
{
@@ -60,6 +102,7 @@ main (void)
if (usb_configured)
{
serial_task ();
+ isp_task ();
}
}
}