Rolled back -b for avrdude
[makefile] / Makefile
1 ### VERSION: zo feb  2 13:21:24 CET 2014
2
3 ###
4 ### (C) copyright by J.P. Hendrix
5 ###
6
7 baudrate=19200
8 avrType=attiny45
9 avrFreq=16000000
10 xtal=true
11 programmerDev=/dev/ttyUSB003
12 programmerType=arduino
13 src=project
14
15 # GCC-option            GOOD                            BAD
16 # -Werror=address       setup();                        setup;
17 # -Werror=unused-value  DDRB = _BS(PB1) | _BS(PB2);     DDRB = _BS(PB1); _BS(PB2);
18 # -Werror=parentheses   ( a & b ) | c;                  a & b | c;
19 # -Werror=overflow      uint8_t n = ( uint8_t ) ~ 0xf5; uint8_t n = ~ 0xf5;
20 # -Werror=narrowing     char n = ( char ) ~ 0xf5;       char n = ~ 0xf5;
21
22 # gcrt1.S:195: multiple definition of `__bad_interrupt' => add flag `-nostartfiles` to elf stage
23 # http://stackoverflow.com/questions/21218690/gcrt1-s195-multiple-definition-of-bad-interrupt
24
25 cflags=-g -DF_CPU=$(avrFreq) -Wall -Os -Werror -Wextra -ffunction-sections -fdata-sections
26 ifeq ($(xtal),true)
27 cflags += -D__XTAL__
28 else
29 ifneq ($(xtal),false)
30 $(error xtal must be either 'true' or 'false')
31 endif
32 endif
33
34 memoryTypes=calibration eeprom efuse flash fuse hfuse lfuse lock signature application apptable boot prodsig usersig
35
36 SHELL := /bin/bash
37
38 ifdef baudrate
39         baud=-b$(baudrate)
40 else
41         baud=
42 endif
43
44 .PHONY: backup clean disassemble dumpelf edit eeprom elf flash fuses help hex makefile object program
45
46 help:
47         @echo 'backup           Read all known memory types from controller and write it into a file.'
48         @echo '         Available memory types: $(memoryTypes)'
49         @echo 'clean            Delete automatically created files.'
50         @echo 'disassemble      Compile source code, then disassemble object file to mnemonics.'
51         @echo 'dumpelf          Dump the contents of the .elf file. Useful for information purposes only.'
52         @echo 'edit             Edit the .cpp source file.'
53         @echo 'eeprom           Extract EEPROM data from .elf file and program the device with it.'
54         @echo 'elf              Create $(src).elf'
55         @echo 'flash            Program $(src).hex to controller flash memory.'
56         @echo 'fuses            Extract FUSES data from .elf file and program the device with it.'
57         @echo 'help             Show this text.'
58         @echo 'hex              Create all hex files for flash, eeprom and fuses.'
59         @echo "memory           Print a report of the controller's memory usage statistics."
60         @echo 'object           Create $(src).o'
61         @echo 'program          Do all programming to controller.'
62
63 edit:
64         [[ ! -f $(src).cpp ]] && echo '// VERSION: ' > $(src).cpp || true
65         vi '$(src).cpp' -s <( printf ":set number\n:1 s/^\/\/ VERSION: .*$$/\/\/ VERSION: $$(date)/g\n" )
66
67 makefile:
68         vi Makefile  -s <( printf ":set number\n:1 s/^### VERSION: .*$$/### VERSION: $$(date)/g\n" )
69
70 clean: 
71         rm $(src).elf $(src).eeprom.hex $(src).fuses.hex $(src).lfuse.hex $(src).hfuse.hex $(src).efuse.hex $(src).flash.hex $(src).o
72         date
73
74 object:
75         avr-gcc $(cflags) -mmcu=$(avrType) -Wa,-ahlmns=$(src).lst -c -o $(src).o $(src).cpp 
76
77 memory: object
78         avr-size -C --mcu=$(avrType) $(src).o
79
80 elf: object
81         avr-gcc $(cflags) -mmcu=$(avrType) -o $(src).elf $(src).o
82         chmod a-x $(src).elf 2>&1
83
84 hex:    elf
85         avr-objcopy -j .text -j .data -O ihex $(src).elf $(src).flash.hex
86         avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 -O ihex $(src).elf $(src).eeprom.hex
87         avr-objcopy -j .fuse -O ihex $(src).elf $(src).fuses.hex --change-section-lma .fuse=0
88         srec_cat $(src).fuses.hex -Intel -crop 0x00 0x01 -offset  0x00 -O $(src).lfuse.hex -Intel
89         srec_cat $(src).fuses.hex -Intel -crop 0x01 0x02 -offset -0x01 -O $(src).hfuse.hex -Intel
90         srec_cat $(src).fuses.hex -Intel -crop 0x02 0x03 -offset -0x02 -O $(src).efuse.hex -Intel
91
92 disassemble: elf
93         avr-objdump -s -j .fuse $(src).elf
94         avr-objdump -C -d $(src).elf 2>&1
95
96 eeprom: hex
97         #avrdude -p$(avrType) -c$(programmerType) -P$(programmerDev) $(baud) -v -U eeprom:w:$(src).eeprom.hex
98         date
99
100 fuses: hex
101         avrdude -p$(avrType) -c$(programmerType) -P$(programmerDev) $(baud) -v -U lfuse:w:$(src).lfuse.hex
102         #avrdude -p$(avrType) -c$(programmerType) -P$(programmerDev) $(baud) -v -U hfuse:w:$(src).hfuse.hex
103         #avrdude -p$(avrType) -c$(programmerType) -P$(programmerDev) $(baud) -v -U efuse:w:$(src).efuse.hex
104         date
105
106 dumpelf: elf
107         avr-objdump -s -h $(src).elf
108
109 program: flash eeprom fuses
110
111 flash: hex
112         avrdude -p$(avrType) -c$(programmerType) -P$(programmerDev) $(baud) -v -U flash:w:$(src).flash.hex
113         date
114
115 backup:
116         echo "$(baud)"
117         @for memory in $(memoryTypes); do \
118                 avrdude -p $(avrType) -c$(programmerType) -P$(programmerDev) $(baud) -v -U $$memory:r:./$(avrType).$$memory.hex:i; \
119         done