From 60f405ea9727a87b41bdab4c81359e5bc961d656 Mon Sep 17 00:00:00 2001 From: schodet Date: Sun, 4 Jul 2004 19:50:15 +0000 Subject: Initial revision --- n/avr/utils/Makefile | 84 ++++++++++++++++++++++++++++++++++++++++++ n/avr/utils/README | 1 + n/avr/utils/avrconfig.h | 32 ++++++++++++++++ n/avr/utils/test_utils.c | 39 ++++++++++++++++++++ n/avr/utils/utils.h | 95 ++++++++++++++++++++++++++++++++++++++++++++++++ n/avr/utils/utils.txt | 6 +++ 6 files changed, 257 insertions(+) create mode 100644 n/avr/utils/Makefile create mode 100644 n/avr/utils/README create mode 100644 n/avr/utils/avrconfig.h create mode 100644 n/avr/utils/test_utils.c create mode 100644 n/avr/utils/utils.h create mode 100644 n/avr/utils/utils.txt diff --git a/n/avr/utils/Makefile b/n/avr/utils/Makefile new file mode 100644 index 0000000..89e18f4 --- /dev/null +++ b/n/avr/utils/Makefile @@ -0,0 +1,84 @@ +PRG = test_utils +OBJECTS = test_utils.o +DOC = utils.html +EXTRACTDOC = utils.h avrconfig.h +# atmega8, atmega8535, atmega128... +MCU_TARGET = atmega8 +# -O2 : speed +# -Os : size +OPTIMIZE = -O2 + +DEFS = +LIBS = + +# You should not have to change anything below here. + +CC = avr-gcc + +CFLAGS = -g -Wall $(OPTIMIZE) -mmcu=$(MCU_TARGET) +CPPFLAGS = $(DEFS) +LDFLAGS = -Wl,-Map,$(PRG).map + +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump + +all: elf lst hex + +elf: $(PRG).elf +lst: $(PRG).lst + +$(PRG).elf: $(OBJECTS) + $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ $(LIBS) + +%.lst: %.elf + $(OBJDUMP) -h -S $< > $@ + +clean: + rm -f *.o $(PRG).elf *.bak $(DOC) *.exd + rm -f *.lst *.map $(EXTRA_CLEAN_FILES) + rm -f $(PRG).hex $(PRG).bin $(PRG).srec $(PRG)_eeprom.hex $(PRG)_eeprom.bin $(PRG)_eeprom.srec + +# Rules for building the doc. + +doc: $(DOC) + +%.html: %.txt %.exd + aft $< + +%.exd: $(EXTRACTDOC) + test -n "$^" && extractdoc $^ > $@ || true + +# Rules for building the .text rom images. + +text: hex bin srec + +hex: $(PRG).hex +bin: $(PRG).bin +srec: $(PRG).srec + +%.hex: %.elf + $(OBJCOPY) -j .text -j .data -O ihex $< $@ + +%.srec: %.elf + $(OBJCOPY) -j .text -j .data -O srec $< $@ + +%.bin: %.elf + $(OBJCOPY) -j .text -j .data -O binary $< $@ + +# Rules for building the .eeprom rom images. + +eeprom: ehex ebin esrec + +ehex: $(PRG)_eeprom.hex +ebin: $(PRG)_eeprom.bin +esrec: $(PRG)_eeprom.srec + +%_eeprom.hex: %.elf + $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@ + +%_eeprom.srec: %.elf + $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O srec $< $@ + +%_eeprom.bin: %.elf + $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O binary $< $@ + diff --git a/n/avr/utils/README b/n/avr/utils/README new file mode 100644 index 0000000..2c9e033 --- /dev/null +++ b/n/avr/utils/README @@ -0,0 +1 @@ +n.avr.utils - AVR utilities module. diff --git a/n/avr/utils/avrconfig.h b/n/avr/utils/avrconfig.h new file mode 100644 index 0000000..62e4f81 --- /dev/null +++ b/n/avr/utils/avrconfig.h @@ -0,0 +1,32 @@ +#ifndef avrconfig_h +#define avrconfig_h +/* avrconfig.h - config file for avr projects. */ +/* n.avr.utils - AVR utilities module. {{{ + * + * Copyright (C) 2004 Nicolas Schodet + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * 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, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * Contact : + * Web: http://perso.efrei.fr/~schodet/ + * Email: + * }}} */ + +/* global */ +/** AVR Frequency : 1000000, 1843200, 2000000, 3686400, 4000000, 7372800, + * 8000000, 11059200, 14745600, 16000000, 18432000, 20000000. */ +#define AC_FREQ 14745600 + +#endif /* avrconfig_h */ diff --git a/n/avr/utils/test_utils.c b/n/avr/utils/test_utils.c new file mode 100644 index 0000000..27d5627 --- /dev/null +++ b/n/avr/utils/test_utils.c @@ -0,0 +1,39 @@ +/* test_utils.c */ +/* n.avr.utils - AVR utilities module. {{{ + * + * Copyright (C) 2004 Nicolas Schodet + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * 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, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * Contact : + * Web: http://perso.efrei.fr/~schodet/ + * Email: + * }}} */ +#include "utils.h" + +/* +AutoDec */ +/* -AutoDec */ + +int +main (void) +{ + //delay_ns (1); + //delay_ns (1000); + //delay_ns (1000000); + //delay_s (1); + delay_s (60); + while (1) + ; +} diff --git a/n/avr/utils/utils.h b/n/avr/utils/utils.h new file mode 100644 index 0000000..a2f9eb0 --- /dev/null +++ b/n/avr/utils/utils.h @@ -0,0 +1,95 @@ +#ifndef utils_h +#define utils_h +// utils.h +// n.avr.utils - AVR utilities module. {{{ +// +// Copyright (C) 2004 Nicolas Schodet +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// 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, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// +// Contact : +// Web: http://perso.efrei.fr/~schodet/ +// Email: +// }}} +#include "avrconfig.h" + +#include +#include + +/** Delay in ns. Do not call this macro with a variable parameter. If you + * want a variable delay, prefer looping over a fixed delay. + * + * Maximum delay is about 3.3s at 20MHz. + * + * Should be a inline function, but GCC do not inline like I want. + */ +#define delay_ns(ns_) \ +do { \ + static const uint32_t ns = (ns_); \ + static const uint32_t t = 1000000000lu / AC_FREQ; \ + static const uint32_t t8 = t * 255 * 3; \ + static const uint32_t t16 = t * 65535 * 4; \ + if (ns <= t) \ + { \ + /* Delay shorter than 1 instruction. */ \ + asm volatile ("nop" : :); \ + } \ + else if (ns <= t * 2) \ + { \ + /* Delay shorter than 2 instruction. */ \ + asm volatile ("nop\n\tnop" : :); \ + } \ + else if (ns <= t * 3) \ + { \ + /* Delay shorter than 3 instruction. */ \ + asm volatile ("nop\n\tnop\n\tnop" : :); \ + } \ + else if (ns <= t8) \ + { \ + static const uint8_t b = (uint8_t) ((ns + t * 3 - 1) / (t * 3)); \ + _delay_loop_1 (b); \ + } \ + else if (ns <= t16) \ + { \ + static const uint16_t b = (uint16_t) ((ns + t * 4 - 1) / (t * 4)); \ + _delay_loop_2 (b); \ + } \ + else \ + { \ + static const uint8_t ob = (uint8_t) ((ns + t16 - 1) / t16); \ + static const uint16_t ib = (uint16_t) ((ns / ob + t * 4 - 1) \ + / (t * 4)); \ + uint8_t i; \ + i = ob; \ + while (i--) \ + _delay_loop_2 (ib); \ + } \ +} while (0) + +/** Shortcut for delay_ns (us * 1000). */ +#define delay_us(us) delay_ns ((us) * 1000) + +/** Shortcut for delay_ns (ms * 1000 * 1000). */ +#define delay_ms(ms) delay_ns ((ms) * 1000 * 1000) + +/** Delay in seconds. Maximum of 256 seconds. */ +extern inline void +delay_s (uint8_t s) +{ + while (s--) + delay_ns (1000000000); +} + +#endif // utils_h diff --git a/n/avr/utils/utils.txt b/n/avr/utils/utils.txt new file mode 100644 index 0000000..4aa9a57 --- /dev/null +++ b/n/avr/utils/utils.txt @@ -0,0 +1,6 @@ +*Title: Module AVR Utilitaires +*Author: Ni + +* Doc + +*File: utils.exd -- cgit v1.2.3