summaryrefslogtreecommitdiff
path: root/usb-spi
diff options
context:
space:
mode:
authorChristian Pointner <equinox@spreadspace.org>2013-07-25 21:52:33 +0000
committerChristian Pointner <equinox@spreadspace.org>2013-07-25 21:52:33 +0000
commit4e2b1ab16736c0a46295cb7f07b5cf69af3d4695 (patch)
tree33148d70033add50a270a4f5905a021ef02f8263 /usb-spi
parentadded slowpandongle v0.2 support (diff)
usb-spi as programmer for spi based PIC bootloader
git-svn-id: https://svn.spreadspace.org/avr/trunk@208 aa12f405-d877-488e-9caf-2d797e2a1cc7
Diffstat (limited to 'usb-spi')
-rw-r--r--usb-spi/usb-spi.c54
1 files changed, 44 insertions, 10 deletions
diff --git a/usb-spi/usb-spi.c b/usb-spi/usb-spi.c
index d1dfa5c..7e68d7e 100644
--- a/usb-spi/usb-spi.c
+++ b/usb-spi/usb-spi.c
@@ -80,14 +80,18 @@ void EVENT_USB_Device_ControlRequest(void)
{
CDC_Device_ProcessControlRequest(&VirtualSerial_CDC_Interface);
}
-/* end LUFA CDC-ACM specific definitions*/
+/* end LUFA CDC-ACM specific definitions */
/* Hardware Defines: */
#define SPI_CS_DDR DDRB
#define SPI_CS_PORT PORTB
#define CS 0
+#define RESET_DDR DDRB
+#define RESET_PORT PORTB
+#define RESET 7
+
void SetupHardware(void)
{
MCUSR &= ~(1 << WDRF);
@@ -99,24 +103,54 @@ void SetupHardware(void)
TCCR0B = (1 << CS02);
- SPI_Init(SPI_SPEED_FCPU_DIV_4 | SPI_MODE_MASTER | SPI_ORDER_MSB_FIRST |
+ SPI_Init(SPI_SPEED_FCPU_DIV_4 | SPI_MODE_MASTER | SPI_ORDER_MSB_FIRST |
SPI_SCK_LEAD_RISING | SPI_SAMPLE_LEADING);
SPI_CS_DDR |= (1<<CS);
SPI_CS_PORT |= (1<<CS);
+
+ RESET_DDR |= (1<<RESET);
+ RESET_PORT |= (1<<RESET);
+
+/* INT0 as input with pull-up */
+ DDRD &= ~(1<<0);
+ PORTD |= (1<<0);
+ EICRA |= (1<<ISC01);
+ EIFR |= (1<<INTF0);
+ EIMSK |= (1<<INT0);
+}
+
+void EVENT_CDC_Device_ControLineStateChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo)
+{
+ if(CDCInterfaceInfo->State.ControlLineStates.HostToDevice & CDC_CONTROL_LINE_OUT_DTR)
+ RESET_PORT &= ~(1<<RESET);
+ else
+ RESET_PORT |= (1<<RESET);
}
-void SPI_TransferBuffer(void)
+void EVENT_CDC_Device_BreakSent(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo, const uint8_t Duration)
+{
+ SPI_CS_PORT ^= (1<<CS);
+}
+
+ISR(INT0_vect)
+{
+ SPI_CS_PORT &= ~(1<<CS);
+ led_on();
+
+ uint8_t ReceivedByte = SPI_ReceiveByte();
+ RingBuffer_Insert(&SPItoUSB_Buffer, ReceivedByte);
+
+ led_off();
+ SPI_CS_PORT |= (1<<CS);
+}
+
+void SPI_SendBuffer(void)
{
SPI_CS_PORT &= ~(1<<CS);
led_on();
while(!(RingBuffer_IsEmpty(&USBtoSPI_Buffer))) {
- uint8_t ReceivedByte = SPI_TransferByte(RingBuffer_Remove(&USBtoSPI_Buffer));
- if (USB_DeviceState == DEVICE_STATE_Configured) {
- RingBuffer_Insert(&SPItoUSB_Buffer, ReceivedByte);
- if(RingBuffer_IsFull(&SPItoUSB_Buffer))
- break;
- }
+ SPI_SendByte(RingBuffer_Remove(&USBtoSPI_Buffer));
}
led_off();
@@ -157,7 +191,7 @@ int main(void)
}
if (!(RingBuffer_IsEmpty(&USBtoSPI_Buffer)))
- SPI_TransferBuffer();
+ SPI_SendBuffer();
CDC_Device_USBTask(&VirtualSerial_CDC_Interface);
USB_USBTask();