summaryrefslogtreecommitdiff
path: root/avr/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'avr/main.c')
-rw-r--r--avr/main.c164
1 files changed, 164 insertions, 0 deletions
diff --git a/avr/main.c b/avr/main.c
new file mode 100644
index 0000000..d350637
--- /dev/null
+++ b/avr/main.c
@@ -0,0 +1,164 @@
+/*
+ Project: DS1992 memory iButton dumper
+ Author: Florian Jung (flo@windfisch.org)
+ Copyright: (c) 2015 by Florian Jung
+ License: GNU GPL v3 (see LICENSE)
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License version 3 as
+ published by the Free Software Foundation.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ This project is based on the code for the AVR ATtiny USB Tutorial at
+ http://codeandlife.com/ by Joonas Pihlajamaa, joonas.pihlajamaa@iki.fi,
+ which is in turn based on the V-USB example code by Christian Starkjohann
+ (Copyright: (c) 2008 by OBJECTIVE DEVELOPMENT Software GmbH)
+*/
+
+#include <avr/io.h>
+#include <avr/interrupt.h>
+#include <avr/wdt.h>
+#include <avr/eeprom.h>
+#include <util/delay.h>
+#include <string.h>
+
+#include "usbdrv/usbdrv.h"
+
+
+#define LED_BLUE (1<<5)
+#define LED_RED (1<<4)
+#define LED_GREEN (1<<3)
+
+
+#define FUNC_READ 0x42
+#define FUNC_WRITE 0x21
+
+#define FUNC_START_BOOTLOADER 30
+#define FUNC_GET_TYPE 0xFE
+
+void jump_to_bootloader(void)
+{
+ cli();
+ wdt_enable(WDTO_15MS);
+ while (1);
+}
+
+static uchar replyBuffer[130]="Hello world initial";
+usbMsgLen_t usbFunctionSetup(uchar data[8])
+{
+ usbRequest_t *rq = (void *) data;
+ int len = 1;
+
+ switch (rq->bRequest)
+ {
+ case FUNC_GET_TYPE:
+ replyBuffer[0]=10;
+ len = 1;
+ break;
+ case FUNC_START_BOOTLOADER:
+ jump_to_bootloader();
+ len = 0;
+ break;
+ case FUNC_READ:
+ return USB_NO_MSG;
+
+ case FUNC_WRITE:
+ PORTC ^= LED_RED;
+ //strcpy(replyBuffer, "Hello world");
+ len = strlen(replyBuffer)+1;
+ break;
+ }
+
+ usbMsgPtr = replyBuffer;
+ return len;
+}
+
+volatile int count = 5;
+
+uchar usbFunctionWrite(uint8_t * data, uchar len)
+{
+ memcpy(replyBuffer,data,len);
+ replyBuffer[len]='\0';
+
+ return len;
+}
+
+
+
+void usb_disconnect()
+{
+ USB_INTR_ENABLE &= ~(1 << USB_INTR_ENABLE_BIT);
+ usbDeviceDisconnect();
+}
+
+void usb_reconnect()
+{
+ cli();
+ usbDeviceDisconnect(); // enforce re-enumeration
+ for (int i = 0; i < 250; i++)
+ { // wait 500 ms
+ wdt_reset(); // keep the watchdog happy
+ _delay_ms(10);
+ }
+ usbDeviceConnect();
+ USB_INTR_ENABLE |= (1 << USB_INTR_ENABLE_BIT);
+ sei();
+}
+
+
+int main(void)
+{
+ uint32_t c = 0;
+
+ DDRC = 0x38; // LEDs as output
+ PORTC |= LED_BLUE | LED_RED | LED_GREEN;
+ DDRD &= ~0xF3; // connector ports as input
+ DDRB &= ~0x3C;
+ PORTD &= ~0xF3; // disable pullups for unused ports
+ PORTB &= ~0x0C;
+ PORTB |= 0x30; // enable pullups for PB4 and 5
+
+ cli();
+
+ wdt_enable(WDTO_1S); // enable 1s watchdog timer
+
+ usbInit();
+
+ usbDeviceDisconnect(); // enforce re-enumeration
+ for (int i = 0; i < 250; i++)
+ { // wait 500 ms
+ wdt_reset(); // keep the watchdog happy
+ _delay_ms(10);
+ }
+ usbDeviceConnect();
+
+ sei(); // Enable interrupts after re-enumeration
+
+ while (1)
+ {
+ wdt_reset(); // keep the watchdog happy
+ usbPoll();
+
+ if (++c % 3000 == 0) PORTC^=LED_BLUE;
+ /*if ( (c / 3000) % 40 == 0)
+ {
+ PORTC &= ~LED_RED;
+ usb_disconnect();
+ }
+ else if ((c / 3000) % 40 == 20)
+ {
+ usb_reconnect();
+ PORTC |= LED_RED;
+ }*/
+ }
+
+ jump_to_bootloader();
+ return 0;
+}