Add rst documentation
This commit is contained in:
parent
7bf9711392
commit
b4a980e659
|
@ -0,0 +1,2 @@
|
||||||
|
build/
|
||||||
|
_build/
|
|
@ -0,0 +1,230 @@
|
||||||
|
************
|
||||||
|
Introduction
|
||||||
|
************
|
||||||
|
|
||||||
|
.. index:: introduction
|
||||||
|
|
||||||
|
AVRDUDE - AVR Downloader Uploader - is a program for downloading and
|
||||||
|
uploading the on-chip memories of Atmel's AVR microcontrollers. It can
|
||||||
|
program the Flash and EEPROM, and where supported by the serial
|
||||||
|
programming protocol, it can program fuse and lock bits. AVRDUDE also
|
||||||
|
supplies a direct instruction mode allowing one to issue any programming
|
||||||
|
instruction to the AVR chip regardless of whether AVRDUDE implements
|
||||||
|
that specific feature of a particular chip.
|
||||||
|
|
||||||
|
AVRDUDE can be used effectively via the command line to read or write
|
||||||
|
all chip memory types (eeprom, flash, fuse bits, lock bits, signature
|
||||||
|
bytes) or via an interactive (terminal) mode. Using AVRDUDE from the
|
||||||
|
command line works well for programming the entire memory of the chip
|
||||||
|
from the contents of a file, while interactive mode is useful for
|
||||||
|
exploring memory contents, modifying individual bytes of eeprom,
|
||||||
|
programming fuse/lock bits, etc.
|
||||||
|
|
||||||
|
AVRDUDE supports the following basic programmer types: Atmel's STK500,
|
||||||
|
Atmel's AVRISP and AVRISP mkII devices,
|
||||||
|
Atmel's STK600,
|
||||||
|
Atmel's JTAG ICE (the original one, mkII, and 3, the latter two also in ISP mode), appnote
|
||||||
|
avr910, appnote avr109 (including the AVR Butterfly),
|
||||||
|
serial bit-bang adapters,
|
||||||
|
and the PPI (parallel port interface). PPI represents a class
|
||||||
|
of simple programmers where the programming lines are directly
|
||||||
|
connected to the PC parallel port. Several pin configurations exist
|
||||||
|
for several variations of the PPI programmers, and AVRDUDE can be
|
||||||
|
configured to work with them by either specifying the appropriate
|
||||||
|
programmer on the command line or by creating a new entry in its
|
||||||
|
configuration file. All that's usually required for a new entry is to
|
||||||
|
tell AVRDUDE which pins to use for each programming function.
|
||||||
|
|
||||||
|
A number of equally simple bit-bang programming adapters that connect
|
||||||
|
to a serial port are supported as well, among them the popular
|
||||||
|
Ponyprog serial adapter, and the DASA and DASA3 adapters that used to
|
||||||
|
be supported by uisp(1). Note that these adapters are meant to be
|
||||||
|
attached to a physical serial port. Connecting to a serial port
|
||||||
|
emulated on top of USB is likely to not work at all, or to work
|
||||||
|
abysmally slow.
|
||||||
|
|
||||||
|
If you happen to have a Linux system with at least 4 hardware GPIOs
|
||||||
|
available (like almost all embedded Linux boards) you can do without
|
||||||
|
any additional hardware - just connect them to the MOSI, MISO, RESET
|
||||||
|
and SCK pins on the AVR and use the linuxgpio programmer type. It bitbangs
|
||||||
|
the lines using the Linux sysfs GPIO interface. Of course, care should
|
||||||
|
be taken about voltage level compatibility. Also, although not strictly
|
||||||
|
required, it is strongly advisable to protect the GPIO pins from
|
||||||
|
overcurrent situations in some way. The simplest would be to just put
|
||||||
|
some resistors in series or better yet use a 3-state buffer driver like
|
||||||
|
the 74HC244. Have a look at http://kolev.info/avrdude-linuxgpio for a more
|
||||||
|
detailed tutorial about using this programmer type.
|
||||||
|
|
||||||
|
Under a Linux installation with direct access to the SPI bus and GPIO
|
||||||
|
pins, such as would be found on a Raspberry Pi, the 'linuxspi'
|
||||||
|
programmer type can be used to directly connect to and program a chip
|
||||||
|
using the built in interfaces on the computer. The requirements to use
|
||||||
|
this type are that an SPI interface is exposed along with one GPIO
|
||||||
|
pin. The GPIO serves as the reset output since the Linux SPI drivers
|
||||||
|
do not hold slave select down when a transfer is not occuring and thus
|
||||||
|
it cannot be used as the reset pin. A readily available level
|
||||||
|
translator should be used between the SPI bus/reset GPIO and the chip
|
||||||
|
to avoid potentially damaging the computer's SPI controller in the
|
||||||
|
event that the chip is running at 5V and the SPI runs at 3.3V. The
|
||||||
|
GPIO chosen for reset can be configured in the avrdude configuration
|
||||||
|
file using the `reset` entry under the linuxspi programmer, or
|
||||||
|
directly in the port specification. An external pull-up resistor
|
||||||
|
should be connected between the AVR's reset pin and Vcc. If Vcc is not
|
||||||
|
the same as the SPI voltage, this should be done on the AVR side of
|
||||||
|
the level translator to protect the hardware from damage.
|
||||||
|
|
||||||
|
On a Raspberry Pi, header J8 provides access to the SPI and GPIO
|
||||||
|
lines.
|
||||||
|
|
||||||
|
Typically, pins 19, 21, and 23 are SPI MOSI, MISO, and SCK, while
|
||||||
|
pins 24 and 26 would serve as CE outputs. So, close to these pins
|
||||||
|
is pin 22 as GPIO25 which can be used as /RESET, and pin 25 can
|
||||||
|
be used as GND.
|
||||||
|
|
||||||
|
A typical programming cable would then look like:
|
||||||
|
|
||||||
|
@multitable @columnfractions .15 .15 .3
|
||||||
|
* `J8 pin` @tab `ISP pin` @tab `Name`
|
||||||
|
* `21` @tab `1` @tab `MISO`
|
||||||
|
* `-` @tab `2` @tab `Vcc - leave open`
|
||||||
|
* `23` @tab `3` @tab `SCK`
|
||||||
|
* `19` @tab `4` @tab `MOSI`
|
||||||
|
* `22` @tab `5` @tab `/RESET`
|
||||||
|
* `25` @tab `6` @tab `GND`
|
||||||
|
@end multitable
|
||||||
|
|
||||||
|
(Mind the 3.3 V voltage level of the Raspberry Pi!)
|
||||||
|
|
||||||
|
The `-P `portname`` option defaults to
|
||||||
|
`/dev/spidev0.0:/dev/gpiochip0` for this programmer.
|
||||||
|
|
||||||
|
The STK500, JTAG ICE, avr910, and avr109/butterfly use the serial port to communicate with the PC.
|
||||||
|
The STK600, JTAG ICE mkII/3, AVRISP mkII, USBasp, avrftdi (and derivatives), and USBtinyISP
|
||||||
|
programmers communicate through the USB, using `libusb` as a
|
||||||
|
platform abstraction layer.
|
||||||
|
The avrftdi adds support for the FT2232C/D, FT2232H, and FT4232H devices. These all use
|
||||||
|
the MPSSE mode, which has a specific pin mapping. Bit 1 (the lsb of the byte in the config
|
||||||
|
file) is SCK. Bit 2 is MOSI, and Bit 3 is MISO. Bit 4 usually reset. The 2232C/D parts
|
||||||
|
are only supported on interface A, but the H parts can be either A or B (specified by the
|
||||||
|
usbdev config parameter).
|
||||||
|
The STK500, STK600, JTAG ICE, and avr910 contain on-board logic to control the programming of the target
|
||||||
|
device.
|
||||||
|
The avr109 bootloader implements a protocol similar to avr910, but is
|
||||||
|
actually implemented in the boot area of the target's flash ROM, as
|
||||||
|
opposed to being an external device.
|
||||||
|
The fundamental difference between the two types lies in the
|
||||||
|
protocol used to control the programmer. The avr910 protocol is very
|
||||||
|
simplistic and can easily be used as the basis for a simple, home made
|
||||||
|
programmer since the firmware is available online. On the other hand,
|
||||||
|
the STK500 protocol is more robust and complicated and the firmware is
|
||||||
|
not openly available.
|
||||||
|
The JTAG ICE also uses a serial communication protocol which is similar
|
||||||
|
to the STK500 firmware version 2 one. However, as the JTAG ICE is
|
||||||
|
intended to allow on-chip debugging as well as memory programming, the
|
||||||
|
protocol is more sophisticated.
|
||||||
|
(The JTAG ICE mkII protocol can also be run on top of USB.)
|
||||||
|
Only the memory programming functionality of the JTAG ICE is supported
|
||||||
|
by AVRDUDE.
|
||||||
|
For the JTAG ICE mkII/3, JTAG, debugWire and ISP mode are supported, provided
|
||||||
|
it has a firmware revision of at least 4.14 (decimal).
|
||||||
|
See below for the limitations of debugWire.
|
||||||
|
For ATxmega devices, the JTAG ICE mkII/3 is supported in PDI mode, provided it
|
||||||
|
has a revision 1 hardware and firmware version of at least 5.37 (decimal).
|
||||||
|
|
||||||
|
The Atmel-ICE (ARM/AVR) is supported (JTAG, PDI for Xmega, debugWIRE, ISP modes).
|
||||||
|
|
||||||
|
Atmel's XplainedPro boards, using EDBG protocol (CMSIS-DAP compliant), are
|
||||||
|
supported by the 'jtag3' programmer type.
|
||||||
|
|
||||||
|
Atmel's XplainedMini boards, using mEDBG protocol, are also
|
||||||
|
supported by the 'jtag3' programmer type.
|
||||||
|
|
||||||
|
The AVR Dragon is supported in all modes (ISP, JTAG, PDI, HVSP, PP, debugWire).
|
||||||
|
When used in JTAG and debugWire mode, the AVR Dragon behaves similar to a
|
||||||
|
JTAG ICE mkII, so all device-specific comments for that device
|
||||||
|
will apply as well.
|
||||||
|
When used in ISP and PDI mode, the AVR Dragon behaves similar to an
|
||||||
|
AVRISP mkII (or JTAG ICE mkII in ISP mode), so all device-specific
|
||||||
|
comments will apply there.
|
||||||
|
In particular, the Dragon starts out with a rather fast ISP clock
|
||||||
|
frequency, so the `-B `bitclock``
|
||||||
|
option might be required to achieve a stable ISP communication.
|
||||||
|
For ATxmega devices, the AVR Dragon is supported in PDI mode, provided it
|
||||||
|
has a firmware version of at least 6.11 (decimal).
|
||||||
|
|
||||||
|
Wiring boards (e.g. Arduino Mega 2560 Rev3) are supported, utilizing
|
||||||
|
STK500 V2.x protocol, but a simple DTR/RTS toggle to set the boards
|
||||||
|
into programming mode. The programmer type is 'wiring'. Note that
|
||||||
|
the -D option will likely be required in this case, because the
|
||||||
|
bootloader will rewrite the program memory, but no true chip erase can
|
||||||
|
be performed.
|
||||||
|
|
||||||
|
The Arduino (which is very similar to the STK500 1.x) is supported via
|
||||||
|
its own programmer type specification 'arduino'. This programmer works for
|
||||||
|
the Arduino Uno Rev3.
|
||||||
|
|
||||||
|
The BusPirate is a versatile tool that can also be used as an AVR programmer.
|
||||||
|
A single BusPirate can be connected to up to 3 independent AVRs. See
|
||||||
|
the section on
|
||||||
|
*extended parameters*
|
||||||
|
below for details.
|
||||||
|
|
||||||
|
The USBasp ISP and USBtinyISP adapters are also supported, provided AVRDUDE
|
||||||
|
has been compiled with libusb support.
|
||||||
|
They both feature simple firmware-only USB implementations, running on
|
||||||
|
an ATmega8 (or ATmega88), or ATtiny2313, respectively.
|
||||||
|
|
||||||
|
The Atmel DFU bootloader is supported in both, FLIP protocol version 1
|
||||||
|
(AT90USB* and ATmega*U* devices), as well as version 2 (Xmega devices).
|
||||||
|
See below for some hints about FLIP version 1 protocol behaviour.
|
||||||
|
|
||||||
|
The MPLAB(R) PICkit 4 and MPLAB(R) SNAP are supported in ISP, PDI and UPDI mode.
|
||||||
|
The Curiosity Nano board is supported in UPDI mode. It is dubbed ``PICkit on
|
||||||
|
Board'', thus the name `pkobn_updi`.
|
||||||
|
|
||||||
|
SerialUPDI programmer implementation is based on Microchip's
|
||||||
|
*pymcuprog* (`https://github.com/microchip-pic-avr-tools/pymcuprog <https://github.com/microchip-pic-avr-tools/pymcuprog>`_)
|
||||||
|
utility, but it also contains some performance improvements included in
|
||||||
|
Spence Kohde's *DxCore* Arduino core (`https://github.com/SpenceKonde/DxCore <https://github.com/SpenceKonde/DxCore>`_).
|
||||||
|
In a nutshell, this programmer consists of simple USB->UART adapter, diode
|
||||||
|
and couple of resistors. It uses serial connection to provide UPDI interface.
|
||||||
|
:ref:`SerialUPDI_programmer` for more details and known issues.
|
||||||
|
|
||||||
|
The jtag2updi programmer is supported,
|
||||||
|
and can program AVRs with a UPDI interface.
|
||||||
|
Jtag2updi is just a firmware that can be uploaded to an AVR,
|
||||||
|
which enables it to interface with avrdude using the jtagice mkii protocol
|
||||||
|
via a serial link (`https://github.com/ElTangas/jtag2updi <https://github.com/ElTangas/jtag2updi>`_).
|
||||||
|
|
||||||
|
The Micronucleus bootloader is supported for both protocol version V1
|
||||||
|
and V2. As the bootloader does not support reading from flash memory,
|
||||||
|
use the `-V` option to prevent AVRDUDE from verifing the flash memory.
|
||||||
|
See the section on *extended parameters*
|
||||||
|
below for Micronucleus specific options.
|
||||||
|
|
||||||
|
.. _History_and_Credits:
|
||||||
|
|
||||||
|
History and Credits
|
||||||
|
===================
|
||||||
|
|
||||||
|
AVRDUDE was written by Brian S. Dean under the name of AVRPROG to run on
|
||||||
|
the FreeBSD Operating System. Brian renamed the software to be called
|
||||||
|
AVRDUDE when interest grew in a Windows port of the software so that the
|
||||||
|
name did not conflict with AVRPROG.EXE which is the name of Atmel's
|
||||||
|
Windows programming software.
|
||||||
|
|
||||||
|
The AVRDUDE source now resides in the public CVS repository on
|
||||||
|
savannah.gnu.org (`http://savannah.gnu.org/projects/avrdude/ <http://savannah.gnu.org/projects/avrdude/>`_),
|
||||||
|
where it continues to be enhanced and ported to other systems. In
|
||||||
|
addition to FreeBSD, AVRDUDE now runs on Linux and Windows. The
|
||||||
|
developers behind the porting effort primarily were Ted Roth, Eric
|
||||||
|
Weddington, and Joerg Wunsch.
|
||||||
|
|
||||||
|
And in the spirit of many open source projects, this manual also draws
|
||||||
|
on the work of others. The initial revision was composed of parts of
|
||||||
|
the original Unix manual page written by Joerg Wunsch, the original web
|
||||||
|
site documentation by Brian Dean, and from the comments describing the
|
||||||
|
fields in the AVRDUDE configuration file by Brian Dean. The texi
|
||||||
|
formatting was modeled after that of the Simulavr documentation by Ted
|
||||||
|
Roth.
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,241 @@
|
||||||
|
.. _Terminal_Mode_Operation:
|
||||||
|
|
||||||
|
***********************
|
||||||
|
Terminal Mode Operation
|
||||||
|
***********************
|
||||||
|
|
||||||
|
AVRDUDE has an interactive mode called `terminal mode` that is
|
||||||
|
enabled by the *-t* option. This mode allows one to enter
|
||||||
|
interactive commands to display and modify the various device memories,
|
||||||
|
perform a chip erase, display the device signature bytes and part
|
||||||
|
parameters, and to send raw programming commands. Commands and
|
||||||
|
parameters may be abbreviated to their shortest unambiguous form.
|
||||||
|
Terminal mode also supports a command history so that previously entered
|
||||||
|
commands can be recalled and edited.
|
||||||
|
|
||||||
|
.. _Terminal_Mode_Commands:
|
||||||
|
|
||||||
|
Terminal Mode Commands
|
||||||
|
======================
|
||||||
|
|
||||||
|
The following commands are implemented:
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
*dump `memtype` `addr` `nbytes`*
|
||||||
|
Read `nbytes` from the specified memory area, and display them in
|
||||||
|
the usual hexadecimal and ASCII form.
|
||||||
|
|
||||||
|
|
||||||
|
*dump*
|
||||||
|
Continue dumping the memory contents for another `nbytes` where the
|
||||||
|
previous dump command left off.
|
||||||
|
|
||||||
|
|
||||||
|
*write `memtype` `addr` `byte1` ... `byteN`*
|
||||||
|
Manually program the respective memory cells, starting at address addr,
|
||||||
|
using the values `byte1` through `byteN`. This feature is not
|
||||||
|
implemented for bank-addressed memories such as the flash memory of
|
||||||
|
ATMega devices.
|
||||||
|
|
||||||
|
|
||||||
|
*erase*
|
||||||
|
Perform a chip erase.
|
||||||
|
|
||||||
|
|
||||||
|
*send `b1` `b2` `b3` `b4`*
|
||||||
|
Send raw instruction codes to the AVR device. If you need access to a
|
||||||
|
feature of an AVR part that is not directly supported by AVRDUDE, this
|
||||||
|
command allows you to use it, even though AVRDUDE does not implement the
|
||||||
|
command. When using direct SPI mode, up to 3 bytes
|
||||||
|
can be omitted.
|
||||||
|
|
||||||
|
|
||||||
|
*sig*
|
||||||
|
Display the device signature bytes.
|
||||||
|
|
||||||
|
|
||||||
|
*spi*
|
||||||
|
Enter direct SPI mode. The *pgmled* pin acts as slave select.
|
||||||
|
*Only supported on parallel bitbang programmers.*
|
||||||
|
|
||||||
|
|
||||||
|
*part*
|
||||||
|
Display the current part settings and parameters. Includes chip
|
||||||
|
specific information including all memory types supported by the
|
||||||
|
device, read/write timing, etc.
|
||||||
|
|
||||||
|
|
||||||
|
*pgm*
|
||||||
|
Return to programming mode (from direct SPI mode).
|
||||||
|
|
||||||
|
|
||||||
|
*verbose [`level`]*
|
||||||
|
Change (when `level` is provided), or display the verbosity
|
||||||
|
level.
|
||||||
|
The initial verbosity level is controlled by the number of `-v` options
|
||||||
|
given on the command line.
|
||||||
|
|
||||||
|
|
||||||
|
*?*
|
||||||
|
|
||||||
|
*help*
|
||||||
|
Give a short on-line summary of the available commands.
|
||||||
|
|
||||||
|
|
||||||
|
*quit*
|
||||||
|
Leave terminal mode and thus AVRDUDE.
|
||||||
|
|
||||||
|
|
||||||
|
In addition, the following commands are supported on the STK500
|
||||||
|
and STK600 programmer:
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
*vtarg `voltage`*
|
||||||
|
Set the target's supply voltage to `voltage` Volts.
|
||||||
|
|
||||||
|
|
||||||
|
*varef [`channel`] `voltage`*
|
||||||
|
Set the adjustable voltage source to `voltage` Volts.
|
||||||
|
This voltage is normally used to drive the target's
|
||||||
|
*Aref* input on the STK500 and STK600.
|
||||||
|
The STK600 offers two reference voltages, which can be
|
||||||
|
selected by the optional parameter `channel` (either
|
||||||
|
0 or 1).
|
||||||
|
|
||||||
|
|
||||||
|
*fosc `freq`[`M`|`k`]*
|
||||||
|
Set the master oscillator to `freq` Hz.
|
||||||
|
An optional trailing letter `M`
|
||||||
|
multiplies by 1E6, a trailing letter `k` by 1E3.
|
||||||
|
|
||||||
|
|
||||||
|
*fosc off*
|
||||||
|
Turn the master oscillator off.
|
||||||
|
|
||||||
|
|
||||||
|
*sck `period`*
|
||||||
|
*STK500 and STK600 only:*
|
||||||
|
Set the SCK clock period to `period` microseconds.
|
||||||
|
|
||||||
|
*JTAG ICE only:*
|
||||||
|
Set the JTAG ICE bit clock period to `period` microseconds.
|
||||||
|
Note that unlike STK500 settings, this setting will be reverted to
|
||||||
|
its default value (approximately 1 microsecond) when the programming
|
||||||
|
software signs off from the JTAG ICE.
|
||||||
|
This parameter can also be used on the JTAG ICE mkII/3 to specify the
|
||||||
|
ISP clock period when operating the ICE in ISP mode.
|
||||||
|
|
||||||
|
|
||||||
|
*parms*
|
||||||
|
*STK500 and STK600 only:*
|
||||||
|
Display the current voltage and master oscillator parameters.
|
||||||
|
|
||||||
|
*JTAG ICE only:*
|
||||||
|
Display the current target supply voltage and JTAG bit clock rate/period.
|
||||||
|
|
||||||
|
|
||||||
|
.. _Terminal_Mode_Examples:
|
||||||
|
|
||||||
|
Terminal Mode Examples
|
||||||
|
======================
|
||||||
|
|
||||||
|
Display part parameters, modify eeprom cells, perform a chip erase:
|
||||||
|
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
@cartouche
|
||||||
|
% avrdude -p m128 -c stk500 -t
|
||||||
|
|
||||||
|
avrdude: AVR device initialized and ready to accept instructions
|
||||||
|
avrdude: Device signature = 0x1e9702
|
||||||
|
avrdude: current erase-rewrite cycle count is 52 (if being tracked)
|
||||||
|
avrdude> part
|
||||||
|
>>> part
|
||||||
|
|
||||||
|
AVR Part : ATMEGA128
|
||||||
|
Chip Erase delay : 9000 us
|
||||||
|
PAGEL : PD7
|
||||||
|
BS2 : PA0
|
||||||
|
RESET disposition : dedicated
|
||||||
|
RETRY pulse : SCK
|
||||||
|
serial program mode : yes
|
||||||
|
parallel program mode : yes
|
||||||
|
Memory Detail :
|
||||||
|
|
||||||
|
Page Polled
|
||||||
|
Memory Type Paged Size Size #Pages MinW MaxW ReadBack
|
||||||
|
----------- ------ ------ ---- ------ ----- ----- ---------
|
||||||
|
eeprom no 4096 8 0 9000 9000 0xff 0xff
|
||||||
|
flash yes 131072 256 512 4500 9000 0xff 0x00
|
||||||
|
lfuse no 1 0 0 0 0 0x00 0x00
|
||||||
|
hfuse no 1 0 0 0 0 0x00 0x00
|
||||||
|
efuse no 1 0 0 0 0 0x00 0x00
|
||||||
|
lock no 1 0 0 0 0 0x00 0x00
|
||||||
|
calibration no 1 0 0 0 0 0x00 0x00
|
||||||
|
signature no 3 0 0 0 0 0x00 0x00
|
||||||
|
|
||||||
|
avrdude> dump eeprom 0 16
|
||||||
|
>>> dump eeprom 0 16
|
||||||
|
0000 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
|
||||||
|
|
||||||
|
avrdude> write eeprom 0 1 2 3 4
|
||||||
|
>>> write eeprom 0 1 2 3 4
|
||||||
|
|
||||||
|
avrdude> dump eeprom 0 16
|
||||||
|
>>> dump eeprom 0 16
|
||||||
|
0000 01 02 03 04 ff ff ff ff ff ff ff ff ff ff ff ff |................|
|
||||||
|
|
||||||
|
avrdude> erase
|
||||||
|
>>> erase
|
||||||
|
avrdude: erasing chip
|
||||||
|
avrdude> dump eeprom 0 16
|
||||||
|
>>> dump eeprom 0 16
|
||||||
|
0000 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
|
||||||
|
|
||||||
|
avrdude>
|
||||||
|
@end cartouche
|
||||||
|
|
||||||
|
|
||||||
|
Program the fuse bits of an ATmega128 (disable M103 compatibility,
|
||||||
|
enable high speed external crystal, enable brown-out detection, slowly
|
||||||
|
rising power). Note since we are working with fuse bits the -u (unsafe)
|
||||||
|
option is specified, which allows you to modify the fuse bits. First
|
||||||
|
display the factory defaults, then reprogram:
|
||||||
|
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
@cartouche
|
||||||
|
% avrdude -p m128 -u -c stk500 -t
|
||||||
|
|
||||||
|
avrdude: AVR device initialized and ready to accept instructions
|
||||||
|
avrdude: Device signature = 0x1e9702
|
||||||
|
avrdude: current erase-rewrite cycle count is 52 (if being tracked)
|
||||||
|
avrdude> d efuse
|
||||||
|
>>> d efuse
|
||||||
|
0000 fd |. |
|
||||||
|
|
||||||
|
avrdude> d hfuse
|
||||||
|
>>> d hfuse
|
||||||
|
0000 99 |. |
|
||||||
|
|
||||||
|
avrdude> d lfuse
|
||||||
|
>>> d lfuse
|
||||||
|
0000 e1 |. |
|
||||||
|
|
||||||
|
avrdude> w efuse 0 0xff
|
||||||
|
>>> w efuse 0 0xff
|
||||||
|
|
||||||
|
avrdude> w hfuse 0 0x89
|
||||||
|
>>> w hfuse 0 0x89
|
||||||
|
|
||||||
|
avrdude> w lfuse 0 0x2f
|
||||||
|
>>> w lfuse 0 0x2f
|
||||||
|
|
||||||
|
avrdude>
|
||||||
|
@end cartouche
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,382 @@
|
||||||
|
.. _Configuration_File:
|
||||||
|
|
||||||
|
******************
|
||||||
|
Configuration File
|
||||||
|
******************
|
||||||
|
|
||||||
|
AVRDUDE reads a configuration file upon startup which describes all of
|
||||||
|
the parts and programmers that it knows about. The advantage of this is
|
||||||
|
that if you have a chip that is not currently supported by AVRDUDE, you
|
||||||
|
can add it to the configuration file without waiting for a new release
|
||||||
|
of AVRDUDE. Likewise, if you have a parallel port programmer that is
|
||||||
|
not supported by AVRDUDE, chances are good that you can copy and
|
||||||
|
existing programmer definition, and with only a few changes, make your
|
||||||
|
programmer work with AVRDUDE.
|
||||||
|
|
||||||
|
AVRDUDE first looks for a system wide configuration file in a platform
|
||||||
|
dependent location. On Unix, this is usually
|
||||||
|
`/usr/local/etc/avrdude.conf`, while on Windows it is usually in the
|
||||||
|
same location as the executable file. The name of this file can be
|
||||||
|
changed using the *-C* command line option. After the system wide
|
||||||
|
configuration file is parsed, AVRDUDE looks for a per-user configuration
|
||||||
|
file to augment or override the system wide defaults. On Unix, the
|
||||||
|
per-user file is `.avrduderc` within the user's home directory. On
|
||||||
|
Windows, this file is the `avrdude.rc` file located in the same
|
||||||
|
directory as the executable.
|
||||||
|
|
||||||
|
.. _AVRDUDE_Defaults:
|
||||||
|
|
||||||
|
AVRDUDE Defaults
|
||||||
|
================
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
*default_parallel = "`default-parallel-device`";*
|
||||||
|
Assign the default parallel port device. Can be overridden using the
|
||||||
|
*-P* option.
|
||||||
|
|
||||||
|
|
||||||
|
*default_serial = "`default-serial-device`";*
|
||||||
|
Assign the default serial port device. Can be overridden using the
|
||||||
|
*-P* option.
|
||||||
|
|
||||||
|
|
||||||
|
*default_programmer = "`default-programmer-id`";*
|
||||||
|
Assign the default programmer id. Can be overridden using the *-c*
|
||||||
|
option.
|
||||||
|
|
||||||
|
|
||||||
|
*default_bitclock = "`default-bitclock`";*
|
||||||
|
Assign the default bitclock value. Can be overridden using the *-B*
|
||||||
|
option.
|
||||||
|
|
||||||
|
|
||||||
|
.. _Programmer_Definitions:
|
||||||
|
|
||||||
|
Programmer Definitions
|
||||||
|
======================
|
||||||
|
|
||||||
|
The format of the programmer definition is as follows:
|
||||||
|
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
programmer
|
||||||
|
parent <id> # <id> is a quoted string
|
||||||
|
id = <id1> [, <id2> [, <id3>] ...] ; # <idN> are quoted strings
|
||||||
|
desc = <description> ; # quoted string
|
||||||
|
type = "par" | "stk500" | ... ; # programmer type (see below for a list)
|
||||||
|
baudrate = <num> ; # baudrate for serial ports
|
||||||
|
vcc = <num1> [, <num2> ... ] ; # pin number(s)
|
||||||
|
buff = <num1> [, <num2> ... ] ; # pin number(s)
|
||||||
|
reset = <num> ; # pin number
|
||||||
|
sck = <num> ; # pin number
|
||||||
|
mosi = <num> ; # pin number
|
||||||
|
miso = <num> ; # pin number
|
||||||
|
errled = <num> ; # pin number
|
||||||
|
rdyled = <num> ; # pin number
|
||||||
|
pgmled = <num> ; # pin number
|
||||||
|
vfyled = <num> ; # pin number
|
||||||
|
usbvid = <hexnum>; # USB VID (Vendor ID)
|
||||||
|
usbpid = <hexnum> [, <hexnum> ...]; # USB PID (Product ID)
|
||||||
|
usbdev = <interface>; # USB interface or other device info
|
||||||
|
usbvendor = <vendorname>; # USB Vendor Name
|
||||||
|
usbproduct = <productname>; # USB Product Name
|
||||||
|
usbsn = <serialno>; # USB Serial Number
|
||||||
|
;
|
||||||
|
|
||||||
|
|
||||||
|
If a parent is specified, all settings of it (except its ids) are used for the new
|
||||||
|
programmer. These values can be changed by new setting them for the new programmer.
|
||||||
|
|
||||||
|
To invert a bit in the pin definitions, use `= ~ <num>`.
|
||||||
|
|
||||||
|
Not all programmer types can handle a list of USB PIDs.
|
||||||
|
|
||||||
|
Following programmer types are currently implemented:
|
||||||
|
|
||||||
|
@multitable @columnfractions .25 .6
|
||||||
|
* `arduino` @tab Arduino programmer
|
||||||
|
* `avr910` @tab Serial programmers using protocol described in application note AVR910
|
||||||
|
* `avrftdi` @tab Interface to the MPSSE Engine of FTDI Chips using libftdi.
|
||||||
|
* `buspirate` @tab Using the Bus Pirate's SPI interface for programming
|
||||||
|
* `buspirate_bb` @tab Using the Bus Pirate's bitbang interface for programming
|
||||||
|
* `butterfly` @tab Atmel Butterfly evaluation board; Atmel AppNotes AVR109, AVR911
|
||||||
|
* `butterfly_mk` @tab Mikrokopter.de Butterfly
|
||||||
|
* `dragon_dw` @tab Atmel AVR Dragon in debugWire mode
|
||||||
|
* `dragon_hvsp` @tab Atmel AVR Dragon in HVSP mode
|
||||||
|
* `dragon_isp` @tab Atmel AVR Dragon in ISP mode
|
||||||
|
* `dragon_jtag` @tab Atmel AVR Dragon in JTAG mode
|
||||||
|
* `dragon_pdi` @tab Atmel AVR Dragon in PDI mode
|
||||||
|
* `dragon_pp` @tab Atmel AVR Dragon in PP mode
|
||||||
|
* `flip1` @tab FLIP USB DFU protocol version 1 (doc7618)
|
||||||
|
* `flip2` @tab FLIP USB DFU protocol version 2 (AVR4023)
|
||||||
|
* `ftdi_syncbb` @tab FT245R/FT232R Synchronous BitBangMode Programmer
|
||||||
|
* `jtagmki` @tab Atmel JTAG ICE mkI
|
||||||
|
* `jtagmkii` @tab Atmel JTAG ICE mkII
|
||||||
|
* `jtagmkii_avr32` @tab Atmel JTAG ICE mkII in AVR32 mode
|
||||||
|
* `jtagmkii_dw` @tab Atmel JTAG ICE mkII in debugWire mode
|
||||||
|
* `jtagmkii_isp` @tab Atmel JTAG ICE mkII in ISP mode
|
||||||
|
* `jtagmkii_pdi` @tab Atmel JTAG ICE mkII in PDI mode
|
||||||
|
* `jtagice3` @tab Atmel JTAGICE3
|
||||||
|
* `jtagice3_pdi` @tab Atmel JTAGICE3 in PDI mode
|
||||||
|
* `jtagice3_updi` @tab Atmel JTAGICE3 in UPDI mode
|
||||||
|
* `jtagice3_dw` @tab Atmel JTAGICE3 in debugWire mode
|
||||||
|
* `jtagice3_isp` @tab Atmel JTAGICE3 in ISP mode
|
||||||
|
* `linuxgpio` @tab GPIO bitbanging using the Linux sysfs interface (not available)
|
||||||
|
* `linuxspi` @tab SPI using Linux spidev driver (not available)
|
||||||
|
* `micronucleus` @tab Micronucleus Bootloader
|
||||||
|
* `par` @tab Parallel port bitbanging
|
||||||
|
* `pickit2` @tab Microchip's PICkit2 Programmer
|
||||||
|
* `serbb` @tab Serial port bitbanging
|
||||||
|
* `serialupdi` @tab Driver for SerialUPDI programmers
|
||||||
|
* `stk500` @tab Atmel STK500 Version 1.x firmware
|
||||||
|
* `stk500generic` @tab Atmel STK500, autodetect firmware version
|
||||||
|
* `stk500v2` @tab Atmel STK500 Version 2.x firmware
|
||||||
|
* `stk500hvsp` @tab Atmel STK500 V2 in high-voltage serial programming mode
|
||||||
|
* `stk500pp` @tab Atmel STK500 V2 in parallel programming mode
|
||||||
|
* `stk600` @tab Atmel STK600
|
||||||
|
* `stk600hvsp` @tab Atmel STK600 in high-voltage serial programming mode
|
||||||
|
* `stk600pp` @tab Atmel STK600 in parallel programming mode
|
||||||
|
* `teensy` @tab Teensy Bootloader
|
||||||
|
* `usbasp` @tab USBasp programmer, see `http://www.fischl.de/usbasp/ <http://www.fischl.de/usbasp/>`_
|
||||||
|
* `usbtiny` @tab Driver for "usbtiny"-type programmers
|
||||||
|
* `wiring` @tab `http://wiring.org.co/ <http://wiring.org.co/>`_, Basically STK500v2 protocol, with some glue to trigger the bootloader.
|
||||||
|
* `xbee` @tab XBee Series 2 Over-The-Air (XBeeBoot)
|
||||||
|
@end multitable
|
||||||
|
|
||||||
|
.. _Part_Definitions:
|
||||||
|
|
||||||
|
Part Definitions
|
||||||
|
================
|
||||||
|
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
part
|
||||||
|
id = <id> ; # quoted string
|
||||||
|
desc = <description> ; # quoted string
|
||||||
|
family_id = <description> ; # quoted string
|
||||||
|
has_jtag = <yes/no> ; # part has JTAG i/f
|
||||||
|
has_debugwire = <yes/no> ; # part has debugWire i/f
|
||||||
|
has_pdi = <yes/no> ; # part has PDI i/f
|
||||||
|
has_updi = <yes/no> ; # part has UPDI i/f
|
||||||
|
has_tpi = <yes/no> ; # part has TPI i/f
|
||||||
|
devicecode = <num> ; # numeric
|
||||||
|
stk500_devcode = <num> ; # numeric
|
||||||
|
avr910_devcode = <num> ; # numeric
|
||||||
|
signature = <num> <num> <num> ; # signature bytes
|
||||||
|
usbpid = <num> ; # DFU USB PID
|
||||||
|
reset = dedicated | io;
|
||||||
|
retry_pulse = reset | sck;
|
||||||
|
pgm_enable = <instruction format> ;
|
||||||
|
chip_erase = <instruction format> ;
|
||||||
|
chip_erase_delay = <num> ; # micro-seconds
|
||||||
|
# STK500 parameters (parallel programming IO lines)
|
||||||
|
pagel = <num> ; # pin name in hex, i.e., 0xD7
|
||||||
|
bs2 = <num> ; # pin name in hex, i.e., 0xA0
|
||||||
|
serial = <yes/no> ; # can use serial downloading
|
||||||
|
parallel = <yes/no/pseudo>; # can use par. programming
|
||||||
|
# STK500v2 parameters, to be taken from Atmel's XML files
|
||||||
|
timeout = <num> ;
|
||||||
|
stabdelay = <num> ;
|
||||||
|
cmdexedelay = <num> ;
|
||||||
|
synchloops = <num> ;
|
||||||
|
bytedelay = <num> ;
|
||||||
|
pollvalue = <num> ;
|
||||||
|
pollindex = <num> ;
|
||||||
|
predelay = <num> ;
|
||||||
|
postdelay = <num> ;
|
||||||
|
pollmethod = <num> ;
|
||||||
|
mode = <num> ;
|
||||||
|
delay = <num> ;
|
||||||
|
blocksize = <num> ;
|
||||||
|
readsize = <num> ;
|
||||||
|
hvspcmdexedelay = <num> ;
|
||||||
|
# STK500v2 HV programming parameters, from XML
|
||||||
|
pp_controlstack = <num>, <num>, ...; # PP only
|
||||||
|
hvsp_controlstack = <num>, <num>, ...; # HVSP only
|
||||||
|
hventerstabdelay = <num>;
|
||||||
|
progmodedelay = <num>; # PP only
|
||||||
|
latchcycles = <num>;
|
||||||
|
togglevtg = <num>;
|
||||||
|
poweroffdelay = <num>;
|
||||||
|
resetdelayms = <num>;
|
||||||
|
resetdelayus = <num>;
|
||||||
|
hvleavestabdelay = <num>;
|
||||||
|
resetdelay = <num>;
|
||||||
|
synchcycles = <num>; # HVSP only
|
||||||
|
chiperasepulsewidth = <num>; # PP only
|
||||||
|
chiperasepolltimeout = <num>;
|
||||||
|
chiperasetime = <num>; # HVSP only
|
||||||
|
programfusepulsewidth = <num>; # PP only
|
||||||
|
programfusepolltimeout = <num>;
|
||||||
|
programlockpulsewidth = <num>; # PP only
|
||||||
|
programlockpolltimeout = <num>;
|
||||||
|
# JTAG ICE mkII parameters, also from XML files
|
||||||
|
allowfullpagebitstream = <yes/no> ;
|
||||||
|
enablepageprogramming = <yes/no> ;
|
||||||
|
idr = <num> ; # IO addr of IDR (OCD) reg.
|
||||||
|
rampz = <num> ; # IO addr of RAMPZ reg.
|
||||||
|
spmcr = <num> ; # mem addr of SPMC[S]R reg.
|
||||||
|
eecr = <num> ; # mem addr of EECR reg.
|
||||||
|
# (only when != 0x3c)
|
||||||
|
is_at90s1200 = <yes/no> ; # AT90S1200 part
|
||||||
|
is_avr32 = <yes/no> ; # AVR32 part
|
||||||
|
|
||||||
|
memory <memtype>
|
||||||
|
paged = <yes/no> ; # yes / no
|
||||||
|
size = <num> ; # bytes
|
||||||
|
page_size = <num> ; # bytes
|
||||||
|
num_pages = <num> ; # numeric
|
||||||
|
min_write_delay = <num> ; # micro-seconds
|
||||||
|
max_write_delay = <num> ; # micro-seconds
|
||||||
|
readback_p1 = <num> ; # byte value
|
||||||
|
readback_p2 = <num> ; # byte value
|
||||||
|
pwroff_after_write = <yes/no> ; # yes / no
|
||||||
|
read = <instruction format> ;
|
||||||
|
write = <instruction format> ;
|
||||||
|
read_lo = <instruction format> ;
|
||||||
|
read_hi = <instruction format> ;
|
||||||
|
write_lo = <instruction format> ;
|
||||||
|
write_hi = <instruction format> ;
|
||||||
|
loadpage_lo = <instruction format> ;
|
||||||
|
loadpage_hi = <instruction format> ;
|
||||||
|
writepage = <instruction format> ;
|
||||||
|
;
|
||||||
|
;
|
||||||
|
|
||||||
|
|
||||||
|
.. _Parent_Part:
|
||||||
|
|
||||||
|
Parent Part
|
||||||
|
-----------
|
||||||
|
|
||||||
|
Parts can also inherit parameters from previously defined parts
|
||||||
|
using the following syntax. In this case specified integer and
|
||||||
|
string values override parameter values from the parent part. New
|
||||||
|
memory definitions are added to the definitions inherited from the
|
||||||
|
parent.
|
||||||
|
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
part parent <id> # quoted string
|
||||||
|
id = <id> ; # quoted string
|
||||||
|
<any set of other parameters from the list above>
|
||||||
|
;
|
||||||
|
|
||||||
|
|
||||||
|
.. _Instruction_Format:
|
||||||
|
|
||||||
|
Instruction Format
|
||||||
|
------------------
|
||||||
|
|
||||||
|
Instruction formats are specified as a comma separated list of string
|
||||||
|
values containing information (bit specifiers) about each of the 32 bits
|
||||||
|
of the instruction. Bit specifiers may be one of the following formats:
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
*1*
|
||||||
|
The bit is always set on input as well as output
|
||||||
|
|
||||||
|
|
||||||
|
*0*
|
||||||
|
the bit is always clear on input as well as output
|
||||||
|
|
||||||
|
|
||||||
|
*x*
|
||||||
|
the bit is ignored on input and output
|
||||||
|
|
||||||
|
|
||||||
|
*a*
|
||||||
|
the bit is an address bit, the bit-number matches this bit specifier's
|
||||||
|
position within the current instruction byte
|
||||||
|
|
||||||
|
|
||||||
|
*a`N`*
|
||||||
|
the bit is the `N`th address bit, bit-number = N, i.e., `a12`
|
||||||
|
is address bit 12 on input, `a0` is address bit 0.
|
||||||
|
|
||||||
|
|
||||||
|
*i*
|
||||||
|
the bit is an input data bit
|
||||||
|
|
||||||
|
|
||||||
|
*o*
|
||||||
|
the bit is an output data bit
|
||||||
|
|
||||||
|
|
||||||
|
Each instruction must be composed of 32 bit specifiers. The instruction
|
||||||
|
specification closely follows the instruction data provided in Atmel's
|
||||||
|
data sheets for their parts. For example, the EEPROM read and write
|
||||||
|
instruction for an AT90S2313 AVR part could be encoded as:
|
||||||
|
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
read = "1 0 1 0 0 0 0 0 x x x x x x x x",
|
||||||
|
"x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o";
|
||||||
|
|
||||||
|
write = "1 1 0 0 0 0 0 0 x x x x x x x x",
|
||||||
|
"x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i";
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
.. _Other_Notes:
|
||||||
|
|
||||||
|
Other Notes
|
||||||
|
===========
|
||||||
|
|
||||||
|
|
||||||
|
*
|
||||||
|
The `devicecode` parameter is the device code used by the STK500
|
||||||
|
and is obtained from the software section (`avr061.zip`) of
|
||||||
|
Atmel's AVR061 application note available from
|
||||||
|
`http://www.atmel.com/dyn/resources/prod_documents/doc2525.pdf <http://www.atmel.com/dyn/resources/prod_documents/doc2525.pdf>`_.
|
||||||
|
|
||||||
|
*
|
||||||
|
Not all memory types will implement all instructions.
|
||||||
|
|
||||||
|
*
|
||||||
|
AVR Fuse bits and Lock bits are implemented as a type of memory.
|
||||||
|
|
||||||
|
*
|
||||||
|
Example memory types are: `flash`, `eeprom`, `fuse`,
|
||||||
|
`lfuse` (low fuse), `hfuse` (high fuse), `efuse`
|
||||||
|
(extended fuse), `signature`, `calibration`, `lock`.
|
||||||
|
|
||||||
|
*
|
||||||
|
The memory type specified on the AVRDUDE command line must match one of
|
||||||
|
the memory types defined for the specified chip.
|
||||||
|
|
||||||
|
*
|
||||||
|
The `pwroff_after_write` flag causes AVRDUDE to attempt to power
|
||||||
|
the device off and back on after an unsuccessful write to the affected
|
||||||
|
memory area if VCC programmer pins are defined. If VCC pins are not
|
||||||
|
defined for the programmer, a message indicating that the device needs a
|
||||||
|
power-cycle is printed out. This flag was added to work around a
|
||||||
|
problem with the at90s4433/2333's; see the at90s4433 errata at:
|
||||||
|
|
||||||
|
`http://www.atmel.com/dyn/resources/prod_documents/doc1280.pdf <http://www.atmel.com/dyn/resources/prod_documents/doc1280.pdf>`_
|
||||||
|
|
||||||
|
*
|
||||||
|
The boot loader from application note AVR109 (and thus also the AVR
|
||||||
|
Butterfly) does not support writing of fuse bits. Writing lock bits
|
||||||
|
is supported, but is restricted to the boot lock bits (BLBxx). These
|
||||||
|
are restrictions imposed by the underlying SPM instruction that is used
|
||||||
|
to program the device from inside the boot loader. Note that programming
|
||||||
|
the boot lock bits can result in a 'shoot-into-your-foot' scenario as
|
||||||
|
the only way to unprogram these bits is a chip erase, which will also
|
||||||
|
erase the boot loader code.
|
||||||
|
|
||||||
|
The boot loader implements the 'chip erase' function by erasing the
|
||||||
|
flash pages of the application section.
|
||||||
|
|
||||||
|
Reading fuse and lock bits is fully supported.
|
||||||
|
|
||||||
|
Note that due to the inability to write the fuse bits, the safemode
|
||||||
|
functionality does not make sense for these boot loaders.
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,843 @@
|
||||||
|
.. _Programmer_Specific_Information:
|
||||||
|
|
||||||
|
*******************************
|
||||||
|
Programmer Specific Information
|
||||||
|
*******************************
|
||||||
|
|
||||||
|
|
||||||
|
.. _Atmel_STK600:
|
||||||
|
|
||||||
|
Atmel STK600
|
||||||
|
============
|
||||||
|
|
||||||
|
The following devices are supported by the respective STK600 routing
|
||||||
|
and socket card:
|
||||||
|
|
||||||
|
@multitable @columnfractions .25 .25 .5
|
||||||
|
@headitem Routing card @tab Socket card @tab Devices
|
||||||
|
* `} @tab @code{STK600-ATTINY10` @tab ATtiny4 ATtiny5 ATtiny9 ATtiny10
|
||||||
|
* `STK600-RC008T-2` @tab `STK600-DIP` @tab ATtiny11 ATtiny12 ATtiny13 ATtiny13A ATtiny25 ATtiny45 ATtiny85
|
||||||
|
* `STK600-RC008T-7` @tab `STK600-DIP` @tab ATtiny15
|
||||||
|
* `STK600-RC014T-42` @tab `STK600-SOIC` @tab ATtiny20
|
||||||
|
* `STK600-RC020T-1` @tab `STK600-DIP` @tab ATtiny2313 ATtiny2313A ATtiny4313
|
||||||
|
* `} @tab @code{STK600-TinyX3U` @tab ATtiny43U
|
||||||
|
* `STK600-RC014T-12` @tab `STK600-DIP` @tab ATtiny24 ATtiny44 ATtiny84 ATtiny24A ATtiny44A
|
||||||
|
* `STK600-RC020T-8` @tab `STK600-DIP` @tab ATtiny26 ATtiny261 ATtiny261A ATtiny461 ATtiny861 ATtiny861A
|
||||||
|
* `STK600-RC020T-43` @tab `STK600-SOIC` @tab ATtiny261 ATtiny261A ATtiny461 ATtiny461A ATtiny861 ATtiny861A
|
||||||
|
* `STK600-RC020T-23` @tab `STK600-SOIC` @tab ATtiny87 ATtiny167
|
||||||
|
* `STK600-RC028T-3` @tab `STK600-DIP` @tab ATtiny28
|
||||||
|
* `STK600-RC028M-6` @tab `STK600-DIP` @tab ATtiny48 ATtiny88 ATmega8 ATmega8A ATmega48 ATmega88 ATmega168 ATmega48P ATmega48PA ATmega88P ATmega88PA ATmega168P ATmega168PA ATmega328P
|
||||||
|
* `} @tab @code{QT600-ATTINY88-QT8` @tab ATtiny88
|
||||||
|
* `STK600-RC040M-4` @tab `STK600-DIP` @tab ATmega8515 ATmega162
|
||||||
|
* `STK600-RC044M-30` @tab `STK600-TQFP44` @tab ATmega8515 ATmega162
|
||||||
|
* `STK600-RC040M-5` @tab `STK600-DIP` @tab ATmega8535 ATmega16 ATmega16A ATmega32 ATmega32A ATmega164P ATmega164PA ATmega324P ATmega324PA ATmega644 ATmega644P ATmega644PA ATmega1284P
|
||||||
|
* `STK600-RC044M-31` @tab `STK600-TQFP44` @tab ATmega8535 ATmega16 ATmega16A ATmega32 ATmega32A ATmega164P ATmega164PA ATmega324P ATmega324PA ATmega644 ATmega644P ATmega644PA ATmega1284P
|
||||||
|
* `} @tab @code{QT600-ATMEGA324-QM64` @tab ATmega324PA
|
||||||
|
* `STK600-RC032M-29` @tab `STK600-TQFP32` @tab ATmega8 ATmega8A ATmega48 ATmega88 ATmega168 ATmega48P ATmega48PA ATmega88P ATmega88PA ATmega168P ATmega168PA ATmega328P
|
||||||
|
* `STK600-RC064M-9` @tab `STK600-TQFP64` @tab ATmega64 ATmega64A ATmega128 ATmega128A ATmega1281 ATmega2561 AT90CAN32 AT90CAN64 AT90CAN128
|
||||||
|
* `STK600-RC064M-10` @tab `STK600-TQFP64` @tab ATmega165 ATmega165P ATmega169 ATmega169P ATmega169PA ATmega325 ATmega325P ATmega329 ATmega329P ATmega645 ATmega649 ATmega649P
|
||||||
|
* `STK600-RC100M-11` @tab `STK600-TQFP100` @tab ATmega640 ATmega1280 ATmega2560
|
||||||
|
* `} @tab @code{STK600-ATMEGA2560` @tab ATmega2560
|
||||||
|
* `STK600-RC100M-18` @tab `STK600-TQFP100` @tab ATmega3250 ATmega3250P ATmega3290 ATmega3290P ATmega6450 ATmega6490
|
||||||
|
* `STK600-RC032U-20` @tab `STK600-TQFP32` @tab AT90USB82 AT90USB162 ATmega8U2 ATmega16U2 ATmega32U2
|
||||||
|
* `STK600-RC044U-25` @tab `STK600-TQFP44` @tab ATmega16U4 ATmega32U4
|
||||||
|
* `STK600-RC064U-17` @tab `STK600-TQFP64` @tab ATmega32U6 AT90USB646 AT90USB1286 AT90USB647 AT90USB1287
|
||||||
|
* `STK600-RCPWM-22` @tab `STK600-TQFP32` @tab ATmega32C1 ATmega64C1 ATmega16M1 ATmega32M1 ATmega64M1
|
||||||
|
* `STK600-RCPWM-19` @tab `STK600-SOIC` @tab AT90PWM2 AT90PWM3 AT90PWM2B AT90PWM3B AT90PWM216 AT90PWM316
|
||||||
|
* `STK600-RCPWM-26` @tab `STK600-SOIC` @tab AT90PWM81
|
||||||
|
* `STK600-RC044M-24` @tab `STK600-TSSOP44` @tab ATmega16HVB ATmega32HVB
|
||||||
|
* `} @tab @code{STK600-HVE2` @tab ATmega64HVE
|
||||||
|
* `} @tab @code{STK600-ATMEGA128RFA1` @tab ATmega128RFA1
|
||||||
|
* `STK600-RC100X-13` @tab `STK600-TQFP100` @tab ATxmega64A1 ATxmega128A1 ATxmega128A1_revD ATxmega128A1U
|
||||||
|
* `} @tab @code{STK600-ATXMEGA1281A1` @tab ATxmega128A1
|
||||||
|
* `} @tab @code{QT600-ATXMEGA128A1-QT16` @tab ATxmega128A1
|
||||||
|
* `STK600-RC064X-14` @tab `STK600-TQFP64` @tab ATxmega64A3 ATxmega128A3 ATxmega256A3 ATxmega64D3 ATxmega128D3 ATxmega192D3 ATxmega256D3
|
||||||
|
* `STK600-RC064X-14` @tab `STK600-MLF64` @tab ATxmega256A3B
|
||||||
|
* `STK600-RC044X-15` @tab `STK600-TQFP44` @tab ATxmega32A4 ATxmega16A4 ATxmega16D4 ATxmega32D4
|
||||||
|
* `} @tab @code{STK600-ATXMEGAT0` @tab ATxmega32T0
|
||||||
|
* `} @tab @code{STK600-uC3-144` @tab AT32UC3A0512 AT32UC3A0256 AT32UC3A0128
|
||||||
|
* `STK600-RCUC3A144-33` @tab `STK600-TQFP144` @tab AT32UC3A0512 AT32UC3A0256 AT32UC3A0128
|
||||||
|
* `STK600-RCuC3A100-28` @tab `STK600-TQFP100` @tab AT32UC3A1512 AT32UC3A1256 AT32UC3A1128
|
||||||
|
* `STK600-RCuC3B0-21` @tab `STK600-TQFP64-2` @tab AT32UC3B0256 AT32UC3B0512RevC AT32UC3B0512 AT32UC3B0128 AT32UC3B064 AT32UC3D1128
|
||||||
|
* `STK600-RCuC3B48-27` @tab `STK600-TQFP48` @tab AT32UC3B1256 AT32UC3B164
|
||||||
|
* `STK600-RCUC3A144-32` @tab `STK600-TQFP144` @tab AT32UC3A3512 AT32UC3A3256 AT32UC3A3128 AT32UC3A364 AT32UC3A3256S AT32UC3A3128S AT32UC3A364S
|
||||||
|
* `STK600-RCUC3C0-36` @tab `STK600-TQFP144` @tab AT32UC3C0512 AT32UC3C0256 AT32UC3C0128 AT32UC3C064
|
||||||
|
* `STK600-RCUC3C1-38` @tab `STK600-TQFP100` @tab AT32UC3C1512 AT32UC3C1256 AT32UC3C1128 AT32UC3C164
|
||||||
|
* `STK600-RCUC3C2-40` @tab `STK600-TQFP64-2` @tab AT32UC3C2512 AT32UC3C2256 AT32UC3C2128 AT32UC3C264
|
||||||
|
* `STK600-RCUC3C0-37` @tab `STK600-TQFP144` @tab AT32UC3C0512 AT32UC3C0256 AT32UC3C0128 AT32UC3C064
|
||||||
|
* `STK600-RCUC3C1-39` @tab `STK600-TQFP100` @tab AT32UC3C1512 AT32UC3C1256 AT32UC3C1128 AT32UC3C164
|
||||||
|
* `STK600-RCUC3C2-41` @tab `STK600-TQFP64-2` @tab AT32UC3C2512 AT32UC3C2256 AT32UC3C2128 AT32UC3C264
|
||||||
|
* `STK600-RCUC3L0-34` @tab `STK600-TQFP48` @tab AT32UC3L064 AT32UC3L032 AT32UC3L016
|
||||||
|
* `} @tab @code{QT600-AT32UC3L-QM64` @tab AT32UC3L064
|
||||||
|
@end multitable
|
||||||
|
|
||||||
|
Ensure the correct socket and routing card are mounted *before*
|
||||||
|
powering on the STK600. While the STK600 firmware ensures the socket
|
||||||
|
and routing card mounted match each other (using a table stored
|
||||||
|
internally in nonvolatile memory), it cannot handle the case where a
|
||||||
|
wrong routing card is used, e. g. the routing card
|
||||||
|
`STK600-RC040M-5` (which is meant for 40-pin DIP AVRs that have
|
||||||
|
an ADC, with the power supply pins in the center of the package) was
|
||||||
|
used but an ATmega8515 inserted (which uses the 'industry standard'
|
||||||
|
pinout with Vcc and GND at opposite corners).
|
||||||
|
|
||||||
|
Note that for devices that use the routing card `STK600-RC008T-2`,
|
||||||
|
in order to use ISP mode, the jumper for `AREF0` must be removed
|
||||||
|
as it would otherwise block one of the ISP signals. High-voltage
|
||||||
|
serial programming can be used even with that jumper installed.
|
||||||
|
|
||||||
|
The ISP system of the STK600 contains a detection against shortcuts
|
||||||
|
and other wiring errors. AVRDUDE initiates a connection check before
|
||||||
|
trying to enter ISP programming mode, and display the result if the
|
||||||
|
target is not found ready to be ISP programmed.
|
||||||
|
|
||||||
|
High-voltage programming requires the target voltage to be set to at
|
||||||
|
least 4.5 V in order to work. This can be done using
|
||||||
|
*Terminal Mode*, see :ref:`Terminal_Mode_Operation`.
|
||||||
|
|
||||||
|
.. _Atmel_DFU_bootloader_using_FLIP_version_1:
|
||||||
|
|
||||||
|
Atmel DFU bootloader using FLIP version 1
|
||||||
|
=========================================
|
||||||
|
|
||||||
|
Bootloaders using the FLIP protocol version 1 experience some very
|
||||||
|
specific behaviour.
|
||||||
|
|
||||||
|
These bootloaders have no option to access memory areas other than
|
||||||
|
Flash and EEPROM.
|
||||||
|
|
||||||
|
When the bootloader is started, it enters a *security mode* where
|
||||||
|
the only acceptable access is to query the device configuration
|
||||||
|
parameters (which are used for the signature on AVR devices). The
|
||||||
|
only way to leave this mode is a *chip erase*. As a chip erase
|
||||||
|
is normally implied by the *-U* option when reprogramming the
|
||||||
|
flash, this peculiarity might not be very obvious immediately.
|
||||||
|
|
||||||
|
Sometimes, a bootloader with security mode already disabled seems to
|
||||||
|
no longer respond with sensible configuration data, but only 0xFF for
|
||||||
|
all queries. As these queries are used to obtain the equivalent of a
|
||||||
|
signature, AVRDUDE can only continue in that situation by forcing the
|
||||||
|
signature check to be overridden with the *-F* option.
|
||||||
|
|
||||||
|
A *chip erase* might leave the EEPROM unerased, at least on some
|
||||||
|
versions of the bootloader.
|
||||||
|
|
||||||
|
.. _SerialUPDI_programmer:
|
||||||
|
|
||||||
|
SerialUPDI programmer
|
||||||
|
=====================
|
||||||
|
|
||||||
|
SerialUPDI programmer can be used for programming UPDI-only devices
|
||||||
|
using very simple serial connection.
|
||||||
|
You can read more about the details here
|
||||||
|
`https://github.com/SpenceKonde/AVR-Guidance/blob/master/UPDI/jtag2updi.md <https://github.com/SpenceKonde/AVR-Guidance/blob/master/UPDI/jtag2updi.md>`_
|
||||||
|
|
||||||
|
SerialUPDI programmer has been tested using FT232RL USB->UART interface
|
||||||
|
with the following connection layout (copied from Spence Kohde's page linked
|
||||||
|
above):
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
-------------------- To Target device
|
||||||
|
DTR| __________________
|
||||||
|
Rx |--------------,------------------| UPDI---\\/\\/---------->
|
||||||
|
Tx---/\\/\\/\\---Tx |-------|<|---' .--------| Gnd 470 ohm
|
||||||
|
resistor Vcc|---------------------------------| Vcc
|
||||||
|
1k CTS| .` |__________________
|
||||||
|
Gnd|--------------------'
|
||||||
|
--------------------
|
||||||
|
|
||||||
|
|
||||||
|
There are several limitations in current SerialUPDI/AVRDUDE integration,
|
||||||
|
listed below.
|
||||||
|
|
||||||
|
At the end of each run there are fuse values being presented to the user.
|
||||||
|
For most of the UPDI-enabled devices these definitions (low fuse, high
|
||||||
|
fuse, extended fuse) have no meaning whatsoever, as they have been
|
||||||
|
simply replaced by array of fuses: fuse0..9. Therefore you can simply
|
||||||
|
ignore this particular line of AVRDUDE output.
|
||||||
|
|
||||||
|
In connection to the above, *safemode* has no meaning in context
|
||||||
|
of UPDI devices and should be ignored.
|
||||||
|
|
||||||
|
Currently available devices support only UPDI NVM programming model 0
|
||||||
|
and 2, but there is also experimental implementation of model 3 - not
|
||||||
|
yet tested.
|
||||||
|
|
||||||
|
One of the core AVRDUDE features is verification of the connection by
|
||||||
|
reading device signature prior to any operation, but this operation
|
||||||
|
is not possible on UPDI locked devices. Therefore, to be able to
|
||||||
|
connect to such a device, you have to provide *-F* to override
|
||||||
|
this check.
|
||||||
|
|
||||||
|
Please note: using *-F* during write operation to locked device
|
||||||
|
will force chip erase. Use carefully.
|
||||||
|
|
||||||
|
Another issue you might notice is slow performance of EEPROM writing
|
||||||
|
using SerialUPDI for AVR Dx devices. This can be addressed by changing
|
||||||
|
*avrdude.conf* section for this device - changing EEPROM page
|
||||||
|
size to 0x20 (instead of default 1), like so:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
#------------------------------------------------------------
|
||||||
|
# AVR128DB28
|
||||||
|
#------------------------------------------------------------
|
||||||
|
|
||||||
|
part parent ".avrdx"
|
||||||
|
id = "avr128db28";
|
||||||
|
desc = "AVR128DB28";
|
||||||
|
signature = 0x1E 0x97 0x0E;
|
||||||
|
|
||||||
|
memory "flash"
|
||||||
|
size = 0x20000;
|
||||||
|
offset = 0x800000;
|
||||||
|
page_size = 0x200;
|
||||||
|
readsize = 0x100;
|
||||||
|
;
|
||||||
|
|
||||||
|
memory "eeprom"
|
||||||
|
size = 0x200;
|
||||||
|
offset = 0x1400;
|
||||||
|
page_size = 0x1;
|
||||||
|
readsize = 0x100;
|
||||||
|
;
|
||||||
|
;
|
||||||
|
|
||||||
|
|
||||||
|
USERROW memory has not been defined for new devices except for
|
||||||
|
experimental addition for AVR128DB28. The point of USERROW is to
|
||||||
|
provide ability to write configuration details to already locked
|
||||||
|
device and currently SerialUPDI interface supports this feature,
|
||||||
|
but it hasn't been tested on wide variety of chips. Treat this as
|
||||||
|
something experimental at this point. Please note: on locked devices
|
||||||
|
it's not possible to read back USERROW contents when written, so
|
||||||
|
the automatic verification will most likely fail and to prevent
|
||||||
|
error messages, use *-V*.
|
||||||
|
|
||||||
|
Please note that SerialUPDI interface is pretty new and some
|
||||||
|
issues are to be expected. In case you run into them, please
|
||||||
|
make sure to run the intended command with debug output enabled
|
||||||
|
(*-v -v -v*) and provide this verbose output with your
|
||||||
|
bug report. You can also try to perform the same action using
|
||||||
|
*pymcuprog* (`https://github.com/microchip-pic-avr-tools/pymcuprog <https://github.com/microchip-pic-avr-tools/pymcuprog>`_)
|
||||||
|
utility with *-v debug* and provide its output too.
|
||||||
|
You will notice that both outputs are pretty similar, and this
|
||||||
|
was implemented like that on purpose - it was supposed to make
|
||||||
|
analysis of UPDI protocol quirks easier.
|
||||||
|
|
||||||
|
@appendix Platform Dependent Information
|
||||||
|
|
||||||
|
.. _Unix:
|
||||||
|
|
||||||
|
Unix
|
||||||
|
====
|
||||||
|
|
||||||
|
|
||||||
|
.. _Unix_Installation:
|
||||||
|
|
||||||
|
Unix Installation
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
To build and install from the source tarball on Unix like systems:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
$ gunzip -c avrdude-6.99-20211218.tar.gz | tar xf -
|
||||||
|
$ cd avrdude-6.99-20211218
|
||||||
|
$ ./configure
|
||||||
|
$ make
|
||||||
|
$ su root -c 'make install'
|
||||||
|
|
||||||
|
|
||||||
|
The default location of the install is into `/usr/local` so you
|
||||||
|
will need to be sure that `/usr/local/bin` is in your `PATH`
|
||||||
|
environment variable.
|
||||||
|
|
||||||
|
If you do not have root access to your system, you can do the
|
||||||
|
following instead:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
$ gunzip -c avrdude-6.99-20211218.tar.gz | tar xf -
|
||||||
|
$ cd avrdude-6.99-20211218
|
||||||
|
$ ./configure --prefix=$HOME/local
|
||||||
|
$ make
|
||||||
|
$ make install
|
||||||
|
|
||||||
|
|
||||||
|
.. _FreeBSD_Installation:
|
||||||
|
|
||||||
|
FreeBSD Installation
|
||||||
|
^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
AVRDUDE is installed via the FreeBSD Ports Tree as follows:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
% su - root
|
||||||
|
# cd /usr/ports/devel/avrdude
|
||||||
|
# make install
|
||||||
|
|
||||||
|
|
||||||
|
If you wish to install from a pre-built package instead of the source,
|
||||||
|
you can use the following instead:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
% su - root
|
||||||
|
# pkg_add -r avrdude
|
||||||
|
|
||||||
|
|
||||||
|
Of course, you must be connected to the Internet for these methods to
|
||||||
|
work, since that is where the source as well as the pre-built package is
|
||||||
|
obtained.
|
||||||
|
|
||||||
|
.. _Linux_Installation:
|
||||||
|
|
||||||
|
Linux Installation
|
||||||
|
^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
On rpm based Linux systems (such as RedHat, SUSE, Mandrake, etc.), you
|
||||||
|
can build and install the rpm binaries directly from the tarball:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
$ su - root
|
||||||
|
# rpmbuild -tb avrdude-6.99-20211218.tar.gz
|
||||||
|
# rpm -Uvh /usr/src/redhat/RPMS/i386/avrdude-6.99-20211218-1.i386.rpm
|
||||||
|
|
||||||
|
|
||||||
|
Note that the path to the resulting rpm package, differs from system
|
||||||
|
to system. The above example is specific to RedHat.
|
||||||
|
|
||||||
|
.. _Unix_Configuration_Files:
|
||||||
|
|
||||||
|
Unix Configuration Files
|
||||||
|
------------------------
|
||||||
|
|
||||||
|
When AVRDUDE is build using the default *--prefix* configure
|
||||||
|
option, the default configuration file for a Unix system is located at
|
||||||
|
`/usr/local/etc/avrdude.conf`. This can be overridden by using the
|
||||||
|
*-C* command line option. Additionally, the user's home directory
|
||||||
|
is searched for a file named `.avrduderc`, and if found, is used to
|
||||||
|
augment the system default configuration file.
|
||||||
|
|
||||||
|
.. _FreeBSD_Configuration_Files:
|
||||||
|
|
||||||
|
FreeBSD Configuration Files
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
When AVRDUDE is installed using the FreeBSD ports system, the system
|
||||||
|
configuration file is always `/usr/local/etc/avrdude.conf`.
|
||||||
|
|
||||||
|
.. _Linux_Configuration_Files:
|
||||||
|
|
||||||
|
Linux Configuration Files
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
When AVRDUDE is installed using from an rpm package, the system
|
||||||
|
configuration file will be always be `/etc/avrdude.conf`.
|
||||||
|
|
||||||
|
.. _Unix_Port_Names:
|
||||||
|
|
||||||
|
Unix Port Names
|
||||||
|
---------------
|
||||||
|
|
||||||
|
The parallel and serial port device file names are system specific.
|
||||||
|
The following table lists the default names for a given system.
|
||||||
|
|
||||||
|
@multitable @columnfractions .30 .30 .30
|
||||||
|
* @strong{System}
|
||||||
|
@tab @strong{Default Parallel Port}
|
||||||
|
@tab @strong{Default Serial Port}
|
||||||
|
* FreeBSD
|
||||||
|
@tab `/dev/ppi0`
|
||||||
|
@tab `/dev/cuad0`
|
||||||
|
* Linux
|
||||||
|
@tab `/dev/parport0`
|
||||||
|
@tab `/dev/ttyS0`
|
||||||
|
* Solaris
|
||||||
|
@tab `/dev/printers/0`
|
||||||
|
@tab `/dev/term/a`
|
||||||
|
@end multitable
|
||||||
|
|
||||||
|
On FreeBSD systems, AVRDUDE uses the ppi(4) interface for
|
||||||
|
accessing the parallel port and the sio(4) driver for serial port
|
||||||
|
access.
|
||||||
|
|
||||||
|
On Linux systems, AVRDUDE uses the ppdev interface for
|
||||||
|
accessing the parallel port and the tty driver for serial port
|
||||||
|
access.
|
||||||
|
|
||||||
|
On Solaris systems, AVRDUDE uses the ecpp(7D) driver for
|
||||||
|
accessing the parallel port and the asy(7D) driver for serial port
|
||||||
|
access.
|
||||||
|
|
||||||
|
.. _Unix_Documentation:
|
||||||
|
|
||||||
|
Unix Documentation
|
||||||
|
------------------
|
||||||
|
|
||||||
|
AVRDUDE installs a manual page as well as info, HTML and PDF
|
||||||
|
documentation. The manual page is installed in
|
||||||
|
`/usr/local/man/man1` area, while the HTML and PDF documentation
|
||||||
|
is installed in `/usr/local/share/doc/avrdude` directory. The
|
||||||
|
info manual is installed in `/usr/local/info/avrdude.info`.
|
||||||
|
|
||||||
|
Note that these locations can be altered by various configure options
|
||||||
|
such as *--prefix*.
|
||||||
|
|
||||||
|
.. _Windows:
|
||||||
|
|
||||||
|
Windows
|
||||||
|
=======
|
||||||
|
|
||||||
|
|
||||||
|
.. _Installation:
|
||||||
|
|
||||||
|
Installation
|
||||||
|
------------
|
||||||
|
|
||||||
|
A Windows executable of avrdude is included in WinAVR which can be found at
|
||||||
|
`http://sourceforge.net/projects/winavr <http://sourceforge.net/projects/winavr>`_. WinAVR is a suite of executable,
|
||||||
|
open source software development tools for the AVR for the Windows platform.
|
||||||
|
|
||||||
|
There are two options to build avrdude from source under Windows.
|
||||||
|
The first one is to use Cygwin (`http://www.cygwin.com/ <http://www.cygwin.com/>`_).
|
||||||
|
|
||||||
|
To build and install from the source tarball for Windows (using Cygwin):
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
$ set PREFIX=<your install directory path>
|
||||||
|
$ export PREFIX
|
||||||
|
$ gunzip -c avrdude-6.99-20211218.tar.gz | tar xf -
|
||||||
|
$ cd avrdude-6.99-20211218
|
||||||
|
$ ./configure LDFLAGS="-static" --prefix=$PREFIX --datadir=$PREFIX
|
||||||
|
--sysconfdir=$PREFIX/bin --enable-versioned-doc=no
|
||||||
|
$ make
|
||||||
|
$ make install
|
||||||
|
|
||||||
|
|
||||||
|
Note that recent versions of Cygwin (starting with 1.7) removed the
|
||||||
|
MinGW support from the compiler that is needed in order to build a
|
||||||
|
native Win32 API binary that does not require to install the Cygwin
|
||||||
|
library `cygwin1.dll` at run-time. Either try using an older
|
||||||
|
compiler version that still supports MinGW builds, or use MinGW
|
||||||
|
(`http://www.mingw.org/ <http://www.mingw.org/>`_) directly.
|
||||||
|
|
||||||
|
.. _Configuration_Files:
|
||||||
|
|
||||||
|
Configuration Files
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
|
||||||
|
.. _Configuration_file_names:
|
||||||
|
|
||||||
|
Configuration file names
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
AVRDUDE on Windows looks for a system configuration file name of
|
||||||
|
`avrdude.conf` and looks for a user override configuration file of
|
||||||
|
`avrdude.rc`.
|
||||||
|
|
||||||
|
.. _How_AVRDUDE_finds_the_configuration_files.:
|
||||||
|
|
||||||
|
How AVRDUDE finds the configuration files.
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
AVRDUDE on Windows has a different way of searching for the system and
|
||||||
|
user configuration files. Below is the search method for locating the
|
||||||
|
configuration files:
|
||||||
|
|
||||||
|
|
||||||
|
*
|
||||||
|
Only for the system configuration file:
|
||||||
|
`<directory from which application loaded>/../etc/avrdude.conf`
|
||||||
|
|
||||||
|
*
|
||||||
|
The directory from which the application loaded.
|
||||||
|
|
||||||
|
*
|
||||||
|
The current directory.
|
||||||
|
|
||||||
|
*
|
||||||
|
The Windows system directory. On Windows NT, the name of this directory
|
||||||
|
is `SYSTEM32`.
|
||||||
|
|
||||||
|
*
|
||||||
|
Windows NT: The 16-bit Windows system directory. The name of this
|
||||||
|
directory is `SYSTEM`.
|
||||||
|
|
||||||
|
*
|
||||||
|
The Windows directory.
|
||||||
|
|
||||||
|
*
|
||||||
|
The directories that are listed in the PATH environment variable.
|
||||||
|
|
||||||
|
|
||||||
|
.. _Port_Names:
|
||||||
|
|
||||||
|
Port Names
|
||||||
|
----------
|
||||||
|
|
||||||
|
|
||||||
|
.. _Serial_Ports:
|
||||||
|
|
||||||
|
Serial Ports
|
||||||
|
^^^^^^^^^^^^
|
||||||
|
|
||||||
|
When you select a serial port (i.e. when using an STK500) use the
|
||||||
|
Windows serial port device names such as: com1, com2, etc.
|
||||||
|
|
||||||
|
.. _Parallel_Ports:
|
||||||
|
|
||||||
|
Parallel Ports
|
||||||
|
^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
AVRDUDE will accept 3 Windows parallel port names: lpt1, lpt2, or
|
||||||
|
lpt3. Each of these names corresponds to a fixed parallel port base
|
||||||
|
address:
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
*lpt1*
|
||||||
|
0x378
|
||||||
|
|
||||||
|
|
||||||
|
*lpt2*
|
||||||
|
0x278
|
||||||
|
|
||||||
|
|
||||||
|
*lpt3*
|
||||||
|
0x3BC
|
||||||
|
|
||||||
|
|
||||||
|
On your desktop PC, lpt1 will be the most common choice. If you are
|
||||||
|
using a laptop, you might have to use lpt3 instead of lpt1. Select the
|
||||||
|
name of the port the corresponds to the base address of the parallel
|
||||||
|
port that you want.
|
||||||
|
|
||||||
|
If the parallel port can be accessed through a different
|
||||||
|
address, this address can be specified directly, using the common C
|
||||||
|
language notation (i. e., hexadecimal values are prefixed by `0x`).
|
||||||
|
|
||||||
|
Documentation
|
||||||
|
-------------
|
||||||
|
|
||||||
|
AVRDUDE installs a manual page as well as info, HTML and PDF
|
||||||
|
documentation. The manual page is installed in
|
||||||
|
`/usr/local/man/man1` area, while the HTML and PDF documentation
|
||||||
|
is installed in `/usr/local/share/doc/avrdude` directory. The
|
||||||
|
info manual is installed in `/usr/local/info/avrdude.info`.
|
||||||
|
|
||||||
|
Note that these locations can be altered by various configure options
|
||||||
|
such as *--prefix* and *--datadir*.
|
||||||
|
|
||||||
|
@appendix Troubleshooting
|
||||||
|
|
||||||
|
In general, please report any bugs encountered via
|
||||||
|
@*
|
||||||
|
`http://savannah.nongnu.org/bugs/?group=avrdude <http://savannah.nongnu.org/bugs/?group=avrdude>`_.
|
||||||
|
|
||||||
|
|
||||||
|
*
|
||||||
|
Problem: I'm using a serial programmer under Windows and get the following
|
||||||
|
error:
|
||||||
|
|
||||||
|
`avrdude: serial_open(): can't set attributes for device "com1"`,
|
||||||
|
|
||||||
|
Solution: This problem seems to appear with certain versions of Cygwin. Specifying
|
||||||
|
`"/dev/com1"` instead of `"com1"` should help.
|
||||||
|
|
||||||
|
*
|
||||||
|
Problem: I'm using Linux and my AVR910 programmer is really slow.
|
||||||
|
|
||||||
|
Solution (short): `setserial `port` low_latency`
|
||||||
|
|
||||||
|
Solution (long):
|
||||||
|
There are two problems here. First, the system may wait some time before it
|
||||||
|
passes data from the serial port to the program. Under Linux the following
|
||||||
|
command works around this (you may need root privileges for this).
|
||||||
|
|
||||||
|
`setserial `port` low_latency`
|
||||||
|
|
||||||
|
Secondly, the serial interface chip may delay the interrupt for some time.
|
||||||
|
This behaviour can be changed by setting the FIFO-threshold to one. Under Linux this
|
||||||
|
can only be done by changing the kernel source in `drivers/char/serial.c`.
|
||||||
|
Search the file for `UART_FCR_TRIGGER_8` and replace it with `UART_FCR_TRIGGER_1`. Note that overall performance might suffer if there
|
||||||
|
is high throughput on serial lines. Also note that you are modifying the kernel at
|
||||||
|
your own risk.
|
||||||
|
|
||||||
|
*
|
||||||
|
Problem: I'm not using Linux and my AVR910 programmer is really slow.
|
||||||
|
|
||||||
|
Solutions: The reasons for this are the same as above.
|
||||||
|
If you know how to work around this on your OS, please let us know.
|
||||||
|
|
||||||
|
*
|
||||||
|
Problem: Updating the flash ROM from terminal mode does not work with the
|
||||||
|
JTAG ICEs.
|
||||||
|
|
||||||
|
Solution: None at this time. Currently, the JTAG ICE code cannot
|
||||||
|
write to the flash ROM one byte at a time.
|
||||||
|
|
||||||
|
*
|
||||||
|
Problem: Page-mode programming the EEPROM (using the -U option) does
|
||||||
|
not erase EEPROM cells before writing, and thus cannot overwrite any
|
||||||
|
previous value != 0xff.
|
||||||
|
|
||||||
|
Solution: None. This is an inherent feature of the way JTAG EEPROM
|
||||||
|
programming works, and is documented that way in the Atmel AVR
|
||||||
|
datasheets.
|
||||||
|
In order to successfully program the EEPROM that way, a prior chip
|
||||||
|
erase (with the EESAVE fuse unprogrammed) is required.
|
||||||
|
This also applies to the STK500 and STK600 in high-voltage programming mode.
|
||||||
|
|
||||||
|
*
|
||||||
|
Problem: How do I turn off the `DWEN` fuse?
|
||||||
|
|
||||||
|
Solution: If the `DWEN` (debugWire enable) fuse is activated,
|
||||||
|
the `/RESET` pin is not functional anymore, so normal ISP
|
||||||
|
communication cannot be established.
|
||||||
|
There are two options to deactivate that fuse again: high-voltage
|
||||||
|
programming, or getting the JTAG ICE mkII talk debugWire, and
|
||||||
|
prepare the target AVR to accept normal ISP communication again.
|
||||||
|
|
||||||
|
The first option requires a programmer that is capable of high-voltage
|
||||||
|
programming (either serial or parallel, depending on the AVR device),
|
||||||
|
for example the STK500. In high-voltage programming mode, the
|
||||||
|
`/RESET` pin is activated initially using a 12 V pulse (thus the
|
||||||
|
name *high voltage*), so the target AVR can subsequently be
|
||||||
|
reprogrammed, and the `DWEN` fuse can be cleared. Typically, this
|
||||||
|
operation cannot be performed while the AVR is located in the target
|
||||||
|
circuit though.
|
||||||
|
|
||||||
|
The second option requires a JTAG ICE mkII that can talk the debugWire
|
||||||
|
protocol. The ICE needs to be connected to the target using the
|
||||||
|
JTAG-to-ISP adapter, so the JTAG ICE mkII can be used as a debugWire
|
||||||
|
initiator as well as an ISP programmer. AVRDUDE will then be activated
|
||||||
|
using the `jtag2isp` programmer type. The initial ISP
|
||||||
|
communication attempt will fail, but AVRDUDE then tries to initiate a
|
||||||
|
debugWire reset. When successful, this will leave the target AVR in a
|
||||||
|
state where it can accept standard ISP communication. The ICE is then
|
||||||
|
signed off (which will make it signing off from the USB as well), so
|
||||||
|
AVRDUDE has to be called again afterwards. This time, standard ISP
|
||||||
|
communication can work, so the `DWEN` fuse can be cleared.
|
||||||
|
|
||||||
|
The pin mapping for the JTAG-to-ISP adapter is:
|
||||||
|
|
||||||
|
@multitable @columnfractions .2 .2
|
||||||
|
* @strong{JTAG pin} @tab @strong{ISP pin}
|
||||||
|
* 1 @tab 3
|
||||||
|
* 2 @tab 6
|
||||||
|
* 3 @tab 1
|
||||||
|
* 4 @tab 2
|
||||||
|
* 6 @tab 5
|
||||||
|
* 9 @tab 4
|
||||||
|
@end multitable
|
||||||
|
|
||||||
|
*
|
||||||
|
Problem: Multiple USBasp or USBtinyISP programmers connected simultaneously are not
|
||||||
|
found.
|
||||||
|
|
||||||
|
Solution: The USBtinyISP code supports distinguishing multiple
|
||||||
|
programmers based on their bus:device connection tuple that describes
|
||||||
|
their place in the USB hierarchy on a specific host. This tuple can
|
||||||
|
be added to the `-P usb` option, similar to adding a serial number
|
||||||
|
on other USB-based programmers.
|
||||||
|
|
||||||
|
The actual naming convention for the bus and device names is
|
||||||
|
operating-system dependent; AVRDUDE will print out what it found
|
||||||
|
on the bus when running it with (at least) one `-v` option.
|
||||||
|
By specifying a string that cannot match any existing device
|
||||||
|
(for example, `-P usb:xxx`), the scan will list all possible
|
||||||
|
candidate devices found on the bus.
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
::
|
||||||
|
|
||||||
|
avrdude -c usbtiny -p atmega8 -P usb:003:025 (Linux)
|
||||||
|
avrdude -c usbtiny -p atmega8 -P usb:/dev/usb:/dev/ugen1.3 (FreeBSD 8+)
|
||||||
|
avrdude -c usbtiny -p atmega8 \\
|
||||||
|
-P usb:bus-0:\\\\.\\libusb0-0001--0x1781-0x0c9f (Windows)
|
||||||
|
|
||||||
|
|
||||||
|
*
|
||||||
|
Problem: I cannot do ... when the target is in debugWire mode.
|
||||||
|
|
||||||
|
Solution: debugWire mode imposes several limitations.
|
||||||
|
|
||||||
|
The debugWire protocol is Atmel's proprietary one-wire (plus ground)
|
||||||
|
protocol to allow an in-circuit emulation of the smaller AVR devices,
|
||||||
|
using the `/RESET` line.
|
||||||
|
DebugWire mode is initiated by activating the `DWEN`
|
||||||
|
fuse, and then power-cycling the target.
|
||||||
|
While this mode is mainly intended for debugging/emulation, it
|
||||||
|
also offers limited programming capabilities.
|
||||||
|
Effectively, the only memory areas that can be read or programmed
|
||||||
|
in this mode are flash ROM and EEPROM.
|
||||||
|
It is also possible to read out the signature.
|
||||||
|
All other memory areas cannot be accessed.
|
||||||
|
There is no
|
||||||
|
*chip erase*
|
||||||
|
functionality in debugWire mode; instead, while reprogramming the
|
||||||
|
flash ROM, each flash ROM page is erased right before updating it.
|
||||||
|
This is done transparently by the JTAG ICE mkII (or AVR Dragon).
|
||||||
|
The only way back from debugWire mode is to initiate a special
|
||||||
|
sequence of commands to the JTAG ICE mkII (or AVR Dragon), so the
|
||||||
|
debugWire mode will be temporarily disabled, and the target can
|
||||||
|
be accessed using normal ISP programming.
|
||||||
|
This sequence is automatically initiated by using the JTAG ICE mkII
|
||||||
|
or AVR Dragon in ISP mode, when they detect that ISP mode cannot be
|
||||||
|
entered.
|
||||||
|
|
||||||
|
*
|
||||||
|
Problem: I want to use my JTAG ICE mkII to program an
|
||||||
|
Xmega device through PDI. The documentation tells me to use the
|
||||||
|
*XMEGA PDI adapter for JTAGICE mkII* that is supposed to ship
|
||||||
|
with the kit, yet I don't have it.
|
||||||
|
|
||||||
|
Solution: Use the following pin mapping:
|
||||||
|
|
||||||
|
@multitable @columnfractions .2 .2 .2 .2
|
||||||
|
* @strong{JTAGICE} @tab @strong{Target} @tab @strong{Squid cab-} @tab @strong{PDI}
|
||||||
|
* @strong{mkII probe} @tab @strong{pins} @tab @strong{le colors} @tab @strong{header}
|
||||||
|
* 1 (TCK) @tab @tab Black @tab
|
||||||
|
* 2 (GND) @tab GND @tab White @tab 6
|
||||||
|
* 3 (TDO) @tab @tab Grey @tab
|
||||||
|
* 4 (VTref) @tab VTref @tab Purple @tab 2
|
||||||
|
* 5 (TMS) @tab @tab Blue @tab
|
||||||
|
* 6 (nSRST) @tab PDI_CLK @tab Green @tab 5
|
||||||
|
* 7 (N.C.) @tab @tab Yellow @tab
|
||||||
|
* 8 (nTRST) @tab @tab Orange @tab
|
||||||
|
* 9 (TDI) @tab PDI_DATA @tab Red @tab 1
|
||||||
|
* 10 (GND) @tab @tab Brown @tab
|
||||||
|
@end multitable
|
||||||
|
|
||||||
|
*
|
||||||
|
Problem: I want to use my AVR Dragon to program an
|
||||||
|
Xmega device through PDI.
|
||||||
|
|
||||||
|
Solution: Use the 6 pin ISP header on the Dragon and the following pin mapping:
|
||||||
|
|
||||||
|
@multitable @columnfractions .2 .2
|
||||||
|
* @strong{Dragon} @tab @strong{Target}
|
||||||
|
* @strong{ISP Header} @tab @strong{pins}
|
||||||
|
* 1 (MISO) @tab PDI_DATA
|
||||||
|
* 2 (VCC) @tab VCC
|
||||||
|
* 3 (SCK) @tab
|
||||||
|
* 4 (MOSI) @tab
|
||||||
|
* 5 (RESET) @tab PDI_CLK / RST
|
||||||
|
* 6 (GND) @tab GND
|
||||||
|
@end multitable
|
||||||
|
|
||||||
|
*
|
||||||
|
Problem: I want to use my AVRISP mkII to program an
|
||||||
|
ATtiny4/5/9/10 device through TPI. How to connect the pins?
|
||||||
|
|
||||||
|
Solution: Use the following pin mapping:
|
||||||
|
|
||||||
|
@multitable @columnfractions .2 .2 .2
|
||||||
|
* @strong{AVRISP} @tab @strong{Target} @tab @strong{ATtiny}
|
||||||
|
* @strong{connector} @tab @strong{pins} @tab @strong{pin #}
|
||||||
|
* 1 (MISO) @tab TPIDATA @tab 1
|
||||||
|
* 2 (VTref) @tab Vcc @tab 5
|
||||||
|
* 3 (SCK) @tab TPICLK @tab 3
|
||||||
|
* 4 (MOSI) @tab @tab
|
||||||
|
* 5 (RESET) @tab /RESET @tab 6
|
||||||
|
* 6 (GND) @tab GND @tab 2
|
||||||
|
@end multitable
|
||||||
|
|
||||||
|
*
|
||||||
|
Problem: I want to program an ATtiny4/5/9/10 device using a serial/parallel
|
||||||
|
bitbang programmer. How to connect the pins?
|
||||||
|
|
||||||
|
Solution: Since TPI has only 1 pin for bi-directional data transfer, both
|
||||||
|
`MISO` and `MOSI` pins should be connected to the `TPIDATA` pin
|
||||||
|
on the ATtiny device.
|
||||||
|
However, a 1K resistor should be placed between the `MOSI` and `TPIDATA`.
|
||||||
|
The `MISO` pin connects to `TPIDATA` directly.
|
||||||
|
The `SCK` pin is connected to `TPICLK`.
|
||||||
|
|
||||||
|
In addition, the `Vcc`, `/RESET` and `GND` pins should
|
||||||
|
be connected to their respective ports on the ATtiny device.
|
||||||
|
|
||||||
|
*
|
||||||
|
Problem: How can I use a FTDI FT232R USB-to-Serial device for bitbang programming?
|
||||||
|
|
||||||
|
Solution: When connecting the FT232 directly to the pins of the target Atmel device,
|
||||||
|
the polarity of the pins defined in the `programmer` definition should be
|
||||||
|
inverted by prefixing a tilde. For example, the `dasa` programmer would
|
||||||
|
look like this when connected via a FT232R device (notice the tildes in
|
||||||
|
front of pins 7, 4, 3 and 8):
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
programmer
|
||||||
|
id = "dasa_ftdi";
|
||||||
|
desc = "serial port banging, reset=rts sck=dtr mosi=txd miso=cts";
|
||||||
|
type = serbb;
|
||||||
|
reset = ~7;
|
||||||
|
sck = ~4;
|
||||||
|
mosi = ~3;
|
||||||
|
miso = ~8;
|
||||||
|
;
|
||||||
|
|
||||||
|
|
||||||
|
Note that this uses the FT232 device as a normal serial port, not using the
|
||||||
|
FTDI drivers in the special bitbang mode.
|
||||||
|
|
||||||
|
*
|
||||||
|
Problem: My ATtiny4/5/9/10 reads out fine, but any attempt to program
|
||||||
|
it (through TPI) fails. Instead, the memory retains the old contents.
|
||||||
|
|
||||||
|
Solution: Mind the limited programming supply voltage range of these
|
||||||
|
devices.
|
||||||
|
|
||||||
|
In-circuit programming through TPI is only guaranteed by the datasheet
|
||||||
|
at Vcc = 5 V.
|
||||||
|
|
||||||
|
*
|
||||||
|
Problem: My ATxmega...A1/A2/A3 cannot be programmed through PDI with
|
||||||
|
my AVR Dragon. Programming through a JTAG ICE mkII works though, as does
|
||||||
|
programming through JTAG.
|
||||||
|
|
||||||
|
Solution: None by this time (2010 Q1).
|
||||||
|
|
||||||
|
It is said that the AVR Dragon can only program devices from the A4
|
||||||
|
Xmega sub-family.
|
||||||
|
|
||||||
|
*
|
||||||
|
Problem: when programming with an AVRISPmkII or STK600, AVRDUDE hangs
|
||||||
|
when programming files of a certain size (e.g. 246 bytes). Other
|
||||||
|
(larger or smaller) sizes work though.
|
||||||
|
|
||||||
|
Solution: This is a bug caused by an incorrect handling of zero-length
|
||||||
|
packets (ZLPs) in some versions of the libusb 0.1 API wrapper that ships
|
||||||
|
with libusb 1.x in certain Linux distributions. All Linux systems with
|
||||||
|
kernel versions < 2.6.31 and libusb >= 1.0.0 < 1.0.3 are reported to be
|
||||||
|
affected by this.
|
||||||
|
|
||||||
|
See also: `http://www.libusb.org/ticket/6 <http://www.libusb.org/ticket/6>`_
|
||||||
|
|
||||||
|
*
|
||||||
|
Problem: after flashing a firmware that reduces the target's clock
|
||||||
|
speed (e.g. through the `CLKPR` register), further ISP connection
|
||||||
|
attempts fail.
|
||||||
|
|
||||||
|
Solution: Even though ISP starts with pulling `/RESET` low, the
|
||||||
|
target continues to run at the internal clock speed as defined by the
|
||||||
|
firmware running before. Therefore, the ISP clock speed must be
|
||||||
|
reduced appropriately (to less than 1/4 of the internal clock speed)
|
||||||
|
using the -B option before the ISP initialization sequence will
|
||||||
|
succeed.
|
||||||
|
|
||||||
|
As that slows down the entire subsequent ISP session, it might make
|
||||||
|
sense to just issue a *chip erase* using the slow ISP clock
|
||||||
|
(option `-e`), and then start a new session at higher speed.
|
||||||
|
Option `-D` might be used there, to prevent another unneeded
|
||||||
|
erase cycle.
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,35 @@
|
||||||
|
# Configuration file for the Sphinx documentation builder.
|
||||||
|
|
||||||
|
# -- Project information
|
||||||
|
|
||||||
|
project = 'AVRDUDE'
|
||||||
|
copyright = 'The AVRDUDE authors'
|
||||||
|
author = '2003-2005 Brian Dean, 2006-2022 Jörg Wunsch'
|
||||||
|
|
||||||
|
release = '0.1'
|
||||||
|
version = '0.1.0'
|
||||||
|
|
||||||
|
# -- General configuration
|
||||||
|
|
||||||
|
extensions = [
|
||||||
|
'sphinx.ext.duration',
|
||||||
|
'sphinx.ext.doctest',
|
||||||
|
'sphinx.ext.autodoc',
|
||||||
|
'sphinx.ext.autosummary',
|
||||||
|
'sphinx.ext.intersphinx',
|
||||||
|
]
|
||||||
|
|
||||||
|
intersphinx_mapping = {
|
||||||
|
'python': ('https://docs.python.org/3/', None),
|
||||||
|
'sphinx': ('https://www.sphinx-doc.org/en/master/', None),
|
||||||
|
}
|
||||||
|
intersphinx_disabled_domains = ['std']
|
||||||
|
|
||||||
|
templates_path = ['_templates']
|
||||||
|
|
||||||
|
# -- Options for HTML output
|
||||||
|
|
||||||
|
html_theme = 'sphinx_rtd_theme'
|
||||||
|
|
||||||
|
# -- Options for EPUB output
|
||||||
|
epub_show_urls = 'footnote'
|
|
@ -0,0 +1,27 @@
|
||||||
|
AVRDUDE
|
||||||
|
=======
|
||||||
|
|
||||||
|
This file documents the avrdude program for downloading/uploading
|
||||||
|
programs to Microchip AVR microcontrollers.
|
||||||
|
|
||||||
|
For avrdude version 6.99-20211218, 6 January 2022.
|
||||||
|
|
||||||
|
Send comments on AVRDUDE to avrdude-dev@nongnu.org.
|
||||||
|
|
||||||
|
Use https://github.com/avrdudes/avrdude/issues to report bugs.
|
||||||
|
|
||||||
|
Copyright (C) 2003,2005 Brian S. Dean
|
||||||
|
|
||||||
|
Copyright (C) 2006 Jörg Wunsch
|
||||||
|
|
||||||
|
.. toctree::
|
||||||
|
:numbered:
|
||||||
|
:maxdepth: 3
|
||||||
|
|
||||||
|
1-Introduction
|
||||||
|
2-Command_Line_Options
|
||||||
|
3-Terminal_Mode_Operation
|
||||||
|
4-Configuration_File
|
||||||
|
5-Programmer_Specific_Information
|
||||||
|
6-Platform_Dependent_Information
|
||||||
|
7-Troubleshooting
|
Loading…
Reference in New Issue