diff options
Diffstat (limited to 'read-rom')
-rw-r--r-- | read-rom/Makefile | 47 | ||||
-rw-r--r-- | read-rom/main.c | 240 |
2 files changed, 0 insertions, 287 deletions
diff --git a/read-rom/Makefile b/read-rom/Makefile deleted file mode 100644 index c31d4ec..0000000 --- a/read-rom/Makefile +++ /dev/null @@ -1,47 +0,0 @@ -MCU ?= attiny2313 -AVRDUDE_PROGRAMMER ?= usbasp - -AVRCC ?= avr-gcc -AVRFLASH ?= avrdude -AVRNM ?= avr-nm -AVROBJCOPY ?= avr-objcopy -AVROBJDUMP ?= avr-objdump - -CFLAGS += -mmcu=attiny2313 -DF_CPU=20000000UL -#CFLAGS += -gdwarf-2 -fverbose-asm -save-temps -CFLAGS += -I. -std=gnu99 -Os -Wall -Wextra -pedantic -CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -# r28 .. r31 hold the microsecond counters -CFLAGS += -ffixed-28 -ffixed-29 -ffixed-30 -ffixed-31 -CFLAGS += -fwhole-program -flto -mstrict-X - -AVRFLAGS += -U lfuse:w:0xe4:m -U hfuse:w:0xdf:m -U efuse:w:0xff:m -AVRFLAGS += -U flash:w:main.hex -# AVRFLAGS += -U eeprom:w:main.eep - -%.hex: %.elf - ${AVROBJCOPY} -O ihex -R .eeprom $< $@ - -%.eep: %.elf - ${AVROBJCOPY} -j .eeprom --set-section-flags=.eeprom="alloc,load" \ - --change-section-lma .eeprom=0 -O ihex $< $@ - -main.elf: main.c - ${AVRCC} ${CFLAGS} -o $@ ${@:.elf=.c} -Wl,-Map=main.map,--cref - avr-size -d $@ - -program: main.hex main.eep - ${AVRFLASH} -p ${MCU} -c ${AVRDUDE_PROGRAMMER} ${AVRFLAGS} - -secsize: main.elf - ${AVROBJDUMP} -hw -j.text -j.bss -j.data main.elf - -funsize: main.elf - ${AVRNM} --print-size --size-sort main.elf - -.PHONY: program secsize funsize - -# Listing of phony targets. -.PHONY : all begin finish end sizebefore sizeafter gccversion \ -build elf hex eep lss sym coff extcoff \ -clean clean_list program debug gdb-config diff --git a/read-rom/main.c b/read-rom/main.c deleted file mode 100644 index d00ea84..0000000 --- a/read-rom/main.c +++ /dev/null @@ -1,240 +0,0 @@ -#include <avr/io.h> -#include <avr/interrupt.h> -#include <stdlib.h> - -/* - * Onewire iButton / SmartButton slave. - * Has the 64bit ID set below - * (corresponds to <https://wiki.chaosdorf.de/images/f/fc/Smartbutton.jpg>). - * - * Only supports non-overdrive READ ROM. Does not hold any data. - * - * Tested and working with a DS2482. Should mostly adhere to the standard, - * but nothing is guaranteed. - * - * Any unexpected input (SKIP ROM, overdriv, ...) may cause a hangup requiring - * an AVR reset. - */ - -#define ADDR1 0xC4 -#define ADDR2 0x00 -#define ADDR3 0x00 -#define ADDR4 0x09 -#define ADDR5 0x7d -#define ADDR6 0x79 -#define ADDR7 0x04 -#define ADDR8 0x01 - -// HCNT: r30 (ZL), r31 (ZH) -// LCNT: r28 (YL), r29 (YH) - -#define LCNTH GPIOR2 -#define LCNTL GPIOR1 -#define HCNTL GPIOR0 - -#define CNT USIDR -#define LASTCMD OCR0B -#define BUF OCR0A -#define POS OCR1A -#define APOS OCR1B -#define BYTE EEDR - -int main (void) -{ - /* watchdog reset after ~4 seconds */ - MCUSR &= ~_BV(WDRF); - WDTCSR = _BV(WDCE) | _BV(WDE); - WDTCSR = _BV(WDE) | _BV(WDP3); - - MCUCR = _BV(ISC10); - GIMSK = _BV(INT1); - - ACSR |= _BV(ACD); - - POS = 0; - APOS = 0; - DDRD = 0; - PORTD = 0; - - sei(); - - asm volatile ("ldi r28, 0"); - asm volatile ("ldi r29, 0"); - asm volatile ("ldi r30, 0"); - asm volatile ("ldi r31, 0"); - - // 1us per cycle -loop: - asm volatile ("inc r30"); // 1c - asm volatile ("adiw r28, 1"); // 2c - asm volatile ("wdr"); // 1c - asm volatile ("nop"); // 1c - asm volatile ("nop"); // 1c - asm volatile ("nop"); // 1c - goto loop; - - return 0; -} - -ISR(INT1_vect) -{ - // overhead: 19c (2.4us) - if (PIND & _BV(PD3)) { - - asm volatile ("out 0x15, r29"); // LCNTH - asm volatile ("out 0x14, r28"); // LCNTL - asm volatile ("out 0x13, r30"); // HCNTL - - // > 256us - reset - if (LCNTH > 0) { - DDRD = _BV(PD3); - - // 120us loop - r31 / r30 need not be preserved - asm volatile ("ldi r31, 0"); - asm volatile ("ldi r30, 120"); // Z = 120 - asm volatile ("wdr"); // <----- - asm volatile ("wdr"); - asm volatile ("wdr"); - asm volatile ("sbiw r30, 1"); - asm volatile ("cp r30, r1"); - asm volatile ("brne .-12"); // -^ - - DDRD = 0; - LASTCMD = 0; - BUF = 0; - POS = 0; - asm volatile ("wdr"); - EIFR |= _BV(INTF1); - } - // ~60us - write 0 - else if (LCNTL > 15) { - if (!LASTCMD) - POS++; - } - // < ~15us - write 1 OR read - else { - if (!LASTCMD) { - BUF |= _BV(POS); - POS++; - } - } - if (!LASTCMD && (POS == 7)) { - LASTCMD = BUF; - POS = 1; - APOS = 0; - BYTE = ~ADDR8; - EEAR = 0; - EIFR |= _BV(INTF1); - } - - - asm volatile ("ldi r30, 1"); // HCNTL = 1 - } - else { - if (LASTCMD == 0x33) { - - if (BYTE & POS) { - - DDRD = _BV(PD3); - - // 15us loop - r31 / r30 need not be preserved - asm volatile ("ldi r31, 0"); - asm volatile ("ldi r30, 15"); // Z = 120 - asm volatile ("wdr"); // <----- - asm volatile ("wdr"); - asm volatile ("wdr"); - asm volatile ("sbiw r30, 1"); - asm volatile ("cp r30, r1"); - asm volatile ("brne .-12"); // -^ - - DDRD = 0; - asm volatile ("wdr"); - EIFR |= _BV(INTF1); - } - if (POS != 0x80) { - POS <<= 1; - } - else { - APOS++; - POS = 1; - if (APOS == 1) - BYTE = ~ADDR7; - else if (APOS == 2) - BYTE = ~ADDR6; - else if (APOS == 3) - BYTE = ~ADDR5; - else if (APOS == 4) - BYTE = ~ADDR4; - else if (APOS == 5) - BYTE = ~ADDR3; - else if (APOS == 6) - BYTE = ~ADDR2; - else if (APOS == 7) - BYTE = ~ADDR1; - - else if (APOS == 8) { - LASTCMD = 0; - POS = 0; - } - } - } - else if (LASTCMD == 0xf0) { - - if (((EEAR == 0) && (BYTE & POS)) - || ((EEAR == 1) && !(BYTE & POS))) { - //if (BYTE & POS) { - DDRD = _BV(PD3); - - // 15us loop - r31 / r30 need not be preserved - asm volatile ("ldi r31, 0"); - asm volatile ("ldi r30, 15"); // Z = 120 - asm volatile ("wdr"); // <----- - asm volatile ("wdr"); - asm volatile ("wdr"); - asm volatile ("sbiw r30, 1"); - asm volatile ("cp r30, r1"); - asm volatile ("brne .-12"); // -^ - - DDRD = 0; - asm volatile ("wdr"); - EIFR |= _BV(INTF1); - } - if (EEAR < 2) { - EEAR++; - } - else if (POS != 0x80) { - POS <<= 1; - EEAR = 0; - } - else { - EEAR = 0; - APOS++; - POS = 1; - if (APOS == 1) - BYTE = ~ADDR7; - else if (APOS == 2) - BYTE = ~ADDR6; - else if (APOS == 3) - BYTE = ~ADDR5; - else if (APOS == 4) - BYTE = ~ADDR4; - else if (APOS == 5) - BYTE = ~ADDR3; - else if (APOS == 6) - BYTE = ~ADDR2; - else if (APOS == 7) - BYTE = ~ADDR1; - - else if (APOS == 8) { - LASTCMD = 0; - POS = 0; - } - } - - } - asm volatile ("ldi r29, 0"); // LCNTH = 0 - asm volatile ("ldi r28, 1"); // LCNTL = 1 - - } - -} |