Board-dat/CCO/CCO3626-dat/CCO3626-dat.md
... ...
@@ -1,6 +1,13 @@
1 1
2 2
# CCO3626
3 3
4
+
5
+- [[CCO3626-dat]] - [[CCO3627-dat]] - [[CCO3628-dat]] - [[CCO3629-dat]] - [[DPR1016-dat]]
6
+
7
+https://www.electrodragon.com/product-category/modules/programmer/ic-socket-programmer/
8
+
9
+
10
+
4 11
- SOP8 150 mil = 3.9 mm
5 12
- supported chips:24CXX、93CXX
6 13
Board-dat/CCO/CCO3627-dat/CCO3627-dat.md
... ...
@@ -1,6 +1,11 @@
1 1
2 2
# CCO3627-dat
3 3
4
+- [[CCO3626-dat]] - [[CCO3627-dat]] - [[CCO3628-dat]] - [[CCO3629-dat]] - [[DPR1016-dat]]
5
+
6
+https://www.electrodragon.com/product-category/modules/programmer/ic-socket-programmer/
7
+
8
+
4 9
5 10
- [[footprint-dat]]
6 11
... ...
@@ -30,4 +35,5 @@
30 35
## ref
31 36
32 37
- [[CCO3626-dat]] - [[CCO3627-dat]]
38
+
33 39
- [[CCO3627]]
... ...
\ No newline at end of file
Board-dat/CCO/CCO3628-dat/CCO3628-dat.md
... ...
@@ -1,6 +1,13 @@
1 1
2 2
# CCO3628-dat
3 3
4
+
5
+- [[CCO3626-dat]] - [[CCO3627-dat]] - [[CCO3628-dat]] - [[CCO3629-dat]] - [[DPR1016-dat]]
6
+
7
+https://www.electrodragon.com/product-category/modules/programmer/ic-socket-programmer/
8
+
9
+
10
+
4 11
- [[footprint-dat]]
5 12
6 13
Board-dat/CCO/CCO3629-dat/CCO3629-dat.md
... ...
@@ -1,6 +1,13 @@
1 1
2 2
# CCO3629-dat
3 3
4
+
5
+- [[CCO3626-dat]] - [[CCO3627-dat]] - [[CCO3628-dat]] - [[CCO3629-dat]] - [[DPR1016-dat]]
6
+
7
+https://www.electrodragon.com/product-category/modules/programmer/ic-socket-programmer/
8
+
9
+
10
+
4 11
- [[footprint-dat]]
5 12
6 13
Board-dat/DPR/DPR1016-dat/DPR1016-dat.md
... ...
@@ -9,6 +9,14 @@
9 9
10 10
### Board Map, Dimension, Pins, chip info, Use Guide, Setup Jumper, etc.
11 11
12
+- [[CCO3626-dat]] - [[CCO3627-dat]] - [[CCO3628-dat]] - [[CCO3629-dat]] - [[DPR1016-dat]]
13
+
14
+https://www.electrodragon.com/product-category/modules/programmer/ic-socket-programmer/
15
+
16
+
17
+
18
+
19
+
12 20
- [[TQFP32-dat]] - [[TQFP-dat]] - [[footprint-dat]]
13 21
14 22
covert map
Chip-cn-dat/LGT-dat/LGT8F328-SDK-DAT/2026-02-11-02-42-37.png
... ...
Binary files /dev/null and b/Chip-cn-dat/LGT-dat/LGT8F328-SDK-DAT/2026-02-11-02-42-37.png differ
Chip-cn-dat/LGT-dat/LGT8F328-SDK-DAT/2026-02-11-02-45-22.png
... ...
Binary files /dev/null and b/Chip-cn-dat/LGT-dat/LGT8F328-SDK-DAT/2026-02-11-02-45-22.png differ
Chip-cn-dat/LGT-dat/LGT8F328-SDK-DAT/2026-02-11-02-58-41.png
... ...
Binary files /dev/null and b/Chip-cn-dat/LGT-dat/LGT8F328-SDK-DAT/2026-02-11-02-58-41.png differ
Chip-cn-dat/LGT-dat/LGT8F328-SDK-DAT/LGT8F328-SDK-DAT.md
... ...
@@ -7,6 +7,65 @@
7 7
8 8
- [[VisualGDB]]
9 9
10
+- [[programmer-socket-dat]]
11
+
12
+- [[CH55x-dat]]
13
+
14
+## SWDICE
15
+
16
+![](2026-02-11-02-42-37.png)
17
+
18
+Connect your new programming device to the board to be programmed (“target”) as follows:
19
+
20
+| Programmer | Target |
21
+| ------------ | ------ |
22
+| GND | GND |
23
+| 5V | VCC |
24
+| Pin 12 (D12) | SWD |
25
+| Pin 10 (D10) | RST |
26
+| Pin 13 (D13) | SWC |
27
+
28
+
29
+- [[SWDICE-dat]]
30
+
31
+![](2026-02-11-02-45-22.png)
32
+
33
+![](2026-02-11-02-58-41.png)
34
+
35
+### SISP
36
+
37
+- connect pin 18 AVCC and pin 21 GND
38
+ SISP 模式为在线烧写模式, 可以支持 LGT 目前除 LGT8F08A 以为的所有芯片,也将
39
+支持 LGT 未来发布的芯片。这种模式下,SWDICE_mkII Pro 为 WinUSB 设备,只能够通过
40
+LGTMix_ISP 工具访问,但需要使用 3.x 以上的版本。
41
+
42
+
43
+ SISP 模式下,SWDICE_mkII Pro 在 Windows 8/10 系统下无需驱动,操作系统自带 winusb
44
+设备驱动。在 Windows XP/7 系统下, 需要安装 SWDISP_mkII 驱动程序。SWDISP_mkII 驱动
45
+可通过官网下载, 或者与我们联系获得。
46
+
47
+ 另外两种模式为调试器模式。分别用于调试 LGT8X/AVR 内核以及 MIC8X/PIC 内核系列芯
48
+片。调试器模式下,SWDICE_mkII Pro 工作于专用 USB 设备,需要由相应的开发环境以及调
49
+试器驱动支持。一般安装开发环境会同时安装调试器所需驱动,无需单独安装。
50
+
51
+### SICE
52
+
53
+ SICE 模式用于调试 LGT8X/AVR 内核芯片。包括 LGT8F08A,LGT8F88A/B,LGT8FX8D 系
54
+列芯片,以及未来所有 LGT 基于 LGT8X/AVR 内核的所有芯片。
55
+ SICE 模式下, SWDICE_mkII Pro 将会被枚举为 JTAGICE_mkII 设备,可以配合 AVRStudio
56
+4/5/6/7 或者 IAR workbench for AVR 实现芯片的在线调试。安装开发环境后,将同时安装调
57
+试器相关驱动。如果需要单独安装,可以在我们的官网下载 driver-atmel--bundle-7.0.888 驱
58
+动安装程序。
59
+
60
+### ICSP
61
+
62
+ ICSP 模式用于调试 MIC8X/PIC 内核芯片。目前 LGT 基于 MIC8X/PIC 内核的芯片包括
63
+LGT8P653A/663A,LGT8F684A。但这些芯片都不支持在线调试。因此此功能暂时不可用。在
64
+LGT 后续发布支持在线调试的 MIC8X 内核芯片,我们将提供固件升级以支持 ICSP 在线调试
65
+功能。因此对于目前的 LGT8P653/663A 以及 LGT8F684A 芯片,请使用 SISP 在线烧写模式。
66
+
67
+
68
+
10 69
## programming interface
11 70
12 71
- GND2/AREF/`SWD`/PE2
Chip-cn-dat/LGT-dat/LGT8F328-SDK-DAT/optiboot_lgt8fx8p/Makefile
... ...
@@ -0,0 +1,650 @@
1
+# Makefile for ATmegaBOOT
2
+# E.Lins, 18.7.2005
3
+# $Id$
4
+#
5
+# Instructions
6
+#
7
+# To make bootloader .hex file:
8
+# make diecimila
9
+# make lilypad
10
+# make ng
11
+# etc...
12
+#
13
+# To burn bootloader .hex file:
14
+# make diecimila_isp
15
+# make lilypad_isp
16
+# make ng_isp
17
+# etc...
18
+#
19
+# Edit History
20
+# 201303xx: WestfW: Major Makefile restructuring.
21
+# Allows options on Make command line "make xx LED=B3"
22
+# (see also pin_defs.h)
23
+# Divide into "chip" targets and "board" targets.
24
+# Most boards are (recursive) board targets with options.
25
+# Move isp target to separate makefile (fixes m8 EFUSE)
26
+# Some (many) targets will now be rebuilt when not
27
+# strictly necessary, so that options will be included.
28
+# (any "make" with options will always compile.)
29
+# Set many variables with ?= so they can be overridden
30
+# Use arduinoISP settings as default for ISP targets
31
+#
32
+
33
+#----------------------------------------------------------------------
34
+#
35
+# program name should not be changed...
36
+PROGRAM = optiboot
37
+
38
+# The default behavior is to build using tools that are in the users
39
+# current path variables, but we can also build using an installed
40
+# Arduino user IDE setup, or the Arduino source tree.
41
+# Uncomment this next lines to build within the arduino environment,
42
+# using the arduino-included avrgcc toolset (mac and pc)
43
+# ENV ?= arduinodev
44
+# OS ?= windows
45
+
46
+# export symbols to recursive makes (for ISP)
47
+export
48
+
49
+# defaults
50
+EXT_OSC = 0
51
+MCU_TARGET = atmega168
52
+LDSECTIONS = -Wl,--section-start=.text=0x3e00 -Wl,--section-start=.version=0x3ffe
53
+
54
+# Build environments
55
+# Start of some ugly makefile-isms to allow optiboot to be built
56
+# in several different environments. See the README.TXT file for
57
+# details.
58
+
59
+# default
60
+fixpath = $(1)
61
+
62
+ifeq ($(ENV), arduino)
63
+# For Arduino, we assume that we're connected to the optiboot directory
64
+# included with the arduino distribution, which means that the full set
65
+# of avr-tools are "right up there" in standard places.
66
+TOOLROOT = /Applications/Arduino.app/Contents/Resources/Java/hardware/tools/avr
67
+GCCROOT = $(TOOLROOT)/avr/bin/
68
+
69
+ifeq ($(OS), windows)
70
+# On windows, SOME of the tool paths will need to have backslashes instead
71
+# of forward slashes (because they use windows cmd.exe for execution instead
72
+# of a unix/mingw shell?) We also have to ensure that a consistent shell
73
+# is used even if a unix shell is installed (ie as part of WINAVR)
74
+fixpath = $(subst /,\,$1)
75
+SHELL = cmd.exe
76
+endif
77
+
78
+else ifeq ($(ENV), arduinodev)
79
+# Arduino IDE source code environment. Use the unpacked compilers created
80
+# by the build (you'll need to do "ant build" first.)
81
+ifeq ($(OS), macosx)
82
+TOOLROOT = ../../../../build/macosx/work/Arduino.app/Contents/Resources/Java/hardware/tools
83
+endif
84
+ifeq ($(OS), windows)
85
+TOOLROOT = ../../../../build/windows/work/hardware/tools
86
+endif
87
+
88
+GCCROOT = $(TOOLROOT)/avr/bin/
89
+AVRDUDE_CONF = -C$(TOOLROOT)/avr/etc/avrdude.conf
90
+
91
+else
92
+TOOLROOT =
93
+GCCROOT =
94
+AVRDUDE_CONF =
95
+endif
96
+
97
+STK500 = "C:\Program Files\Atmel\AVR Tools\STK500\Stk500.exe"
98
+STK500-1 = $(STK500) -e -d$(MCU_TARGET) -pf -vf -if$(PROGRAM)_$(TARGET).hex \
99
+ -lFF -LFF -f$(HFUSE)$(LFUSE) -EF8 -ms -q -cUSB -I200kHz -s -wt
100
+STK500-2 = $(STK500) -d$(MCU_TARGET) -ms -q -lCF -LCF -cUSB -I200kHz -s -wt
101
+#
102
+# End of build environment code.
103
+
104
+
105
+OBJ = $(PROGRAM).o
106
+OPTIMIZE = -Os -fno-inline-small-functions -fno-split-wide-types -mshort-calls
107
+
108
+DEFS =
109
+LIBS =
110
+
111
+CC = $(GCCROOT)avr-gcc
112
+
113
+# Override is only needed by avr-lib build system.
114
+
115
+override CFLAGS = -g -Wall $(OPTIMIZE) -mmcu=$(MCU_TARGET) -DF_CPU=$(AVR_FREQ) $(DEFS)
116
+override LDFLAGS = $(LDSECTIONS) -Wl,--relax -nostartfiles -nostdlib
117
+#-Wl,--gc-sections
118
+
119
+OBJCOPY = $(GCCROOT)avr-objcopy
120
+OBJDUMP = $(call fixpath,$(GCCROOT)avr-objdump)
121
+
122
+SIZE = $(GCCROOT)avr-size
123
+
124
+#
125
+# Make command-line Options.
126
+# Permit commands like "make atmega328 LED_START_FLASHES=10" to pass the
127
+# appropriate parameters ("-DLED_START_FLASHES=10") to gcc
128
+#
129
+
130
+ifdef BAUD_RATE
131
+BAUD_RATE_CMD = -DBAUD_RATE=$(BAUD_RATE)
132
+dummy = FORCE
133
+else
134
+#BAUD_RATE_CMD = -DBAUD_RATE=115200
135
+BAUD_RATE_CMD = -DBAUD_RATE=57600
136
+#BAUD_RATE_CMD = -DBAUD_RATE=38400
137
+#BAUD_RATE_CMD = -DBAUD_RATE=19200
138
+endif
139
+
140
+#
141
+# External crystal
142
+#
143
+
144
+ifdef EXT_OSC
145
+OSC_CMD = -DEXT_OSC=$(EXT_OSC)
146
+else
147
+OSC_CMD = -DEXT_OSC=0
148
+endif
149
+
150
+ifdef LED_START_FLASHES
151
+LED_START_FLASHES_CMD = -DLED_START_FLASHES=$(LED_START_FLASHES)
152
+dummy = FORCE
153
+else
154
+LED_START_FLASHES_CMD = -DLED_START_FLASHES=3
155
+endif
156
+
157
+# BIG_BOOT: Include extra features, up to 1K.
158
+ifdef BIGBOOT
159
+BIGBOOT_CMD = -DBIGBOOT=1
160
+dummy = FORCE
161
+endif
162
+
163
+ifdef SOFT_UART
164
+SOFT_UART_CMD = -DSOFT_UART=1
165
+dummy = FORCE
166
+endif
167
+
168
+ifdef LED_DATA_FLASH
169
+LED_DATA_FLASH_CMD = -DLED_DATA_FLASH=1
170
+dummy = FORCE
171
+#else
172
+#LED_DATA_FLASH_CMD= -DLED_DATA_FLASH=1
173
+endif
174
+
175
+ifdef LED
176
+LED_CMD = -DLED=$(LED)
177
+dummy = FORCE
178
+endif
179
+
180
+ifdef SINGLESPEED
181
+SSCMD = -DSINGLESPEED=1
182
+endif
183
+
184
+COMMON_OPTIONS = $(BAUD_RATE_CMD) $(LED_START_FLASHES_CMD) $(BIGBOOT_CMD)
185
+COMMON_OPTIONS += $(SOFT_UART_CMD) $(LED_DATA_FLASH_CMD) $(LED_CMD) $(SSCMD)
186
+COMMON_OPTIONS += $(OSC_CMD)
187
+
188
+#UART is handled separately and only passed for devices with more than one.
189
+ifdef UART
190
+UARTCMD = -DUART=$(UART)
191
+endif
192
+
193
+# Not supported yet
194
+# ifdef SUPPORT_EEPROM
195
+# SUPPORT_EEPROM_CMD = -DSUPPORT_EEPROM
196
+# dummy = FORCE
197
+# endif
198
+
199
+# Not supported yet
200
+# ifdef TIMEOUT_MS
201
+# TIMEOUT_MS_CMD = -DTIMEOUT_MS=$(TIMEOUT_MS)
202
+# dummy = FORCE
203
+# endif
204
+#
205
+
206
+#---------------------------------------------------------------------------
207
+# "Chip-level Platform" targets.
208
+# A "Chip-level Platform" compiles for a particular chip, but probably does
209
+# not have "standard" values for things like clock speed, LED pin, etc.
210
+# Makes for chip-level platforms should usually explicitly define their
211
+# options like: "make atmega1285 AVR_FREQ=16000000L LED=D0"
212
+#---------------------------------------------------------------------------
213
+#
214
+# Note about fuses:
215
+# the efuse should really be 0xf8; since, however, only the lower
216
+# three bits of that byte are used on the atmega168, avrdude gets
217
+# confused if you specify 1's for the higher bits, see:
218
+# http://tinker.it/now/2007/02/24/the-tale-of-avrdude-atmega168-and-extended-bits-fuses/
219
+#
220
+# similarly, the lock bits should be 0xff instead of 0x3f (to
221
+# unlock the bootloader section) and 0xcf instead of 0x2f (to
222
+# lock it), but since the high two bits of the lock byte are
223
+# unused, avrdude would get confused.
224
+#---------------------------------------------------------------------------
225
+#
226
+
227
+# Test platforms
228
+# Virtual boot block test
229
+virboot328: TARGET = atmega328
230
+virboot328: MCU_TARGET = atmega328p
231
+virboot328: CFLAGS += $(COMMON_OPTIONS) '-DVIRTUAL_BOOT'
232
+virboot328: AVR_FREQ ?= 16000000L
233
+virboot328: LDSECTIONS = -Wl,--section-start=.text=0x7e00 -Wl,--section-start=.version=0x7ffe
234
+virboot328: $(PROGRAM)_atmega328.hex
235
+virboot328: $(PROGRAM)_atmega328.lst
236
+
237
+# Diecimila, Duemilanove with m168, and NG use identical bootloaders
238
+# Call it "atmega168" for generality and clarity, keep "diecimila" for
239
+# backward compatibility of makefile
240
+#
241
+atmega168: TARGET = atmega168
242
+atmega168: MCU_TARGET = atmega168
243
+atmega168: CFLAGS += $(COMMON_OPTIONS)
244
+atmega168: AVR_FREQ ?= 16000000L
245
+atmega168: $(PROGRAM)_atmega168.hex
246
+atmega168: $(PROGRAM)_atmega168.lst
247
+
248
+atmega168_isp: atmega168
249
+atmega168_isp: TARGET = atmega168
250
+# 2.7V brownout
251
+atmega168_isp: HFUSE ?= DD
252
+# Low power xtal (16MHz) 16KCK/14CK+65ms
253
+atmega168_isp: LFUSE ?= FF
254
+# 512 byte boot
255
+atmega168_isp: EFUSE ?= 04
256
+atmega168_isp: isp
257
+
258
+atmega328: TARGET = atmega328
259
+atmega328: MCU_TARGET = atmega328p
260
+atmega328: CFLAGS += $(COMMON_OPTIONS)
261
+atmega328: AVR_FREQ ?= 16000000L
262
+atmega328: LDSECTIONS = -Wl,--section-start=.text=0x7e00 -Wl,--section-start=.version=0x7ffe
263
+atmega328: $(PROGRAM)_atmega328.hex
264
+atmega328: $(PROGRAM)_atmega328.lst
265
+
266
+atmega328_isp: atmega328
267
+atmega328_isp: TARGET = atmega328
268
+atmega328_isp: MCU_TARGET = atmega328p
269
+# 512 byte boot, SPIEN
270
+atmega328_isp: HFUSE ?= DE
271
+# Low power xtal (16MHz) 16KCK/14CK+65ms
272
+atmega328_isp: LFUSE ?= FF
273
+# 2.7V brownout
274
+atmega328_isp: EFUSE ?= FD
275
+atmega328_isp: isp
276
+
277
+atmega644p: TARGET = atmega644p
278
+atmega644p: MCU_TARGET = atmega644p
279
+atmega644p: CFLAGS += $(COMMON_OPTIONS) -DBIGBOOT $(LED_CMD)
280
+atmega644p: AVR_FREQ ?= 16000000L
281
+atmega644p: LDSECTIONS = -Wl,--section-start=.text=0xfc00 -Wl,--section-start=.version=0xfffe
282
+atmega644p: CFLAGS += $(UARTCMD)
283
+atmega644p: $(PROGRAM)_atmega644p.hex
284
+atmega644p: $(PROGRAM)_atmega644p.lst
285
+
286
+atmega1284: TARGET = atmega1284p
287
+atmega1284: MCU_TARGET = atmega1284p
288
+atmega1284: CFLAGS += $(COMMON_OPTIONS) -DBIGBOOT $(LED_CMD)
289
+atmega1284: AVR_FREQ ?= 16000000L
290
+atmega1284: LDSECTIONS = -Wl,--section-start=.text=0x1fc00 -Wl,--section-start=.version=0x1fffe
291
+atmega1284: CFLAGS += $(UARTCMD)
292
+atmega1284: $(PROGRAM)_atmega1284p.hex
293
+atmega1284: $(PROGRAM)_atmega1284p.lst
294
+
295
+atmega1284p: atmega1284
296
+
297
+atmega1284_isp: atmega1284
298
+atmega1284_isp: TARGET = atmega1284p
299
+atmega1284_isp: MCU_TARGET = atmega1284p
300
+# 1024 byte boot
301
+atmega1284_isp: HFUSE ?= DE
302
+# Full Swing xtal (16MHz) 16KCK/14CK+65ms
303
+atmega1284_isp: LFUSE ?= F7
304
+# 2.7V brownout
305
+atmega1284_isp: EFUSE ?= FD
306
+atmega1284_isp: isp
307
+
308
+#Atmega1280
309
+atmega1280: MCU_TARGET = atmega1280
310
+atmega1280: CFLAGS += $(COMMON_OPTIONS) -DBIGBOOT $(UART_CMD)
311
+atmega1280: AVR_FREQ ?= 16000000L
312
+atmega1280: LDSECTIONS = -Wl,--section-start=.text=0x1fc00 -Wl,--section-start=.version=0x1fffe
313
+atmega1280: $(PROGRAM)_atmega1280.hex
314
+atmega1280: $(PROGRAM)_atmega1280.lst
315
+
316
+
317
+# ATmega8
318
+#
319
+atmega8: TARGET = atmega8
320
+atmega8: MCU_TARGET = atmega8
321
+atmega8: CFLAGS += $(COMMON_OPTIONS)
322
+atmega8: AVR_FREQ ?= 16000000L
323
+atmega8: LDSECTIONS = -Wl,--section-start=.text=0x1e00 -Wl,--section-start=.version=0x1ffe
324
+atmega8: $(PROGRAM)_atmega8.hex
325
+atmega8: $(PROGRAM)_atmega8.lst
326
+
327
+atmega8_isp: atmega8
328
+atmega8_isp: TARGET = atmega8
329
+atmega8_isp: MCU_TARGET = atmega8
330
+# SPIEN, CKOPT (for full swing xtal), Bootsize=512B
331
+atmega8_isp: HFUSE ?= CC
332
+# 2.7V brownout, 16MHz Xtal, 16KCK/14CK+65ms
333
+atmega8_isp: LFUSE ?= BF
334
+atmega8_isp: isp
335
+
336
+# LGT8F328P
337
+#
338
+lgt8f328p: EXT_OSC ?= 0
339
+lgt8f328p: TARGET = lgt8f328p
340
+lgt8f328p: MCU_TARGET = atmega328p
341
+lgt8f328p: CFLAGS += $(COMMON_OPTIONS)
342
+#lgt8f328p: CFLAGS += $(COMMON_OPTIONS) '-DSOFT_UART'
343
+lgt8f328p: CFLAGS += '-DVIRTUAL_BOOT_PARTITION'
344
+lgt8f328p: AVR_FREQ ?= 16000000L
345
+lgt8f328p: LDSECTIONS = -Wl,--section-start=.bootv=0x0
346
+lgt8f328p: LDSECTIONS += -Wl,--section-start=.text=0x7400 -Wl,--section-start=.version=0x77fe
347
+lgt8f328p: $(PROGRAM)_lgt8f328p.elf
348
+lgt8f328p: $(PROGRAM)_lgt8f328p.hex
349
+lgt8f328p: $(PROGRAM)_lgt8f328p.lst
350
+
351
+lgt8f328p_isp: lgt8f328p
352
+lgt8f328p_isp: TARGET = lgt8f328p
353
+lgt8f328p_isp: MCU_TARGET = atmega323p
354
+lgt8f328p_isp: isp
355
+
356
+atmega32: TARGET = atmega32
357
+atmega32: MCU_TARGET = atmega32
358
+atmega32: CFLAGS += $(COMMON_OPTIONS)
359
+atmega32: AVR_FREQ ?= 11059200L
360
+atmega32: LDSECTIONS = -Wl,--section-start=.text=0x7e00 -Wl,--section-start=.version=0x7ffe
361
+atmega32: $(PROGRAM)_atmega32.hex
362
+atmega32: $(PROGRAM)_atmega32.lst
363
+
364
+atmega32_isp: atmega32
365
+atmega32_isp: TARGET = atmega32
366
+atmega32_isp: MCU_TARGET = atmega32
367
+# No OCD or JTAG, SPIEN, CKOPT (for full swing xtal), Bootsize=512B
368
+atmega32_isp: HFUSE ?= CE
369
+# 2.7V brownout, 16MHz Xtal, 16KCK/14CK+65ms
370
+atemga32_isp: LFUSE ?= BF
371
+atmega32_isp: isp
372
+
373
+#---------------------------------------------------------------------------
374
+# "Board-level Platform" targets.
375
+# A "Board-level Platform" implies a manufactured platform with a particular
376
+# AVR_FREQ, LED, and so on. Parameters are not particularly changable from
377
+# the "make" command line.
378
+# Most of the board-level platform builds should envoke make recursively
379
+# appropriate specific options
380
+#---------------------------------------------------------------------------
381
+# 20MHz clocked platforms
382
+#
383
+# These are capable of 230400 baud, or 115200 baud on PC (Arduino Avrdude issue)
384
+#
385
+
386
+pro20: TARGET = pro_20mhz
387
+pro20: CHIP = atmega168
388
+pro20:
389
+ $(MAKE) atmega168 AVR_FREQ=20000000L LED_START_FLASHES=3
390
+ mv $(PROGRAM)_$(CHIP).hex $(PROGRAM)_$(TARGET).hex
391
+ mv $(PROGRAM)_$(CHIP).lst $(PROGRAM)_$(TARGET).lst
392
+
393
+pro20_isp: pro20
394
+pro20_isp: TARGET = pro_20mhz
395
+# 2.7V brownout
396
+pro20_isp: HFUSE ?= DD
397
+# Full swing xtal (20MHz) 258CK/14CK+4.1ms
398
+pro20_isp: LFUSE ?= C6
399
+# 512 byte boot
400
+pro20_isp: EFUSE ?= 04
401
+pro20_isp: isp
402
+
403
+# 16MHz clocked platforms
404
+#
405
+# These are capable of 230400 baud, or 115200 baud on PC (Arduino Avrdude issue)
406
+#
407
+
408
+pro16: TARGET = pro_16MHz
409
+pro16: CHIP = atmega168
410
+pro16:
411
+ $(MAKE) $(CHIP) AVR_FREQ=16000000L LED_START_FLASHES=3
412
+ mv $(PROGRAM)_$(CHIP).hex $(PROGRAM)_$(TARGET).hex
413
+ mv $(PROGRAM)_$(CHIP).lst $(PROGRAM)_$(TARGET).lst
414
+
415
+pro16_isp: pro16
416
+pro16_isp: TARGET = pro_16MHz
417
+# 2.7V brownout
418
+pro16_isp: HFUSE ?= DD
419
+# Full swing xtal (20MHz) 258CK/14CK+4.1ms
420
+pro16_isp: LFUSE ?= C6
421
+# 512 byte boot
422
+pro16_isp: EFUSE ?= 04
423
+pro16_isp: isp
424
+
425
+diecimila: TARGET = diecimila
426
+diecimila: CHIP = atmega168
427
+diecimila:
428
+ $(MAKE) $(CHIP) AVR_FREQ=16000000L LED_START_FLASHES=3
429
+ mv $(PROGRAM)_$(CHIP).hex $(PROGRAM)_$(TARGET).hex
430
+ mv $(PROGRAM)_$(CHIP).lst $(PROGRAM)_$(TARGET).lst
431
+
432
+diecimila_isp: diecimila
433
+diecimila_isp: TARGET = diecimila
434
+# 2.7V brownout
435
+diecimila_isp: HFUSE ?= DD
436
+# Low power xtal (16MHz) 16KCK/14CK+65ms
437
+diecimila_isp: LFUSE ?= FF
438
+# 512 byte boot
439
+diecimila_isp: EFUSE ?= 04
440
+diecimila_isp: isp
441
+
442
+# Sanguino has a minimum boot size of 1024 bytes, so enable extra functions
443
+#
444
+sanguino: TARGET = $@
445
+sanguino: CHIP = atmega644p
446
+sanguino:
447
+ $(MAKE) $(CHIP) AVR_FREQ=16000000L LED=B0
448
+ mv $(PROGRAM)_$(CHIP).hex $(PROGRAM)_$(TARGET).hex
449
+ mv $(PROGRAM)_$(CHIP).lst $(PROGRAM)_$(TARGET).lst
450
+
451
+sanguino_isp: sanguino
452
+sanguino_isp: TARGET = sanguino
453
+sanguino_isp: MCU_TARGET = atmega644p
454
+# 1024 byte boot
455
+sanguino_isp: HFUSE ?= DE
456
+# Full swing xtal (16MHz) 16KCK/14CK+65ms
457
+sanguino_isp: LFUSE ?= F7
458
+# 2.7V brownout
459
+sanguino_isp: EFUSE ?= FD
460
+sanguino_isp: isp
461
+
462
+mighty1284: TARGET = $@
463
+mighty1284: CHIP = atmega1284p
464
+mighty1284:
465
+ $(MAKE) $(CHIP) AVR_FREQ=16000000L LED=B7
466
+ mv $(PROGRAM)_$(CHIP).hex $(PROGRAM)_$(TARGET).hex
467
+ mv $(PROGRAM)_$(CHIP).lst $(PROGRAM)_$(TARGET).lst
468
+
469
+mighty1284_isp: mighty1284
470
+mighty1284_isp: TARGET = mighty1284
471
+mighty1284_isp: MCU_TARGET = atmega1284p
472
+# 1024 byte boot
473
+mighty1284_isp: HFUSE ?= DE
474
+# Full swing xtal (16MHz) 16KCK/14CK+65ms
475
+mighty1284_isp: LFUSE ?= F7
476
+# 2.7V brownout
477
+mighty1284_isp: EFUSE ?= FD
478
+mighty1284_isp: isp
479
+
480
+bobuino: TARGET = $@
481
+bobuino: CHIP = atmega1284p
482
+bobuino:
483
+ $(MAKE) $(CHIP) AVR_FREQ=16000000L LED=B5
484
+ mv $(PROGRAM)_$(CHIP).hex $(PROGRAM)_$(TARGET).hex
485
+ mv $(PROGRAM)_$(CHIP).lst $(PROGRAM)_$(TARGET).lst
486
+
487
+bobuino_isp: bobuino
488
+bobuino_isp: TARGET = bobuino
489
+bobuino_isp: MCU_TARGET = atmega1284p
490
+# 1024 byte boot
491
+bobuino_isp: HFUSE ?= DE
492
+# Full swing xtal (16MHz) 16KCK/14CK+65ms
493
+bobuino_isp: LFUSE ?= F7
494
+# 2.7V brownout
495
+bobuino_isp: EFUSE ?= FD
496
+bobuino_isp: isp
497
+
498
+# MEGA1280 Board (this is different from the atmega1280 chip platform)
499
+# Mega has a minimum boot size of 1024 bytes, so enable extra functions
500
+# Note that optiboot does not (can not) work on the MEGA2560
501
+#mega: TARGET = atmega1280
502
+mega1280: atmega1280
503
+
504
+
505
+mega1280_isp: mega1280
506
+mega1280_isp: TARGET = atmega1280
507
+mega1280_isp: MCU_TARGET = atmega1280
508
+# 1024 byte boot
509
+mega1280_isp: HFUSE ?= DE
510
+# Low power xtal (16MHz) 16KCK/14CK+65ms
511
+mega1280_isp: LFUSE ?= FF
512
+# 2.7V brownout; wants F5 for some reason...
513
+mega1280_isp: EFUSE ?= F5
514
+mega1280_isp: isp
515
+
516
+# 8MHz clocked platforms
517
+#
518
+# These are capable of 115200 baud
519
+# Note that "new" Arduinos with an AVR as USB/Serial converter will NOT work
520
+# with an 8MHz target Arduino. The bitrate errors are in opposite directions,
521
+# and total too large a number.
522
+#
523
+
524
+lilypad: TARGET = $@
525
+lilypad: CHIP = atmega168
526
+lilypad:
527
+ $(MAKE) $(CHIP) AVR_FREQ=8000000L LED_START_FLASHES=3
528
+ mv $(PROGRAM)_$(CHIP).hex $(PROGRAM)_$(TARGET).hex
529
+ mv $(PROGRAM)_$(CHIP).lst $(PROGRAM)_$(TARGET).lst
530
+
531
+lilypad_isp: lilypad
532
+lilypad_isp: TARGET = lilypad
533
+# 2.7V brownout
534
+lilypad_isp: HFUSE ?= DD
535
+# Internal 8MHz osc (8MHz) Slow rising power
536
+lilypad_isp: LFUSE ?= E2
537
+# 512 byte boot
538
+lilypad_isp: EFUSE ?= 04
539
+lilypad_isp: isp
540
+
541
+# lilypad_resonator is the same as a 8MHz lilypad, except for fuses.
542
+lilypad_resonator: lilypad
543
+
544
+lilypad_resonator_isp: lilypad
545
+lilypad_resonator_isp: TARGET = lilypad
546
+# 2.7V brownout
547
+lilypad_resonator_isp: HFUSE ?= DD
548
+# Full swing xtal (20MHz) 258CK/14CK+4.1ms
549
+lilypad_resonator_isp: LFUSE ?= C6
550
+# 512 byte boot
551
+lilypad_resonator_isp: EFUSE ?= 04
552
+lilypad_resonator_isp: isp
553
+
554
+pro8: TARGET = pro_8MHz
555
+pro8: CHIP = atmega168
556
+pro8:
557
+ $(MAKE) $(CHIP) AVR_FREQ=8000000L LED_START_FLASHES=3
558
+ mv $(PROGRAM)_$(CHIP).hex $(PROGRAM)_$(TARGET).hex
559
+ mv $(PROGRAM)_$(CHIP).lst $(PROGRAM)_$(TARGET).lst
560
+
561
+pro8_isp: pro8
562
+pro8_isp: TARGET = pro_8MHz
563
+# 2.7V brownout
564
+pro8_isp: HFUSE ?= DD
565
+# Full swing xtal (20MHz) 258CK/14CK+4.1ms
566
+pro8_isp: LFUSE ?= C6
567
+# 512 byte boot
568
+pro8_isp: EFUSE ?= 04
569
+pro8_isp: isp
570
+
571
+atmega328_pro8: TARGET = atmega328_pro_8MHz
572
+atmega328_pro8: CHIP = atmega328
573
+atmega328_pro8:
574
+ $(MAKE) $(CHIP) AVR_FREQ=8000000L LED_START_FLASHES=3
575
+ mv $(PROGRAM)_$(CHIP).hex $(PROGRAM)_$(TARGET).hex
576
+ mv $(PROGRAM)_$(CHIP).lst $(PROGRAM)_$(TARGET).lst
577
+
578
+atmega328_pro8_isp: atmega328_pro8
579
+atmega328_pro8_isp: TARGET = atmega328_pro_8MHz
580
+atmega328_pro8_isp: MCU_TARGET = atmega328p
581
+# 512 byte boot, SPIEN
582
+atmega328_pro8_isp: HFUSE ?= DE
583
+# Low power xtal (16MHz) 16KCK/14CK+65ms
584
+atmega328_pro8_isp: LFUSE ?= FF
585
+# 2.7V brownout
586
+atmega328_pro8_isp: EFUSE ?= DE
587
+atmega328_pro8_isp: isp
588
+
589
+# 1MHz clocked platforms
590
+#
591
+# These are capable of 9600 baud
592
+#
593
+
594
+luminet: TARGET = luminet
595
+luminet: MCU_TARGET = attiny84
596
+luminet: CFLAGS += $(COMMON_OPTIONS) '-DSOFT_UART' '-DBAUD_RATE=9600'
597
+luminet: CFLAGS += '-DVIRTUAL_BOOT_PARTITION'
598
+luminet: AVR_FREQ ?= 1000000L
599
+luminet: LDSECTIONS = -Wl,--section-start=.text=0x1d00 -Wl,--section-start=.version=0x1efe
600
+luminet: $(PROGRAM)_luminet.hex
601
+luminet: $(PROGRAM)_luminet.lst
602
+
603
+luminet_isp: luminet
604
+luminet_isp: TARGET = luminet
605
+luminet_isp: MCU_TARGET = attiny84
606
+# Brownout disabled
607
+luminet_isp: HFUSE ?= DF
608
+# 1MHz internal oscillator, slowly rising power
609
+luminet_isp: LFUSE ?= 62
610
+# Self-programming enable
611
+luminet_isp: EFUSE ?= FE
612
+luminet_isp: isp
613
+
614
+
615
+#---------------------------------------------------------------------------
616
+#
617
+# Generic build instructions
618
+#
619
+
620
+FORCE:
621
+
622
+baudcheck: FORCE
623
+ - @$(CC) $(CFLAGS) -E baudcheck.c -o baudcheck.tmp.sh
624
+ - @sh baudcheck.tmp.sh
625
+
626
+isp: $(TARGET)
627
+ $(MAKE) -f Makefile.isp isp TARGET=$(TARGET)
628
+
629
+isp-stk500: $(PROGRAM)_$(TARGET).hex
630
+ $(STK500-1)
631
+ $(STK500-2)
632
+
633
+%.elf: $(OBJ) baudcheck $(dummy)
634
+ $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< $(LIBS)
635
+ $(SIZE) $@
636
+
637
+clean:
638
+ rm -rf *.o *.elf *.lst *.map *.sym *.lss *.eep *.srec *.bin *.hex *.tmp.sh
639
+
640
+%.lst: %.elf
641
+ $(OBJDUMP) -h -S $< > $@
642
+
643
+%.hex: %.elf
644
+ $(OBJCOPY) -j .bootv -j .text -j .data -j .version --set-section-flags .version=alloc,load --set-section-flags .bootv=alloc,load -O ihex $< $@
645
+
646
+%.srec: %.elf
647
+ $(OBJCOPY) -j .text -j .data -j .version --set-section-flags .version=alloc,load -O srec $< $@
648
+
649
+%.bin: %.elf
650
+ $(OBJCOPY) -j .text -j .data -j .version --set-section-flags .version=alloc,load -O binary $< $@
Chip-cn-dat/LGT-dat/LGT8F328-SDK-DAT/optiboot_lgt8fx8p/Makefile.isp
... ...
@@ -0,0 +1,79 @@
1
+# Makefile.isp for Optiboot
2
+# Bill Westfield ([email protected]) March, 2013
3
+# $Id$
4
+#
5
+# Instructions:
6
+#
7
+# This is a "daughter" Makefile that burns the bootloader using a ISP
8
+# device programmer. It is designed to inherit assorted variables from
9
+# the parent optiboot "Makefile"... Using a daughter makefile makes
10
+# certain variable manipulations more obvious.
11
+#
12
+# To burn bootloader .hex file, invoke the main Makefile using:
13
+# make diecimila_isp
14
+# make lilypad_isp
15
+# make ng_isp
16
+# etc...
17
+
18
+#
19
+# Note: inherit paths/etc from parent Makefile.
20
+#
21
+
22
+#---------------------------------------------------------------------------
23
+
24
+# enter the parameters for the avrdude isp tool -b19200
25
+#
26
+
27
+# Inherit avrdude paths from top-level makefile
28
+AVRDUDE_ROOT ?= $(GCCROOT)
29
+AVRDUDE_CONF ?= -C$(TOOLROOT)/avr/etc/avrdude.conf
30
+
31
+# These are the parameters for a usb-based STK500v2 programmer.
32
+# Exact type unknown. (historical Makefile values.)
33
+#ISPTOOL = stk500v2
34
+#ISPPORT = usb
35
+#ISPSPEED = -b 115200
36
+#
37
+#
38
+# These are parameters for using an Arduino with the ArduinoISP sketch
39
+# as the programmer. On a mac, for a particular Uno as programmer.
40
+ISPTOOL ?= jtag2isp
41
+ISPPORT ?= usb
42
+ISPSPEED ?= -b19200
43
+
44
+
45
+
46
+# Not all chips have EFUSE.
47
+
48
+ifdef EFUSE
49
+EFUSE_CMD= -U efuse:w:0x$(EFUSE):m
50
+endif
51
+
52
+
53
+# There are certain complicated caused by the fact that the default state
54
+# of a fuse is a "1" rather than a "0", especially with respect to fuse bits
55
+# that have not been implemented. Those would normally not be included, but
56
+# unimplemented fuses still default to being "1"
57
+#
58
+# the efuse should really be 0xf8; since, however, only the lower
59
+# three bits of that byte are used on the atmega168, avrdude gets
60
+# confused if you specify 1's for the higher bits, see:
61
+# http://tinker.it/now/2007/02/24/the-tale-of-avrdude-atmega168-and-extended-bits-fuses/
62
+#
63
+# similarly, the lock bits should be 0xff instead of 0x3f (to
64
+# unlock the bootloader section) and 0xcf instead of 0x2f (to
65
+# lock it), but since the high two bits of the lock byte are
66
+# unused, avrdude would get confused.
67
+
68
+# Set fuses and unlock memory
69
+ISPFUSES = $(AVRDUDE_ROOT)avrdude $(AVRDUDE_CONF) -c $(ISPTOOL) \
70
+ -p $(MCU_TARGET) -P $(ISPPORT) $(ISPSPEED) \
71
+ -e -u -U lock:w:0x3f:m $(EFUSE_CMD) \
72
+ -U hfuse:w:0x$(HFUSE):m -U lfuse:w:0x$(LFUSE):m
73
+# program flash and lock memory.
74
+ISPFLASH = $(AVRDUDE_ROOT)avrdude $(AVRDUDE_CONF) -c $(ISPTOOL) \
75
+ -p $(MCU_TARGET) -P $(ISPPORT) $(ISPSPEED) \
76
+ -U flash:w:$(PROGRAM)_$(TARGET).hex
77
+
78
+isp: $(PROGRAM)_$(TARGET).hex
79
+ $(ISPFLASH)
Chip-cn-dat/LGT-dat/LGT8F328-SDK-DAT/optiboot_lgt8fx8p/README.TXT
... ...
@@ -0,0 +1,93 @@
1
+This directory contains the Optiboot small bootloader for AVR
2
+microcontrollers, somewhat modified specifically for the Arduino
3
+environment.
4
+
5
+Optiboot is more fully described here: http://code.google.com/p/optiboot/
6
+and is the work of Peter Knight (aka Cathedrow), building on work of Jason P
7
+Kyle, Spiff, and Ladyada. Arduino-specific modification are by Bill
8
+Westfield (aka WestfW)
9
+
10
+Arduino-specific issues are tracked as part of the Arduino project
11
+at http://code.google.com/p/arduino
12
+
13
+
14
+------------------------------------------------------------
15
+Building optiboot for Arduino.
16
+
17
+Production builds of optiboot for Arduino are done on a Mac in "unix mode"
18
+using CrossPack-AVR-20100115. CrossPack tracks WINAVR (for windows), which
19
+is just a package of avr-gcc and related utilities, so similar builds should
20
+work on Windows or Linux systems.
21
+
22
+One of the Arduino-specific changes is modifications to the makefile to
23
+allow building optiboot using only the tools installed as part of the
24
+Arduino environment, or the Arduino source development tree. All three
25
+build procedures should yield identical binaries (.hex files) (although
26
+this may change if compiler versions drift apart between CrossPack and
27
+the Arduino IDE.)
28
+
29
+
30
+Building Optiboot in the Arduino IDE Install.
31
+
32
+Work in the .../hardware/arduino/bootloaders/optiboot/ and use the
33
+"omake <targets>" command, which just generates a command that uses
34
+the arduino-included "make" utility with a command like:
35
+ make OS=windows ENV=arduino <targets>
36
+or make OS=macosx ENV=arduino <targets>
37
+On windows, this assumes you're using the windows command shell. If
38
+you're using a cygwin or mingw shell, or have one of those in your
39
+path, the build will probably break due to slash vs backslash issues.
40
+On a Mac, if you have the developer tools installed, you can use the
41
+Apple-supplied version of make.
42
+The makefile uses relative paths ("../../../tools/" and such) to find
43
+the programs it needs, so you need to work in the existing optiboot
44
+directory (or something created at the same "level") for it to work.
45
+
46
+
47
+Building Optiboot in the Arduino Source Development Install.
48
+
49
+In this case, there is no special shell script, and you're assumed to
50
+have "make" installed somewhere in your path.
51
+Build the Arduino source ("ant build") to unpack the tools into the
52
+expected directory.
53
+Work in Arduino/hardware/arduino/bootloaders/optiboot and use
54
+ make OS=windows ENV=arduinodev <targets>
55
+or make OS=macosx ENV=arduinodev <targets>
56
+
57
+
58
+Programming Chips Using the _isp Targets
59
+
60
+The CPU targets have corresponding ISP targets that will actuall
61
+program the bootloader into a chip. "atmega328_isp" for the atmega328,
62
+for example. These will set the fuses and lock bits as appropriate as
63
+well as uploading the bootloader code.
64
+
65
+ISP Targets in Version 5.0 and later:
66
+
67
+The isp targets are now built using a separate "Makefile.isp" makefile,
68
+which should make modification easier and more obvious. This also fixes
69
+the atmega8_isp target problem mentioned below. The default
70
+configuration assumes an ArduinoISP setup, but you will probably need to
71
+update at least the serial port, since those are different for each
72
+Arduino board and/or system/
73
+
74
+
75
+ISP Targets in Version 4.6 and earlier:
76
+
77
+The older makefiles default to using a USB programmer, but you can use a
78
+serial programmer like ArduinoISP by changing the appropriate variables
79
+when you invoke make:
80
+
81
+ make ISPTOOL=stk500v1 ISPPORT=/dev/tty.usbserial-A20e1eAN \
82
+ ISPSPEED=-b19200 atmega328_isp
83
+
84
+The "atmega8_isp" target does not currently work, because the mega8
85
+doesn't have the "extended" fuse that the generic ISP target wants to
86
+pass on to avrdude. You'll need to run avrdude manually.
87
+
88
+
89
+Standard Targets
90
+
91
+I've reduced the pre-built and source-version-controlled targets
92
+(.hex and .lst files included in the git repository) to just the
93
+three basic 16MHz targets: atmega8, atmega16, atmega328.
Chip-cn-dat/LGT-dat/LGT8F328-SDK-DAT/optiboot_lgt8fx8p/baudcheck.c
... ...
@@ -0,0 +1,50 @@
1
+/*
2
+ * baudcheck.c
3
+ * Mar, 2013 by Bill Westfield ([email protected])
4
+ * Exercises in executing arithmetic code on a system that we can't count
5
+ * on having the usual languages or tools installed.
6
+ *
7
+ * This little "C program" is run through the C preprocessor using the same
8
+ * arguments as our "real" target (which should assure that it gets the
9
+ * same values for clock speed and desired baud rate), and produces as
10
+ * output a shell script that can be run through bash, and THAT in turn
11
+ * writes the desired output...
12
+ *
13
+ * Note that the C-style comments are stripped by the C preprocessor.
14
+ */
15
+
16
+/*
17
+ * First strip any trailing "L" from the defined constants. To do this
18
+ * we need to make the constants into shell variables first.
19
+ */
20
+bpsx=BAUD_RATE
21
+bps=${bpsx/L/}
22
+fcpux=F_CPU
23
+fcpu=${fcpux/L/}
24
+
25
+// echo f_cpu = $fcpu, baud = $bps
26
+/*
27
+ * Compute the divisor
28
+ */
29
+BAUD_SETTING=$(( ( ($fcpu + $bps * 4) / (($bps * 8))) - 1 ))
30
+// echo baud setting = $BAUD_SETTING
31
+
32
+/*
33
+ * Based on the computer divisor, calculate the actual bitrate,
34
+ * And the error. Since we're all integers, we have to calculate
35
+ * the tenths part of the error separately.
36
+ */
37
+BAUD_ACTUAL=$(( ($fcpu/(8 * (($BAUD_SETTING)+1))) ))
38
+BAUD_ERROR=$(( (( 100*($bps - $BAUD_ACTUAL) ) / $bps) ))
39
+ERR_TS=$(( ((( 1000*($bps - $BAUD_ACTUAL) ) / $bps) - $BAUD_ERROR * 10) ))
40
+ERR_TENTHS=$(( ERR_TS > 0 ? ERR_TS: -ERR_TS ))
41
+
42
+/*
43
+ * Print a nice message containing the info we've calculated
44
+ */
45
+echo BAUD RATE CHECK: Desired: $bps, Real: $BAUD_ACTUAL, UBRRL = $BAUD_SETTING, Error=$BAUD_ERROR.$ERR_TENTHS\%
46
+
47
+
48
+
49
+
50
+
Chip-cn-dat/LGT-dat/LGT8F328-SDK-DAT/optiboot_lgt8fx8p/baudcheck.tmp.sh
... ...
@@ -0,0 +1,32 @@
1
+# 1 "baudcheck.c"
2
+# 1 "C:\\Users\\Administrator\\Documents\\Arduino\\hardware\\LGT\\avr\\bootloaders\\lgt8fx8p//"
3
+# 1 "<built-in>"
4
+# 1 "<command-line>"
5
+# 1 "baudcheck.c"
6
+# 20 "baudcheck.c"
7
+bpsx=57600
8
+bps=${bpsx/L/}
9
+fcpux=16000000L
10
+fcpu=${fcpux/L/}
11
+
12
+
13
+
14
+
15
+
16
+BAUD_SETTING=$(( ( ($fcpu + $bps * 4) / (($bps * 8))) - 1 ))
17
+
18
+
19
+
20
+
21
+
22
+
23
+
24
+BAUD_ACTUAL=$(( ($fcpu/(8 * (($BAUD_SETTING)+1))) ))
25
+BAUD_ERROR=$(( (( 100*($bps - $BAUD_ACTUAL) ) / $bps) ))
26
+ERR_TS=$(( ((( 1000*($bps - $BAUD_ACTUAL) ) / $bps) - $BAUD_ERROR * 10) ))
27
+ERR_TENTHS=$(( ERR_TS > 0 ? ERR_TS: -ERR_TS ))
28
+
29
+
30
+
31
+
32
+echo BAUD RATE CHECK: Desired: $bps, Real: $BAUD_ACTUAL, UBRRL = $BAUD_SETTING, Error=$BAUD_ERROR.$ERR_TENTHS\%
Chip-cn-dat/LGT-dat/LGT8F328-SDK-DAT/optiboot_lgt8fx8p/boot.h
... ...
@@ -0,0 +1,848 @@
1
+/* Modified to use out for SPM access
2
+** Peter Knight, Optiboot project http://optiboot.googlecode.com
3
+**
4
+** Todo: Tidy up
5
+**
6
+** "_short" routines execute 1 cycle faster and use 1 less word of flash
7
+** by using "out" instruction instead of "sts".
8
+**
9
+** Additional elpm variants that trust the value of RAMPZ
10
+*/
11
+
12
+/* Copyright (c) 2002, 2003, 2004, 2005, 2006, 2007 Eric B. Weddington
13
+ All rights reserved.
14
+
15
+ Redistribution and use in source and binary forms, with or without
16
+ modification, are permitted provided that the following conditions are met:
17
+
18
+ * Redistributions of source code must retain the above copyright
19
+ notice, this list of conditions and the following disclaimer.
20
+ * Redistributions in binary form must reproduce the above copyright
21
+ notice, this list of conditions and the following disclaimer in
22
+ the documentation and/or other materials provided with the
23
+ distribution.
24
+ * Neither the name of the copyright holders nor the names of
25
+ contributors may be used to endorse or promote products derived
26
+ from this software without specific prior written permission.
27
+
28
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
29
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
30
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
31
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
32
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
33
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
34
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
35
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
36
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
37
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
38
+ POSSIBILITY OF SUCH DAMAGE. */
39
+
40
+/* $Id: boot.h,v 1.27.2.3 2008/09/30 13:58:48 arcanum Exp $ */
41
+
42
+#ifndef _AVR_BOOT_H_
43
+#define _AVR_BOOT_H_ 1
44
+
45
+/** \file */
46
+/** \defgroup avr_boot <avr/boot.h>: Bootloader Support Utilities
47
+ \code
48
+ #include <avr/io.h>
49
+ #include <avr/boot.h>
50
+ \endcode
51
+
52
+ The macros in this module provide a C language interface to the
53
+ bootloader support functionality of certain AVR processors. These
54
+ macros are designed to work with all sizes of flash memory.
55
+
56
+ Global interrupts are not automatically disabled for these macros. It
57
+ is left up to the programmer to do this. See the code example below.
58
+ Also see the processor datasheet for caveats on having global interrupts
59
+ enabled during writing of the Flash.
60
+
61
+ \note Not all AVR processors provide bootloader support. See your
62
+ processor datasheet to see if it provides bootloader support.
63
+
64
+ \todo From email with Marek: On smaller devices (all except ATmega64/128),
65
+ __SPM_REG is in the I/O space, accessible with the shorter "in" and "out"
66
+ instructions - since the boot loader has a limited size, this could be an
67
+ important optimization.
68
+
69
+ \par API Usage Example
70
+ The following code shows typical usage of the boot API.
71
+
72
+ \code
73
+ #include <inttypes.h>
74
+ #include <avr/interrupt.h>
75
+ #include <avr/pgmspace.h>
76
+
77
+ void boot_program_page (uint32_t page, uint8_t *buf)
78
+ {
79
+ uint16_t i;
80
+ uint8_t sreg;
81
+
82
+ // Disable interrupts.
83
+
84
+ sreg = SREG;
85
+ cli();
86
+
87
+ eeprom_busy_wait ();
88
+
89
+ boot_page_erase (page);
90
+ boot_spm_busy_wait (); // Wait until the memory is erased.
91
+
92
+ for (i=0; i<SPM_PAGESIZE; i+=2)
93
+ {
94
+ // Set up little-endian word.
95
+
96
+ uint16_t w = *buf++;
97
+ w += (*buf++) << 8;
98
+
99
+ boot_page_fill (page + i, w);
100
+ }
101
+
102
+ boot_page_write (page); // Store buffer in flash page.
103
+ boot_spm_busy_wait(); // Wait until the memory is written.
104
+
105
+ // Reenable RWW-section again. We need this if we want to jump back
106
+ // to the application after bootloading.
107
+
108
+ boot_rww_enable ();
109
+
110
+ // Re-enable interrupts (if they were ever enabled).
111
+
112
+ SREG = sreg;
113
+ }\endcode */
114
+
115
+#include <avr/eeprom.h>
116
+#include <avr/io.h>
117
+#include <inttypes.h>
118
+#include <limits.h>
119
+
120
+/* Check for SPM Control Register in processor. */
121
+#if defined (SPMCSR)
122
+# define __SPM_REG SPMCSR
123
+#elif defined (SPMCR)
124
+# define __SPM_REG SPMCR
125
+#else
126
+# error AVR processor does not provide bootloader support!
127
+#endif
128
+
129
+
130
+/* Check for SPM Enable bit. */
131
+#if defined(SPMEN)
132
+# define __SPM_ENABLE SPMEN
133
+#elif defined(SELFPRGEN)
134
+# define __SPM_ENABLE SELFPRGEN
135
+#else
136
+# error Cannot find SPM Enable bit definition!
137
+#endif
138
+
139
+/** \ingroup avr_boot
140
+ \def BOOTLOADER_SECTION
141
+
142
+ Used to declare a function or variable to be placed into a
143
+ new section called .bootloader. This section and its contents
144
+ can then be relocated to any address (such as the bootloader
145
+ NRWW area) at link-time. */
146
+
147
+#define BOOTLOADER_SECTION __attribute__ ((section (".bootloader")))
148
+
149
+/* Create common bit definitions. */
150
+#ifdef ASB
151
+#define __COMMON_ASB ASB
152
+#else
153
+#define __COMMON_ASB RWWSB
154
+#endif
155
+
156
+#ifdef ASRE
157
+#define __COMMON_ASRE ASRE
158
+#else
159
+#define __COMMON_ASRE RWWSRE
160
+#endif
161
+
162
+/* Define the bit positions of the Boot Lock Bits. */
163
+
164
+#define BLB12 5
165
+#define BLB11 4
166
+#define BLB02 3
167
+#define BLB01 2
168
+
169
+/** \ingroup avr_boot
170
+ \def boot_spm_interrupt_enable()
171
+ Enable the SPM interrupt. */
172
+
173
+#define boot_spm_interrupt_enable() (__SPM_REG |= (uint8_t)_BV(SPMIE))
174
+
175
+/** \ingroup avr_boot
176
+ \def boot_spm_interrupt_disable()
177
+ Disable the SPM interrupt. */
178
+
179
+#define boot_spm_interrupt_disable() (__SPM_REG &= (uint8_t)~_BV(SPMIE))
180
+
181
+/** \ingroup avr_boot
182
+ \def boot_is_spm_interrupt()
183
+ Check if the SPM interrupt is enabled. */
184
+
185
+#define boot_is_spm_interrupt() (__SPM_REG & (uint8_t)_BV(SPMIE))
186
+
187
+/** \ingroup avr_boot
188
+ \def boot_rww_busy()
189
+ Check if the RWW section is busy. */
190
+
191
+#define boot_rww_busy() (__SPM_REG & (uint8_t)_BV(__COMMON_ASB))
192
+
193
+/** \ingroup avr_boot
194
+ \def boot_spm_busy()
195
+ Check if the SPM instruction is busy. */
196
+
197
+#define boot_spm_busy() (__SPM_REG & (uint8_t)_BV(__SPM_ENABLE))
198
+
199
+/** \ingroup avr_boot
200
+ \def boot_spm_busy_wait()
201
+ Wait while the SPM instruction is busy. */
202
+
203
+#define boot_spm_busy_wait() do{}while(boot_spm_busy())
204
+
205
+#define __BOOT_PAGE_ERASE (_BV(__SPM_ENABLE) | _BV(PGERS))
206
+#define __BOOT_PAGE_WRITE (_BV(__SPM_ENABLE) | _BV(PGWRT))
207
+#define __BOOT_PAGE_FILL _BV(__SPM_ENABLE)
208
+#define __BOOT_RWW_ENABLE (_BV(__SPM_ENABLE) | _BV(__COMMON_ASRE))
209
+#define __BOOT_LOCK_BITS_SET (_BV(__SPM_ENABLE) | _BV(BLBSET))
210
+
211
+#define __boot_page_fill_short(address, data) \
212
+(__extension__({ \
213
+ __asm__ __volatile__ \
214
+ ( \
215
+ "movw r0, %3\n\t" \
216
+ "out %0, %1\n\t" \
217
+ "spm\n\t" \
218
+ "clr r1\n\t" \
219
+ : \
220
+ : "i" (_SFR_IO_ADDR(__SPM_REG)), \
221
+ "r" ((uint8_t)__BOOT_PAGE_FILL), \
222
+ "z" ((uint16_t)address), \
223
+ "r" ((uint16_t)data) \
224
+ : "r0" \
225
+ ); \
226
+}))
227
+
228
+#define __boot_page_fill_normal(address, data) \
229
+(__extension__({ \
230
+ __asm__ __volatile__ \
231
+ ( \
232
+ "movw r0, %3\n\t" \
233
+ "sts %0, %1\n\t" \
234
+ "spm\n\t" \
235
+ "clr r1\n\t" \
236
+ : \
237
+ : "i" (_SFR_MEM_ADDR(__SPM_REG)), \
238
+ "r" ((uint8_t)__BOOT_PAGE_FILL), \
239
+ "z" ((uint16_t)address), \
240
+ "r" ((uint16_t)data) \
241
+ : "r0" \
242
+ ); \
243
+}))
244
+
245
+#define __boot_page_fill_alternate(address, data)\
246
+(__extension__({ \
247
+ __asm__ __volatile__ \
248
+ ( \
249
+ "movw r0, %3\n\t" \
250
+ "sts %0, %1\n\t" \
251
+ "spm\n\t" \
252
+ ".word 0xffff\n\t" \
253
+ "nop\n\t" \
254
+ "clr r1\n\t" \
255
+ : \
256
+ : "i" (_SFR_MEM_ADDR(__SPM_REG)), \
257
+ "r" ((uint8_t)__BOOT_PAGE_FILL), \
258
+ "z" ((uint16_t)address), \
259
+ "r" ((uint16_t)data) \
260
+ : "r0" \
261
+ ); \
262
+}))
263
+
264
+#define __boot_page_fill_extended(address, data) \
265
+(__extension__({ \
266
+ __asm__ __volatile__ \
267
+ ( \
268
+ "movw r0, %4\n\t" \
269
+ "movw r30, %A3\n\t" \
270
+ "sts %1, %C3\n\t" \
271
+ "sts %0, %2\n\t" \
272
+ "spm\n\t" \
273
+ "clr r1\n\t" \
274
+ : \
275
+ : "i" (_SFR_MEM_ADDR(__SPM_REG)), \
276
+ "i" (_SFR_MEM_ADDR(RAMPZ)), \
277
+ "r" ((uint8_t)__BOOT_PAGE_FILL), \
278
+ "r" ((uint32_t)address), \
279
+ "r" ((uint16_t)data) \
280
+ : "r0", "r30", "r31" \
281
+ ); \
282
+}))
283
+
284
+#define __boot_page_fill_extended_short(address, data) \
285
+(__extension__({ \
286
+ __asm__ __volatile__ \
287
+ ( \
288
+ "movw r0, %4\n\t" \
289
+ "movw r30, %A3\n\t" \
290
+ "out %1, %C3\n\t" \
291
+ "out %0, %2\n\t" \
292
+ "spm\n\t" \
293
+ "clr r1\n\t" \
294
+ : \
295
+ : "i" (_SFR_IO_ADDR(__SPM_REG)), \
296
+ "i" (_SFR_IO_ADDR(RAMPZ)), \
297
+ "r" ((uint8_t)__BOOT_PAGE_FILL), \
298
+ "r" ((uint32_t)address), \
299
+ "r" ((uint16_t)data) \
300
+ : "r0", "r30", "r31" \
301
+ ); \
302
+}))
303
+
304
+#define __boot_page_erase_short(address) \
305
+(__extension__({ \
306
+ __asm__ __volatile__ \
307
+ ( \
308
+ "out %0, %1\n\t" \
309
+ "spm\n\t" \
310
+ : \
311
+ : "i" (_SFR_IO_ADDR(__SPM_REG)), \
312
+ "r" ((uint8_t)__BOOT_PAGE_ERASE), \
313
+ "z" ((uint16_t)address) \
314
+ ); \
315
+}))
316
+
317
+
318
+#define __boot_page_erase_normal(address) \
319
+(__extension__({ \
320
+ __asm__ __volatile__ \
321
+ ( \
322
+ "sts %0, %1\n\t" \
323
+ "spm\n\t" \
324
+ : \
325
+ : "i" (_SFR_MEM_ADDR(__SPM_REG)), \
326
+ "r" ((uint8_t)__BOOT_PAGE_ERASE), \
327
+ "z" ((uint16_t)address) \
328
+ ); \
329
+}))
330
+
331
+#define __boot_page_erase_alternate(address) \
332
+(__extension__({ \
333
+ __asm__ __volatile__ \
334
+ ( \
335
+ "sts %0, %1\n\t" \
336
+ "spm\n\t" \
337
+ ".word 0xffff\n\t" \
338
+ "nop\n\t" \
339
+ : \
340
+ : "i" (_SFR_MEM_ADDR(__SPM_REG)), \
341
+ "r" ((uint8_t)__BOOT_PAGE_ERASE), \
342
+ "z" ((uint16_t)address) \
343
+ ); \
344
+}))
345
+
346
+#define __boot_page_erase_extended(address) \
347
+(__extension__({ \
348
+ __asm__ __volatile__ \
349
+ ( \
350
+ "movw r30, %A3\n\t" \
351
+ "sts %1, %C3\n\t" \
352
+ "sts %0, %2\n\t" \
353
+ "spm\n\t" \
354
+ : \
355
+ : "i" (_SFR_MEM_ADDR(__SPM_REG)), \
356
+ "i" (_SFR_MEM_ADDR(RAMPZ)), \
357
+ "r" ((uint8_t)__BOOT_PAGE_ERASE), \
358
+ "r" ((uint32_t)address) \
359
+ : "r30", "r31" \
360
+ ); \
361
+}))
362
+#define __boot_page_erase_extended_short(address) \
363
+(__extension__({ \
364
+ __asm__ __volatile__ \
365
+ ( \
366
+ "movw r30, %A3\n\t" \
367
+ "out %1, %C3\n\t" \
368
+ "out %0, %2\n\t" \
369
+ "spm\n\t" \
370
+ : \
371
+ : "i" (_SFR_IO_ADDR(__SPM_REG)), \
372
+ "i" (_SFR_IO_ADDR(RAMPZ)), \
373
+ "r" ((uint8_t)__BOOT_PAGE_ERASE), \
374
+ "r" ((uint32_t)address) \
375
+ : "r30", "r31" \
376
+ ); \
377
+}))
378
+
379
+#define __boot_page_write_short(address) \
380
+(__extension__({ \
381
+ __asm__ __volatile__ \
382
+ ( \
383
+ "out %0, %1\n\t" \
384
+ "spm\n\t" \
385
+ : \
386
+ : "i" (_SFR_IO_ADDR(__SPM_REG)), \
387
+ "r" ((uint8_t)__BOOT_PAGE_WRITE), \
388
+ "z" ((uint16_t)address) \
389
+ ); \
390
+}))
391
+
392
+#define __boot_page_write_normal(address) \
393
+(__extension__({ \
394
+ __asm__ __volatile__ \
395
+ ( \
396
+ "sts %0, %1\n\t" \
397
+ "spm\n\t" \
398
+ : \
399
+ : "i" (_SFR_MEM_ADDR(__SPM_REG)), \
400
+ "r" ((uint8_t)__BOOT_PAGE_WRITE), \
401
+ "z" ((uint16_t)address) \
402
+ ); \
403
+}))
404
+
405
+#define __boot_page_write_alternate(address) \
406
+(__extension__({ \
407
+ __asm__ __volatile__ \
408
+ ( \
409
+ "sts %0, %1\n\t" \
410
+ "spm\n\t" \
411
+ ".word 0xffff\n\t" \
412
+ "nop\n\t" \
413
+ : \
414
+ : "i" (_SFR_MEM_ADDR(__SPM_REG)), \
415
+ "r" ((uint8_t)__BOOT_PAGE_WRITE), \
416
+ "z" ((uint16_t)address) \
417
+ ); \
418
+}))
419
+
420
+#define __boot_page_write_extended(address) \
421
+(__extension__({ \
422
+ __asm__ __volatile__ \
423
+ ( \
424
+ "movw r30, %A3\n\t" \
425
+ "sts %1, %C3\n\t" \
426
+ "sts %0, %2\n\t" \
427
+ "spm\n\t" \
428
+ : \
429
+ : "i" (_SFR_MEM_ADDR(__SPM_REG)), \
430
+ "i" (_SFR_MEM_ADDR(RAMPZ)), \
431
+ "r" ((uint8_t)__BOOT_PAGE_WRITE), \
432
+ "r" ((uint32_t)address) \
433
+ : "r30", "r31" \
434
+ ); \
435
+}))
436
+#define __boot_page_write_extended_short(address) \
437
+(__extension__({ \
438
+ __asm__ __volatile__ \
439
+ ( \
440
+ "movw r30, %A3\n\t" \
441
+ "out %1, %C3\n\t" \
442
+ "out %0, %2\n\t" \
443
+ "spm\n\t" \
444
+ : \
445
+ : "i" (_SFR_IO_ADDR(__SPM_REG)), \
446
+ "i" (_SFR_IO_ADDR(RAMPZ)), \
447
+ "r" ((uint8_t)__BOOT_PAGE_WRITE), \
448
+ "r" ((uint32_t)address) \
449
+ : "r30", "r31" \
450
+ ); \
451
+}))
452
+
453
+#define __boot_rww_enable_short() \
454
+(__extension__({ \
455
+ __asm__ __volatile__ \
456
+ ( \
457
+ "out %0, %1\n\t" \
458
+ "spm\n\t" \
459
+ : \
460
+ : "i" (_SFR_IO_ADDR(__SPM_REG)), \
461
+ "r" ((uint8_t)__BOOT_RWW_ENABLE) \
462
+ ); \
463
+}))
464
+
465
+#define __boot_rww_enable() \
466
+(__extension__({ \
467
+ __asm__ __volatile__ \
468
+ ( \
469
+ "sts %0, %1\n\t" \
470
+ "spm\n\t" \
471
+ : \
472
+ : "i" (_SFR_MEM_ADDR(__SPM_REG)), \
473
+ "r" ((uint8_t)__BOOT_RWW_ENABLE) \
474
+ ); \
475
+}))
476
+
477
+#define __boot_rww_enable_alternate() \
478
+(__extension__({ \
479
+ __asm__ __volatile__ \
480
+ ( \
481
+ "sts %0, %1\n\t" \
482
+ "spm\n\t" \
483
+ ".word 0xffff\n\t" \
484
+ "nop\n\t" \
485
+ : \
486
+ : "i" (_SFR_MEM_ADDR(__SPM_REG)), \
487
+ "r" ((uint8_t)__BOOT_RWW_ENABLE) \
488
+ ); \
489
+}))
490
+
491
+/* From the mega16/mega128 data sheets (maybe others):
492
+
493
+ Bits by SPM To set the Boot Loader Lock bits, write the desired data to
494
+ R0, write "X0001001" to SPMCR and execute SPM within four clock cycles
495
+ after writing SPMCR. The only accessible Lock bits are the Boot Lock bits
496
+ that may prevent the Application and Boot Loader section from any
497
+ software update by the MCU.
498
+
499
+ If bits 5..2 in R0 are cleared (zero), the corresponding Boot Lock bit
500
+ will be programmed if an SPM instruction is executed within four cycles
501
+ after BLBSET and SPMEN (or SELFPRGEN) are set in SPMCR. The Z-pointer is
502
+ don't care during this operation, but for future compatibility it is
503
+ recommended to load the Z-pointer with $0001 (same as used for reading the
504
+ Lock bits). For future compatibility It is also recommended to set bits 7,
505
+ 6, 1, and 0 in R0 to 1 when writing the Lock bits. When programming the
506
+ Lock bits the entire Flash can be read during the operation. */
507
+
508
+#define __boot_lock_bits_set_short(lock_bits) \
509
+(__extension__({ \
510
+ uint8_t value = (uint8_t)(~(lock_bits)); \
511
+ __asm__ __volatile__ \
512
+ ( \
513
+ "ldi r30, 1\n\t" \
514
+ "ldi r31, 0\n\t" \
515
+ "mov r0, %2\n\t" \
516
+ "out %0, %1\n\t" \
517
+ "spm\n\t" \
518
+ : \
519
+ : "i" (_SFR_IO_ADDR(__SPM_REG)), \
520
+ "r" ((uint8_t)__BOOT_LOCK_BITS_SET), \
521
+ "r" (value) \
522
+ : "r0", "r30", "r31" \
523
+ ); \
524
+}))
525
+
526
+#define __boot_lock_bits_set(lock_bits) \
527
+(__extension__({ \
528
+ uint8_t value = (uint8_t)(~(lock_bits)); \
529
+ __asm__ __volatile__ \
530
+ ( \
531
+ "ldi r30, 1\n\t" \
532
+ "ldi r31, 0\n\t" \
533
+ "mov r0, %2\n\t" \
534
+ "sts %0, %1\n\t" \
535
+ "spm\n\t" \
536
+ : \
537
+ : "i" (_SFR_MEM_ADDR(__SPM_REG)), \
538
+ "r" ((uint8_t)__BOOT_LOCK_BITS_SET), \
539
+ "r" (value) \
540
+ : "r0", "r30", "r31" \
541
+ ); \
542
+}))
543
+
544
+#define __boot_lock_bits_set_alternate(lock_bits) \
545
+(__extension__({ \
546
+ uint8_t value = (uint8_t)(~(lock_bits)); \
547
+ __asm__ __volatile__ \
548
+ ( \
549
+ "ldi r30, 1\n\t" \
550
+ "ldi r31, 0\n\t" \
551
+ "mov r0, %2\n\t" \
552
+ "sts %0, %1\n\t" \
553
+ "spm\n\t" \
554
+ ".word 0xffff\n\t" \
555
+ "nop\n\t" \
556
+ : \
557
+ : "i" (_SFR_MEM_ADDR(__SPM_REG)), \
558
+ "r" ((uint8_t)__BOOT_LOCK_BITS_SET), \
559
+ "r" (value) \
560
+ : "r0", "r30", "r31" \
561
+ ); \
562
+}))
563
+
564
+/*
565
+ Reading lock and fuse bits:
566
+
567
+ Similarly to writing the lock bits above, set BLBSET and SPMEN (or
568
+ SELFPRGEN) bits in __SPMREG, and then (within four clock cycles) issue an
569
+ LPM instruction.
570
+
571
+ Z address: contents:
572
+ 0x0000 low fuse bits
573
+ 0x0001 lock bits
574
+ 0x0002 extended fuse bits
575
+ 0x0003 high fuse bits
576
+
577
+ Sounds confusing, doesn't it?
578
+
579
+ Unlike the macros in pgmspace.h, no need to care for non-enhanced
580
+ cores here as these old cores do not provide SPM support anyway.
581
+ */
582
+
583
+/** \ingroup avr_boot
584
+ \def GET_LOW_FUSE_BITS
585
+ address to read the low fuse bits, using boot_lock_fuse_bits_get
586
+ */
587
+#define GET_LOW_FUSE_BITS (0x0000)
588
+/** \ingroup avr_boot
589
+ \def GET_LOCK_BITS
590
+ address to read the lock bits, using boot_lock_fuse_bits_get
591
+ */
592
+#define GET_LOCK_BITS (0x0001)
593
+/** \ingroup avr_boot
594
+ \def GET_EXTENDED_FUSE_BITS
595
+ address to read the extended fuse bits, using boot_lock_fuse_bits_get
596
+ */
597
+#define GET_EXTENDED_FUSE_BITS (0x0002)
598
+/** \ingroup avr_boot
599
+ \def GET_HIGH_FUSE_BITS
600
+ address to read the high fuse bits, using boot_lock_fuse_bits_get
601
+ */
602
+#define GET_HIGH_FUSE_BITS (0x0003)
603
+
604
+/** \ingroup avr_boot
605
+ \def boot_lock_fuse_bits_get(address)
606
+
607
+ Read the lock or fuse bits at \c address.
608
+
609
+ Parameter \c address can be any of GET_LOW_FUSE_BITS,
610
+ GET_LOCK_BITS, GET_EXTENDED_FUSE_BITS, or GET_HIGH_FUSE_BITS.
611
+
612
+ \note The lock and fuse bits returned are the physical values,
613
+ i.e. a bit returned as 0 means the corresponding fuse or lock bit
614
+ is programmed.
615
+ */
616
+#define boot_lock_fuse_bits_get_short(address) \
617
+(__extension__({ \
618
+ uint8_t __result; \
619
+ __asm__ __volatile__ \
620
+ ( \
621
+ "ldi r30, %3\n\t" \
622
+ "ldi r31, 0\n\t" \
623
+ "out %1, %2\n\t" \
624
+ "lpm %0, Z\n\t" \
625
+ : "=r" (__result) \
626
+ : "i" (_SFR_IO_ADDR(__SPM_REG)), \
627
+ "r" ((uint8_t)__BOOT_LOCK_BITS_SET), \
628
+ "M" (address) \
629
+ : "r0", "r30", "r31" \
630
+ ); \
631
+ __result; \
632
+}))
633
+
634
+#define boot_lock_fuse_bits_get(address) \
635
+(__extension__({ \
636
+ uint8_t __result; \
637
+ __asm__ __volatile__ \
638
+ ( \
639
+ "ldi r30, %3\n\t" \
640
+ "ldi r31, 0\n\t" \
641
+ "sts %1, %2\n\t" \
642
+ "lpm %0, Z\n\t" \
643
+ : "=r" (__result) \
644
+ : "i" (_SFR_MEM_ADDR(__SPM_REG)), \
645
+ "r" ((uint8_t)__BOOT_LOCK_BITS_SET), \
646
+ "M" (address) \
647
+ : "r0", "r30", "r31" \
648
+ ); \
649
+ __result; \
650
+}))
651
+
652
+/** \ingroup avr_boot
653
+ \def boot_signature_byte_get(address)
654
+
655
+ Read the Signature Row byte at \c address. For some MCU types,
656
+ this function can also retrieve the factory-stored oscillator
657
+ calibration bytes.
658
+
659
+ Parameter \c address can be 0-0x1f as documented by the datasheet.
660
+ \note The values are MCU type dependent.
661
+*/
662
+
663
+#define __BOOT_SIGROW_READ (_BV(__SPM_ENABLE) | _BV(SIGRD))
664
+
665
+#define boot_signature_byte_get_short(addr) \
666
+(__extension__({ \
667
+ uint16_t __addr16 = (uint16_t)(addr); \
668
+ uint8_t __result; \
669
+ __asm__ __volatile__ \
670
+ ( \
671
+ "out %1, %2\n\t" \
672
+ "lpm %0, Z" "\n\t" \
673
+ : "=r" (__result) \
674
+ : "i" (_SFR_IO_ADDR(__SPM_REG)), \
675
+ "r" ((uint8_t) __BOOT_SIGROW_READ), \
676
+ "z" (__addr16) \
677
+ ); \
678
+ __result; \
679
+}))
680
+
681
+#define boot_signature_byte_get(addr) \
682
+(__extension__({ \
683
+ uint16_t __addr16 = (uint16_t)(addr); \
684
+ uint8_t __result; \
685
+ __asm__ __volatile__ \
686
+ ( \
687
+ "sts %1, %2\n\t" \
688
+ "lpm %0, Z" "\n\t" \
689
+ : "=r" (__result) \
690
+ : "i" (_SFR_MEM_ADDR(__SPM_REG)), \
691
+ "r" ((uint8_t) __BOOT_SIGROW_READ), \
692
+ "z" (__addr16) \
693
+ ); \
694
+ __result; \
695
+}))
696
+
697
+/** \ingroup avr_boot
698
+ \def boot_page_fill(address, data)
699
+
700
+ Fill the bootloader temporary page buffer for flash
701
+ address with data word.
702
+
703
+ \note The address is a byte address. The data is a word. The AVR
704
+ writes data to the buffer a word at a time, but addresses the buffer
705
+ per byte! So, increment your address by 2 between calls, and send 2
706
+ data bytes in a word format! The LSB of the data is written to the lower
707
+ address; the MSB of the data is written to the higher address.*/
708
+
709
+/** \ingroup avr_boot
710
+ \def boot_page_erase(address)
711
+
712
+ Erase the flash page that contains address.
713
+
714
+ \note address is a byte address in flash, not a word address. */
715
+
716
+/** \ingroup avr_boot
717
+ \def boot_page_write(address)
718
+
719
+ Write the bootloader temporary page buffer
720
+ to flash page that contains address.
721
+
722
+ \note address is a byte address in flash, not a word address. */
723
+
724
+/** \ingroup avr_boot
725
+ \def boot_rww_enable()
726
+
727
+ Enable the Read-While-Write memory section. */
728
+
729
+/** \ingroup avr_boot
730
+ \def boot_lock_bits_set(lock_bits)
731
+
732
+ Set the bootloader lock bits.
733
+
734
+ \param lock_bits A mask of which Boot Loader Lock Bits to set.
735
+
736
+ \note In this context, a 'set bit' will be written to a zero value.
737
+ Note also that only BLBxx bits can be programmed by this command.
738
+
739
+ For example, to disallow the SPM instruction from writing to the Boot
740
+ Loader memory section of flash, you would use this macro as such:
741
+
742
+ \code
743
+ boot_lock_bits_set (_BV (BLB11));
744
+ \endcode
745
+
746
+ \note Like any lock bits, the Boot Loader Lock Bits, once set,
747
+ cannot be cleared again except by a chip erase which will in turn
748
+ also erase the boot loader itself. */
749
+
750
+/* Normal versions of the macros use 16-bit addresses.
751
+ Extended versions of the macros use 32-bit addresses.
752
+ Alternate versions of the macros use 16-bit addresses and require special
753
+ instruction sequences after LPM.
754
+
755
+ FLASHEND is defined in the ioXXXX.h file.
756
+ USHRT_MAX is defined in <limits.h>. */
757
+
758
+#if defined(__AVR_ATmega161__) || defined(__AVR_ATmega163__) \
759
+ || defined(__AVR_ATmega323__)
760
+
761
+/* Alternate: ATmega161/163/323 and 16 bit address */
762
+#define boot_page_fill(address, data) __boot_page_fill_alternate(address, data)
763
+#define boot_page_erase(address) __boot_page_erase_alternate(address)
764
+#define boot_page_write(address) __boot_page_write_alternate(address)
765
+#define boot_rww_enable() __boot_rww_enable_alternate()
766
+#define boot_lock_bits_set(lock_bits) __boot_lock_bits_set_alternate(lock_bits)
767
+
768
+#elif (FLASHEND > USHRT_MAX)
769
+
770
+/* Extended: >16 bit address */
771
+#define boot_page_fill(address, data) __boot_page_fill_extended_short(address, data)
772
+#define boot_page_erase(address) __boot_page_erase_extended_short(address)
773
+#define boot_page_write(address) __boot_page_write_extended_short(address)
774
+#define boot_rww_enable() __boot_rww_enable_short()
775
+#define boot_lock_bits_set(lock_bits) __boot_lock_bits_set_short(lock_bits)
776
+
777
+#else
778
+
779
+/* Normal: 16 bit address */
780
+#define boot_page_fill(address, data) __boot_page_fill_short(address, data)
781
+#define boot_page_erase(address) __boot_page_erase_short(address)
782
+#define boot_page_write(address) __boot_page_write_short(address)
783
+#define boot_rww_enable() __boot_rww_enable_short()
784
+#define boot_lock_bits_set(lock_bits) __boot_lock_bits_set_short(lock_bits)
785
+
786
+#endif
787
+
788
+/** \ingroup avr_boot
789
+
790
+ Same as boot_page_fill() except it waits for eeprom and spm operations to
791
+ complete before filling the page. */
792
+
793
+#define boot_page_fill_safe(address, data) \
794
+do { \
795
+ boot_spm_busy_wait(); \
796
+ eeprom_busy_wait(); \
797
+ boot_page_fill(address, data); \
798
+} while (0)
799
+
800
+/** \ingroup avr_boot
801
+
802
+ Same as boot_page_erase() except it waits for eeprom and spm operations to
803
+ complete before erasing the page. */
804
+
805
+#define boot_page_erase_safe(address) \
806
+do { \
807
+ boot_spm_busy_wait(); \
808
+ eeprom_busy_wait(); \
809
+ boot_page_erase (address); \
810
+} while (0)
811
+
812
+/** \ingroup avr_boot
813
+
814
+ Same as boot_page_write() except it waits for eeprom and spm operations to
815
+ complete before writing the page. */
816
+
817
+#define boot_page_write_safe(address) \
818
+do { \
819
+ boot_spm_busy_wait(); \
820
+ eeprom_busy_wait(); \
821
+ boot_page_write (address); \
822
+} while (0)
823
+
824
+/** \ingroup avr_boot
825
+
826
+ Same as boot_rww_enable() except waits for eeprom and spm operations to
827
+ complete before enabling the RWW mameory. */
828
+
829
+#define boot_rww_enable_safe() \
830
+do { \
831
+ boot_spm_busy_wait(); \
832
+ eeprom_busy_wait(); \
833
+ boot_rww_enable(); \
834
+} while (0)
835
+
836
+/** \ingroup avr_boot
837
+
838
+ Same as boot_lock_bits_set() except waits for eeprom and spm operations to
839
+ complete before setting the lock bits. */
840
+
841
+#define boot_lock_bits_set_safe(lock_bits) \
842
+do { \
843
+ boot_spm_busy_wait(); \
844
+ eeprom_busy_wait(); \
845
+ boot_lock_bits_set (lock_bits); \
846
+} while (0)
847
+
848
+#endif /* _AVR_BOOT_H_ */
Chip-cn-dat/LGT-dat/LGT8F328-SDK-DAT/optiboot_lgt8fx8p/lgtx8p.h
... ...
@@ -0,0 +1,563 @@
1
+/*
2
+**
3
+** Copyright (c) 2013, LogicGreen techologies
4
+** All rights reserved.
5
+**
6
+** project : LGT8F328PBSPPrj
7
+** filename : lgt8f328p_spec.h
8
+** version : 1.0
9
+** date : Feb 01, 2017
10
+
11
+VERSION HISTORY:
12
+----------------
13
+Version : 1.0
14
+Date : Feb 01, 2017
15
+Revised by : LogicGreen Software Group
16
+Description : Original version.
17
+**
18
+*/
19
+
20
+#ifndef _LGT8F328P_SPEC_H_
21
+#define _LGT8F328P_SPEC_H_
22
+
23
+//----------------------------------------------------------------
24
+// DSU (Digital Signal Co-processor) Register Definition
25
+//----------------------------------------------------------------
26
+#define DSCR (*((volatile unsigned char *)0x20))
27
+#define DSUEN 7
28
+#define MM 6
29
+#define DSD1 5
30
+#define DSD0 4
31
+#define DSN 2
32
+#define DSZ 1
33
+#define DSC 0
34
+
35
+#define DSIR (*((volatile unsigned char *)0x21))
36
+#define DSSD (*((volatile unsigned char *)0x22))
37
+
38
+#define DSDX (*((volatile unsigned char *)0x30))
39
+#define DSDY (*((volatile unsigned char *)0x31))
40
+
41
+#define DSAL (*((volatile unsigned char *)0x58))
42
+#define DSAH (*((volatile unsigned char *)0x59))
43
+
44
+//----------------------------------------------------------------
45
+// GPIO Group C Register Definition
46
+//----------------------------------------------------------------
47
+#define PC7 7
48
+
49
+//----------------------------------------------------------------
50
+// GPIO Group E Register Definition
51
+//----------------------------------------------------------------
52
+#define IPINE (*((volatile unsigned char *)0x2C))
53
+#define IDDRE (*((volatile unsigned char *)0x2D))
54
+#define IPORTE (*((volatile unsigned char *)0x2E))
55
+
56
+#define EPINE (*((volatile unsigned char *)0xA7))
57
+#define EDDRE (*((volatile unsigned char *)0xA8))
58
+#define EPORTE (*((volatile unsigned char *)0xA9))
59
+
60
+//#define USE_EIO_EREG
61
+
62
+#ifdef USE_EIO_EREG
63
+#define PINE EPINE
64
+#define DDRE EDDRE
65
+#define PORTE EPORTE
66
+#else
67
+#define PINE IPINE
68
+#define DDRE IDDRE
69
+#define PORTE IPORTE
70
+#endif
71
+
72
+#define OCPUE (*((volatile unsigned char *)0xE1))
73
+
74
+#define PE7 7
75
+#define PE6 6
76
+#define PE5 5
77
+#define PE4 4
78
+#define PE3 3
79
+#define PE2 2
80
+#define PE1 1
81
+#define PE0 0
82
+
83
+//----------------------------------------------------------------
84
+// GPIO Group F Register Definition
85
+//----------------------------------------------------------------
86
+#define PINF (*((volatile unsigned char *)0x32))
87
+#define DDRF (*((volatile unsigned char *)0x33))
88
+#define PORTF (*((volatile unsigned char *)0x34))
89
+
90
+#define PF7 7
91
+#define PF6 6
92
+#define PF5 5
93
+#define PF4 4
94
+#define PF3 3
95
+#define PF2 2
96
+#define PF1 1
97
+#define PF0 0
98
+
99
+//----------------------------------------------------------------
100
+// SPI (Serial Periphral Interface) Register Definition
101
+//----------------------------------------------------------------
102
+#define SPFR (*((volatile unsigned char *)0x39))
103
+#define RDFULL 7
104
+#define RDEMPT 6
105
+#define RDPTR1 5
106
+#define RDPTR0 4
107
+#define WRFULL 3
108
+#define WREMPT 2
109
+#define WRPTR1 1
110
+#define WRPTR0 0
111
+
112
+// Bits of SPSR
113
+#define DUAL 2
114
+
115
+//----------------------------------------------------------------
116
+// AC0 (Analog Comparator 0) Register Definition
117
+//----------------------------------------------------------------
118
+#define C0SR (*((volatile unsigned char *)0x50))
119
+#define C0D 7
120
+#define C0BG 6
121
+#define C0O 5
122
+#define C0I 4
123
+#define C0IE 3
124
+#define C0IC 2
125
+#define C0IS1 1
126
+#define C0IS0 0
127
+
128
+#define C0XR (*((volatile unsigned char *)0x51))
129
+#define C0OE 6
130
+#define C0HSYE 5
131
+#define C0PS0 4
132
+#define C0WKE 3
133
+#define C0FEN 2
134
+#define C0FS1 1
135
+#define C0FS0 0
136
+
137
+#define C0TR (*((volatile unsigned char *)0x52))
138
+
139
+//----------------------------------------------------------------
140
+// AC1 (Analog Comparator 1) Register Definition
141
+//----------------------------------------------------------------
142
+#define C1SR (*((volatile unsigned char *)0x2F))
143
+#define C1D 7
144
+#define C1BG 6
145
+#define C1O 5
146
+#define C1I 4
147
+#define C1IE 3
148
+#define C1IC 2
149
+#define C1IS1 1
150
+#define C1IS0 0
151
+
152
+#define C1XR (*((volatile unsigned char *)0x3A))
153
+#define C1OE 6
154
+#define C1HSYE 5
155
+#define C1PS0 4
156
+#define C1WKE 3
157
+#define C1FEN 2
158
+#define C1FS1 1
159
+#define C1FS0 0
160
+
161
+#define C1TR (*((volatile unsigned char *)0x5B))
162
+
163
+//----------------------------------------------------------------
164
+// EEP (E2PROM Controller) Register Definition
165
+//----------------------------------------------------------------
166
+#define E2PDL (*((volatile unsigned char *)0x40))
167
+#define E2PDH (*((volatile unsigned char *)0x5A))
168
+
169
+#define E2PD0 (*((volatile unsigned char *)0x40))
170
+#define E2PD1 (*((volatile unsigned char *)0x5A))
171
+#define E2PD2 (*((volatile unsigned char *)0x57))
172
+#define E2PD3 (*((volatile unsigned char *)0x5C))
173
+
174
+#define ECCR (*((volatile unsigned char *)0x56))
175
+#define ECS 0
176
+#define CP0 2
177
+#define CP1 3
178
+#define SWM 4
179
+#define ERN 5
180
+#define EEN 6
181
+#define EWEN 7
182
+
183
+//----------------------------------------------------------------
184
+// TC0 (Timer Counter 0) Register Definition
185
+//----------------------------------------------------------------
186
+#define TCCR0C (*((volatile unsigned char *)0x49))
187
+#define DSX07 7
188
+#define DSX06 6
189
+#define DSX05 5
190
+#define DSX04 4
191
+#define DSX01 1
192
+#define DSX00 0
193
+
194
+#define DTR0 (*((volatile unsigned char *)0x4F))
195
+
196
+// Bits of TCCR0B
197
+#define OC0AS 5
198
+#define DTEN0 4
199
+
200
+// Bits of TIFR0
201
+#define OC0A 7
202
+#define OC0B 6
203
+
204
+//----------------------------------------------------------------
205
+// TC1 (Timer Counter 1) Register Definition
206
+//----------------------------------------------------------------
207
+#define TCCR1D (*((volatile unsigned char *)0x83))
208
+#define DSX17 7
209
+#define DSX16 6
210
+#define DSX15 5
211
+#define DSX14 4
212
+#define DSX11 1
213
+#define DSX10 0
214
+
215
+#define DTR1L (*((volatile unsigned char *)0x8C))
216
+#define DTR1H (*((volatile unsigned char *)0x8D))
217
+
218
+#define PSSR (*((volatile unsigned char *)0xE2))
219
+#define PSS1 7
220
+#define PSR1 0
221
+
222
+#define TCKSR (*((volatile unsigned char *)0xEC))
223
+#define TCKCSR (*((volatile unsigned char *)0xEC))
224
+#define F2XEN 6
225
+#define TC2XF1 5
226
+#define TC2XF0 4
227
+#define TC2XS1 1
228
+#define TC2XS0 0
229
+
230
+// Bits of TCCR1C
231
+#define DOC1B 5
232
+#define DOC1A 4
233
+#define DTEN1 3
234
+
235
+// Bits of TIFR1
236
+#define OC1A 7
237
+#define OC1B 6
238
+
239
+//----------------------------------------------------------------
240
+// TC2 (Timer Counter 2) Register Definition
241
+//----------------------------------------------------------------
242
+
243
+// Bits of ASSR
244
+#define INTCK 7
245
+
246
+// Bits of TIFR2
247
+#define OC2A 7
248
+#define OC2B 6
249
+
250
+//----------------------------------------------------------------
251
+// TC3 (Timer Counter 3) Register Definition
252
+//----------------------------------------------------------------
253
+#define TIFR3 (*((volatile unsigned char *)0x38))
254
+#define OC3A 7
255
+#define OC3B 6
256
+#define ICF3 5
257
+#define OCF3C 3
258
+#define OCF3B 2
259
+#define OCF3A 1
260
+#define TOV3 0
261
+
262
+#define TIMSK3 (*((volatile unsigned char *)0x71))
263
+#define ICIE3 5
264
+#define OCIE3C 3
265
+#define OCIE3B 2
266
+#define OCIE3A 1
267
+#define TOIE3 0
268
+
269
+#define TCCR3A (*((volatile unsigned char *)0x90))
270
+#define COM3A1 7
271
+#define COM3A0 6
272
+#define COM3B1 5
273
+#define COM3B0 4
274
+#define COM3C1 3
275
+#define COM3C0 2
276
+#define WGM31 1
277
+#define WGM30 0
278
+
279
+#define TCCR3B (*((volatile unsigned char *)0x91))
280
+#define ICNC3 7
281
+#define ICES3 6
282
+#define WGM33 4
283
+#define WGM32 3
284
+#define CS32 2
285
+#define CS31 1
286
+#define CS30 0
287
+
288
+#define TCCR3C (*((volatile unsigned char *)0x92))
289
+#define FOC3A 7
290
+#define FOC3B 6
291
+#define DOC31 5
292
+#define DOC30 4
293
+#define DTEN3 3
294
+#define DOC32 1
295
+#define FOC3C 0
296
+
297
+#define TCCR3D (*((volatile unsigned char *)0x93))
298
+#define DSX37 7
299
+#define DSX36 6
300
+#define DSX35 5
301
+#define DSX34 4
302
+#define DSX31 1
303
+#define DSX30 0
304
+
305
+#define TCNT3L (*((volatile unsigned char *)0x94))
306
+#define TCNT3H (*((volatile unsigned char *)0x95))
307
+
308
+#define ICR3L (*((volatile unsigned char *)0x96))
309
+#define ICR3H (*((volatile unsigned char *)0x97))
310
+
311
+#define OCR3AL (*((volatile unsigned char *)0x98))
312
+#define OCR3AH (*((volatile unsigned char *)0x99))
313
+
314
+#define OCR3BL (*((volatile unsigned char *)0x9A))
315
+#define OCR3BH (*((volatile unsigned char *)0x9B))
316
+
317
+#define DTR3A (*((volatile unsigned char *)0x9C))
318
+#define DTR3B (*((volatile unsigned char *)0x9D))
319
+
320
+#define OCR3CL (*((volatile unsigned char *)0x9E))
321
+#define OCR3CH (*((volatile unsigned char *)0x9F))
322
+
323
+// Bits of PSSR
324
+#define PSS3 6
325
+#define PSR3 1
326
+
327
+//----------------------------------------------------------------
328
+// PCI (PIN Change Interrupt) Register Definition
329
+//----------------------------------------------------------------
330
+#define PCMSK3 (*((volatile unsigned char *)0x73))
331
+#define PCMSK4 (*((volatile unsigned char *)0x74))
332
+
333
+// Bits of PCICR
334
+#define PCIE4 4
335
+#define PCIE3 3
336
+
337
+// Bits of PCIFR
338
+#define PCIF4 4
339
+#define PCIF3 3
340
+
341
+//----------------------------------------------------------------
342
+// ADC (Analog to Digital Controller) Register Definition
343
+//----------------------------------------------------------------
344
+
345
+// bit of ADCSRB
346
+#define ICTL 4
347
+
348
+#define ADCSRC (*((volatile unsigned char *)0x7D))
349
+#define OFEN 7
350
+#define OFSF 6
351
+#define SPN 5
352
+#define AMEN 4
353
+#define SPD 2
354
+#define DIFS 1
355
+#define ADTM 0
356
+
357
+#define OFR0 (*((volatile unsigned char *)0xA3))
358
+#define OFR1 (*((volatile unsigned char *)0xA4))
359
+
360
+#define ADT0L (*((volatile unsigned char *)0xA5))
361
+#define ADT0H (*((volatile unsigned char *)0xA6))
362
+
363
+#define ADT1L (*((volatile unsigned char *)0xAA))
364
+#define ADT1H (*((volatile unsigned char *)0xAB))
365
+
366
+#define ADMSC (*((volatile unsigned char *)0xAC))
367
+#define AMOF 7
368
+#define AMFC3 3
369
+#define AMFC2 2
370
+#define AMFC1 1
371
+#define AMFC0 0
372
+
373
+#define ADCSRD (*((volatile unsigned char *)0xAD))
374
+#define BGEN 7
375
+#define REFS2 6
376
+#define IVSEL1 5
377
+#define IVSEL0 4
378
+#define VDS2 2
379
+#define VDS1 1
380
+#define VDS0 0
381
+
382
+#define DAPCR (*((volatile unsigned char *)0xDC))
383
+#define DAPEN 7
384
+#define GA1 6
385
+#define GA0 5
386
+#define DNS2 4
387
+#define DNS1 3
388
+#define DNS0 2
389
+#define DPS1 1
390
+#define DPS0 0
391
+
392
+#define DAPTR (*((volatile unsigned char *)0xDD))
393
+
394
+#define DAPTC (*((volatile unsigned char *)0xDE))
395
+#define DAPTE 7
396
+
397
+// Bits of ADCSRB
398
+#define ACME01 7
399
+#define ACME00 6
400
+#define ACME11 5
401
+#define ACME10 4
402
+#define ACTS 3
403
+
404
+// Bits of DIDR0
405
+#define ADC7D 7
406
+#define ADC6D 6
407
+#define PE3D 7
408
+#define PE1D 6
409
+#define PC5D 5
410
+#define PC4D 4
411
+#define PC3D 3
412
+#define PC2D 2
413
+#define PC1D 1
414
+#define PC0D 0
415
+
416
+// Bits of DIDR1
417
+#define PE7D 7
418
+#define PE6D 6
419
+#define PE0D 5
420
+#define C0PD 4
421
+#define PF0D 3
422
+#define PC7D 2
423
+#define PD7D 1
424
+#define PD6D 0
425
+
426
+#define DIDR2 (*((volatile unsigned char *)0x76))
427
+#define PB5D 6
428
+
429
+//----------------------------------------------------------------
430
+// DAC (Digital to Analog Controller) Register Definition
431
+//----------------------------------------------------------------
432
+#define DACON (*((volatile unsigned char *)0xA0))
433
+#define DACEN 3
434
+#define DAOE 2
435
+#define DAVS1 1
436
+#define DAVS0 0
437
+
438
+#define DALR (*((volatile unsigned char *)0xA1))
439
+
440
+//----------------------------------------------------------------
441
+// Config () Register Definition
442
+//----------------------------------------------------------------
443
+// Bits of MCUCR
444
+#define FWKEN 7
445
+#define FPDEN 6
446
+#define EXRFD 5
447
+#define IRLD 3
448
+#define IFAIL 2
449
+#define MWCE 0
450
+
451
+// Bits of MCUSR
452
+#define SWDD 7
453
+#define OCDRF 4
454
+
455
+// Bits of CLKPR
456
+#define WCE 7
457
+#define CLKOE1 6
458
+#define CLKOE0 5
459
+#define CLKOE 5
460
+
461
+#define VDTCR (*((volatile unsigned char *)0x62))
462
+//#define WCE 7
463
+#define SWR 6
464
+#define VDTS2 4
465
+#define VDTS1 3
466
+#define VDTS0 2
467
+#define VDREN 1
468
+#define VDTEN 0
469
+
470
+#define PRR1 (*((volatile unsigned char *)0x65))
471
+#define PRWDT 5
472
+#define PRTC3 3
473
+#define PREFL 2
474
+#define PRPCI 1
475
+
476
+#define RCMCAL (*((volatile unsigned char *)0x66))
477
+#define RCKCAL (*((volatile unsigned char *)0x67))
478
+
479
+#define IVBASE (*((volatile unsigned char *)0x75))
480
+
481
+#define IOCWK (*((volatile unsigned char *)0xAE))
482
+#define IOCD7
483
+#define IOCD6
484
+#define IOCD5
485
+#define IOCD4
486
+#define IOCD3
487
+#define IOCD2
488
+#define IOCD1
489
+#define IOCD0
490
+
491
+#define DPS2R (*((volatile unsigned char *)0xAF))
492
+#define DPS2E 3
493
+#define LPRCE 2
494
+#define TOS1 1
495
+#define TOS0 0
496
+
497
+#define VCAL (*((volatile unsigned char *)0xC8))
498
+#define VCAL3 (*((volatile unsigned char *)0xCC))
499
+#define VCAL1 (*((volatile unsigned char *)0xCD))
500
+#define VCAL2 (*((volatile unsigned char *)0xCE))
501
+
502
+#define LDOCR (*((volatile unsigned char *)0xCF))
503
+//#define WCE 7
504
+#define PDEN 3
505
+#define VSEL2 2
506
+#define VSEL1 1
507
+#define VSEL0 0
508
+
509
+#define HDR (*((volatile unsigned char *)0xE0))
510
+#define HDR5 5
511
+#define HDR4 4
512
+#define HDR3 3
513
+#define HDR2 2
514
+#define HDR1 1
515
+#define HDR0 0
516
+
517
+#define PMX1 (*((volatile unsigned char *)0xED))
518
+#define C3AC 2
519
+#define C2BF7 1
520
+#define C2AF6 0
521
+
522
+#define PMX0 (*((volatile unsigned char *)0xEE))
523
+//#define WCE 7
524
+#define C1BF4 6
525
+#define C1AF5 5
526
+#define C0BF3 4
527
+#define C0AC0 3
528
+#define SSB1 2
529
+#define TXD6 1
530
+#define RXD5 0
531
+
532
+#define PMX2 (*((volatile unsigned char *)0xF0))
533
+#define IOCR (*((volatile unsigned char *)0xF0))
534
+//#define WCE 7
535
+#define IOCE 7
536
+#define STSC1 6
537
+#define STSC0 5
538
+#define XIEN 2
539
+#define E6EN 1
540
+#define REFIOEN 1
541
+#define C6EN 0
542
+#define RSTIOEN 0
543
+
544
+#define PMCR (*((volatile unsigned char *)0xF2))
545
+#define PMCE 7
546
+#define CLKFS 6
547
+#define CLKSS 5
548
+#define WCLKS 4
549
+#define WCES 4
550
+#define OSCKEN 3
551
+#define OSCMEN 2
552
+#define RCKEN 1
553
+#define RCMEN 0
554
+
555
+#define GUID0 (*((volatile unsigned char *)0xF3))
556
+#define GUID1 (*((volatile unsigned char *)0xF4))
557
+#define GUID2 (*((volatile unsigned char *)0xF5))
558
+#define GUID3 (*((volatile unsigned char *)0xF6))
559
+
560
+#endif
561
+/**********************************************************************************
562
+*** EOF ***
563
+**********************************************************************************/
Chip-cn-dat/LGT-dat/LGT8F328-SDK-DAT/optiboot_lgt8fx8p/optiboot.c
... ...
@@ -0,0 +1,879 @@
1
+/**********************************************************/
2
+/* Optiboot bootloader for Arduino */
3
+/* */
4
+/* http://optiboot.googlecode.com */
5
+/* */
6
+/* Arduino-maintained version : See README.TXT */
7
+/* http://code.google.com/p/arduino/ */
8
+/* It is the intent that changes not relevant to the */
9
+/* Arduino production envionment get moved from the */
10
+/* optiboot project to the arduino project in "lumps." */
11
+/* */
12
+/* Heavily optimised bootloader that is faster and */
13
+/* smaller than the Arduino standard bootloader */
14
+/* */
15
+/* Enhancements: */
16
+/* Fits in 512 bytes, saving 1.5K of code space */
17
+/* Background page erasing speeds up programming */
18
+/* Higher baud rate speeds up programming */
19
+/* Written almost entirely in C */
20
+/* Customisable timeout with accurate timeconstant */
21
+/* Optional virtual UART. No hardware UART required. */
22
+/* Optional virtual boot partition for devices without. */
23
+/* */
24
+/* What you lose: */
25
+/* Implements a skeleton STK500 protocol which is */
26
+/* missing several features including EEPROM */
27
+/* programming and non-page-aligned writes */
28
+/* High baud rate breaks compatibility with standard */
29
+/* Arduino flash settings */
30
+/* */
31
+/* Fully supported: */
32
+/* ATmega168 based devices (Diecimila etc) */
33
+/* ATmega328P based devices (Duemilanove etc) */
34
+/* */
35
+/* Beta test (believed working.) */
36
+/* ATmega8 based devices (Arduino legacy) */
37
+/* ATmega328 non-picopower devices */
38
+/* ATmega644P based devices (Sanguino) */
39
+/* ATmega1284P based devices */
40
+/* ATmega1280 based devices (Arduino Mega) */
41
+/* */
42
+/* Alpha test */
43
+/* ATmega32 */
44
+/* */
45
+/* Work in progress: */
46
+/* ATtiny84 based devices (Luminet) */
47
+/* */
48
+/* Does not support: */
49
+/* USB based devices (eg. Teensy, Leonardo) */
50
+/* */
51
+/* Assumptions: */
52
+/* The code makes several assumptions that reduce the */
53
+/* code size. They are all true after a hardware reset, */
54
+/* but may not be true if the bootloader is called by */
55
+/* other means or on other hardware. */
56
+/* No interrupts can occur */
57
+/* UART and Timer 1 are set to their reset state */
58
+/* SP points to RAMEND */
59
+/* */
60
+/* Code builds on code, libraries and optimisations from: */
61
+/* stk500boot.c by Jason P. Kyle */
62
+/* Arduino bootloader http://arduino.cc */
63
+/* Spiff's 1K bootloader http://spiffie.org/know/arduino_1k_bootloader/bootloader.shtml */
64
+/* avr-libc project http://nongnu.org/avr-libc */
65
+/* Adaboot http://www.ladyada.net/library/arduino/bootloader.html */
66
+/* AVR305 Atmel Application Note */
67
+/* */
68
+/* This program is free software; you can redistribute it */
69
+/* and/or modify it under the terms of the GNU General */
70
+/* Public License as published by the Free Software */
71
+/* Foundation; either version 2 of the License, or */
72
+/* (at your option) any later version. */
73
+/* */
74
+/* This program is distributed in the hope that it will */
75
+/* be useful, but WITHOUT ANY WARRANTY; without even the */
76
+/* implied warranty of MERCHANTABILITY or FITNESS FOR A */
77
+/* PARTICULAR PURPOSE. See the GNU General Public */
78
+/* License for more details. */
79
+/* */
80
+/* You should have received a copy of the GNU General */
81
+/* Public License along with this program; if not, write */
82
+/* to the Free Software Foundation, Inc., */
83
+/* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
84
+/* */
85
+/* Licence can be viewed at */
86
+/* http://www.fsf.org/licenses/gpl.txt */
87
+/* */
88
+/**********************************************************/
89
+
90
+
91
+/**********************************************************/
92
+/* */
93
+/* Optional defines: */
94
+/* */
95
+/**********************************************************/
96
+/* */
97
+/* BIG_BOOT: */
98
+/* Build a 1k bootloader, not 512 bytes. This turns on */
99
+/* extra functionality. */
100
+/* */
101
+/* BAUD_RATE: */
102
+/* Set bootloader baud rate. */
103
+/* */
104
+/* LUDICROUS_SPEED: */
105
+/* 230400 baud :-) */
106
+/* */
107
+/* SOFT_UART: */
108
+/* Use AVR305 soft-UART instead of hardware UART. */
109
+/* */
110
+/* LED_START_FLASHES: */
111
+/* Number of LED flashes on bootup. */
112
+/* */
113
+/* LED_DATA_FLASH: */
114
+/* Flash LED when transferring data. For boards without */
115
+/* TX or RX LEDs, or for people who like blinky lights. */
116
+/* */
117
+/* SUPPORT_EEPROM: */
118
+/* Support reading and writing from EEPROM. This is not */
119
+/* used by Arduino, so off by default. */
120
+/* */
121
+/* TIMEOUT_MS: */
122
+/* Bootloader timeout period, in milliseconds. */
123
+/* 500,1000,2000,4000,8000 supported. */
124
+/* */
125
+/* UART: */
126
+/* UART number (0..n) for devices with more than */
127
+/* one hardware uart (644P, 1284P, etc) */
128
+/* */
129
+/**********************************************************/
130
+
131
+/**********************************************************/
132
+/* Version Numbers! */
133
+/* */
134
+/* Arduino Optiboot now includes this Version number in */
135
+/* the source and object code. */
136
+/* */
137
+/* Version 3 was released as zip from the optiboot */
138
+/* repository and was distributed with Arduino 0022. */
139
+/* Version 4 starts with the arduino repository commit */
140
+/* that brought the arduino repository up-to-date with */
141
+/* the optiboot source tree changes since v3. */
142
+/* Version 5 was created at the time of the new Makefile */
143
+/* structure (Mar, 2013), even though no binaries changed*/
144
+/* It would be good if versions implemented outside the */
145
+/* official repository used an out-of-seqeunce version */
146
+/* number (like 104.6 if based on based on 4.5) to */
147
+/* prevent collisions. */
148
+/* */
149
+/**********************************************************/
150
+
151
+/**********************************************************/
152
+/* Edit History: */
153
+/* */
154
+/* Mar 2013 */
155
+/* 5.0 WestfW: Major Makefile restructuring. */
156
+/* See Makefile and pin_defs.h */
157
+/* (no binary changes) */
158
+/* */
159
+/* 4.6 WestfW/Pito: Add ATmega32 support */
160
+/* 4.6 WestfW/radoni: Don't set LED_PIN as an output if */
161
+/* not used. (LED_START_FLASHES = 0) */
162
+/* Jan 2013 */
163
+/* 4.6 WestfW/dkinzer: use autoincrement lpm for read */
164
+/* 4.6 WestfW/dkinzer: pass reset cause to app in R2 */
165
+/* Mar 2012 */
166
+/* 4.5 WestfW: add infrastructure for non-zero UARTS. */
167
+/* 4.5 WestfW: fix SIGNATURE_2 for m644 (bad in avr-libc) */
168
+/* Jan 2012: */
169
+/* 4.5 WestfW: fix NRWW value for m1284. */
170
+/* 4.4 WestfW: use attribute OS_main instead of naked for */
171
+/* main(). This allows optimizations that we */
172
+/* count on, which are prohibited in naked */
173
+/* functions due to PR42240. (keeps us less */
174
+/* than 512 bytes when compiler is gcc4.5 */
175
+/* (code from 4.3.2 remains the same.) */
176
+/* 4.4 WestfW and Maniacbug: Add m1284 support. This */
177
+/* does not change the 328 binary, so the */
178
+/* version number didn't change either. (?) */
179
+/* June 2011: */
180
+/* 4.4 WestfW: remove automatic soft_uart detect (didn't */
181
+/* know what it was doing or why.) Added a */
182
+/* check of the calculated BRG value instead. */
183
+/* Version stays 4.4; existing binaries are */
184
+/* not changed. */
185
+/* 4.4 WestfW: add initialization of address to keep */
186
+/* the compiler happy. Change SC'ed targets. */
187
+/* Return the SW version via READ PARAM */
188
+/* 4.3 WestfW: catch framing errors in getch(), so that */
189
+/* AVRISP works without HW kludges. */
190
+/* http://code.google.com/p/arduino/issues/detail?id=368n*/
191
+/* 4.2 WestfW: reduce code size, fix timeouts, change */
192
+/* verifySpace to use WDT instead of appstart */
193
+/* 4.1 WestfW: put version number in binary. */
194
+/**********************************************************/
195
+
196
+#define OPTIBOOT_MAJVER 5
197
+#define OPTIBOOT_MINVER 0
198
+
199
+#define MAKESTR(a) #a
200
+#define MAKEVER(a, b) MAKESTR(a*256+b)
201
+
202
+#if defined (__AVR_ATmega328__) || defined(__AVR_ATmega328P__)
203
+// boot_code : jmp to 0x7400 (start of bootloader)
204
+asm(" .section .bootv\n"
205
+ "boot_code: .word 0x940c\n"
206
+ ".word 0x3a00\n");
207
+#else
208
+#if #defined(__AVR_ATmega168__)
209
+// boot_code : jmp to 0x3c00 (start of bootloader)
210
+asm(" .section .bootv\n"
211
+ "boot_code: .word 0x940c\n"
212
+ ".word 0x1e00\n");
213
+#endif
214
+#endif
215
+
216
+asm(" .section .version\n"
217
+ "optiboot_version: .word " MAKEVER(OPTIBOOT_MAJVER, OPTIBOOT_MINVER) "\n"
218
+ " .section .text\n");
219
+
220
+#include <inttypes.h>
221
+#include <avr/io.h>
222
+
223
+// We don't use <avr/wdt.h> as those routines have interrupt overhead we don't need.
224
+
225
+#include "pin_defs.h"
226
+#include "stk500.h"
227
+#include "lgtx8p.h"
228
+
229
+typedef union {
230
+ uint32_t dword;
231
+ uint8_t byte[4];
232
+} *pdword_t, dword_t;
233
+
234
+#ifndef LED_START_FLASHES
235
+#define LED_START_FLASHES 0
236
+#endif
237
+
238
+#ifdef LUDICROUS_SPEED
239
+#define BAUD_RATE 230400L
240
+#endif
241
+
242
+/* set the UART baud rate defaults */
243
+#ifndef BAUD_RATE
244
+#if F_CPU >= 8000000L
245
+#define BAUD_RATE 115200L // Highest rate Avrdude win32 will support
246
+#elif F_CPU >= 1000000L
247
+#define BAUD_RATE 9600L // 19200 also supported, but with significant error
248
+#elif F_CPU >= 128000L
249
+#define BAUD_RATE 4800L // Good for 128kHz internal RC
250
+#else
251
+#define BAUD_RATE 1200L // Good even at 32768Hz
252
+#endif
253
+#endif
254
+
255
+#ifndef UART
256
+#define UART 0
257
+#endif
258
+
259
+#define BAUD_SETTING (( (F_CPU + BAUD_RATE * 4L) / ((BAUD_RATE * 8L))) - 1 )
260
+#define BAUD_ACTUAL (F_CPU/(8 * ((BAUD_SETTING)+1)))
261
+#define BAUD_ERROR (( 100*(BAUD_RATE - BAUD_ACTUAL) ) / BAUD_RATE)
262
+
263
+#if BAUD_ERROR >= 5
264
+#error BAUD_RATE error greater than 5%
265
+#elif BAUD_ERROR <= -5
266
+#error BAUD_RATE error greater than -5%
267
+#elif BAUD_ERROR >= 2
268
+#warning BAUD_RATE error greater than 2%
269
+#elif BAUD_ERROR <= -2
270
+#warning BAUD_RATE error greater than -2%
271
+#endif
272
+
273
+#if 0
274
+/* Switch in soft UART for hard baud rates */
275
+/*
276
+ * I don't understand what this was supposed to accomplish, where the
277
+ * constant "280" came from, or why automatically (and perhaps unexpectedly)
278
+ * switching to a soft uart is a good thing, so I'm undoing this in favor
279
+ * of a range check using the same calc used to config the BRG...
280
+ */
281
+#if (F_CPU/BAUD_RATE) > 280 // > 57600 for 16MHz
282
+#ifndef SOFT_UART
283
+#define SOFT_UART
284
+#endif
285
+#endif
286
+#else // 0
287
+#if (F_CPU + BAUD_RATE * 4L) / (BAUD_RATE * 8L) - 1 > 250
288
+#error Unachievable baud rate (too slow) BAUD_RATE
289
+#endif // baud rate slow check
290
+#if (F_CPU + BAUD_RATE * 4L) / (BAUD_RATE * 8L) - 1 < 3
291
+#error Unachievable baud rate (too fast) BAUD_RATE
292
+#endif // baud rate fastn check
293
+#endif
294
+
295
+/* Watchdog settings */
296
+#define WATCHDOG_OFF (0)
297
+#define WATCHDOG_1MS (_BV(WDE))
298
+#define WATCHDOG_2MS (_BV(WDP0) | _BV(WDE))
299
+#define WATCHDOG_4MS (_BV(WDP1) | _BV(WDE))
300
+#define WATCHDOG_8MS (_BV(WDP1) | _BV(WDP0) | _BV(WDE))
301
+#define WATCHDOG_16MS (_BV(WDP2) | _BV(WDE))
302
+#define WATCHDOG_32MS (_BV(WDP2) | _BV(WDP0) | _BV(WDE))
303
+#define WATCHDOG_64MS (_BV(WDP2) | _BV(WDP1) | _BV(WDE))
304
+#define WATCHDOG_128MS (_BV(WDP2) | _BV(WDP1) | _BV(WDP0) | _BV(WDE))
305
+#define WATCHDOG_256MS (_BV(WDP3) | _BV(WDE))
306
+#define WATCHDOG_512MS (_BV(WDP3) | _BV(WDP0) | _BV(WDE))
307
+
308
+/* Function Prototypes */
309
+/* The main function is in init9, which removes the interrupt vector table */
310
+/* we don't need. It is also 'naked', which means the compiler does not */
311
+/* generate any entry or exit code itself. */
312
+int main(void) __attribute__ ((OS_main)) __attribute__ ((section (".init9")));
313
+//int main(void) __attribute__ ((naked)) __attribute__ ((section (".init9")));
314
+void putch(char);
315
+uint8_t getch(void);
316
+static inline void getNch(uint8_t); /* "static inline" is a compiler hint to reduce code size */
317
+void verifySpace();
318
+static inline void flash_led(uint8_t);
319
+uint8_t getLen();
320
+static inline void watchdogReset();
321
+void watchdogConfig(uint8_t x);
322
+#ifdef SOFT_UART
323
+void uartDelay() __attribute__ ((naked));
324
+#endif
325
+void appStart(uint8_t rstFlags) __attribute__ ((naked));
326
+
327
+/*
328
+ * NRWW memory
329
+ * Addresses below NRWW (Non-Read-While-Write) can be programmed while
330
+ * continuing to run code from flash, slightly speeding up programming
331
+ * time. Beware that Atmel data sheets specify this as a WORD address,
332
+ * while optiboot will be comparing against a 16-bit byte address. This
333
+ * means that on a part with 128kB of memory, the upper part of the lower
334
+ * 64k will get NRWW processing as well, even though it doesn't need it.
335
+ * That's OK. In fact, you can disable the overlapping processing for
336
+ * a part entirely by setting NRWWSTART to zero. This reduces code
337
+ * space a bit, at the expense of being slightly slower, overall.
338
+ *
339
+ * RAMSTART should be self-explanatory. It's bigger on parts with a
340
+ * lot of peripheral registers.
341
+ */
342
+#if defined(__AVR_ATmega168__)
343
+#define RAMSTART (0x100)
344
+#define NRWWSTART (0x3800)
345
+#elif defined(__AVR_ATmega328P__) || defined(__AVR_ATmega32__)
346
+#define RAMSTART (0x100)
347
+#define NRWWSTART (0x7000)
348
+#elif defined (__AVR_ATmega644P__)
349
+#define RAMSTART (0x100)
350
+#define NRWWSTART (0xE000)
351
+// correct for a bug in avr-libc
352
+#undef SIGNATURE_2
353
+#define SIGNATURE_2 0x0A
354
+#elif defined (__AVR_ATmega1284P__)
355
+#define RAMSTART (0x100)
356
+#define NRWWSTART (0xE000)
357
+#elif defined(__AVR_ATtiny84__)
358
+#define RAMSTART (0x100)
359
+#define NRWWSTART (0x0000)
360
+#elif defined(__AVR_ATmega1280__)
361
+#define RAMSTART (0x200)
362
+#define NRWWSTART (0xE000)
363
+#elif defined(__AVR_ATmega8__) || defined(__AVR_ATmega88__)
364
+#define RAMSTART (0x100)
365
+#define NRWWSTART (0x1800)
366
+#endif
367
+
368
+/* C zero initialises all global variables. However, that requires */
369
+/* These definitions are NOT zero initialised, but that doesn't matter */
370
+/* This allows us to drop the zero init code, saving us memory */
371
+#define buff ((uint8_t*)(RAMSTART))
372
+#ifdef VIRTUAL_BOOT_PARTITION
373
+#define rstVect0 (*(volatile uint16_t*)(RAMSTART + SPM_PAGESIZE + 4))
374
+#define rstVect1 (*(volatile uint16_t*)(RAMSTART + SPM_PAGESIZE + 6))
375
+#define wdtVect0 (*(volatile uint16_t*)(RAMSTART + SPM_PAGESIZE + 8))
376
+#define wdtVect1 (*(volatile uint16_t*)(RAMSTART + SPM_PAGESIZE + 10))
377
+#endif
378
+
379
+/*
380
+ * Handle devices with up to 4 uarts (eg m1280.) Rather inelegantly.
381
+ * Note that mega8/m32 still needs special handling, because ubrr is handled
382
+ * differently.
383
+ */
384
+#if UART == 0
385
+# define UART_SRA UCSR0A
386
+# define UART_SRB UCSR0B
387
+# define UART_SRC UCSR0C
388
+# define UART_SRL UBRR0L
389
+# define UART_UDR UDR0
390
+#elif UART == 1
391
+#if !defined(UDR1)
392
+#error UART == 1, but no UART1 on device
393
+#endif
394
+# define UART_SRA UCSR1A
395
+# define UART_SRB UCSR1B
396
+# define UART_SRC UCSR1C
397
+# define UART_SRL UBRR1L
398
+# define UART_UDR UDR1
399
+#elif UART == 2
400
+#if !defined(UDR2)
401
+#error UART == 2, but no UART2 on device
402
+#endif
403
+# define UART_SRA UCSR2A
404
+# define UART_SRB UCSR2B
405
+# define UART_SRC UCSR2C
406
+# define UART_SRL UBRR2L
407
+# define UART_UDR UDR2
408
+#elif UART == 3
409
+#if !defined(UDR1)
410
+#error UART == 3, but no UART3 on device
411
+#endif
412
+# define UART_SRA UCSR3A
413
+# define UART_SRB UCSR3B
414
+# define UART_SRC UCSR3C
415
+# define UART_SRL UBRR3L
416
+# define UART_UDR UDR3
417
+#endif
418
+
419
+/* main program starts here */
420
+int main(void) {
421
+ uint8_t ch;
422
+ uint32_t pmask;
423
+
424
+ /*
425
+ * Making these local and in registers prevents the need for initializing
426
+ * them, and also saves space because code no longer stores to memory.
427
+ * (initializing address keeps the compiler happy, but isn't really
428
+ * necessary, and uses 4 bytes of flash.)
429
+ */
430
+ register uint16_t address = 0;
431
+ register uint16_t length;
432
+
433
+ // After the zero init loop, this is the first code to run.
434
+ //
435
+ // This code makes the following assumptions:
436
+ // No interrupts will execute
437
+ // SP points to RAMEND
438
+ // r1 contains zero
439
+ //
440
+ // If not, uncomment the following instructions:
441
+ // cli();
442
+ asm volatile ("clr __zero_reg__");
443
+ SP=RAMEND; // This is done by hardware reset
444
+
445
+ // in case we got raw chip
446
+#if 0
447
+ pmask = (GUID3 << 24) | (GUID2 << 16) | (GUID1 << 8) | GUID0;
448
+ if(pmask == 0)
449
+ OSCCAL = 0xae;
450
+#endif
451
+
452
+ // Adaboot no-wait mod
453
+ ch = MCUSR;
454
+ MCUSR = 0;
455
+ if (ch & (_BV(WDRF) | _BV(BORF) | _BV(PORF)))
456
+ appStart(ch);
457
+
458
+ // WDT clock by 32KHz IRC
459
+ PMCR = 0x80;
460
+ PMCR = 0x93;
461
+
462
+ // system clock: 16MHz system clock
463
+ CLKPR = 0x80;
464
+ CLKPR = 0x01;
465
+
466
+ // enable 1KB E2PROM (for LGT8F328P)
467
+ ECCR = 0x80;
468
+ ECCR = 0x4C;
469
+
470
+#if LED_START_FLASHES > 0
471
+ // Set up Timer 1 for timeout counter
472
+ TCCR1B = _BV(CS12) | _BV(CS10); // div 1024
473
+#endif
474
+
475
+#ifndef SOFT_UART
476
+#if defined(__AVR_ATmega8__) || defined (__AVR_ATmega32__)
477
+ UCSRA = _BV(U2X); //Double speed mode USART
478
+ UCSRB = _BV(RXEN) | _BV(TXEN); // enable Rx & Tx
479
+ UCSRC = _BV(URSEL) | _BV(UCSZ1) | _BV(UCSZ0); // config USART; 8N1
480
+ UBRRL = (uint8_t)( (F_CPU + BAUD_RATE * 4L) / (BAUD_RATE * 8L) - 1 );
481
+#else
482
+ //UART_SRA = _BV(U2X0); //Double speed mode USART0
483
+ UART_SRB = _BV(RXEN0) | _BV(TXEN0);
484
+ UART_SRC = _BV(UCSZ00) | _BV(UCSZ01);
485
+ //UART_SRL = (uint8_t)( F_CPU / (BAUD_RATE * 8L) - 1 );
486
+ UART_SRL = (uint8_t)( F_CPU / (BAUD_RATE * 16L) - 1 );
487
+#endif
488
+#endif
489
+
490
+ // Set up watchdog to trigger after 500ms
491
+ watchdogConfig(WATCHDOG_32MS);
492
+
493
+#if (LED_START_FLASHES > 0) || defined(LED_DATA_FLASH)
494
+ /* Set LED pin as output */
495
+ LED_DDR |= _BV(LED);
496
+#endif
497
+
498
+#ifdef SOFT_UART
499
+ /* Set TX pin as output */
500
+ UART_DDR |= _BV(UART_TX_BIT);
501
+#endif
502
+
503
+#if LED_START_FLASHES > 0
504
+ /* Flash onboard LED to signal entering of bootloader */
505
+ flash_led(LED_START_FLASHES * 2);
506
+#endif
507
+
508
+ // page erased flag
509
+ pmask = 0;
510
+
511
+ /* Forever loop */
512
+ for (;;) {
513
+ /* get character from UART */
514
+ ch = getch();
515
+
516
+ if(ch == STK_GET_PARAMETER) {
517
+ unsigned char which = getch();
518
+ verifySpace();
519
+ if (which == 0x82) {
520
+ /*
521
+ * Send optiboot version as "minor SW version"
522
+ */
523
+ putch(OPTIBOOT_MINVER);
524
+ } else if (which == 0x81) {
525
+ putch(OPTIBOOT_MAJVER);
526
+ } else {
527
+ /*
528
+ * GET PARAMETER returns a generic 0x03 reply for
529
+ * other parameters - enough to keep Avrdude happy
530
+ */
531
+ putch(0x03);
532
+ }
533
+ }
534
+ else if(ch == STK_SET_DEVICE) {
535
+ // SET DEVICE is ignored
536
+ getNch(20);
537
+ }
538
+ else if(ch == STK_SET_DEVICE_EXT) {
539
+ // SET DEVICE EXT is ignored
540
+ getNch(5);
541
+ }
542
+ else if(ch == STK_LOAD_ADDRESS) {
543
+ // LOAD ADDRESS
544
+ uint16_t newAddress;
545
+ newAddress = getch();
546
+ newAddress = (newAddress & 0xff) | (getch() << 8);
547
+#ifdef RAMPZ
548
+ // Transfer top bit to RAMPZ
549
+ RAMPZ = (newAddress & 0x8000) ? 1 : 0;
550
+#endif
551
+ newAddress += newAddress; // Convert from word address to byte address
552
+ address = newAddress;
553
+ verifySpace();
554
+ }
555
+ else if(ch == STK_UNIVERSAL) {
556
+ // UNIVERSAL command is ignored
557
+ getNch(4);
558
+ putch(0x00);
559
+ }
560
+ /* Write memory, length is big endian and is in bytes */
561
+ else if(ch == STK_PROG_PAGE) {
562
+ // PROGRAM PAGE - we support flash programming only, not EEPROM
563
+ uint8_t *bufPtr;
564
+ uint8_t bval;
565
+ uint16_t len;
566
+ length = (uint16_t)getch() << 8; /* getlen() */
567
+ length += getch();
568
+ bval = getch();
569
+
570
+ // If we are in RWW section, immediately start page erase
571
+ //if (address < NRWWSTART) __boot_page_erase_short((uint16_t)(void*)address);
572
+
573
+ // While that is going on, read in page contents
574
+ bufPtr = buff;
575
+ len = length;
576
+ do *bufPtr++ = getch();
577
+ while (--len);
578
+
579
+ EEARL = 0;
580
+ EEARH = address >> 8;
581
+ ch = EEARH >> 2; // 1KB page size
582
+
583
+ if((0 == (pmask & (((uint32_t)1 << ch)))) && bval == 'F') {
584
+ pmask |= ((uint32_t)1 << ch);
585
+ // do page erase here
586
+ EECR = 0x94;
587
+ EECR = 0x92;
588
+ __asm__ __volatile__ ("nop" ::);
589
+ __asm__ __volatile__ ("nop" ::);
590
+ }
591
+
592
+ // Read command terminator, start reply
593
+ verifySpace();
594
+
595
+ // If only a partial page is to be programmed, the erase might not be complete.
596
+ // So check that here
597
+ //boot_spm_busy_wait();
598
+ if (bval == 'E') {
599
+ for(len = 0; len < length; len++) {
600
+ //if(address >= 1022)
601
+ //break;
602
+ EEARL = address++;
603
+ EEARH = address >> 8;
604
+ EEDR = buff[len];
605
+ EECR = 0x04;
606
+ EECR = 0x02;
607
+ }
608
+ } else {
609
+#ifdef VIRTUAL_BOOT_PARTITION
610
+ if ((uint16_t)(void*)address == 0) {
611
+ // This is the reset vector page. We need to live-patch the code so the
612
+ // bootloader runs.
613
+ //
614
+ // Move RESET vector to WDT vector
615
+ rstVect0 = buff[0] | (buff[1] << 8);
616
+ rstVect1 = buff[2] | (buff[3] << 8);
617
+ wdtVect0 = buff[24] | (buff[25] << 8);
618
+ wdtVect1 = buff[26] | (buff[27] << 8);
619
+
620
+ buff[24] = buff[0];
621
+ buff[25] = buff[1];
622
+ buff[26] = buff[2];
623
+ buff[27] = buff[3];
624
+
625
+ // Add jump to bootloader at RESET vector
626
+ buff[0] = 0x0c;
627
+ buff[1] = 0x94; // jmp
628
+ buff[2] = 0x00;
629
+ buff[3] = 0x3a; // 0x7400 (0x3a00)
630
+ }
631
+#endif
632
+ // Write from programming buffer
633
+ pdword_t wPtr = (pdword_t)buff;
634
+ for(length = 0; length < SPM_PAGESIZE; length+=4, wPtr++) {
635
+ EEARL = 0; EEDR = wPtr->byte[0];
636
+ EEARL = 1; EEDR = wPtr->byte[1];
637
+ EEARL = 2; EEDR = wPtr->byte[2];
638
+ EEARL = 3; EEDR = wPtr->byte[3];
639
+ EEARL = (address + length) & 0xff;
640
+ EECR = 0xA4;
641
+ EECR = 0xA2;
642
+ }
643
+ }
644
+ }
645
+ /* Read memory block mode, length is big endian. */
646
+ else if(ch == STK_READ_PAGE) {
647
+ // READ PAGE - we only read flash
648
+ uint8_t bval;
649
+
650
+ length = getch() << 8; /* getlen() */
651
+ length += getch();
652
+ bval = getch();
653
+
654
+ verifySpace();
655
+
656
+ if( bval == 'E') {
657
+ do {
658
+ EEARL = address++;
659
+ EEARH = address >> 8;
660
+ EECR = 0x01;
661
+ __asm__ __volatile__ ("nop" ::);
662
+ __asm__ __volatile__ ("nop" ::);
663
+ putch(EEDR);
664
+ } while (--length);
665
+ } else {
666
+ do {
667
+#ifdef VIRTUAL_BOOT_PARTITION
668
+ // Undo vector patch in bottom page so verify passes
669
+ if (address == 0) ch = rstVect0 & 0xff;
670
+ else if (address == 1) ch = rstVect0 >> 8;
671
+ else if (address == 2) ch = rstVect1 & 0xff;
672
+ else if (address == 3) ch = rstVect1 >> 8;
673
+ else if (address == 24) ch = wdtVect0 & 0xff;
674
+ else if (address == 25) ch = wdtVect0 >> 8;
675
+ else if (address == 26) ch = wdtVect1 & 0xff;
676
+ else if (address == 27) ch = wdtVect1 >> 8;
677
+ else {
678
+ // read a Flash byte and increment the address
679
+ #if defined(RAMPZ)
680
+ // Since RAMPZ should already be set, we need to use EPLM directly.
681
+ // read a Flash and increment the address (may increment RAMPZ)
682
+ __asm__ ("elpm %0,Z\n" : "=r" (ch) : "z" (address));
683
+ #else
684
+ // read a Flash byte and increment the address
685
+ __asm__ ("lpm %0,Z\n" : "=r" (ch) : "z" (address));
686
+ //ch = *((uint8_t *)(0x4000 + address));
687
+ #endif
688
+#endif
689
+ }
690
+ address++;
691
+ putch(ch);
692
+ } while (--length);
693
+ }
694
+ }
695
+
696
+ /* Get device signature bytes */
697
+ else if(ch == STK_READ_SIGN) {
698
+ // READ SIGN - return what Avrdude wants to hear
699
+ verifySpace();
700
+ putch(SIGNATURE_0);
701
+ putch(SIGNATURE_1);
702
+ putch(SIGNATURE_2);
703
+ }
704
+ else if (ch == STK_LEAVE_PROGMODE) { /* 'Q' */
705
+ // Adaboot no-wait mod
706
+ watchdogConfig(WATCHDOG_16MS);
707
+ verifySpace();
708
+ }
709
+ else {
710
+ // This covers the response to commands like STK_ENTER_PROGMODE
711
+ verifySpace();
712
+ }
713
+ putch(STK_OK);
714
+ }
715
+}
716
+
717
+void putch(char ch) {
718
+#ifndef SOFT_UART
719
+ while (!(UART_SRA & _BV(UDRE0)));
720
+ UART_UDR = ch;
721
+#else
722
+ __asm__ __volatile__ (
723
+ " com %[ch]\n" // ones complement, carry set
724
+ " sec\n"
725
+ "1: brcc 2f\n"
726
+ " cbi %[uartPort],%[uartBit]\n"
727
+ " rjmp 3f\n"
728
+ "2: sbi %[uartPort],%[uartBit]\n"
729
+ " nop\n"
730
+ "3: rcall uartDelay\n"
731
+ " rcall uartDelay\n"
732
+ " lsr %[ch]\n"
733
+ " dec %[bitcnt]\n"
734
+ " brne 1b\n"
735
+ :
736
+ :
737
+ [bitcnt] "d" (10),
738
+ [ch] "r" (ch),
739
+ [uartPort] "I" (_SFR_IO_ADDR(UART_PORT)),
740
+ [uartBit] "I" (UART_TX_BIT)
741
+ :
742
+ "r25"
743
+ );
744
+#endif
745
+}
746
+
747
+uint8_t getch(void) {
748
+ uint8_t ch;
749
+
750
+#ifdef LED_DATA_FLASH
751
+ LED_PORT ^= _BV(LED);
752
+#endif
753
+
754
+#ifdef SOFT_UART
755
+ __asm__ __volatile__ (
756
+ "1: sbic %[uartPin],%[uartBit]\n" // Wait for start edge
757
+ " rjmp 1b\n"
758
+ " rcall uartDelay\n" // Get to middle of start bit
759
+ "2: rcall uartDelay\n" // Wait 1 bit period
760
+ " rcall uartDelay\n" // Wait 1 bit period
761
+ " clc\n"
762
+ " sbic %[uartPin],%[uartBit]\n"
763
+ " sec\n"
764
+ " dec %[bitCnt]\n"
765
+ " breq 3f\n"
766
+ " ror %[ch]\n"
767
+ " rjmp 2b\n"
768
+ "3:\n"
769
+ :
770
+ [ch] "=r" (ch)
771
+ :
772
+ [bitCnt] "d" (9),
773
+ [uartPin] "I" (_SFR_IO_ADDR(UART_PIN)),
774
+ [uartBit] "I" (UART_RX_BIT)
775
+ :
776
+ "r25"
777
+);
778
+#else
779
+ while(!(UART_SRA & _BV(RXC0)))
780
+ ;
781
+ if (!(UART_SRA & _BV(FE0))) {
782
+ /*
783
+ * A Framing Error indicates (probably) that something is talking
784
+ * to us at the wrong bit rate. Assume that this is because it
785
+ * expects to be talking to the application, and DON'T reset the
786
+ * watchdog. This should cause the bootloader to abort and run
787
+ * the application "soon", if it keeps happening. (Note that we
788
+ * don't care that an invalid char is returned...)
789
+ */
790
+ watchdogReset();
791
+ }
792
+
793
+ ch = UART_UDR;
794
+#endif
795
+
796
+#ifdef LED_DATA_FLASH
797
+ LED_PORT ^= _BV(LED);
798
+#endif
799
+
800
+ return ch;
801
+}
802
+
803
+// AVR305 equation: #define UART_B_VALUE (((F_CPU/BAUD_RATE)-23)/6)
804
+// Adding 3 to numerator simulates nearest rounding for more accurate baud rates
805
+#define UART_B_VALUE (((F_CPU/BAUD_RATE)-20)/6)
806
+#if UART_B_VALUE > 255
807
+#error Baud rate too slow for soft UART
808
+#endif
809
+
810
+void uartDelay() {
811
+ __asm__ __volatile__ (
812
+ "ldi r25,%[count]\n"
813
+ "1:dec r25\n"
814
+ "brne 1b\n"
815
+ "ret\n"
816
+ ::[count] "M" (UART_B_VALUE)
817
+ );
818
+}
819
+
820
+void getNch(uint8_t count) {
821
+ do getch(); while (--count);
822
+ verifySpace();
823
+}
824
+
825
+void verifySpace() {
826
+ if (getch() != CRC_EOP) {
827
+ watchdogConfig(WATCHDOG_32MS); // shorten WD timeout
828
+ while (1) // and busy-loop so that WD causes
829
+ ; // a reset and app start.
830
+ }
831
+ putch(STK_INSYNC);
832
+}
833
+
834
+#if LED_START_FLASHES > 0
835
+void flash_led(uint8_t count) {
836
+ do {
837
+ TCNT1 = -(F_CPU/(1024*16));
838
+ TIFR1 = _BV(TOV1);
839
+ while(!(TIFR1 & _BV(TOV1)));
840
+ LED_PORT ^= _BV(LED);
841
+ watchdogReset();
842
+ } while (--count);
843
+}
844
+#endif
845
+
846
+// Watchdog functions. These are only safe with interrupts turned off.
847
+void watchdogReset() {
848
+ __asm__ __volatile__ (
849
+ "wdr\n"
850
+ );
851
+}
852
+
853
+void watchdogConfig(uint8_t x) {
854
+#if 1
855
+ WDTCSR = _BV(WDCE) | _BV(WDE);
856
+ WDTCSR = x;
857
+#endif
858
+}
859
+
860
+void appStart(uint8_t rstFlags) {
861
+ // save the reset flags in the designated register
862
+ // This can be saved in a main program by putting code in .init0 (which
863
+ // executes before normal c init code) to save R2 to a global variable.
864
+ __asm__ __volatile__ ("mov r2, %0\n" :: "r" (rstFlags));
865
+
866
+ watchdogConfig(WATCHDOG_OFF);
867
+ __asm__ __volatile__ (
868
+#ifdef VIRTUAL_BOOT_PARTITION
869
+ // Jump to WDT vector
870
+ "ldi r30,0x0c\n"
871
+ "clr r31\n"
872
+#else
873
+ // Jump to RST vector
874
+ "clr r30\n"
875
+ "clr r31\n"
876
+#endif
877
+ "ijmp\n"
878
+ );
879
+}
Chip-cn-dat/LGT-dat/LGT8F328-SDK-DAT/optiboot_lgt8fx8p/optiboot_lgt8f328p.elf
... ...
Binary files /dev/null and b/Chip-cn-dat/LGT-dat/LGT8F328-SDK-DAT/optiboot_lgt8fx8p/optiboot_lgt8f328p.elf differ
Chip-cn-dat/LGT-dat/LGT8F328-SDK-DAT/optiboot_lgt8fx8p/optiboot_lgt8f328p.hex
... ...
@@ -0,0 +1,67 @@
1
+:040000000C94003A22
2
+:1074000011248FEF98E09EBF8DBF94B714BE892FD3
3
+:107410008D7011F0892FE0D190E89093F20083E90C
4
+:107420008093F2009093610081E08093610096BFA9
5
+:107430008CE486BF85E08093810088E18093C10061
6
+:1074400086E08093C20080E18093C4008DE0AED1DD
7
+:10745000259A96E020E33CEF51E040E2309385002E
8
+:107460002093840056BBB09BFECF85B1842785B99D
9
+:10747000A895915099F7662477244301CC24DD2404
10
+:1074800064E9A62E51E0252E312C412C512C7DD1C2
11
+:10749000813461F47AD1182F8FD1123829F1113843
12
+:1074A00011F485E001C083E068D164C1823411F435
13
+:1074B00084E103C0853419F485E086D15BC185354C
14
+:1074C00079F463D1E82EFF2460D1082F10E0102F4B
15
+:1074D00000270E291F29000F111F6ED168014AC114
16
+:1074E000863521F484E070D180E0DECF843609F067
17
+:1074F000C5C04BD190E0F82EEE2447D1E80EF11C28
18
+:1075000044D1B82EE70100E011E03FD1F8018193AA
19
+:107510008F012197D1F711BC8D2D992782BD82B59E
20
+:1075200086958695282FD401C301022E04C0B695F6
21
+:10753000A795979587950A94D2F780FD15C0F6E434
22
+:10754000BF1691F4D201C10104C0880F991FAA1F70
23
+:10755000BB1F2A95D2F7682A792A8A2A9B2AAFBAB2
24
+:1075600082E98FBB0000000027D1E5E4BE16B1F42C
25
+:10757000960110C021BD2F5F3F4F832F992782BDF9
26
+:10758000C050DF4F888180BDF4E0FFBB82E08FBB3D
27
+:10759000CF5FD040CE15DF0568F3DBC0C114D10446
28
+:1075A00009F04EC06091000170910101872F90E0B9
29
+:1075B000982F8827262F30E0822B932B90938501DC
30
+:1075C000809384014091020150910301852F90E046
31
+:1075D000982F8827242F30E0822B932B90938701BC
32
+:1075E00080938601209118018091190190E0982FD5
33
+:1075F000882730E0822B932B909389018093880118
34
+:1076000020911A0180911B0190E0982F882730E08B
35
+:10761000822B932B90938B0180938A0160931801A6
36
+:107620007093190140931A0150931B018CE08093D1
37
+:107630000001A092010110920201EAE3E09303012C
38
+:10764000E0E0F1E011BC808180BD81E081BD8181FD
39
+:1076500080BD82E081BD828180BD83E081BD838168
40
+:1076600080BD8E2F8C0D81BD84EA8FBB82EA8FBBDB
41
+:10767000349681E0E038F80729F77CC0843709F0B8
42
+:107680006BC083D090E0F82EEE247FD0E80EF11C82
43
+:107690007CD0182F91D0153489F4E6018701C1BD43
44
+:1076A00021968D2F992782BDE1E0EFBB00000000FD
45
+:1076B00080B563D00150104091F74BC0E6018701BF
46
+:1076C000209729F480918401909185013CC0C130BC
47
+:1076D000D10529F480918401909185010FC0C230B9
48
+:1076E000D10529F480918601909187012CC0C33087
49
+:1076F000D10539F48091860190918701892F9927CE
50
+:1077000022C0C831D10529F4809188019091890166
51
+:107710001AC0C931D10529F480918801909189015D
52
+:10772000EDCFCA31D10529F480918A0190918B0166
53
+:107730000AC0CB31D10529F480918A0190918B0147
54
+:10774000DDCFFE018491219618D00150104009F040
55
+:10775000B7CFCE0CDF1C0EC0853739F42DD08EE1AB
56
+:107760000CD085E90AD08FE09FCE813511F48CE0F2
57
+:107770001DD022D080E101D08ACE982F8091C00008
58
+:1077800085FFFCCF9093C60008958091C00087FFCD
59
+:10779000FCCF8091C00084FD01C0A8958091C600F7
60
+:1077A00008959AE29A95F1F708950895E0E6F0E0D9
61
+:1077B00098E1908380830895E8DF803219F08DE0AE
62
+:1077C000F5DFFFCF84E1D9CF1F93182FDEDF1150F3
63
+:1077D000E9F7F2DF1F910895282E80E0E7DFECE063
64
+:0477E000FF270994E2
65
+:0277FE00000584
66
+:040000030000740085
67
+:00000001FF
Chip-cn-dat/LGT-dat/LGT8F328-SDK-DAT/optiboot_lgt8fx8p/optiboot_lgt8f328p.lst
... ...
@@ -0,0 +1,892 @@
1
+
2
+optiboot_lgt8f328p.elf: file format elf32-avr
3
+
4
+Sections:
5
+Idx Name Size VMA LMA File off Algn
6
+ 0 .text 000003e4 00007400 00007400 00000054 2**1
7
+ CONTENTS, ALLOC, LOAD, READONLY, CODE
8
+ 1 .bootv 00000004 00000000 00000000 00000438 2**0
9
+ CONTENTS, READONLY
10
+ 2 .version 00000002 000077fe 000077fe 0000043c 2**0
11
+ CONTENTS, READONLY
12
+ 3 .debug_aranges 00000028 00000000 00000000 0000043e 2**0
13
+ CONTENTS, READONLY, DEBUGGING
14
+ 4 .debug_pubnames 0000006d 00000000 00000000 00000466 2**0
15
+ CONTENTS, READONLY, DEBUGGING
16
+ 5 .debug_info 00000337 00000000 00000000 000004d3 2**0
17
+ CONTENTS, READONLY, DEBUGGING
18
+ 6 .debug_abbrev 000001a6 00000000 00000000 0000080a 2**0
19
+ CONTENTS, READONLY, DEBUGGING
20
+ 7 .debug_line 0000059e 00000000 00000000 000009b0 2**0
21
+ CONTENTS, READONLY, DEBUGGING
22
+ 8 .debug_frame 00000090 00000000 00000000 00000f50 2**2
23
+ CONTENTS, READONLY, DEBUGGING
24
+ 9 .debug_str 0000016b 00000000 00000000 00000fe0 2**0
25
+ CONTENTS, READONLY, DEBUGGING
26
+ 10 .debug_loc 00000344 00000000 00000000 0000114b 2**0
27
+ CONTENTS, READONLY, DEBUGGING
28
+ 11 .debug_ranges 00000080 00000000 00000000 0000148f 2**0
29
+ CONTENTS, READONLY, DEBUGGING
30
+
31
+Disassembly of section .text:
32
+
33
+00007400 <main>:
34
+# define UART_SRL UBRR3L
35
+# define UART_UDR UDR3
36
+#endif
37
+
38
+/* main program starts here */
39
+int main(void) {
40
+ 7400: 11 24 eor r1, r1
41
+ // r1 contains zero
42
+ //
43
+ // If not, uncomment the following instructions:
44
+ // cli();
45
+ asm volatile ("clr __zero_reg__");
46
+ SP=RAMEND; // This is done by hardware reset
47
+ 7402: 8f ef ldi r24, 0xFF ; 255
48
+ 7404: 98 e0 ldi r25, 0x08 ; 8
49
+ 7406: 9e bf out 0x3e, r25 ; 62
50
+ 7408: 8d bf out 0x3d, r24 ; 61
51
+ if(pmask == 0)
52
+ OSCCAL = 0xae;
53
+#endif
54
+
55
+ // Adaboot no-wait mod
56
+ ch = MCUSR;
57
+ 740a: 94 b7 in r25, 0x34 ; 52
58
+ MCUSR = 0;
59
+ 740c: 14 be out 0x34, r1 ; 52
60
+ if (ch & (_BV(WDRF) | _BV(BORF) | _BV(PORF)))
61
+ 740e: 89 2f mov r24, r25
62
+ 7410: 8d 70 andi r24, 0x0D ; 13
63
+ 7412: 11 f0 breq .+4 ; 0x7418 <main+0x18>
64
+ appStart(ch);
65
+ 7414: 89 2f mov r24, r25
66
+ 7416: e0 d1 rcall .+960 ; 0x77d8 <appStart>
67
+
68
+ // WDT clock by 32KHz IRC
69
+ PMCR = 0x80;
70
+ 7418: 90 e8 ldi r25, 0x80 ; 128
71
+ 741a: 90 93 f2 00 sts 0x00F2, r25
72
+ PMCR = 0x93;
73
+ 741e: 83 e9 ldi r24, 0x93 ; 147
74
+ 7420: 80 93 f2 00 sts 0x00F2, r24
75
+
76
+ // system clock: 16MHz system clock
77
+ CLKPR = 0x80;
78
+ 7424: 90 93 61 00 sts 0x0061, r25
79
+ CLKPR = 0x01;
80
+ 7428: 81 e0 ldi r24, 0x01 ; 1
81
+ 742a: 80 93 61 00 sts 0x0061, r24
82
+
83
+ // enable 1KB E2PROM (for LGT8F328P)
84
+ ECCR = 0x80;
85
+ 742e: 96 bf out 0x36, r25 ; 54
86
+ ECCR = 0x4C;
87
+ 7430: 8c e4 ldi r24, 0x4C ; 76
88
+ 7432: 86 bf out 0x36, r24 ; 54
89
+
90
+#if LED_START_FLASHES > 0
91
+ // Set up Timer 1 for timeout counter
92
+ TCCR1B = _BV(CS12) | _BV(CS10); // div 1024
93
+ 7434: 85 e0 ldi r24, 0x05 ; 5
94
+ 7436: 80 93 81 00 sts 0x0081, r24
95
+ UCSRB = _BV(RXEN) | _BV(TXEN); // enable Rx & Tx
96
+ UCSRC = _BV(URSEL) | _BV(UCSZ1) | _BV(UCSZ0); // config USART; 8N1
97
+ UBRRL = (uint8_t)( (F_CPU + BAUD_RATE * 4L) / (BAUD_RATE * 8L) - 1 );
98
+#else
99
+ //UART_SRA = _BV(U2X0); //Double speed mode USART0
100
+ UART_SRB = _BV(RXEN0) | _BV(TXEN0);
101
+ 743a: 88 e1 ldi r24, 0x18 ; 24
102
+ 743c: 80 93 c1 00 sts 0x00C1, r24
103
+ UART_SRC = _BV(UCSZ00) | _BV(UCSZ01);
104
+ 7440: 86 e0 ldi r24, 0x06 ; 6
105
+ 7442: 80 93 c2 00 sts 0x00C2, r24
106
+ //UART_SRL = (uint8_t)( F_CPU / (BAUD_RATE * 8L) - 1 );
107
+ UART_SRL = (uint8_t)( F_CPU / (BAUD_RATE * 16L) - 1 );
108
+ 7446: 80 e1 ldi r24, 0x10 ; 16
109
+ 7448: 80 93 c4 00 sts 0x00C4, r24
110
+#endif
111
+#endif
112
+
113
+ // Set up watchdog to trigger after 500ms
114
+ watchdogConfig(WATCHDOG_32MS);
115
+ 744c: 8d e0 ldi r24, 0x0D ; 13
116
+ 744e: ae d1 rcall .+860 ; 0x77ac <watchdogConfig>
117
+
118
+#if (LED_START_FLASHES > 0) || defined(LED_DATA_FLASH)
119
+ /* Set LED pin as output */
120
+ LED_DDR |= _BV(LED);
121
+ 7450: 25 9a sbi 0x04, 5 ; 4
122
+ 7452: 96 e0 ldi r25, 0x06 ; 6
123
+}
124
+
125
+#if LED_START_FLASHES > 0
126
+void flash_led(uint8_t count) {
127
+ do {
128
+ TCNT1 = -(F_CPU/(1024*16));
129
+ 7454: 20 e3 ldi r18, 0x30 ; 48
130
+ 7456: 3c ef ldi r19, 0xFC ; 252
131
+ TIFR1 = _BV(TOV1);
132
+ 7458: 51 e0 ldi r21, 0x01 ; 1
133
+ while(!(TIFR1 & _BV(TOV1)));
134
+ LED_PORT ^= _BV(LED);
135
+ 745a: 40 e2 ldi r20, 0x20 ; 32
136
+}
137
+
138
+#if LED_START_FLASHES > 0
139
+void flash_led(uint8_t count) {
140
+ do {
141
+ TCNT1 = -(F_CPU/(1024*16));
142
+ 745c: 30 93 85 00 sts 0x0085, r19
143
+ 7460: 20 93 84 00 sts 0x0084, r18
144
+ TIFR1 = _BV(TOV1);
145
+ 7464: 56 bb out 0x16, r21 ; 22
146
+ while(!(TIFR1 & _BV(TOV1)));
147
+ 7466: b0 9b sbis 0x16, 0 ; 22
148
+ 7468: fe cf rjmp .-4 ; 0x7466 <main+0x66>
149
+ LED_PORT ^= _BV(LED);
150
+ 746a: 85 b1 in r24, 0x05 ; 5
151
+ 746c: 84 27 eor r24, r20
152
+ 746e: 85 b9 out 0x05, r24 ; 5
153
+}
154
+#endif
155
+
156
+// Watchdog functions. These are only safe with interrupts turned off.
157
+void watchdogReset() {
158
+ __asm__ __volatile__ (
159
+ 7470: a8 95 wdr
160
+ TCNT1 = -(F_CPU/(1024*16));
161
+ TIFR1 = _BV(TOV1);
162
+ while(!(TIFR1 & _BV(TOV1)));
163
+ LED_PORT ^= _BV(LED);
164
+ watchdogReset();
165
+ } while (--count);
166
+ 7472: 91 50 subi r25, 0x01 ; 1
167
+ 7474: 99 f7 brne .-26 ; 0x745c <main+0x5c>
168
+ 7476: 66 24 eor r6, r6
169
+ 7478: 77 24 eor r7, r7
170
+ 747a: 43 01 movw r8, r6
171
+ 747c: cc 24 eor r12, r12
172
+ 747e: dd 24 eor r13, r13
173
+ buff[26] = buff[2];
174
+ buff[27] = buff[3];
175
+
176
+ // Add jump to bootloader at RESET vector
177
+ buff[0] = 0x0c;
178
+ buff[1] = 0x94; // jmp
179
+ 7480: 64 e9 ldi r22, 0x94 ; 148
180
+ 7482: a6 2e mov r10, r22
181
+ EEARL = 0;
182
+ EEARH = address >> 8;
183
+ ch = EEARH >> 2; // 1KB page size
184
+
185
+ if((0 == (pmask & (((uint32_t)1 << ch)))) && bval == 'F') {
186
+ pmask |= ((uint32_t)1 << ch);
187
+ 7484: 51 e0 ldi r21, 0x01 ; 1
188
+ 7486: 25 2e mov r2, r21
189
+ 7488: 31 2c mov r3, r1
190
+ 748a: 41 2c mov r4, r1
191
+ 748c: 51 2c mov r5, r1
192
+ pmask = 0;
193
+
194
+ /* Forever loop */
195
+ for (;;) {
196
+ /* get character from UART */
197
+ ch = getch();
198
+ 748e: 7d d1 rcall .+762 ; 0x778a <getch>
199
+
200
+ if(ch == STK_GET_PARAMETER) {
201
+ 7490: 81 34 cpi r24, 0x41 ; 65
202
+ 7492: 61 f4 brne .+24 ; 0x74ac <main+0xac>
203
+ unsigned char which = getch();
204
+ 7494: 7a d1 rcall .+756 ; 0x778a <getch>
205
+ 7496: 18 2f mov r17, r24
206
+ verifySpace();
207
+ 7498: 8f d1 rcall .+798 ; 0x77b8 <verifySpace>
208
+ if (which == 0x82) {
209
+ 749a: 12 38 cpi r17, 0x82 ; 130
210
+ 749c: 29 f1 breq .+74 ; 0x74e8 <main+0xe8>
211
+ /*
212
+ * Send optiboot version as "minor SW version"
213
+ */
214
+ putch(OPTIBOOT_MINVER);
215
+ } else if (which == 0x81) {
216
+ 749e: 11 38 cpi r17, 0x81 ; 129
217
+ 74a0: 11 f4 brne .+4 ; 0x74a6 <main+0xa6>
218
+ putch(OPTIBOOT_MAJVER);
219
+ 74a2: 85 e0 ldi r24, 0x05 ; 5
220
+ 74a4: 01 c0 rjmp .+2 ; 0x74a8 <main+0xa8>
221
+ } else {
222
+ /*
223
+ * GET PARAMETER returns a generic 0x03 reply for
224
+ * other parameters - enough to keep Avrdude happy
225
+ */
226
+ putch(0x03);
227
+ 74a6: 83 e0 ldi r24, 0x03 ; 3
228
+ 74a8: 68 d1 rcall .+720 ; 0x777a <putch>
229
+ 74aa: 64 c1 rjmp .+712 ; 0x7774 <main+0x374>
230
+ }
231
+ }
232
+ else if(ch == STK_SET_DEVICE) {
233
+ 74ac: 82 34 cpi r24, 0x42 ; 66
234
+ 74ae: 11 f4 brne .+4 ; 0x74b4 <main+0xb4>
235
+ // SET DEVICE is ignored
236
+ getNch(20);
237
+ 74b0: 84 e1 ldi r24, 0x14 ; 20
238
+ 74b2: 03 c0 rjmp .+6 ; 0x74ba <main+0xba>
239
+ }
240
+ else if(ch == STK_SET_DEVICE_EXT) {
241
+ 74b4: 85 34 cpi r24, 0x45 ; 69
242
+ 74b6: 19 f4 brne .+6 ; 0x74be <main+0xbe>
243
+ // SET DEVICE EXT is ignored
244
+ getNch(5);
245
+ 74b8: 85 e0 ldi r24, 0x05 ; 5
246
+ 74ba: 86 d1 rcall .+780 ; 0x77c8 <verifySpace+0x10>
247
+ 74bc: 5b c1 rjmp .+694 ; 0x7774 <main+0x374>
248
+ }
249
+ else if(ch == STK_LOAD_ADDRESS) {
250
+ 74be: 85 35 cpi r24, 0x55 ; 85
251
+ 74c0: 79 f4 brne .+30 ; 0x74e0 <main+0xe0>
252
+ // LOAD ADDRESS
253
+ uint16_t newAddress;
254
+ newAddress = getch();
255
+ 74c2: 63 d1 rcall .+710 ; 0x778a <getch>
256
+ newAddress = (newAddress & 0xff) | (getch() << 8);
257
+ 74c4: e8 2e mov r14, r24
258
+ 74c6: ff 24 eor r15, r15
259
+ 74c8: 60 d1 rcall .+704 ; 0x778a <getch>
260
+ 74ca: 08 2f mov r16, r24
261
+ 74cc: 10 e0 ldi r17, 0x00 ; 0
262
+ 74ce: 10 2f mov r17, r16
263
+ 74d0: 00 27 eor r16, r16
264
+ 74d2: 0e 29 or r16, r14
265
+ 74d4: 1f 29 or r17, r15
266
+#ifdef RAMPZ
267
+ // Transfer top bit to RAMPZ
268
+ RAMPZ = (newAddress & 0x8000) ? 1 : 0;
269
+#endif
270
+ newAddress += newAddress; // Convert from word address to byte address
271
+ 74d6: 00 0f add r16, r16
272
+ 74d8: 11 1f adc r17, r17
273
+ address = newAddress;
274
+ verifySpace();
275
+ 74da: 6e d1 rcall .+732 ; 0x77b8 <verifySpace>
276
+ 74dc: 68 01 movw r12, r16
277
+ 74de: 4a c1 rjmp .+660 ; 0x7774 <main+0x374>
278
+ }
279
+ else if(ch == STK_UNIVERSAL) {
280
+ 74e0: 86 35 cpi r24, 0x56 ; 86
281
+ 74e2: 21 f4 brne .+8 ; 0x74ec <main+0xec>
282
+ // UNIVERSAL command is ignored
283
+ getNch(4);
284
+ 74e4: 84 e0 ldi r24, 0x04 ; 4
285
+ 74e6: 70 d1 rcall .+736 ; 0x77c8 <verifySpace+0x10>
286
+ putch(0x00);
287
+ 74e8: 80 e0 ldi r24, 0x00 ; 0
288
+ 74ea: de cf rjmp .-68 ; 0x74a8 <main+0xa8>
289
+ }
290
+ /* Write memory, length is big endian and is in bytes */
291
+ else if(ch == STK_PROG_PAGE) {
292
+ 74ec: 84 36 cpi r24, 0x64 ; 100
293
+ 74ee: 09 f0 breq .+2 ; 0x74f2 <main+0xf2>
294
+ 74f0: c5 c0 rjmp .+394 ; 0x767c <main+0x27c>
295
+ // PROGRAM PAGE - we support flash programming only, not EEPROM
296
+ uint8_t *bufPtr;
297
+ uint8_t bval;
298
+ uint16_t len;
299
+ length = (uint16_t)getch() << 8; /* getlen() */
300
+ 74f2: 4b d1 rcall .+662 ; 0x778a <getch>
301
+ 74f4: 90 e0 ldi r25, 0x00 ; 0
302
+ 74f6: f8 2e mov r15, r24
303
+ 74f8: ee 24 eor r14, r14
304
+ length += getch();
305
+ 74fa: 47 d1 rcall .+654 ; 0x778a <getch>
306
+ 74fc: e8 0e add r14, r24
307
+ 74fe: f1 1c adc r15, r1
308
+ bval = getch();
309
+ 7500: 44 d1 rcall .+648 ; 0x778a <getch>
310
+ 7502: b8 2e mov r11, r24
311
+ 7504: e7 01 movw r28, r14
312
+ 7506: 00 e0 ldi r16, 0x00 ; 0
313
+ 7508: 11 e0 ldi r17, 0x01 ; 1
314
+ //if (address < NRWWSTART) __boot_page_erase_short((uint16_t)(void*)address);
315
+
316
+ // While that is going on, read in page contents
317
+ bufPtr = buff;
318
+ len = length;
319
+ do *bufPtr++ = getch();
320
+ 750a: 3f d1 rcall .+638 ; 0x778a <getch>
321
+ 750c: f8 01 movw r30, r16
322
+ 750e: 81 93 st Z+, r24
323
+ 7510: 8f 01 movw r16, r30
324
+ while (--len);
325
+ 7512: 21 97 sbiw r28, 0x01 ; 1
326
+ 7514: d1 f7 brne .-12 ; 0x750a <main+0x10a>
327
+
328
+ EEARL = 0;
329
+ 7516: 11 bc out 0x21, r1 ; 33
330
+ EEARH = address >> 8;
331
+ 7518: 8d 2d mov r24, r13
332
+ 751a: 99 27 eor r25, r25
333
+ 751c: 82 bd out 0x22, r24 ; 34
334
+ ch = EEARH >> 2; // 1KB page size
335
+ 751e: 82 b5 in r24, 0x22 ; 34
336
+
337
+ if((0 == (pmask & (((uint32_t)1 << ch)))) && bval == 'F') {
338
+ 7520: 86 95 lsr r24
339
+ 7522: 86 95 lsr r24
340
+ 7524: 28 2f mov r18, r24
341
+ 7526: d4 01 movw r26, r8
342
+ 7528: c3 01 movw r24, r6
343
+ 752a: 02 2e mov r0, r18
344
+ 752c: 04 c0 rjmp .+8 ; 0x7536 <main+0x136>
345
+ 752e: b6 95 lsr r27
346
+ 7530: a7 95 ror r26
347
+ 7532: 97 95 ror r25
348
+ 7534: 87 95 ror r24
349
+ 7536: 0a 94 dec r0
350
+ 7538: d2 f7 brpl .-12 ; 0x752e <main+0x12e>
351
+ 753a: 80 fd sbrc r24, 0
352
+ 753c: 15 c0 rjmp .+42 ; 0x7568 <main+0x168>
353
+ 753e: f6 e4 ldi r31, 0x46 ; 70
354
+ 7540: bf 16 cp r11, r31
355
+ 7542: 91 f4 brne .+36 ; 0x7568 <main+0x168>
356
+ pmask |= ((uint32_t)1 << ch);
357
+ 7544: d2 01 movw r26, r4
358
+ 7546: c1 01 movw r24, r2
359
+ 7548: 04 c0 rjmp .+8 ; 0x7552 <main+0x152>
360
+ 754a: 88 0f add r24, r24
361
+ 754c: 99 1f adc r25, r25
362
+ 754e: aa 1f adc r26, r26
363
+ 7550: bb 1f adc r27, r27
364
+ 7552: 2a 95 dec r18
365
+ 7554: d2 f7 brpl .-12 ; 0x754a <main+0x14a>
366
+ 7556: 68 2a or r6, r24
367
+ 7558: 79 2a or r7, r25
368
+ 755a: 8a 2a or r8, r26
369
+ 755c: 9b 2a or r9, r27
370
+ // do page erase here
371
+ EECR = 0x94;
372
+ 755e: af ba out 0x1f, r10 ; 31
373
+ EECR = 0x92;
374
+ 7560: 82 e9 ldi r24, 0x92 ; 146
375
+ 7562: 8f bb out 0x1f, r24 ; 31
376
+ __asm__ __volatile__ ("nop" ::);
377
+ 7564: 00 00 nop
378
+ __asm__ __volatile__ ("nop" ::);
379
+ 7566: 00 00 nop
380
+ }
381
+
382
+ // Read command terminator, start reply
383
+ verifySpace();
384
+ 7568: 27 d1 rcall .+590 ; 0x77b8 <verifySpace>
385
+
386
+ // If only a partial page is to be programmed, the erase might not be complete.
387
+ // So check that here
388
+ //boot_spm_busy_wait();
389
+ if (bval == 'E') {
390
+ 756a: e5 e4 ldi r30, 0x45 ; 69
391
+ 756c: be 16 cp r11, r30
392
+ 756e: b1 f4 brne .+44 ; 0x759c <main+0x19c>
393
+ 7570: 96 01 movw r18, r12
394
+ 7572: 10 c0 rjmp .+32 ; 0x7594 <main+0x194>
395
+ for(len = 0; len < length; len++) {
396
+ //if(address >= 1022)
397
+ //break;
398
+ EEARL = address++;
399
+ 7574: 21 bd out 0x21, r18 ; 33
400
+ 7576: 2f 5f subi r18, 0xFF ; 255
401
+ 7578: 3f 4f sbci r19, 0xFF ; 255
402
+ EEARH = address >> 8;
403
+ 757a: 83 2f mov r24, r19
404
+ 757c: 99 27 eor r25, r25
405
+ 757e: 82 bd out 0x22, r24 ; 34
406
+ EEDR = buff[len];
407
+ 7580: c0 50 subi r28, 0x00 ; 0
408
+ 7582: df 4f sbci r29, 0xFF ; 255
409
+ 7584: 88 81 ld r24, Y
410
+ 7586: 80 bd out 0x20, r24 ; 32
411
+ EECR = 0x04;
412
+ 7588: f4 e0 ldi r31, 0x04 ; 4
413
+ 758a: ff bb out 0x1f, r31 ; 31
414
+ EECR = 0x02;
415
+ 758c: 82 e0 ldi r24, 0x02 ; 2
416
+ 758e: 8f bb out 0x1f, r24 ; 31
417
+
418
+ // If only a partial page is to be programmed, the erase might not be complete.
419
+ // So check that here
420
+ //boot_spm_busy_wait();
421
+ if (bval == 'E') {
422
+ for(len = 0; len < length; len++) {
423
+ 7590: cf 5f subi r28, 0xFF ; 255
424
+ 7592: d0 40 sbci r29, 0x00 ; 0
425
+ 7594: ce 15 cp r28, r14
426
+ 7596: df 05 cpc r29, r15
427
+ 7598: 68 f3 brcs .-38 ; 0x7574 <main+0x174>
428
+ 759a: db c0 rjmp .+438 ; 0x7752 <main+0x352>
429
+ EECR = 0x04;
430
+ EECR = 0x02;
431
+ }
432
+ } else {
433
+#ifdef VIRTUAL_BOOT_PARTITION
434
+ if ((uint16_t)(void*)address == 0) {
435
+ 759c: c1 14 cp r12, r1
436
+ 759e: d1 04 cpc r13, r1
437
+ 75a0: 09 f0 breq .+2 ; 0x75a4 <main+0x1a4>
438
+ 75a2: 4e c0 rjmp .+156 ; 0x7640 <main+0x240>
439
+ // This is the reset vector page. We need to live-patch the code so the
440
+ // bootloader runs.
441
+ //
442
+ // Move RESET vector to WDT vector
443
+ rstVect0 = buff[0] | (buff[1] << 8);
444
+ 75a4: 60 91 00 01 lds r22, 0x0100
445
+ 75a8: 70 91 01 01 lds r23, 0x0101
446
+ 75ac: 87 2f mov r24, r23
447
+ 75ae: 90 e0 ldi r25, 0x00 ; 0
448
+ 75b0: 98 2f mov r25, r24
449
+ 75b2: 88 27 eor r24, r24
450
+ 75b4: 26 2f mov r18, r22
451
+ 75b6: 30 e0 ldi r19, 0x00 ; 0
452
+ 75b8: 82 2b or r24, r18
453
+ 75ba: 93 2b or r25, r19
454
+ 75bc: 90 93 85 01 sts 0x0185, r25
455
+ 75c0: 80 93 84 01 sts 0x0184, r24
456
+ rstVect1 = buff[2] | (buff[3] << 8);
457
+ 75c4: 40 91 02 01 lds r20, 0x0102
458
+ 75c8: 50 91 03 01 lds r21, 0x0103
459
+ 75cc: 85 2f mov r24, r21
460
+ 75ce: 90 e0 ldi r25, 0x00 ; 0
461
+ 75d0: 98 2f mov r25, r24
462
+ 75d2: 88 27 eor r24, r24
463
+ 75d4: 24 2f mov r18, r20
464
+ 75d6: 30 e0 ldi r19, 0x00 ; 0
465
+ 75d8: 82 2b or r24, r18
466
+ 75da: 93 2b or r25, r19
467
+ 75dc: 90 93 87 01 sts 0x0187, r25
468
+ 75e0: 80 93 86 01 sts 0x0186, r24
469
+ wdtVect0 = buff[24] | (buff[25] << 8);
470
+ 75e4: 20 91 18 01 lds r18, 0x0118
471
+ 75e8: 80 91 19 01 lds r24, 0x0119
472
+ 75ec: 90 e0 ldi r25, 0x00 ; 0
473
+ 75ee: 98 2f mov r25, r24
474
+ 75f0: 88 27 eor r24, r24
475
+ 75f2: 30 e0 ldi r19, 0x00 ; 0
476
+ 75f4: 82 2b or r24, r18
477
+ 75f6: 93 2b or r25, r19
478
+ 75f8: 90 93 89 01 sts 0x0189, r25
479
+ 75fc: 80 93 88 01 sts 0x0188, r24
480
+ wdtVect1 = buff[26] | (buff[27] << 8);
481
+ 7600: 20 91 1a 01 lds r18, 0x011A
482
+ 7604: 80 91 1b 01 lds r24, 0x011B
483
+ 7608: 90 e0 ldi r25, 0x00 ; 0
484
+ 760a: 98 2f mov r25, r24
485
+ 760c: 88 27 eor r24, r24
486
+ 760e: 30 e0 ldi r19, 0x00 ; 0
487
+ 7610: 82 2b or r24, r18
488
+ 7612: 93 2b or r25, r19
489
+ 7614: 90 93 8b 01 sts 0x018B, r25
490
+ 7618: 80 93 8a 01 sts 0x018A, r24
491
+
492
+ buff[24] = buff[0];
493
+ 761c: 60 93 18 01 sts 0x0118, r22
494
+ buff[25] = buff[1];
495
+ 7620: 70 93 19 01 sts 0x0119, r23
496
+ buff[26] = buff[2];
497
+ 7624: 40 93 1a 01 sts 0x011A, r20
498
+ buff[27] = buff[3];
499
+ 7628: 50 93 1b 01 sts 0x011B, r21
500
+
501
+ // Add jump to bootloader at RESET vector
502
+ buff[0] = 0x0c;
503
+ 762c: 8c e0 ldi r24, 0x0C ; 12
504
+ 762e: 80 93 00 01 sts 0x0100, r24
505
+ buff[1] = 0x94; // jmp
506
+ 7632: a0 92 01 01 sts 0x0101, r10
507
+ buff[2] = 0x00;
508
+ 7636: 10 92 02 01 sts 0x0102, r1
509
+ buff[3] = 0x3a; // 0x7400 (0x3a00)
510
+ 763a: ea e3 ldi r30, 0x3A ; 58
511
+ 763c: e0 93 03 01 sts 0x0103, r30
512
+ 7640: e0 e0 ldi r30, 0x00 ; 0
513
+ 7642: f1 e0 ldi r31, 0x01 ; 1
514
+ }
515
+#endif
516
+ // Write from programming buffer
517
+ pdword_t wPtr = (pdword_t)buff;
518
+ for(length = 0; length < SPM_PAGESIZE; length+=4, wPtr++) {
519
+ EEARL = 0; EEDR = wPtr->byte[0];
520
+ 7644: 11 bc out 0x21, r1 ; 33
521
+ 7646: 80 81 ld r24, Z
522
+ 7648: 80 bd out 0x20, r24 ; 32
523
+ EEARL = 1; EEDR = wPtr->byte[1];
524
+ 764a: 81 e0 ldi r24, 0x01 ; 1
525
+ 764c: 81 bd out 0x21, r24 ; 33
526
+ 764e: 81 81 ldd r24, Z+1 ; 0x01
527
+ 7650: 80 bd out 0x20, r24 ; 32
528
+ EEARL = 2; EEDR = wPtr->byte[2];
529
+ 7652: 82 e0 ldi r24, 0x02 ; 2
530
+ 7654: 81 bd out 0x21, r24 ; 33
531
+ 7656: 82 81 ldd r24, Z+2 ; 0x02
532
+ 7658: 80 bd out 0x20, r24 ; 32
533
+ EEARL = 3; EEDR = wPtr->byte[3];
534
+ 765a: 83 e0 ldi r24, 0x03 ; 3
535
+ 765c: 81 bd out 0x21, r24 ; 33
536
+ 765e: 83 81 ldd r24, Z+3 ; 0x03
537
+ 7660: 80 bd out 0x20, r24 ; 32
538
+ 7662: 8e 2f mov r24, r30
539
+ 7664: 8c 0d add r24, r12
540
+ EEARL = (address + length) & 0xff;
541
+ 7666: 81 bd out 0x21, r24 ; 33
542
+ EECR = 0xA4;
543
+ 7668: 84 ea ldi r24, 0xA4 ; 164
544
+ 766a: 8f bb out 0x1f, r24 ; 31
545
+ EECR = 0xA2;
546
+ 766c: 82 ea ldi r24, 0xA2 ; 162
547
+ 766e: 8f bb out 0x1f, r24 ; 31
548
+ buff[3] = 0x3a; // 0x7400 (0x3a00)
549
+ }
550
+#endif
551
+ // Write from programming buffer
552
+ pdword_t wPtr = (pdword_t)buff;
553
+ for(length = 0; length < SPM_PAGESIZE; length+=4, wPtr++) {
554
+ 7670: 34 96 adiw r30, 0x04 ; 4
555
+ 7672: 81 e0 ldi r24, 0x01 ; 1
556
+ 7674: e0 38 cpi r30, 0x80 ; 128
557
+ 7676: f8 07 cpc r31, r24
558
+ 7678: 29 f7 brne .-54 ; 0x7644 <main+0x244>
559
+ 767a: 7c c0 rjmp .+248 ; 0x7774 <main+0x374>
560
+ EECR = 0xA2;
561
+ }
562
+ }
563
+ }
564
+ /* Read memory block mode, length is big endian. */
565
+ else if(ch == STK_READ_PAGE) {
566
+ 767c: 84 37 cpi r24, 0x74 ; 116
567
+ 767e: 09 f0 breq .+2 ; 0x7682 <main+0x282>
568
+ 7680: 6b c0 rjmp .+214 ; 0x7758 <main+0x358>
569
+ // READ PAGE - we only read flash
570
+ uint8_t bval;
571
+
572
+ length = getch() << 8; /* getlen() */
573
+ 7682: 83 d0 rcall .+262 ; 0x778a <getch>
574
+ 7684: 90 e0 ldi r25, 0x00 ; 0
575
+ 7686: f8 2e mov r15, r24
576
+ 7688: ee 24 eor r14, r14
577
+ length += getch();
578
+ 768a: 7f d0 rcall .+254 ; 0x778a <getch>
579
+ 768c: e8 0e add r14, r24
580
+ 768e: f1 1c adc r15, r1
581
+ bval = getch();
582
+ 7690: 7c d0 rcall .+248 ; 0x778a <getch>
583
+ 7692: 18 2f mov r17, r24
584
+
585
+ verifySpace();
586
+ 7694: 91 d0 rcall .+290 ; 0x77b8 <verifySpace>
587
+
588
+ if( bval == 'E') {
589
+ 7696: 15 34 cpi r17, 0x45 ; 69
590
+ 7698: 89 f4 brne .+34 ; 0x76bc <main+0x2bc>
591
+ 769a: e6 01 movw r28, r12
592
+ 769c: 87 01 movw r16, r14
593
+ do {
594
+ EEARL = address++;
595
+ 769e: c1 bd out 0x21, r28 ; 33
596
+ 76a0: 21 96 adiw r28, 0x01 ; 1
597
+ EEARH = address >> 8;
598
+ 76a2: 8d 2f mov r24, r29
599
+ 76a4: 99 27 eor r25, r25
600
+ 76a6: 82 bd out 0x22, r24 ; 34
601
+ EECR = 0x01;
602
+ 76a8: e1 e0 ldi r30, 0x01 ; 1
603
+ 76aa: ef bb out 0x1f, r30 ; 31
604
+ __asm__ __volatile__ ("nop" ::);
605
+ 76ac: 00 00 nop
606
+ __asm__ __volatile__ ("nop" ::);
607
+ 76ae: 00 00 nop
608
+ putch(EEDR);
609
+ 76b0: 80 b5 in r24, 0x20 ; 32
610
+ 76b2: 63 d0 rcall .+198 ; 0x777a <putch>
611
+ } while (--length);
612
+ 76b4: 01 50 subi r16, 0x01 ; 1
613
+ 76b6: 10 40 sbci r17, 0x00 ; 0
614
+ 76b8: 91 f7 brne .-28 ; 0x769e <main+0x29e>
615
+ 76ba: 4b c0 rjmp .+150 ; 0x7752 <main+0x352>
616
+ 76bc: e6 01 movw r28, r12
617
+ 76be: 87 01 movw r16, r14
618
+ } else {
619
+ do {
620
+#ifdef VIRTUAL_BOOT_PARTITION
621
+ // Undo vector patch in bottom page so verify passes
622
+ if (address == 0) ch = rstVect0 & 0xff;
623
+ 76c0: 20 97 sbiw r28, 0x00 ; 0
624
+ 76c2: 29 f4 brne .+10 ; 0x76ce <main+0x2ce>
625
+ 76c4: 80 91 84 01 lds r24, 0x0184
626
+ 76c8: 90 91 85 01 lds r25, 0x0185
627
+ 76cc: 3c c0 rjmp .+120 ; 0x7746 <main+0x346>
628
+ else if (address == 1) ch = rstVect0 >> 8;
629
+ 76ce: c1 30 cpi r28, 0x01 ; 1
630
+ 76d0: d1 05 cpc r29, r1
631
+ 76d2: 29 f4 brne .+10 ; 0x76de <main+0x2de>
632
+ 76d4: 80 91 84 01 lds r24, 0x0184
633
+ 76d8: 90 91 85 01 lds r25, 0x0185
634
+ 76dc: 0f c0 rjmp .+30 ; 0x76fc <main+0x2fc>
635
+ else if (address == 2) ch = rstVect1 & 0xff;
636
+ 76de: c2 30 cpi r28, 0x02 ; 2
637
+ 76e0: d1 05 cpc r29, r1
638
+ 76e2: 29 f4 brne .+10 ; 0x76ee <main+0x2ee>
639
+ 76e4: 80 91 86 01 lds r24, 0x0186
640
+ 76e8: 90 91 87 01 lds r25, 0x0187
641
+ 76ec: 2c c0 rjmp .+88 ; 0x7746 <main+0x346>
642
+ else if (address == 3) ch = rstVect1 >> 8;
643
+ 76ee: c3 30 cpi r28, 0x03 ; 3
644
+ 76f0: d1 05 cpc r29, r1
645
+ 76f2: 39 f4 brne .+14 ; 0x7702 <main+0x302>
646
+ 76f4: 80 91 86 01 lds r24, 0x0186
647
+ 76f8: 90 91 87 01 lds r25, 0x0187
648
+ 76fc: 89 2f mov r24, r25
649
+ 76fe: 99 27 eor r25, r25
650
+ 7700: 22 c0 rjmp .+68 ; 0x7746 <main+0x346>
651
+ else if (address == 24) ch = wdtVect0 & 0xff;
652
+ 7702: c8 31 cpi r28, 0x18 ; 24
653
+ 7704: d1 05 cpc r29, r1
654
+ 7706: 29 f4 brne .+10 ; 0x7712 <main+0x312>
655
+ 7708: 80 91 88 01 lds r24, 0x0188
656
+ 770c: 90 91 89 01 lds r25, 0x0189
657
+ 7710: 1a c0 rjmp .+52 ; 0x7746 <main+0x346>
658
+ else if (address == 25) ch = wdtVect0 >> 8;
659
+ 7712: c9 31 cpi r28, 0x19 ; 25
660
+ 7714: d1 05 cpc r29, r1
661
+ 7716: 29 f4 brne .+10 ; 0x7722 <main+0x322>
662
+ 7718: 80 91 88 01 lds r24, 0x0188
663
+ 771c: 90 91 89 01 lds r25, 0x0189
664
+ 7720: ed cf rjmp .-38 ; 0x76fc <main+0x2fc>
665
+ else if (address == 26) ch = wdtVect1 & 0xff;
666
+ 7722: ca 31 cpi r28, 0x1A ; 26
667
+ 7724: d1 05 cpc r29, r1
668
+ 7726: 29 f4 brne .+10 ; 0x7732 <main+0x332>
669
+ 7728: 80 91 8a 01 lds r24, 0x018A
670
+ 772c: 90 91 8b 01 lds r25, 0x018B
671
+ 7730: 0a c0 rjmp .+20 ; 0x7746 <main+0x346>
672
+ else if (address == 27) ch = wdtVect1 >> 8;
673
+ 7732: cb 31 cpi r28, 0x1B ; 27
674
+ 7734: d1 05 cpc r29, r1
675
+ 7736: 29 f4 brne .+10 ; 0x7742 <main+0x342>
676
+ 7738: 80 91 8a 01 lds r24, 0x018A
677
+ 773c: 90 91 8b 01 lds r25, 0x018B
678
+ 7740: dd cf rjmp .-70 ; 0x76fc <main+0x2fc>
679
+ // Since RAMPZ should already be set, we need to use EPLM directly.
680
+ // read a Flash and increment the address (may increment RAMPZ)
681
+ __asm__ ("elpm %0,Z\n" : "=r" (ch) : "z" (address));
682
+ #else
683
+ // read a Flash byte and increment the address
684
+ __asm__ ("lpm %0,Z\n" : "=r" (ch) : "z" (address));
685
+ 7742: fe 01 movw r30, r28
686
+ 7744: 84 91 lpm r24, Z+
687
+ //ch = *((uint8_t *)(0x4000 + address));
688
+ #endif
689
+#endif
690
+ }
691
+ address++;
692
+ 7746: 21 96 adiw r28, 0x01 ; 1
693
+ putch(ch);
694
+ 7748: 18 d0 rcall .+48 ; 0x777a <putch>
695
+ } while (--length);
696
+ 774a: 01 50 subi r16, 0x01 ; 1
697
+ 774c: 10 40 sbci r17, 0x00 ; 0
698
+ 774e: 09 f0 breq .+2 ; 0x7752 <main+0x352>
699
+ 7750: b7 cf rjmp .-146 ; 0x76c0 <main+0x2c0>
700
+ 7752: ce 0c add r12, r14
701
+ 7754: df 1c adc r13, r15
702
+ 7756: 0e c0 rjmp .+28 ; 0x7774 <main+0x374>
703
+ }
704
+ }
705
+
706
+ /* Get device signature bytes */
707
+ else if(ch == STK_READ_SIGN) {
708
+ 7758: 85 37 cpi r24, 0x75 ; 117
709
+ 775a: 39 f4 brne .+14 ; 0x776a <main+0x36a>
710
+ // READ SIGN - return what Avrdude wants to hear
711
+ verifySpace();
712
+ 775c: 2d d0 rcall .+90 ; 0x77b8 <verifySpace>
713
+ putch(SIGNATURE_0);
714
+ 775e: 8e e1 ldi r24, 0x1E ; 30
715
+ 7760: 0c d0 rcall .+24 ; 0x777a <putch>
716
+ putch(SIGNATURE_1);
717
+ 7762: 85 e9 ldi r24, 0x95 ; 149
718
+ 7764: 0a d0 rcall .+20 ; 0x777a <putch>
719
+ putch(SIGNATURE_2);
720
+ 7766: 8f e0 ldi r24, 0x0F ; 15
721
+ 7768: 9f ce rjmp .-706 ; 0x74a8 <main+0xa8>
722
+ }
723
+ else if (ch == STK_LEAVE_PROGMODE) { /* 'Q' */
724
+ 776a: 81 35 cpi r24, 0x51 ; 81
725
+ 776c: 11 f4 brne .+4 ; 0x7772 <main+0x372>
726
+ // Adaboot no-wait mod
727
+ watchdogConfig(WATCHDOG_16MS);
728
+ 776e: 8c e0 ldi r24, 0x0C ; 12
729
+ 7770: 1d d0 rcall .+58 ; 0x77ac <watchdogConfig>
730
+ verifySpace();
731
+ }
732
+ else {
733
+ // This covers the response to commands like STK_ENTER_PROGMODE
734
+ verifySpace();
735
+ 7772: 22 d0 rcall .+68 ; 0x77b8 <verifySpace>
736
+ }
737
+ putch(STK_OK);
738
+ 7774: 80 e1 ldi r24, 0x10 ; 16
739
+ 7776: 01 d0 rcall .+2 ; 0x777a <putch>
740
+ 7778: 8a ce rjmp .-748 ; 0x748e <main+0x8e>
741
+
742
+0000777a <putch>:
743
+ }
744
+}
745
+
746
+void putch(char ch) {
747
+ 777a: 98 2f mov r25, r24
748
+#ifndef SOFT_UART
749
+ while (!(UART_SRA & _BV(UDRE0)));
750
+ 777c: 80 91 c0 00 lds r24, 0x00C0
751
+ 7780: 85 ff sbrs r24, 5
752
+ 7782: fc cf rjmp .-8 ; 0x777c <putch+0x2>
753
+ UART_UDR = ch;
754
+ 7784: 90 93 c6 00 sts 0x00C6, r25
755
+ [uartBit] "I" (UART_TX_BIT)
756
+ :
757
+ "r25"
758
+ );
759
+#endif
760
+}
761
+ 7788: 08 95 ret
762
+
763
+0000778a <getch>:
764
+ [uartBit] "I" (UART_RX_BIT)
765
+ :
766
+ "r25"
767
+);
768
+#else
769
+ while(!(UART_SRA & _BV(RXC0)))
770
+ 778a: 80 91 c0 00 lds r24, 0x00C0
771
+ 778e: 87 ff sbrs r24, 7
772
+ 7790: fc cf rjmp .-8 ; 0x778a <getch>
773
+ ;
774
+ if (!(UART_SRA & _BV(FE0))) {
775
+ 7792: 80 91 c0 00 lds r24, 0x00C0
776
+ 7796: 84 fd sbrc r24, 4
777
+ 7798: 01 c0 rjmp .+2 ; 0x779c <getch+0x12>
778
+}
779
+#endif
780
+
781
+// Watchdog functions. These are only safe with interrupts turned off.
782
+void watchdogReset() {
783
+ __asm__ __volatile__ (
784
+ 779a: a8 95 wdr
785
+ * don't care that an invalid char is returned...)
786
+ */
787
+ watchdogReset();
788
+ }
789
+
790
+ ch = UART_UDR;
791
+ 779c: 80 91 c6 00 lds r24, 0x00C6
792
+#ifdef LED_DATA_FLASH
793
+ LED_PORT ^= _BV(LED);
794
+#endif
795
+
796
+ return ch;
797
+}
798
+ 77a0: 08 95 ret
799
+
800
+000077a2 <uartDelay>:
801
+#if UART_B_VALUE > 255
802
+#error Baud rate too slow for soft UART
803
+#endif
804
+
805
+void uartDelay() {
806
+ __asm__ __volatile__ (
807
+ 77a2: 9a e2 ldi r25, 0x2A ; 42
808
+ 77a4: 9a 95 dec r25
809
+ 77a6: f1 f7 brne .-4 ; 0x77a4 <uartDelay+0x2>
810
+ 77a8: 08 95 ret
811
+ "1:dec r25\n"
812
+ "brne 1b\n"
813
+ "ret\n"
814
+ ::[count] "M" (UART_B_VALUE)
815
+ );
816
+}
817
+ 77aa: 08 95 ret
818
+
819
+000077ac <watchdogConfig>:
820
+ );
821
+}
822
+
823
+void watchdogConfig(uint8_t x) {
824
+#if 1
825
+ WDTCSR = _BV(WDCE) | _BV(WDE);
826
+ 77ac: e0 e6 ldi r30, 0x60 ; 96
827
+ 77ae: f0 e0 ldi r31, 0x00 ; 0
828
+ 77b0: 98 e1 ldi r25, 0x18 ; 24
829
+ 77b2: 90 83 st Z, r25
830
+ WDTCSR = x;
831
+ 77b4: 80 83 st Z, r24
832
+#endif
833
+}
834
+ 77b6: 08 95 ret
835
+
836
+000077b8 <verifySpace>:
837
+ do getch(); while (--count);
838
+ verifySpace();
839
+}
840
+
841
+void verifySpace() {
842
+ if (getch() != CRC_EOP) {
843
+ 77b8: e8 df rcall .-48 ; 0x778a <getch>
844
+ 77ba: 80 32 cpi r24, 0x20 ; 32
845
+ 77bc: 19 f0 breq .+6 ; 0x77c4 <verifySpace+0xc>
846
+ watchdogConfig(WATCHDOG_32MS); // shorten WD timeout
847
+ 77be: 8d e0 ldi r24, 0x0D ; 13
848
+ 77c0: f5 df rcall .-22 ; 0x77ac <watchdogConfig>
849
+ 77c2: ff cf rjmp .-2 ; 0x77c2 <verifySpace+0xa>
850
+ while (1) // and busy-loop so that WD causes
851
+ ; // a reset and app start.
852
+ }
853
+ putch(STK_INSYNC);
854
+ 77c4: 84 e1 ldi r24, 0x14 ; 20
855
+}
856
+ 77c6: d9 cf rjmp .-78 ; 0x777a <putch>
857
+ "ret\n"
858
+ ::[count] "M" (UART_B_VALUE)
859
+ );
860
+}
861
+
862
+void getNch(uint8_t count) {
863
+ 77c8: 1f 93 push r17
864
+
865
+000077ca <getNch>:
866
+ 77ca: 18 2f mov r17, r24
867
+ do getch(); while (--count);
868
+ 77cc: de df rcall .-68 ; 0x778a <getch>
869
+ 77ce: 11 50 subi r17, 0x01 ; 1
870
+ 77d0: e9 f7 brne .-6 ; 0x77cc <getNch+0x2>
871
+ verifySpace();
872
+ 77d2: f2 df rcall .-28 ; 0x77b8 <verifySpace>
873
+}
874
+ 77d4: 1f 91 pop r17
875
+ 77d6: 08 95 ret
876
+
877
+000077d8 <appStart>:
878
+
879
+void appStart(uint8_t rstFlags) {
880
+ // save the reset flags in the designated register
881
+ // This can be saved in a main program by putting code in .init0 (which
882
+ // executes before normal c init code) to save R2 to a global variable.
883
+ __asm__ __volatile__ ("mov r2, %0\n" :: "r" (rstFlags));
884
+ 77d8: 28 2e mov r2, r24
885
+
886
+ watchdogConfig(WATCHDOG_OFF);
887
+ 77da: 80 e0 ldi r24, 0x00 ; 0
888
+ 77dc: e7 df rcall .-50 ; 0x77ac <watchdogConfig>
889
+ __asm__ __volatile__ (
890
+ 77de: ec e0 ldi r30, 0x0C ; 12
891
+ 77e0: ff 27 eor r31, r31
892
+ 77e2: 09 94 ijmp
Chip-cn-dat/LGT-dat/LGT8F328-SDK-DAT/optiboot_lgt8fx8p/pin_defs.h
... ...
@@ -0,0 +1,740 @@
1
+/*------------------------------------------------------------------------ */
2
+#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined(__AVR_ATmega88) || defined(__AVR_ATmega8__) || defined(__AVR_ATmega88__)
3
+/*------------------------------------------------------------------------ */
4
+
5
+/* Onboard LED is connected to pin PB5 in Arduino NG, Diecimila, and Duemilanove
6
+ */
7
+#if !defined(LED)
8
+#define LED B5
9
+#endif
10
+
11
+/* Ports for soft UART */
12
+#ifdef SOFT_UART
13
+#define UART_PORT PORTD
14
+#define UART_PIN PIND
15
+#define UART_DDR DDRD
16
+#define UART_TX_BIT 1
17
+#define UART_RX_BIT 0
18
+#endif
19
+#endif
20
+
21
+#if defined(__AVR_ATmega8__) || defined(__AVR_ATmega32__)
22
+ //Name conversion R.Wiersma
23
+ #define UCSR0A UCSRA
24
+ #define UDR0 UDR
25
+ #define UDRE0 UDRE
26
+ #define RXC0 RXC
27
+ #define FE0 FE
28
+ #define TIFR1 TIFR
29
+ #define WDTCSR WDTCR
30
+#endif
31
+#if defined(__AVR_ATmega32__)
32
+ #define WDCE WDTOE
33
+#endif
34
+
35
+/* Luminet support */
36
+/*------------------------------------------------------------------------ */
37
+#if defined(__AVR_ATtiny84__)
38
+/*------------------------------------------------------------------------ */
39
+/* Red LED is connected to pin PA4 */
40
+#if !defined(LED)
41
+#define LED A4
42
+#endif
43
+
44
+/* Ports for soft UART - left port only for now. TX/RX on PA2/PA3 */
45
+#ifdef SOFT_UART
46
+#define UART_PORT PORTA
47
+#define UART_PIN PINA
48
+#define UART_DDR DDRA
49
+#define UART_TX_BIT 2
50
+#define UART_RX_BIT 3
51
+#endif
52
+#endif
53
+
54
+/*------------------------------------------------------------------------ */
55
+/* Sanguino support (and other 40pin DIP cpus) */
56
+#if defined(__AVR_ATmega644P__) || defined(__AVR_ATmega1284P__) || defined(__AVR_ATmega32__)
57
+/*------------------------------------------------------------------------ */
58
+/* Onboard LED is connected to pin PB0 on Sanguino */
59
+#if !defined(LED)
60
+#define LED B0
61
+#endif
62
+
63
+/* Ports for soft UART */
64
+#ifdef SOFT_UART
65
+#define UART_PORT PORTD
66
+#define UART_PIN PIND
67
+#define UART_DDR DDRD
68
+#define UART_TX_BIT 1
69
+#define UART_RX_BIT 0
70
+#endif
71
+#endif
72
+
73
+/*------------------------------------------------------------------------ */
74
+/* Mega support */
75
+#if defined(__AVR_ATmega1280__)
76
+/*------------------------------------------------------------------------ */
77
+/* Onboard LED is connected to pin PB7 on Arduino Mega */
78
+#if !defined(LED)
79
+#define LED B7
80
+#endif
81
+
82
+/* Ports for soft UART */
83
+#ifdef SOFT_UART
84
+#define UART_PORT PORTE
85
+#define UART_PIN PINE
86
+#define UART_DDR DDRE
87
+#define UART_TX_BIT 1
88
+#define UART_RX_BIT 0
89
+#endif
90
+#endif
91
+
92
+/*
93
+ * ------------------------------------------------------------------------
94
+ * A bunch of macros to enable the LED to be specifed as "B5" for bit 5
95
+ * of port B, and similar.
96
+ */
97
+
98
+#define A0 0x100
99
+#define A1 0x101
100
+#define A2 0x102
101
+#define A3 0x103
102
+#define A4 0x104
103
+#define A5 0x105
104
+#define A6 0x106
105
+#define A7 0x107
106
+
107
+#define B0 0x200
108
+#define B1 0x201
109
+#define B2 0x202
110
+#define B3 0x203
111
+#define B4 0x204
112
+#define B5 0x205
113
+#define B6 0x206
114
+#define B7 0x207
115
+
116
+#define C0 0x300
117
+#define C1 0x301
118
+#define C2 0x302
119
+#define C3 0x303
120
+#define C4 0x304
121
+#define C5 0x305
122
+#define C6 0x306
123
+#define C7 0x307
124
+
125
+#define D0 0x400
126
+#define D1 0x401
127
+#define D2 0x402
128
+#define D3 0x403
129
+#define D4 0x404
130
+#define D5 0x405
131
+#define D6 0x406
132
+#define D7 0x407
133
+
134
+#define E0 0x500
135
+#define E1 0x501
136
+#define E2 0x502
137
+#define E3 0x503
138
+#define E4 0x504
139
+#define E5 0x505
140
+#define E6 0x506
141
+#define E7 0x507
142
+
143
+#define F0 0x600
144
+#define F1 0x601
145
+#define F2 0x602
146
+#define F3 0x603
147
+#define F4 0x604
148
+#define F5 0x605
149
+#define F6 0x606
150
+#define F7 0x607
151
+
152
+#define G0 0x700
153
+#define G1 0x701
154
+#define G2 0x702
155
+#define G3 0x703
156
+#define G4 0x704
157
+#define G5 0x705
158
+#define G6 0x706
159
+#define G7 0x707
160
+
161
+#define H0 0x800
162
+#define H1 0x801
163
+#define H2 0x802
164
+#define H3 0x803
165
+#define H4 0x804
166
+#define H5 0x805
167
+#define H6 0x806
168
+#define H7 0x807
169
+
170
+#define J0 0xA00
171
+#define J1 0xA01
172
+#define J2 0xA02
173
+#define J3 0xA03
174
+#define J4 0xA04
175
+#define J5 0xA05
176
+#define J6 0xA06
177
+#define J7 0xA07
178
+
179
+#define K0 0xB00
180
+#define K1 0xB01
181
+#define K2 0xB02
182
+#define K3 0xB03
183
+#define K4 0xB04
184
+#define K5 0xB05
185
+#define K6 0xB06
186
+#define K7 0xB07
187
+
188
+#define L0 0xC00
189
+#define L1 0xC01
190
+#define L2 0xC02
191
+#define L3 0xC03
192
+#define L4 0xC04
193
+#define L5 0xC05
194
+#define L6 0xC06
195
+#define L7 0xC07
196
+
197
+#if LED == B0
198
+#undef LED
199
+#define LED_DDR DDRB
200
+#define LED_PORT PORTB
201
+#define LED_PIN PINB
202
+#define LED PINB0
203
+#elif LED == B1
204
+#undef LED
205
+#define LED_DDR DDRB
206
+#define LED_PORT PORTB
207
+#define LED_PIN PINB
208
+#define LED PINB1
209
+#elif LED == B2
210
+#undef LED
211
+#define LED_DDR DDRB
212
+#define LED_PORT PORTB
213
+#define LED_PIN PINB
214
+#define LED PINB2
215
+#elif LED == B3
216
+#undef LED
217
+#define LED_DDR DDRB
218
+#define LED_PORT PORTB
219
+#define LED_PIN PINB
220
+#define LED PINB3
221
+#elif LED == B4
222
+#undef LED
223
+#define LED_DDR DDRB
224
+#define LED_PORT PORTB
225
+#define LED_PIN PINB
226
+#define LED PINB4
227
+#elif LED == B5
228
+#undef LED
229
+#define LED_DDR DDRB
230
+#define LED_PORT PORTB
231
+#define LED_PIN PINB
232
+#define LED PINB5
233
+#elif LED == B6
234
+#undef LED
235
+#define LED_DDR DDRB
236
+#define LED_PORT PORTB
237
+#define LED_PIN PINB
238
+#define LED PINB6
239
+#elif LED == B7
240
+#undef LED
241
+#define LED_DDR DDRB
242
+#define LED_PORT PORTB
243
+#define LED_PIN PINB
244
+#define LED PINB7
245
+
246
+#elif LED == C0
247
+#undef LED
248
+#define LED_DDR DDRC
249
+#define LED_PORT PORTC
250
+#define LED_PIN PINC
251
+#define LED PINC0
252
+#elif LED == C1
253
+#undef LED
254
+#define LED_DDR DDRC
255
+#define LED_PORT PORTC
256
+#define LED_PIN PINC
257
+#define LED PINC1
258
+#elif LED == C2
259
+#undef LED
260
+#define LED_DDR DDRC
261
+#define LED_PORT PORTC
262
+#define LED_PIN PINC
263
+#define LED PINC2
264
+#elif LED == C3
265
+#undef LED
266
+#define LED_DDR DDRC
267
+#define LED_PORT PORTC
268
+#define LED_PIN PINC
269
+#define LED PINC3
270
+#elif LED == C4
271
+#undef LED
272
+#define LED_DDR DDRC
273
+#define LED_PORT PORTC
274
+#define LED_PIN PINC
275
+#define LED PINC4
276
+#elif LED == C5
277
+#undef LED
278
+#define LED_DDR DDRC
279
+#define LED_PORT PORTC
280
+#define LED_PIN PINC
281
+#define LED PINC5
282
+#elif LED == C6
283
+#undef LED
284
+#define LED_DDR DDRC
285
+#define LED_PORT PORTC
286
+#define LED_PIN PINC
287
+#define LED PINC6
288
+#elif LED == C7
289
+#undef LED
290
+#define LED_DDR DDRC
291
+#define LED_PORT PORTC
292
+#define LED_PIN PINC
293
+#define LED PINC7
294
+
295
+#elif LED == D0
296
+#undef LED
297
+#define LED_DDR DDRD
298
+#define LED_PORT PORTD
299
+#define LED_PIN PIND
300
+#define LED PIND0
301
+#elif LED == D1
302
+#undef LED
303
+#define LED_DDR DDRD
304
+#define LED_PORT PORTD
305
+#define LED_PIN PIND
306
+#define LED PIND1
307
+#elif LED == D2
308
+#undef LED
309
+#define LED_DDR DDRD
310
+#define LED_PORT PORTD
311
+#define LED_PIN PIND
312
+#define LED PIND2
313
+#elif LED == D3
314
+#undef LED
315
+#define LED_DDR DDRD
316
+#define LED_PORT PORTD
317
+#define LED_PIN PIND
318
+#define LED PIND3
319
+#elif LED == D4
320
+#undef LED
321
+#define LED_DDR DDRD
322
+#define LED_PORT PORTD
323
+#define LED_PIN PIND
324
+#define LED PIND4
325
+#elif LED == D5
326
+#undef LED
327
+#define LED_DDR DDRD
328
+#define LED_PORT PORTD
329
+#define LED_PIN PIND
330
+#define LED PIND5
331
+#elif LED == D6
332
+#undef LED
333
+#define LED_DDR DDRD
334
+#define LED_PORT PORTD
335
+#define LED_PIN PIND
336
+#define LED PIND6
337
+#elif LED == D7
338
+#undef LED
339
+#define LED_DDR DDRD
340
+#define LED_PORT PORTD
341
+#define LED_PIN PIND
342
+#define LED PIND7
343
+
344
+#elif LED == E0
345
+#undef LED
346
+#define LED_DDR DDRE
347
+#define LED_PORT PORTE
348
+#define LED_PIN PINE
349
+#define LED PINE0
350
+#elif LED == E1
351
+#undef LED
352
+#define LED_DDR DDRE
353
+#define LED_PORT PORTE
354
+#define LED_PIN PINE
355
+#define LED PINE1
356
+#elif LED == E2
357
+#undef LED
358
+#define LED_DDR DDRE
359
+#define LED_PORT PORTE
360
+#define LED_PIN PINE
361
+#define LED PINE2
362
+#elif LED == E3
363
+#undef LED
364
+#define LED_DDR DDRE
365
+#define LED_PORT PORTE
366
+#define LED_PIN PINE
367
+#define LED PINE3
368
+#elif LED == E4
369
+#undef LED
370
+#define LED_DDR DDRE
371
+#define LED_PORT PORTE
372
+#define LED_PIN PINE
373
+#define LED PINE4
374
+#elif LED == E5
375
+#undef LED
376
+#define LED_DDR DDRE
377
+#define LED_PORT PORTE
378
+#define LED_PIN PINE
379
+#define LED PINE5
380
+#elif LED == E6
381
+#undef LED
382
+#define LED_DDR DDRE
383
+#define LED_PORT PORTE
384
+#define LED_PIN PINE
385
+#define LED PINE6
386
+#elif LED == E7
387
+#undef LED
388
+#define LED_DDR DDRE
389
+#define LED_PORT PORTE
390
+#define LED_PIN PINE
391
+#define LED PINE7
392
+
393
+#elif LED == F0
394
+#undef LED
395
+#define LED_DDR DDRF
396
+#define LED_PORT PORTF
397
+#define LED_PIN PINF
398
+#define LED PINF0
399
+#elif LED == F1
400
+#undef LED
401
+#define LED_DDR DDRF
402
+#define LED_PORT PORTF
403
+#define LED_PIN PINF
404
+#define LED PINF1
405
+#elif LED == F2
406
+#undef LED
407
+#define LED_DDR DDRF
408
+#define LED_PORT PORTF
409
+#define LED_PIN PINF
410
+#define LED PINF2
411
+#elif LED == F3
412
+#undef LED
413
+#define LED_DDR DDRF
414
+#define LED_PORT PORTF
415
+#define LED_PIN PINF
416
+#define LED PINF3
417
+#elif LED == F4
418
+#undef LED
419
+#define LED_DDR DDRF
420
+#define LED_PORT PORTF
421
+#define LED_PIN PINF
422
+#define LED PINF4
423
+#elif LED == F5
424
+#undef LED
425
+#define LED_DDR DDRF
426
+#define LED_PORT PORTF
427
+#define LED_PIN PINF
428
+#define LED PINF5
429
+#elif LED == F6
430
+#undef LED
431
+#define LED_DDR DDRF
432
+#define LED_PORT PORTF
433
+#define LED_PIN PINF
434
+#define LED PINF6
435
+#elif LED == F7
436
+#undef LED
437
+#define LED_DDR DDRF
438
+#define LED_PORT PORTF
439
+#define LED_PIN PINF
440
+#define LED PINF7
441
+
442
+#elif LED == G0
443
+#undef LED
444
+#define LED_DDR DDRG
445
+#define LED_PORT PORTG
446
+#define LED_PIN PING
447
+#define LED PING0
448
+#elif LED == G1
449
+#undef LED
450
+#define LED_DDR DDRG
451
+#define LED_PORT PORTG
452
+#define LED_PIN PING
453
+#define LED PING1
454
+#elif LED == G2
455
+#undef LED
456
+#define LED_DDR DDRG
457
+#define LED_PORT PORTG
458
+#define LED_PIN PING
459
+#define LED PING2
460
+#elif LED == G3
461
+#undef LED
462
+#define LED_DDR DDRG
463
+#define LED_PORT PORTG
464
+#define LED_PIN PING
465
+#define LED PING3
466
+#elif LED == G4
467
+#undef LED
468
+#define LED_DDR DDRG
469
+#define LED_PORT PORTG
470
+#define LED_PIN PING
471
+#define LED PING4
472
+#elif LED == G5
473
+#undef LED
474
+#define LED_DDR DDRG
475
+#define LED_PORT PORTG
476
+#define LED_PIN PING
477
+#define LED PING5
478
+#elif LED == G6
479
+#undef LED
480
+#define LED_DDR DDRG
481
+#define LED_PORT PORTG
482
+#define LED_PIN PING
483
+#define LED PING6
484
+#elif LED == G7
485
+#undef LED
486
+#define LED_DDR DDRG
487
+#define LED_PORT PORTG
488
+#define LED_PIN PING
489
+#define LED PING7
490
+
491
+#elif LED == H0
492
+#undef LED
493
+#define LED_DDR DDRH
494
+#define LED_PORT PORTH
495
+#define LED_PIN PINH
496
+#define LED PINH0
497
+#elif LED == H1
498
+#undef LED
499
+#define LED_DDR DDRH
500
+#define LED_PORT PORTH
501
+#define LED_PIN PINH
502
+#define LED PINH1
503
+#elif LED == H2
504
+#undef LED
505
+#define LED_DDR DDRH
506
+#define LED_PORT PORTH
507
+#define LED_PIN PINH
508
+#define LED PINH2
509
+#elif LED == H3
510
+#undef LED
511
+#define LED_DDR DDRH
512
+#define LED_PORT PORTH
513
+#define LED_PIN PINH
514
+#define LED PINH3
515
+#elif LED == H4
516
+#undef LED
517
+#define LED_DDR DDRH
518
+#define LED_PORT PORTH
519
+#define LED_PIN PINH
520
+#define LED PINH4
521
+#elif LED == H5
522
+#undef LED
523
+#define LED_DDR DDRH
524
+#define LED_PORT PORTH
525
+#define LED_PIN PINH
526
+#define LED PINH5
527
+#elif LED == H6
528
+#undef LED
529
+#define LED_DDR DDRH
530
+#define LED_PORT PORTH
531
+#define LED_PIN PINH
532
+#define LED PINH6
533
+#elif LED == H7
534
+#undef LED
535
+#define LED_DDR DDRH
536
+#define LED_PORT PORTH
537
+#define LED_PIN PINH
538
+#define LED PINH7
539
+
540
+#elif LED == J0
541
+#undef LED
542
+#define LED_DDR DDRJ
543
+#define LED_PORT PORTJ
544
+#define LED_PIN PINJ
545
+#define LED PINJ0
546
+#elif LED == J1
547
+#undef LED
548
+#define LED_DDR DDRJ
549
+#define LED_PORT PORTJ
550
+#define LED_PIN PINJ
551
+#define LED PINJ1
552
+#elif LED == J2
553
+#undef LED
554
+#define LED_DDR DDRJ
555
+#define LED_PORT PORTJ
556
+#define LED_PIN PINJ
557
+#define LED PINJ2
558
+#elif LED == J3
559
+#undef LED
560
+#define LED_DDR DDRJ
561
+#define LED_PORT PORTJ
562
+#define LED_PIN PINJ
563
+#define LED PINJ3
564
+#elif LED == J4
565
+#undef LED
566
+#define LED_DDR DDRJ
567
+#define LED_PORT PORTJ
568
+#define LED_PIN PINJ
569
+#define LED PINJ4
570
+#elif LED == J5
571
+#undef LED
572
+#define LED_DDR DDRJ
573
+#define LED_PORT PORTJ
574
+#define LED_PIN PINJ
575
+#define LED PINJ5
576
+#elif LED == J6
577
+#undef LED
578
+#define LED_DDR DDRJ
579
+#define LED_PORT PORTJ
580
+#define LED_PIN PINJ
581
+#define LED PINJ6
582
+#elif LED == J7
583
+#undef LED
584
+#define LED_DDR DDRJ
585
+#define LED_PORT PORTJ
586
+#define LED_PIN PINJ
587
+#define LED PINJ7
588
+
589
+#elif LED == K0
590
+#undef LED
591
+#define LED_DDR DDRK
592
+#define LED_PORT PORTK
593
+#define LED_PIN PINK
594
+#define LED PINK0
595
+#elif LED == K1
596
+#undef LED
597
+#define LED_DDR DDRK
598
+#define LED_PORT PORTK
599
+#define LED_PIN PINK
600
+#define LED PINK1
601
+#elif LED == K2
602
+#undef LED
603
+#define LED_DDR DDRK
604
+#define LED_PORT PORTK
605
+#define LED_PIN PINK
606
+#define LED PINK2
607
+#elif LED == K3
608
+#undef LED
609
+#define LED_DDR DDRK
610
+#define LED_PORT PORTK
611
+#define LED_PIN PINK
612
+#define LED PINK3
613
+#elif LED == K4
614
+#undef LED
615
+#define LED_DDR DDRK
616
+#define LED_PORT PORTK
617
+#define LED_PIN PINK
618
+#define LED PINK4
619
+#elif LED == K5
620
+#undef LED
621
+#define LED_DDR DDRK
622
+#define LED_PORT PORTK
623
+#define LED_PIN PINK
624
+#define LED PINK5
625
+#elif LED == K6
626
+#undef LED
627
+#define LED_DDR DDRK
628
+#define LED_PORT PORTK
629
+#define LED_PIN PINK
630
+#define LED PINK6
631
+#elif LED == K7
632
+#undef LED
633
+#define LED_DDR DDRK
634
+#define LED_PORT PORTK
635
+#define LED_PIN PINK
636
+#define LED PINK7
637
+
638
+#elif LED == L0
639
+#undef LED
640
+#define LED_DDR DDRL
641
+#define LED_PORT PORTL
642
+#define LED_PIN PINL
643
+#define LED PINL0
644
+#elif LED == L1
645
+#undef LED
646
+#define LED_DDR DDRL
647
+#define LED_PORT PORTL
648
+#define LED_PIN PINL
649
+#define LED PINL1
650
+#elif LED == L2
651
+#undef LED
652
+#define LED_DDR DDRL
653
+#define LED_PORT PORTL
654
+#define LED_PIN PINL
655
+#define LED PINL2
656
+#elif LED == L3
657
+#undef LED
658
+#define LED_DDR DDRL
659
+#define LED_PORT PORTL
660
+#define LED_PIN PINL
661
+#define LED PINL3
662
+#elif LED == L4
663
+#undef LED
664
+#define LED_DDR DDRL
665
+#define LED_PORT PORTL
666
+#define LED_PIN PINL
667
+#define LED PINL4
668
+#elif LED == L5
669
+#undef LED
670
+#define LED_DDR DDRL
671
+#define LED_PORT PORTL
672
+#define LED_PIN PINL
673
+#define LED PINL5
674
+#elif LED == L6
675
+#undef LED
676
+#define LED_DDR DDRL
677
+#define LED_PORT PORTL
678
+#define LED_PIN PINL
679
+#define LED PINL6
680
+#elif LED == L7
681
+#undef LED
682
+#define LED_DDR DDRL
683
+#define LED_PORT PORTL
684
+#define LED_PIN PINL
685
+#define LED PINL7
686
+
687
+#elif LED == A0
688
+#undef LED
689
+#define LED_DDR DDRA
690
+#define LED_PORT PORTA
691
+#define LED_PIN PINA
692
+#define LED PINA0
693
+#elif LED == A1
694
+#undef LED
695
+#define LED_DDR DDRA
696
+#define LED_PORT PORTA
697
+#define LED_PIN PINA
698
+#define LED PINA1
699
+#elif LED == A2
700
+#undef LED
701
+#define LED_DDR DDRA
702
+#define LED_PORT PORTA
703
+#define LED_PIN PINA
704
+#define LED PINA2
705
+#elif LED == A3
706
+#undef LED
707
+#define LED_DDR DDRA
708
+#define LED_PORT PORTA
709
+#define LED_PIN PINA
710
+#define LED PINA3
711
+#elif LED == A4
712
+#undef LED
713
+#define LED_DDR DDRA
714
+#define LED_PORT PORTA
715
+#define LED_PIN PINA
716
+#define LED PINA4
717
+#elif LED == A5
718
+#undef LED
719
+#define LED_DDR DDRA
720
+#define LED_PORT PORTA
721
+#define LED_PIN PINA
722
+#define LED PINA5
723
+#elif LED == A6
724
+#undef LED
725
+#define LED_DDR DDRA
726
+#define LED_PORT PORTA
727
+#define LED_PIN PINA
728
+#define LED PINA6
729
+#elif LED == A7
730
+#undef LED
731
+#define LED_DDR DDRA
732
+#define LED_PORT PORTA
733
+#define LED_PIN PINA
734
+#define LED PINA7
735
+
736
+#else
737
+#error -------------------------------------------
738
+#error Unrecognized LED name. Should be like "B5"
739
+#error -------------------------------------------
740
+#endif
Chip-cn-dat/LGT-dat/LGT8F328-SDK-DAT/optiboot_lgt8fx8p/stk500.h
... ...
@@ -0,0 +1,39 @@
1
+/* STK500 constants list, from AVRDUDE */
2
+#define STK_OK 0x10
3
+#define STK_FAILED 0x11 // Not used
4
+#define STK_UNKNOWN 0x12 // Not used
5
+#define STK_NODEVICE 0x13 // Not used
6
+#define STK_INSYNC 0x14 // ' '
7
+#define STK_NOSYNC 0x15 // Not used
8
+#define ADC_CHANNEL_ERROR 0x16 // Not used
9
+#define ADC_MEASURE_OK 0x17 // Not used
10
+#define PWM_CHANNEL_ERROR 0x18 // Not used
11
+#define PWM_ADJUST_OK 0x19 // Not used
12
+#define CRC_EOP 0x20 // 'SPACE'
13
+#define STK_GET_SYNC 0x30 // '0'
14
+#define STK_GET_SIGN_ON 0x31 // '1'
15
+#define STK_SET_PARAMETER 0x40 // '@'
16
+#define STK_GET_PARAMETER 0x41 // 'A'
17
+#define STK_SET_DEVICE 0x42 // 'B'
18
+#define STK_SET_DEVICE_EXT 0x45 // 'E'
19
+#define STK_ENTER_PROGMODE 0x50 // 'P'
20
+#define STK_LEAVE_PROGMODE 0x51 // 'Q'
21
+#define STK_CHIP_ERASE 0x52 // 'R'
22
+#define STK_CHECK_AUTOINC 0x53 // 'S'
23
+#define STK_LOAD_ADDRESS 0x55 // 'U'
24
+#define STK_UNIVERSAL 0x56 // 'V'
25
+#define STK_PROG_FLASH 0x60 // '`'
26
+#define STK_PROG_DATA 0x61 // 'a'
27
+#define STK_PROG_FUSE 0x62 // 'b'
28
+#define STK_PROG_LOCK 0x63 // 'c'
29
+#define STK_PROG_PAGE 0x64 // 'd'
30
+#define STK_PROG_FUSE_EXT 0x65 // 'e'
31
+#define STK_READ_FLASH 0x70 // 'p'
32
+#define STK_READ_DATA 0x71 // 'q'
33
+#define STK_READ_FUSE 0x72 // 'r'
34
+#define STK_READ_LOCK 0x73 // 's'
35
+#define STK_READ_PAGE 0x74 // 't'
36
+#define STK_READ_SIGN 0x75 // 'u'
37
+#define STK_READ_OSCCAL 0x76 // 'v'
38
+#define STK_READ_FUSE_EXT 0x77 // 'w'
39
+#define STK_READ_OSCCAL_EXT 0x78 // 'x'
SDK-dat/ISP-dat/ISP-dat.md
... ...
@@ -0,0 +1,16 @@
1
+
2
+# ISP-dat
3
+
4
+
5
+- [[programmer-socket-dat]]
6
+
7
+- [[CH55x-dat]]
8
+
9
+- [[LGT8F328-SDK-DAT]]
10
+
11
+
12
+
13
+
14
+## ref
15
+
16
+- [[SDK-dat]]
... ...
\ No newline at end of file
board-series-dat/programmer-socket-dat/programmer-socket-dat.md
... ...
@@ -0,0 +1,12 @@
1
+
2
+# programmer-socket-dat
3
+
4
+- [[CCO3626-dat]] - [[CCO3627-dat]] - [[CCO3628-dat]] - [[CCO3629-dat]] - [[DPR1016-dat]] - [[programmer-socket-dat]]
5
+
6
+https://www.electrodragon.com/product-category/modules/programmer/ic-socket-programmer/
7
+
8
+
9
+
10
+## ref
11
+
12
+- [[CCO3527-dat]]
... ...
\ No newline at end of file