diff options
Diffstat (limited to 'avr/main.c')
-rw-r--r-- | avr/main.c | 164 |
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; +} |