/* 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 . 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 #include #include #include #include #include #include "usbdrv/usbdrv.h" #include "1wire.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; len = 130; 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 replyBuffer[129] = 0; 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; PORTC |= LED_RED | LED_GREEN; } if (c % 12000 == 0) { uint8_t result = w1_reset(); if (result == 0) { PORTC &= ~LED_GREEN; ds1992_read(0, replyBuffer, 128); } else if (result == 1) PORTC &= ~LED_RED; else PORTC &= ~(LED_RED | LED_GREEN); } /*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; }