Submitted by Doug Springer, based on work by
Wolfgang Moser, Ville Voipio, Hannes Weisbach patch #7486: Patch to add FT2232C/D, FT2232H, FT4232H, usbvid, usbpid, usbdev for USB support - Based on #7062 * avrftdi.c: New file. * avrftdi.h: (Ditto.) * configure.ac: Add check for libftdi. * config_gram.y: Add AVRFTDI and per-programmer USB string keywords. * lexer.l: (Ditto.) * avrdude.conf.in: Add avrftdi and 2232HIO programmers. * pgm.h: Add USB parameters. * Makefile.am: Add avrftdi.c and avrftdi.h. * AUTHORS: Mention the new authors. * avrdude.1: Document the changes. git-svn-id: svn://svn.savannah.nongnu.org/avrdude/trunk/avrdude@979 81a1dc3b-b13d-400b-aceb-764788c761c2
This commit is contained in:
parent
d74d9e647e
commit
46c7bf38ec
5
AUTHORS
5
AUTHORS
|
@ -16,6 +16,9 @@ Contributors:
|
|||
David Hoerl <dhoerl@mac.com>
|
||||
Michal Ludvig <mludvig@logix.net.nz>
|
||||
Darell Tan <darell.tan@gmail.com>
|
||||
|
||||
Wolfgang Moser
|
||||
Ville Voipio
|
||||
Hannes Weisbach
|
||||
Doug Springer
|
||||
For minor contributions, please see the ChangeLog files.
|
||||
|
||||
|
|
19
ChangeLog
19
ChangeLog
|
@ -1,3 +1,22 @@
|
|||
2011-08-25 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||
|
||||
Submitted by Doug Springer, based on work by
|
||||
Wolfgang Moser, Ville Voipio, Hannes Weisbach
|
||||
patch #7486: Patch to add FT2232C/D, FT2232H, FT4232H,
|
||||
usbvid, usbpid, usbdev for USB support - Based on #7062
|
||||
* avrftdi.c: New file.
|
||||
* avrftdi.h: (Ditto.)
|
||||
* configure.ac: Add check for libftdi.
|
||||
* config_gram.y: Add AVRFTDI and per-programmer USB string
|
||||
keywords.
|
||||
* lexer.l: (Ditto.)
|
||||
* avrdude.conf.in: Add avrftdi and 2232HIO programmers.
|
||||
* pgm.h: Add USB parameters.
|
||||
* Makefile.am: Add avrftdi.c and avrftdi.h.
|
||||
* AUTHORS: Mention the new authors.
|
||||
* avrdude.1: Document the changes.
|
||||
* doc/avrdude.texi: (Ditto.)
|
||||
|
||||
2011-08-23 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||
|
||||
bug #29585: Fix license
|
||||
|
|
|
@ -56,7 +56,7 @@ avrdude_CFLAGS = @ENABLE_WARNINGS@
|
|||
|
||||
libavrdude_a_CFLAGS = @ENABLE_WARNINGS@
|
||||
|
||||
avrdude_LDADD = $(top_builddir)/$(noinst_LIBRARIES) @LIBUSB@ @LIBUSB_1_0@ @LIBHID@ -lm
|
||||
avrdude_LDADD = $(top_builddir)/$(noinst_LIBRARIES) @LIBUSB@ @LIBUSB_1_0@ @LIBFTDI@ @LIBHID@ -lm
|
||||
|
||||
bin_PROGRAMS = avrdude
|
||||
|
||||
|
@ -87,6 +87,8 @@ libavrdude_a_SOURCES = \
|
|||
avr910.c \
|
||||
avr910.h \
|
||||
avrdude.h \
|
||||
avrftdi.c \
|
||||
avrftdi.h \
|
||||
avrpart.c \
|
||||
avrpart.h \
|
||||
bitbang.c \
|
||||
|
|
1
NEWS
1
NEWS
|
@ -15,6 +15,7 @@ Current:
|
|||
* New programmers supported:
|
||||
- TPI programming through bitbang programmers (both, serial
|
||||
and parallel ones)
|
||||
- FT2232 (and relatives) based programmers (MPSSE bitbang mode)
|
||||
|
||||
* Bugfixes
|
||||
|
||||
|
|
17
avrdude.1
17
avrdude.1
|
@ -148,11 +148,16 @@ 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).
|
||||
.Pp
|
||||
The USBasp ISP and USBtinyISP adapters are also supported, provided
|
||||
The avrftdi, USBasp ISP and USBtinyISP adapters are also supported, provided
|
||||
.Nm avrdude
|
||||
has been compiled with libusb support.
|
||||
They both feature simple firmware-only USB implementations, running on
|
||||
an ATmega8 (or ATmega88), or ATtiny2313, respectively.
|
||||
USBasp ISP and USBtinyISP both feature simple firmware-only USB implementations,
|
||||
running on an ATmega8 (or ATmega88), or ATtiny2313, respectively. If libftdi has
|
||||
has been compiled in
|
||||
.Nm avrdude ,
|
||||
the avrftdi device adds support for many programmers using FTDI's 2232C/D/H
|
||||
and 4232H parts running in MPSSE mode, which hard-codes (in the chip)
|
||||
SCK to bit 1, MOSI to bit 2, and MISO to bit 3. Reset is usually bit 4.
|
||||
.Pp
|
||||
Input files can be provided, and output files can be written in
|
||||
different file formats, such as raw binary files containing the data
|
||||
|
@ -1041,3 +1046,9 @@ This also applies to the STK500 and STK600 in parallel programming mode.
|
|||
The USBasp and USBtinyISP drivers do not offer any option to distinguish multiple
|
||||
devices connected simultaneously, so effectively only a single device
|
||||
is supported.
|
||||
.Pp
|
||||
The avrftdi driver allows to select specific devices using any combination of vid,pid
|
||||
serial number (usbsn) vendor description (usbvendoror part description (usbproduct)
|
||||
as seen with lsusb or whatever tool used to view USB device information. Multiple
|
||||
devices can be on the bus at the same time. For the H parts, which have multiple MPSSE
|
||||
interfaces, the interface can also be selected. It defaults to interface 'A'.
|
||||
|
|
|
@ -32,6 +32,14 @@
|
|||
# rdyled = <num> ; # pin number
|
||||
# pgmled = <num> ; # pin number
|
||||
# vfyled = <num> ; # pin number
|
||||
# usbvid = <hexnum>; # USB VID (Vendor ID)
|
||||
# usbpid = <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
|
||||
#
|
||||
# To invert a bit, use = ~ <num>, the spaces are important.
|
||||
# ;
|
||||
#
|
||||
# part
|
||||
|
@ -319,6 +327,73 @@ programmer
|
|||
desc = "Arduino";
|
||||
type = arduino;
|
||||
;
|
||||
# this will interface with the chips on these programmers:
|
||||
#
|
||||
# http://real.kiev.ua/old/avreal/en/adapters
|
||||
# http://www.amontec.com/jtagkey.shtml, jtagkey-tiny.shtml
|
||||
# http://www.olimex.com/dev/arm-usb-ocd.html, arm-usb-tiny.html
|
||||
# http://www.ethernut.de/en/hardware/turtelizer/index.html
|
||||
# http://elk.informatik.fh-augsburg.de/hhweb/doc/openocd/usbjtag/usbjtag.html
|
||||
# http://dangerousprototypes.com/docs/FT2232_breakout_board
|
||||
# http://www.ftdichip.com/Products/Modules/DLPModules.htm,DLP-2232*,DLP-USB1232H
|
||||
# http://flashrom.org/FT2232SPI_Programmer
|
||||
#
|
||||
# The drivers will look for a specific device and use the first one found.
|
||||
# If you have mulitple devices, then look for unique information (like SN)
|
||||
# And fill that in here.
|
||||
|
||||
programmer
|
||||
id = "avrftdi";
|
||||
desc = "FT2232D based generic programmer";
|
||||
type = avrftdi;
|
||||
usbvid = 0x0403;
|
||||
usbpid = 0x6010;
|
||||
usbvendor = "";
|
||||
usbproduct = "";
|
||||
usbdev = "A";
|
||||
usbsn = "";
|
||||
#ISP-signals - lower ACBUS-Nibble (default)
|
||||
reset = 4;
|
||||
sck = 1;
|
||||
mosi = 2;
|
||||
miso = 3;
|
||||
#LED SIGNALs - higher ACBUS-Nibble
|
||||
# errled = 5;
|
||||
# rdyled = 6;
|
||||
# pgmled = 7;
|
||||
# vfyled = 8;
|
||||
#Buffer Signal - ADBUS - Nibble
|
||||
# buff = 9;
|
||||
;
|
||||
# This is an implementation of the above with a buffer IC (74AC244) and
|
||||
# 4 LEDs directly attached, active low. The buff and reset pins are
|
||||
# understood (by avrdude) to be active low, so there's no
|
||||
# need to invert the bits.
|
||||
programmer
|
||||
id = "2232HIO";
|
||||
desc = "FT2232H based generic programmer";
|
||||
type = avrftdi;
|
||||
usbvid = 0x0403;
|
||||
# Note: This PID is reserved for generic H devices and
|
||||
# should be programmed into the EEPROM
|
||||
# usbpid = 0x8A48;
|
||||
usbpid = 0x6010;
|
||||
usbdev = "A";
|
||||
usbvendor = "";
|
||||
usbproduct = "";
|
||||
usbsn = "";
|
||||
#ISP-signals
|
||||
reset = 4;
|
||||
sck = 1;
|
||||
mosi = 2;
|
||||
miso = 3;
|
||||
buff = 5;
|
||||
#LED SIGNALs
|
||||
errled = ~ 12;
|
||||
rdyled = ~ 15;
|
||||
pgmled = ~ 14;
|
||||
vfyled = ~ 13;
|
||||
;
|
||||
|
||||
programmer
|
||||
id = "avrisp";
|
||||
|
|
|
@ -0,0 +1,56 @@
|
|||
/*
|
||||
* avrftdi - extension for avrdude, Wolfgang Moser, Ville Voipio
|
||||
* Copyright (C) 2011 Hannes Weisbach, Doug Springer
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
/* $Id$ */
|
||||
|
||||
#ifndef avrftdi_h
|
||||
#define avrfdti_h
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define SCK 0x01
|
||||
#define SDO 0x02
|
||||
#define SDI 0x04
|
||||
|
||||
#define RX 0x20
|
||||
#define TX 0x11
|
||||
|
||||
#define TRX (RX | TX)
|
||||
|
||||
#define TYPE_C_D 0x500
|
||||
#define TYPE_H 0x700
|
||||
#define TYPE_4H 0x800
|
||||
|
||||
#define E(x) if ((x)) { fprintf(stdout, "%s:%d %s() %s: %s (%d)\n\t%s\n", __FILE__, __LINE__, __FUNCTION__, \
|
||||
#x, strerror(errno), errno, ftdi_get_error_string(&ftdic)); return -1; }
|
||||
|
||||
#define E_VOID(x) if ((x)) { fprintf(stdout, "%s:%d %s() %s: %s (%d)\n\t%s\n", __FILE__, __LINE__, __FUNCTION__, \
|
||||
#x, strerror(errno), errno, ftdi_get_error_string(&ftdic)); }
|
||||
|
||||
void avrftdi_initpgm (PROGRAMMER * pgm);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
|
|
@ -48,6 +48,7 @@
|
|||
#include "avr.h"
|
||||
#include "jtagmkI.h"
|
||||
#include "jtagmkII.h"
|
||||
#include "avrftdi.h"
|
||||
|
||||
#if defined(WIN32NATIVE)
|
||||
#define strtok_r( _s, _sep, _lasts ) \
|
||||
|
@ -82,6 +83,7 @@ static int parse_cmdbits(OPCODE * op);
|
|||
%token K_PAGED
|
||||
|
||||
%token K_ARDUINO
|
||||
%token K_AVRFTDI
|
||||
%token K_BAUDRATE
|
||||
%token K_BS2
|
||||
%token K_BUFF
|
||||
|
@ -149,7 +151,13 @@ static int parse_cmdbits(OPCODE * op);
|
|||
%token K_STK600PP
|
||||
%token K_AVR910
|
||||
%token K_USBASP
|
||||
%token K_USBDEV
|
||||
%token K_USBSN
|
||||
%token K_USBTINY
|
||||
%token K_USBPID
|
||||
%token K_USBPRODUCT
|
||||
%token K_USBVENDOR
|
||||
%token K_USBVID
|
||||
%token K_BUTTERFLY
|
||||
%token K_TYPE
|
||||
%token K_VCC
|
||||
|
@ -432,6 +440,12 @@ prog_parm :
|
|||
}
|
||||
} |
|
||||
|
||||
K_TYPE TKN_EQUAL K_AVRFTDI {
|
||||
{
|
||||
avrftdi_initpgm(current_prog);
|
||||
}
|
||||
} |
|
||||
|
||||
K_TYPE TKN_EQUAL K_BUSPIRATE {
|
||||
{
|
||||
buspirate_initpgm(current_prog);
|
||||
|
@ -590,7 +604,49 @@ prog_parm :
|
|||
}
|
||||
}
|
||||
} |
|
||||
K_USBDEV TKN_EQUAL TKN_STRING {
|
||||
{
|
||||
strncpy(current_prog->usbdev, $3->value.string, PGM_USBSTRINGLEN);
|
||||
current_prog->usbdev[PGM_USBSTRINGLEN-1] = 0;
|
||||
free_token($3);
|
||||
}
|
||||
} |
|
||||
K_USBVID TKN_EQUAL TKN_NUMBER {
|
||||
{
|
||||
current_prog->usbvid = $3->value.number;
|
||||
}
|
||||
} |
|
||||
|
||||
K_USBPID TKN_EQUAL TKN_NUMBER {
|
||||
{
|
||||
current_prog->usbpid = $3->value.number;
|
||||
}
|
||||
} |
|
||||
|
||||
K_USBSN TKN_EQUAL TKN_STRING {
|
||||
{
|
||||
strncpy(current_prog->usbsn, $3->value.string, PGM_USBSTRINGLEN);
|
||||
current_prog->usbsn[PGM_USBSTRINGLEN-1] = 0;
|
||||
free_token($3);
|
||||
}
|
||||
} |
|
||||
|
||||
K_USBVENDOR TKN_EQUAL TKN_STRING {
|
||||
{
|
||||
strncpy(current_prog->usbvendor, $3->value.string, PGM_USBSTRINGLEN);
|
||||
current_prog->usbvendor[PGM_USBSTRINGLEN-1] = 0;
|
||||
free_token($3);
|
||||
}
|
||||
} |
|
||||
|
||||
K_USBPRODUCT TKN_EQUAL TKN_STRING {
|
||||
{
|
||||
strncpy(current_prog->usbproduct, $3->value.string, PGM_USBSTRINGLEN);
|
||||
current_prog->usbproduct[PGM_USBSTRINGLEN-1] = 0;
|
||||
free_token($3);
|
||||
}
|
||||
} |
|
||||
|
||||
K_BAUDRATE TKN_EQUAL TKN_NUMBER {
|
||||
{
|
||||
current_prog->baudrate = $3->value.number;
|
||||
|
|
|
@ -83,7 +83,14 @@ if test x$have_libusb_1_0 = xyes; then
|
|||
AC_CHECK_HEADERS([libusb.h])
|
||||
fi
|
||||
AC_SUBST(LIBUSB_1_0, $LIBUSB_1_0)
|
||||
|
||||
AH_TEMPLATE([HAVE_LIBFTDI],
|
||||
[Define if FTDI support is enabled via libftdi])
|
||||
AC_CHECK_LIB([ftdi], [ftdi_init], [have_libftdi=yes])
|
||||
if test x$have_libftdi = xyes; then
|
||||
LIBFTDI="-lftdi"
|
||||
AC_DEFINE([HAVE_LIBFTDI])
|
||||
fi
|
||||
AC_SUBST(LIBFTDI, $LIBFTDI)
|
||||
# Checks for header files.
|
||||
AC_CHECK_HEADERS([limits.h stdlib.h string.h])
|
||||
AC_CHECK_HEADERS([fcntl.h sys/ioctl.h sys/time.h termios.h unistd.h])
|
||||
|
|
|
@ -169,9 +169,14 @@ emulated on top of USB is likely to not work at all, or to work
|
|||
abysmally slow.
|
||||
|
||||
The STK500, JTAG ICE, avr910, and avr109/butterfly use the serial port to communicate with the PC.
|
||||
The STK600, JTAG ICE mkII, AVRISP mkII, USBasp, and USBtinyISP
|
||||
The STK600, JTAG ICE mkII, AVRISP mkII, USBasp, avrftdi (and derivitives), and USBtinyISP
|
||||
programmers communicate through the USB, using @code{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
|
||||
|
|
7
lexer.l
7
lexer.l
|
@ -120,6 +120,7 @@ allowfullpagebitstream { yylval=NULL; return K_ALLOWFULLPAGEBITSTREAM; }
|
|||
arduino { yylval=NULL; return K_ARDUINO; }
|
||||
avr910 { yylval=NULL; return K_AVR910; }
|
||||
avr910_devcode { yylval=NULL; return K_AVR910_DEVCODE; }
|
||||
avrftdi { yylval=NULL; return K_AVRFTDI; }
|
||||
usbasp { yylval=NULL; return K_USBASP; }
|
||||
usbtiny { yylval=NULL; return K_USBTINY; }
|
||||
bank_size { yylval=NULL; return K_PAGE_SIZE; }
|
||||
|
@ -197,6 +198,12 @@ stk600 { yylval=NULL; return K_STK600; }
|
|||
stk600hvsp { yylval=NULL; return K_STK600HVSP; }
|
||||
stk600pp { yylval=NULL; return K_STK600PP; }
|
||||
type { yylval=NULL; return K_TYPE; }
|
||||
usbdev { yylval=NULL; return K_USBDEV; }
|
||||
usbpid { yylval=NULL; return K_USBPID; }
|
||||
usbproduct { yylval=NULL; return K_USBPRODUCT; }
|
||||
usbsn { yylval=NULL; return K_USBSN; }
|
||||
usbvendor { yylval=NULL; return K_USBVENDOR; }
|
||||
usbvid { yylval=NULL; return K_USBVID; }
|
||||
vcc { yylval=NULL; return K_VCC; }
|
||||
vfyled { yylval=NULL; return K_VFYLED; }
|
||||
|
||||
|
|
4
pgm.h
4
pgm.h
|
@ -36,6 +36,7 @@
|
|||
#define PGM_DESCLEN 80
|
||||
#define PGM_PORTLEN PATH_MAX
|
||||
#define PGM_TYPELEN 32
|
||||
#define PGM_USBSTRINGLEN 256
|
||||
|
||||
typedef enum {
|
||||
EXIT_VCC_UNSPEC,
|
||||
|
@ -60,6 +61,9 @@ typedef struct programmer_t {
|
|||
int ppidata;
|
||||
int ppictrl;
|
||||
int baudrate;
|
||||
int usbvid, usbpid;
|
||||
char usbdev[PGM_USBSTRINGLEN], usbsn[PGM_USBSTRINGLEN];
|
||||
char usbvendor[PGM_USBSTRINGLEN], usbproduct[PGM_USBSTRINGLEN];
|
||||
double bitclock; /* JTAG ICE clock period in microseconds */
|
||||
int ispdelay; /* ISP clock delay */
|
||||
union filedescriptor fd;
|
||||
|
|
Loading…
Reference in New Issue