[55055] trunk/dports/cross/avrdude/files
snc at macports.org
snc at macports.org
Thu Aug 6 05:01:16 PDT 2009
Revision: 55055
http://trac.macports.org/changeset/55055
Author: snc at macports.org
Date: 2009-08-06 05:01:16 -0700 (Thu, 06 Aug 2009)
Log Message:
-----------
add patches from ticket #20526
Added Paths:
-----------
trunk/dports/cross/avrdude/files/patch-Makefile.in.diff
trunk/dports/cross/avrdude/files/patch-avr910.c.diff
trunk/dports/cross/avrdude/files/patch-avrdude.conf.in.diff
trunk/dports/cross/avrdude/files/patch-config_gram.y.diff
trunk/dports/cross/avrdude/files/patch-ft245r.c.diff
trunk/dports/cross/avrdude/files/patch-ft245r.h.diff
trunk/dports/cross/avrdude/files/patch-lexer.l.diff
trunk/dports/cross/avrdude/files/patch-serjtag.c.diff
trunk/dports/cross/avrdude/files/patch-serjtag.h.diff
Added: trunk/dports/cross/avrdude/files/patch-Makefile.in.diff
===================================================================
--- trunk/dports/cross/avrdude/files/patch-Makefile.in.diff (rev 0)
+++ trunk/dports/cross/avrdude/files/patch-Makefile.in.diff 2009-08-06 12:01:16 UTC (rev 55055)
@@ -0,0 +1,65 @@
+--- Makefile.in.orig 2009-07-11 00:52:12.000000000 +0200
++++ Makefile.in 2009-08-02 22:25:27.000000000 +0200
+@@ -82,6 +82,7 @@
+ libavrdude_a_LIBADD =
+ am_libavrdude_a_OBJECTS = libavrdude_a-config_gram.$(OBJEXT) \
+ libavrdude_a-lexer.$(OBJEXT) libavrdude_a-arduino.$(OBJEXT) \
++ libavrdude_a-serjtag.$(OBJEXT) libavrdude_a-ft245r.$(OBJEXT) \
+ libavrdude_a-avr.$(OBJEXT) libavrdude_a-avr910.$(OBJEXT) \
+ libavrdude_a-avrpart.$(OBJEXT) libavrdude_a-bitbang.$(OBJEXT) \
+ libavrdude_a-butterfly.$(OBJEXT) libavrdude_a-config.$(OBJEXT) \
+@@ -307,6 +308,10 @@
+ avrdude.h \
+ avrpart.c \
+ avrpart.h \
++ serjtag.c \
++ serjtag.h \
++ ft245r.c \
++ ft245r.h \
+ bitbang.c \
+ bitbang.h \
+ butterfly.c \
+@@ -482,6 +487,8 @@
+ @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libavrdude_a-avr.Po at am__quote@
+ @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libavrdude_a-avr910.Po at am__quote@
+ @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libavrdude_a-avrpart.Po at am__quote@
++ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/avrdude-serjtag.Po at am__quote@
++ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/avrdude-ft245r.Po at am__quote@
+ @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libavrdude_a-bitbang.Po at am__quote@
+ @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libavrdude_a-butterfly.Po at am__quote@
+ @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libavrdude_a-config.Po at am__quote@
+@@ -609,6 +616,34 @@
+ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libavrdude_a_CPPFLAGS) $(CPPFLAGS) $(libavrdude_a_CFLAGS) $(CFLAGS) -c -o libavrdude_a-avrpart.obj `if test -f 'avrpart.c'; then $(CYGPATH_W) 'avrpart.c'; else $(CYGPATH_W) '$(srcdir)/avrpart.c'; fi`
+
++libavrdude_a-serjtag.o: serjtag.c
++ at am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libavrdude_a_CPPFLAGS) $(CPPFLAGS) $(libavrdude_a_CFLAGS) $(CFLAGS) -MT libavrdude_a-serjtag.o -MD -MP -MF "$(DEPDIR)/libavrdude_a-serjtag.Tpo" -c -o libavrdude_a-serjtag.o `test -f 'serjtag.c' || echo '$(srcdir)/'`serjtag.c; \
++ at am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libavrdude_a-serjtag.Tpo" "$(DEPDIR)/libavrdude_a-serjtag.Po"; else rm -f "$(DEPDIR)/libavrdude_a-serjtag.Tpo"; exit 1; fi
++ at AMDEP_TRUE@@am__fastdepCC_FALSE@ source='serjtag.c' object='libavrdude_a-serjtag.o' libtool=no @AMDEPBACKSLASH@
++ at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
++ at am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libavrdude_a_CPPFLAGS) $(CPPFLAGS) $(libavrdude_a_CFLAGS) $(CFLAGS) -c -o libavrdude_a-serjtag.o `test -f 'serjtag.c' || echo '$(srcdir)/'`serjtag.c
++
++libavrdude_a-serjtag.obj: serjtag.c
++ at am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libavrdude_a_CPPFLAGS) $(CPPFLAGS) $(libavrdude_a_CFLAGS) $(CFLAGS) -MT libavrdude_a-serjtag.obj -MD -MP -MF "$(DEPDIR)/libavrdude_a-serjtag.Tpo" -c -o libavrdude_a-serjtag.obj `if test -f 'serjtag.c'; then $(CYGPATH_W) 'serjtag.c'; else $(CYGPATH_W) '$(srcdir)/serjtag.c'; fi`; \
++ at am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libavrdude_a-serjtag.Tpo" "$(DEPDIR)/libavrdude_a-serjtag.Po"; else rm -f "$(DEPDIR)/libavrdude_a-serjtag.Tpo"; exit 1; fi
++ at AMDEP_TRUE@@am__fastdepCC_FALSE@ source='serjtag.c' object='libavrdude_a-serjtag.obj' libtool=no @AMDEPBACKSLASH@
++ at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
++ at am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libavrdude_a_CPPFLAGS) $(CPPFLAGS) $(libavrdude_a_CFLAGS) $(CFLAGS) -c -o libavrdude_a-serjtag.obj `if test -f 'serjtag.c'; then $(CYGPATH_W) 'serjtag.c'; else $(CYGPATH_W) '$(srcdir)/serjtag.c'; fi`
++
++libavrdude_a-ft245r.o: ft245r.c
++ at am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libavrdude_a_CPPFLAGS) $(CPPFLAGS) $(libavrdude_a_CFLAGS) $(CFLAGS) -MT libavrdude_a-ft245r.o -MD -MP -MF "$(DEPDIR)/libavrdude_a-ft245r.Tpo" -c -o libavrdude_a-ft245r.o `test -f 'ft245r.c' || echo '$(srcdir)/'`ft245r.c; \
++ at am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libavrdude_a-ft245r.Tpo" "$(DEPDIR)/libavrdude_a-ft245r.Po"; else rm -f "$(DEPDIR)/libavrdude_a-ft245r.Tpo"; exit 1; fi
++ at AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ft245r.c' object='libavrdude_a-ft245r.o' libtool=no @AMDEPBACKSLASH@
++ at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
++ at am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libavrdude_a_CPPFLAGS) $(CPPFLAGS) $(libavrdude_a_CFLAGS) $(CFLAGS) -c -o libavrdude_a-ft245r.o `test -f 'ft245r.c' || echo '$(srcdir)/'`ft245r.c
++
++libavrdude_a-ft245r.obj: ft245r.c
++ at am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libavrdude_a_CPPFLAGS) $(CPPFLAGS) $(libavrdude_a_CFLAGS) $(CFLAGS) -MT libavrdude_a-ft245r.obj -MD -MP -MF "$(DEPDIR)/libavrdude_a-ft245r.Tpo" -c -o libavrdude_a-ft245r.obj `if test -f 'ft245r.c'; then $(CYGPATH_W) 'ft245r.c'; else $(CYGPATH_W) '$(srcdir)/ft245r.c'; fi`; \
++ at am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libavrdude_a-ft245r.Tpo" "$(DEPDIR)/libavrdude_a-ft245r.Po"; else rm -f "$(DEPDIR)/libavrdude_a-ft245r.Tpo"; exit 1; fi
++ at AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ft245r.c' object='libavrdude_a-ft245r.obj' libtool=no @AMDEPBACKSLASH@
++ at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
++ at am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libavrdude_a_CPPFLAGS) $(CPPFLAGS) $(libavrdude_a_CFLAGS) $(CFLAGS) -c -o libavrdude_a-ft245r.obj `if test -f 'ft245r.c'; then $(CYGPATH_W) 'ft245r.c'; else $(CYGPATH_W) '$(srcdir)/ft245r.c'; fi`
++
+ libavrdude_a-bitbang.o: bitbang.c
+ @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libavrdude_a_CPPFLAGS) $(CPPFLAGS) $(libavrdude_a_CFLAGS) $(CFLAGS) -MT libavrdude_a-bitbang.o -MD -MP -MF $(DEPDIR)/libavrdude_a-bitbang.Tpo -c -o libavrdude_a-bitbang.o `test -f 'bitbang.c' || echo '$(srcdir)/'`bitbang.c
+ @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/libavrdude_a-bitbang.Tpo $(DEPDIR)/libavrdude_a-bitbang.Po
Added: trunk/dports/cross/avrdude/files/patch-avr910.c.diff
===================================================================
--- trunk/dports/cross/avrdude/files/patch-avr910.c.diff (rev 0)
+++ trunk/dports/cross/avrdude/files/patch-avr910.c.diff 2009-08-06 12:01:16 UTC (rev 55055)
@@ -0,0 +1,186 @@
+--- avr910.c.orig 2009-03-06 21:09:11.000000000 +0100
++++ avr910.c 2009-08-02 22:43:51.000000000 +0200
+@@ -55,6 +55,10 @@
+ unsigned char use_blockmode;
+ };
+
++static char is_usb = 0;
++#define READ_SIZE 64
++static unsigned char extra_buf[1024+7];
++
+ #define PDATA(pgm) ((struct pdata *)(pgm->cookie))
+
+ static void avr910_setup(PROGRAMMER * pgm)
+@@ -154,6 +158,7 @@
+ return -1;
+ }
+
++static int can_cmd = 0;
+
+ /*
+ * initialize the AVR device and prepare it to accept commands
+@@ -175,11 +180,15 @@
+ avr910_send(pgm, "S", 1);
+ memset (id, 0, sizeof(id));
+ avr910_recv(pgm, id, sizeof(id)-1);
++ is_usb = !strncmp(id, "USB910",6);
+
+ /* Get the HW and SW versions to see if the programmer is present. */
+
+ avr910_send(pgm, "V", 1);
+ avr910_recv(pgm, sw, sizeof(sw));
++ if (sw[0] == '2') {
++ can_cmd = 1;
++ }
+
+ avr910_send(pgm, "v", 1);
+ avr910_recv(pgm, hw, sizeof(hw));
+@@ -304,7 +313,7 @@
+ {
+ char buf[5];
+
+- /* FIXME: Insert version check here */
++ if (!can_cmd) return -1;
+
+ buf[0] = '.'; /* New Universal Command */
+ buf[1] = cmd[0];
+@@ -320,7 +329,7 @@
+ res[2] = cmd[1];
+ res[3] = buf[0];
+
+- return 0;
++ return (buf[1] == 'Y')?0:-1;
+ }
+
+
+@@ -518,35 +527,54 @@
+ avr910_set_addr(pgm, addr>>1);
+
+ while (addr < max_addr) {
+- page_wr_cmd_pending = 1;
+- buf[0] = cmd[addr & 0x01];
+- buf[1] = m->buf[addr];
+- avr910_send(pgm, buf, sizeof(buf));
+- avr910_vfy_cmd_sent(pgm, "write byte");
++ if (is_usb && m->paged) {
++ int i;
++ int idx = 0;
++ extra_buf[idx++] = 'A';
++ extra_buf[idx++] = (addr>>(8+1)) & 0xff;
++ extra_buf[idx++] = (addr>>1) & 0xff;
++ for (i=0; i< page_size; i++) {
++ extra_buf[idx++] = cmd[(addr+i)&0x01];
++ extra_buf[idx++] = (addr + i >= max_addr)?0xff:m->buf[addr+i];
++ }
++ extra_buf[idx++] = 'A';
++ extra_buf[idx++] = (addr>>(8+1)) & 0xff;
++ extra_buf[idx++] = (addr>>1) & 0xff;
++ extra_buf[idx++] = 'm';
++ avr910_send(pgm, extra_buf, idx);
++ avr910_recv(pgm, extra_buf, 3 + page_size);
++ addr += page_size;
++ usleep(m->max_write_delay);
++ } else {
++ page_wr_cmd_pending = 1;
++ buf[0] = cmd[addr & 0x01];
++ buf[1] = m->buf[addr];
++ avr910_send(pgm, buf, sizeof(buf));
++ avr910_vfy_cmd_sent(pgm, "write byte");
+
+- addr++;
+- page_bytes--;
++ addr++;
++ page_bytes--;
+
+- if (m->paged && (page_bytes == 0)) {
+- /* Send the "Issue Page Write" if we have sent a whole page. */
++ if (m->paged && (page_bytes == 0)) {
++ /* Send the "Issue Page Write" if we have sent a whole page. */
+
+- avr910_set_addr(pgm, page_addr>>1);
+- avr910_send(pgm, "m", 1);
+- avr910_vfy_cmd_sent(pgm, "flush page");
++ avr910_set_addr(pgm, page_addr>>1);
++ avr910_send(pgm, "m", 1);
++ avr910_vfy_cmd_sent(pgm, "flush page");
+
+- page_wr_cmd_pending = 0;
+- usleep(m->max_write_delay);
+- avr910_set_addr(pgm, addr>>1);
++ page_wr_cmd_pending = 0;
++ usleep(m->max_write_delay);
++ avr910_set_addr(pgm, addr>>1);
+
+- /* Set page address for next page. */
++ /* Set page address for next page. */
+
+- page_addr = addr;
+- page_bytes = page_size;
+- }
+- else if ((PDATA(pgm)->has_auto_incr_addr != 'Y') && ((addr & 0x01) == 0)) {
+- avr910_set_addr(pgm, addr>>1);
++ page_addr = addr;
++ page_bytes = page_size;
++ }
++ else if ((PDATA(pgm)->has_auto_incr_addr != 'Y') && ((addr & 0x01) == 0)) {
++ avr910_set_addr(pgm, addr>>1);
++ }
+ }
+-
+ report_progress (addr, max_addr, NULL);
+ }
+
+@@ -676,24 +704,36 @@
+ avr910_set_addr(pgm, addr);
+
+ while (addr < max_addr) {
+- avr910_send(pgm, &cmd, 1);
+- if (cmd == 'R') {
+- /* The 'R' command returns two bytes, MSB first, we need to put the data
+- into the memory buffer LSB first. */
+- avr910_recv(pgm, buf, 2);
+- m->buf[addr*2] = buf[1]; /* LSB */
+- m->buf[addr*2+1] = buf[0]; /* MSB */
+- }
+- else {
+- avr910_recv(pgm, (char *)&m->buf[addr], 1);
++ if (is_usb && cmd == 'R') {
++ int i;
++ for (i=0; i<READ_SIZE/2; i++) {
++ extra_buf[i] = 'R';
++ }
++ avr910_send(pgm, extra_buf, READ_SIZE/2);
++ avr910_recv(pgm, extra_buf, READ_SIZE);
++ for (i=0; i< READ_SIZE; i+=2) {
++ m->buf[addr*2+i] = extra_buf[i+1]; /* LSB */
++ m->buf[addr*2+i+1] = extra_buf[i]; /* MSB */
++ }
++ addr += READ_SIZE/2;
++ } else {
++ avr910_send(pgm, &cmd, 1);
++ if (cmd == 'R') {
++ /* The 'R' command returns two bytes, MSB first, we need to put the data
++ into the memory buffer LSB first. */
++ avr910_recv(pgm, buf, 2);
++ m->buf[addr*2] = buf[1]; /* LSB */
++ m->buf[addr*2+1] = buf[0]; /* MSB */
++ } else {
++ avr910_recv(pgm, (char *)&m->buf[addr], 1);
++ }
++
++ addr++;
++
++ if (PDATA(pgm)->has_auto_incr_addr != 'Y') {
++ avr910_set_addr(pgm, addr);
++ }
+ }
+-
+- addr++;
+-
+- if (PDATA(pgm)->has_auto_incr_addr != 'Y') {
+- avr910_set_addr(pgm, addr);
+- }
+-
+ report_progress (addr, max_addr, NULL);
+ }
+
Added: trunk/dports/cross/avrdude/files/patch-avrdude.conf.in.diff
===================================================================
--- trunk/dports/cross/avrdude/files/patch-avrdude.conf.in.diff (rev 0)
+++ trunk/dports/cross/avrdude/files/patch-avrdude.conf.in.diff 2009-08-06 12:01:16 UTC (rev 55055)
@@ -0,0 +1,55 @@
+--- avrdude.conf.in.orig 2009-07-11 00:22:22.000000000 +0200
++++ avrdude.conf.in 2009-08-02 22:38:25.000000000 +0200
+@@ -17,7 +17,7 @@
+ # desc = <description> ; # quoted string
+ # type = par | stk500 | stk500v2 | stk500pp | stk500hvsp | stk500generic |
+ # stk600 | stk600pp | stk600hvsp |
+-# avr910 | butterfly | usbasp |
++# avr910 | butterfly | usbasp | serjtag | ft245r |
+ # jtagmki | jtagmkii | jtagmkii_isp | jtagmkii_dw |
+ # dragon_dw | dragon_jtag | dragon_isp | dragon_pp |
+ # dragon_hvsp | arduino; # programmer type
+@@ -316,6 +316,43 @@
+ type = arduino;
+ ;
+
++#arduino duemilanove
++programmer
++ id = "duemilanove";
++ desc = "FT232R Synchronous BitBang";
++ type = ft245r;
++ miso = 3; # CTS X3(1)
++ sck = 5; # DSR X3(2)
++ mosi = 6; # DCD X3(3)
++ reset = 7; # RI X3(4)
++;
++
++programmer
++ id = "serjtag";
++ desc = "Serial JTAG Cable";
++ type = serjtag;
++;
++
++programmer
++ id = "ft245r";
++ desc = "FT245R Synchronous BitBang";
++ type = ft245r;
++ miso = 1; # D1
++ sck = 0; # D0
++ mosi = 2; # D2
++ reset = 4; # D4
++;
++
++programmer
++ id = "ft232r";
++ desc = "FT232R Synchronous BitBang";
++ type = ft245r;
++ miso = 1; # RxD
++ sck = 0; # RTS
++ mosi = 2; # TxD
++ reset = 4; # DTR
++;
++
+ programmer
+ id = "avrisp";
+ desc = "Atmel AVR ISP";
Added: trunk/dports/cross/avrdude/files/patch-config_gram.y.diff
===================================================================
--- trunk/dports/cross/avrdude/files/patch-config_gram.y.diff (rev 0)
+++ trunk/dports/cross/avrdude/files/patch-config_gram.y.diff 2009-08-06 12:01:16 UTC (rev 55055)
@@ -0,0 +1,51 @@
+--- config_gram.y.orig 2009-03-06 21:09:11.000000000 +0100
++++ config_gram.y 2009-08-02 22:30:38.000000000 +0200
+@@ -41,6 +41,7 @@
+ #include "stk500v2.h"
+ #include "stk500generic.h"
+ #include "avr910.h"
++#include "serjtag.h"
+ #include "butterfly.h"
+ #include "usbasp.h"
+ #include "usbtiny.h"
+@@ -143,6 +144,8 @@
+ %token K_STK600HVSP
+ %token K_STK600PP
+ %token K_AVR910
++%token K_SERJTAG
++%token K_FT245R
+ %token K_USBASP
+ %token K_USBTINY
+ %token K_BUTTERFLY
+@@ -449,6 +452,18 @@
+ }
+ } |
+
++ K_TYPE TKN_EQUAL K_SERJTAG {
++ {
++ serjtag_initpgm(current_prog);
++ }
++ } |
++
++ K_TYPE TKN_EQUAL K_FT245R {
++ {
++ ft245r_initpgm(current_prog);
++ }
++ } |
++
+ K_TYPE TKN_EQUAL K_USBASP {
+ {
+ usbasp_initpgm(current_prog);
+@@ -1321,10 +1336,10 @@
+
+ value = v->value.number;
+
+- if ((value <= 0) || (value >= 18)) {
++ if ((value < 0) || (value >= 18)) {
+ fprintf(stderr,
+ "%s: error at line %d of %s: pin must be in the "
+- "range 1-17\n",
++ "range 0-17\n",
+ progname, lineno, infile);
+ exit(1);
+ }
Added: trunk/dports/cross/avrdude/files/patch-ft245r.c.diff
===================================================================
--- trunk/dports/cross/avrdude/files/patch-ft245r.c.diff (rev 0)
+++ trunk/dports/cross/avrdude/files/patch-ft245r.c.diff 2009-08-06 12:01:16 UTC (rev 55055)
@@ -0,0 +1,765 @@
+--- /dev/null 2009-08-02 22:44:47.000000000 +0200
++++ ft245r.c 2009-08-02 21:56:45.000000000 +0200
+@@ -0,0 +1,762 @@
++/*
++ * avrdude - A Downloader/Uploader for AVR device programmers
++ * Copyright (C) 2003-2004 Theodore A. Roth <troth at openavr.org>
++ *
++ * 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$ */
++
++/* ft245r -- FT245R/FT232R Synchronous BitBangMode Programmer
++ default pin assign
++ FT232R / FT245R
++ miso = 1; # RxD / D1
++ sck = 0; # RTS / D0
++ mosi = 2; # TxD / D2
++ reset = 4; # DTR / D4
++*/
++
++#include "ac_cfg.h"
++
++#include <stdio.h>
++#include <stdlib.h>
++#include <string.h>
++#include <errno.h>
++#include <sys/time.h>
++#include <unistd.h>
++
++#include "avr.h"
++#include "pindefs.h"
++#include "pgm.h"
++#include "bitbang.h"
++#include "ft245r.h"
++
++#if defined(_WIN32) || defined(SUPPORT_FT245R)
++#if defined(_WIN32)
++#include <windows.h>
++#include "ftd2xx.h"
++#else
++#include "ftd2xx.h"
++#endif
++
++#define FT245R_CYCLES 2
++#define FT245R_FRAGMENT_SIZE 512
++#define REQ_OUTSTANDINGS 10
++//#define USE_INLINE_WRITE_PAGE
++
++#define FT245R_DEBUG 1
++
++extern char * progname;
++extern int do_cycles;
++extern int ovsigck;
++extern int verbose;
++
++static FT_HANDLE handle;
++
++static unsigned char ft245r_ddr;
++static unsigned char ft245r_sck;
++static unsigned char ft245r_mosi;
++static unsigned char ft245r_reset;
++static unsigned char ft245r_miso;
++
++static inline void setbit(UCHAR *data, int pinno, int v)
++{
++ if (v) {
++ *data |= (1 << (pinno));
++ } else {
++ *data &= ~(1 <<(pinno));
++ }
++}
++
++static int ft245r_send(PROGRAMMER * pgm, char * buf, size_t len)
++{
++ FT_STATUS r;
++ DWORD rlen;
++ r = FT_Write(handle, buf, len, &rlen);
++ if (r == FT_OK) return 0;
++ if (len != rlen) return -1;
++ return -1;
++}
++
++
++static int ft245r_recv(PROGRAMMER * pgm, char * buf, size_t len)
++{
++ FT_STATUS r;
++ DWORD rlen;
++
++ r = FT_Read(handle, buf, len, &rlen);
++
++ if (r != FT_OK || len != rlen) {
++ fprintf(stderr,
++ "%s: ft245r_recv(): programmer is not responding\n",
++ progname);
++ exit(1);
++ }
++ return 0;
++}
++
++
++static int ft245r_drain(PROGRAMMER * pgm, int display)
++{
++ FT_STATUS r;
++ DWORD n;
++ r = FT_SetBitMode(handle, 0, 0x0); // reset
++ if (r != FT_OK) return -1;
++ r = FT_SetBitMode(handle, ft245r_ddr, 0x4); // set Synchronuse BitBang
++ if (r != FT_OK) return -1;
++
++ r = FT_GetQueueStatus(handle, &n);
++ if (r != FT_OK) return -1;
++ if (n) {
++ fprintf(stderr, "ft245r_drain called but queue is not empty %d \n",
++ (int)n);
++ }
++ return 0;
++}
++
++static inline int ft245r_sync(PROGRAMMER * pgm)
++{
++ FT_STATUS r;
++ UCHAR ch;
++ r = FT_GetBitMode(handle, &ch);
++ if (r != FT_OK) return -1;
++ return 0;
++}
++
++static int ft245r_chip_erase(PROGRAMMER * pgm, AVRPART * p)
++{
++ unsigned char cmd[4];
++ unsigned char res[4];
++
++ if (p->op[AVR_OP_CHIP_ERASE] == NULL) {
++ fprintf(stderr, "chip erase instruction not defined for part \"%s\"\n",
++ p->desc);
++ return -1;
++ }
++
++ memset(cmd, 0, sizeof(cmd));
++
++ avr_set_bits(p->op[AVR_OP_CHIP_ERASE], cmd);
++ pgm->cmd(pgm, cmd, res);
++ usleep(p->chip_erase_delay);
++ pgm->initialize(pgm, p);
++
++ return 0;
++}
++
++static unsigned char saved_signature[3];
++
++static int valid_rates[] = {
++ 2400, 4800, 9600, 14400, 19200, 38400, 57600,
++ 115200, 230400, 460800, 921600, 3000000
++};
++
++static void ft245r_set_bitclock(PROGRAMMER * pgm) {
++ FT_STATUS r;
++ int rate = 0;
++ int i;
++
++ if (pgm->bitclock == 0.0) { // using default
++ rate = 235000.0 /2;
++ } else if (pgm->bitclock >= 0.50 ) {
++ rate = 500000.0 /2;
++ } else if (pgm->bitclock < 0.01) {
++ rate = 1000.0 /2;
++ } else {
++ rate = pgm->bitclock * 1000000.0 /2;
++ }
++ for (i= sizeof(valid_rates)/sizeof(valid_rates[0]) -1; i>=0; --i)
++ {
++ if (valid_rates[i] <= rate) {
++ rate = valid_rates[i];
++ break;
++ }
++ }
++ if (i<0) rate = valid_rates[0];
++
++ r = FT_SetBaudRate(handle, rate);
++ if ((verbose>=1) || FT245R_DEBUG) {
++ fprintf(stderr," ft245r: bitclk %d -> ft baud %d\n",
++ rate * 2, rate);
++ }
++}
++
++static int set_reset(PROGRAMMER * pgm, int val)
++{
++ unsigned char buf[1];
++
++ buf[0] = 0;
++ if (val) buf[0] |= ft245r_reset;
++
++ ft245r_send (pgm, buf, 1);
++ ft245r_recv (pgm, buf, 1);
++ return 0;
++}
++
++static int ft245r_cmd(PROGRAMMER * pgm, unsigned char cmd[4],
++ unsigned char res[4]);
++/*
++ * issue the 'program enable' command to the AVR device
++ */
++static int ft245r_program_enable(PROGRAMMER * pgm, AVRPART * p)
++{
++ int retry_count = 0;
++ unsigned char cmd[4];
++ unsigned char res[4];
++ int i,reset_ok;
++
++ ft245r_set_bitclock(pgm);
++
++retry:
++ reset_ok = 0;
++ set_reset(pgm, 0);
++ usleep(5000); // 5ms
++ set_reset(pgm, 1);
++ usleep(5000); // 5ms
++ set_reset(pgm, 0);
++ usleep(5000); // 5ms
++
++ cmd[0] = 0xAC;
++ cmd[1] = 0x53;
++ cmd[2] = 0;
++ cmd[3] = 0;
++ ft245r_cmd(pgm, cmd, res);
++ if (res[2] == 0x53 ) reset_ok = 1;
++ for (i=0; i<3; i++) {
++ cmd[0] = 0x30;
++ cmd[1] = 0;
++ cmd[2] = i;
++ cmd[3] = 0;
++ ft245r_cmd(pgm, cmd, res);
++ saved_signature[i] = res[3];
++ }
++
++ if (reset_ok && (saved_signature[0] == 0x1e)) // success
++ return 0;
++
++ if (retry_count < 5) {
++ retry_count++;
++ goto retry;
++ }
++ if ((verbose>=1) || FT245R_DEBUG) {
++ fprintf(stderr,
++ "%s: ft245r_program_enable: failed\n", progname);
++ fflush(stderr);
++ }
++ return -1;
++}
++
++static int ft245r_read_sig_bytes(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m)
++{
++ m->buf[0] = saved_signature[0];
++ m->buf[1] = saved_signature[1];
++ m->buf[2] = saved_signature[2];
++ return 3;
++}
++
++/*
++ * initialize the AVR device and prepare it to accept commands
++ */
++static int ft245r_initialize(PROGRAMMER * pgm, AVRPART * p)
++{
++ return ft245r_program_enable(pgm, p);
++}
++
++static void ft245r_disable(PROGRAMMER * pgm)
++{
++ return;
++}
++
++
++static void ft245r_enable(PROGRAMMER * pgm)
++{
++ /* Do nothing. */
++
++ return;
++}
++
++static inline int set_data(unsigned char *buf, unsigned char data)
++{
++ int j;
++ int buf_pos = 0;
++ unsigned char bit = 0x80;
++
++ for (j=0; j<8; j++) {
++ buf[buf_pos] = 0;
++ if (data & bit) buf[buf_pos] |= ft245r_mosi;
++ buf_pos++;
++
++ buf[buf_pos] = 0;
++ if (data & bit) buf[buf_pos] |= ft245r_mosi;
++ buf[buf_pos] |= ft245r_sck;
++ buf_pos++;
++
++ bit >>= 1;
++ }
++ return buf_pos;
++}
++
++static inline unsigned char extract_data(unsigned char *buf, int offset)
++{
++ int j;
++ int buf_pos = 1;
++ unsigned char bit = 0x80;
++ unsigned char r = 0;
++
++ buf += offset * (8 * FT245R_CYCLES);
++ for (j=0; j<8; j++) {
++ if (buf[buf_pos] & ft245r_miso) {
++ r |= bit;
++ }
++ buf_pos += FT245R_CYCLES;
++ bit >>= 1;
++ }
++ return r;
++}
++
++/* to check data */
++static inline unsigned char extract_data_out(unsigned char *buf, int offset)
++{
++ int j;
++ int buf_pos = 1;
++ unsigned char bit = 0x80;
++ unsigned char r = 0;
++
++ buf += offset * (8 * FT245R_CYCLES);
++ for (j=0; j<8; j++) {
++ if (buf[buf_pos] & ft245r_mosi) {
++ r |= bit;
++ }
++ buf_pos += FT245R_CYCLES;
++ bit >>= 1;
++ }
++ return r;
++}
++
++
++/*
++ * transmit an AVR device command and return the results; 'cmd' and
++ * 'res' must point to at least a 4 byte data buffer
++ */
++static int ft245r_cmd(PROGRAMMER * pgm, unsigned char cmd[4],
++ unsigned char res[4])
++{
++ int i,buf_pos;
++ unsigned char buf[128];
++
++ buf_pos = 0;
++ for (i=0; i<4; i++) {
++ buf_pos += set_data(buf+buf_pos, cmd[i]);
++ }
++ buf[buf_pos] = 0;
++ buf_pos++;
++
++ ft245r_send (pgm, buf, buf_pos);
++ ft245r_recv (pgm, buf, buf_pos);
++ res[0] = extract_data(buf, 0);
++ res[1] = extract_data(buf, 1);
++ res[2] = extract_data(buf, 2);
++ res[3] = extract_data(buf, 3);
++
++ return 0;
++}
++
++static int ft245r_open(PROGRAMMER * pgm, char * port)
++{
++ FT_STATUS r;
++ int devnum = -1;
++ strcpy(pgm->port, port);
++
++#ifdef _WIN32
++ if (!strncasecmp("ft", port, 2) && '0' <= port[2] && port[2] <= '9') {
++ devnum = port[2] - '0';
++ } else {
++ fprintf(stderr,
++ "%s: invalid portname %s: use ft0 - ft9\n",
++ progname,port);
++ exit(1);
++ }
++ r = FT_Open(devnum, &handle);
++#else
++ for (devnum=0; devnum<9; devnum++) {
++ r = FT_Open(devnum, &handle);
++ if (r == FT_OK) break;
++ }
++#endif
++ if (r != FT_OK) {
++ fprintf(stderr,
++ "%s: %s open failed \n",
++ progname, port);
++ exit(1);
++ }
++ r = FT_SetBitMode(handle, 0, 0x4); // set Synchronuse BitBang
++ if (r != FT_OK) {
++ fprintf(stderr,
++ "%s: Synchronuse BitBangMode is not supported\n",
++ progname);
++ exit(1);
++ }
++#if FT245R_DEBUG
++ fprintf(stderr, "%s: BitBang OK \n", progname);
++ fflush(stderr);
++#endif
++
++ ft245r_ddr = 0;
++ setbit(&ft245r_ddr, pgm->pinno[PIN_AVR_SCK], 1);
++ setbit(&ft245r_ddr, pgm->pinno[PIN_AVR_MOSI], 1);
++ setbit(&ft245r_ddr, pgm->pinno[PIN_AVR_RESET], 1);
++ ft245r_sck = 0;
++ setbit(&ft245r_sck, pgm->pinno[PIN_AVR_SCK], 1);
++ ft245r_mosi = 0;
++ setbit(&ft245r_mosi, pgm->pinno[PIN_AVR_MOSI], 1);
++ ft245r_reset = 0;
++ setbit(&ft245r_reset, pgm->pinno[PIN_AVR_RESET], 1);
++ ft245r_miso = 0;
++ setbit(&ft245r_miso, pgm->pinno[PIN_AVR_MISO], 1);
++ if ((verbose>=1) || FT245R_DEBUG) {
++ fprintf(stderr,
++ "%s: pin assign miso %d sck %d mosi %d reset %d\n",
++ progname,
++ pgm->pinno[PIN_AVR_MISO],
++ pgm->pinno[PIN_AVR_SCK],
++ pgm->pinno[PIN_AVR_MOSI],
++ pgm->pinno[PIN_AVR_RESET]);
++ }
++
++ /*
++ * drain any extraneous input
++ */
++ ft245r_drain (pgm, 0);
++#if FT245R_DEBUG
++ fprintf(stderr, "%s: drain OK \n", progname);
++ fflush(stderr);
++#endif
++
++ return 0;
++}
++
++static void ft245r_close(PROGRAMMER * pgm)
++{
++ FT_Close(handle);
++}
++
++static void ft245r_display(PROGRAMMER * pgm, char * p)
++{
++ return;
++}
++
++static int ft245r_paged_write_gen(PROGRAMMER * pgm, AVRPART * p,
++ AVRMEM * m, int page_size, int n_bytes)
++{
++ unsigned long i;
++ int rc;
++ for (i=0; i<n_bytes; i++) {
++ report_progress(i, n_bytes, NULL);
++
++ rc = avr_write_byte_default(pgm, p, m, i, m->buf[i]);
++ if (rc != 0) {
++ return -2;
++ }
++
++ if (m->paged) {
++ /*
++ * check to see if it is time to flush the page with a page
++ * write
++ */
++ if (((i % m->page_size) == m->page_size-1) || (i == n_bytes-1)) {
++ rc = avr_write_page(pgm, p, m, i);
++ if (rc != 0) {
++ return -2;
++ }
++ }
++ }
++ }
++ return i;
++}
++
++static struct ft245r_request {
++ int addr;
++ int bytes;
++ int n;
++ struct ft245r_request *next;
++} *req_head,*req_tail,*req_pool;
++
++static void put_request(int addr, int bytes, int n)
++{
++ struct ft245r_request *p;
++ if (req_pool) {
++ p = req_pool;
++ req_pool = p->next;
++ } else {
++ p = malloc(sizeof(struct ft245r_request));
++ if (!p) {
++ fprintf(stderr, "can't alloc memory\n");
++ exit(1);
++ }
++ }
++ memset(p, 0, sizeof(struct ft245r_request));
++ p->addr = addr;
++ p->bytes = bytes;
++ p->n = n;
++ if (req_tail) {
++ req_tail->next = p;
++ req_tail = p;
++ } else {
++ req_head = req_tail = p;
++ }
++}
++
++static int do_request(PROGRAMMER * pgm, AVRMEM *m)
++{
++ struct ft245r_request *p;
++ int addr, bytes, j, n;
++ char buf[FT245R_FRAGMENT_SIZE+1+128];
++
++ if (!req_head) return 0;
++ p = req_head;
++ req_head = p->next;
++ if (!req_head) req_tail = req_head;
++
++ addr = p->addr;
++ bytes = p->bytes;
++ n = p->n;
++ memset(p, 0, sizeof(struct ft245r_request));
++ p->next = req_pool;
++ req_pool = p;
++
++ ft245r_recv(pgm, buf, bytes);
++ for (j=0; j<n; j++) {
++ m->buf[addr++] = extract_data(buf , (j * 4 + 3));
++ }
++#if 0
++if (n == 0) // paged_write
++fprintf(stderr, "recv addr 0x%04x buf size %d \n",addr, bytes);
++#endif
++ return 1;
++}
++
++static int ft245r_paged_write_flash(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m,
++ int page_size, int n_bytes)
++{
++ unsigned int i,j;
++ int addr,addr_save,buf_pos,do_page_write,req_count;
++ char buf[FT245R_FRAGMENT_SIZE+1+128];
++
++ req_count = 0;
++ addr = 0;
++ for (i=0; i<n_bytes; ) {
++ addr_save = addr;
++ buf_pos = 0;
++ do_page_write = 0;
++ for (j=0; j< FT245R_FRAGMENT_SIZE/8/FT245R_CYCLES/4; j++) {
++ buf_pos += set_data(buf+buf_pos, (addr & 1)?0x48:0x40 );
++ buf_pos += set_data(buf+buf_pos, (addr >> 9) & 0xff );
++ buf_pos += set_data(buf+buf_pos, (addr >> 1) & 0xff );
++ buf_pos += set_data(buf+buf_pos, m->buf[i]);
++ addr ++;
++ i++;
++ if ( (m->paged) &&
++ (((i % m->page_size) == 0) || (i == n_bytes))) {
++ do_page_write = 1;
++ break;
++ }
++ }
++#if defined(USE_INLINE_WRITE_PAGE)
++ if (do_page_write) {
++ int addr_wk = addr_save - (addr_save % m->page_size);
++ /* If this device has a "load extended address" command, issue it. */
++ if (m->op[AVR_OP_LOAD_EXT_ADDR]) {
++ unsigned char cmd[4];
++ OPCODE *lext = m->op[AVR_OP_LOAD_EXT_ADDR];
++
++ memset(cmd, 0, 4);
++ avr_set_bits(lext, cmd);
++ avr_set_addr(lext, cmd, addr_wk/2);
++ buf_pos += set_data(buf+buf_pos, cmd[0]);
++ buf_pos += set_data(buf+buf_pos, cmd[1]);
++ buf_pos += set_data(buf+buf_pos, cmd[2]);
++ buf_pos += set_data(buf+buf_pos, cmd[3]);
++ }
++ buf_pos += set_data(buf+buf_pos, 0x4C); /* Issue Page Write */
++ buf_pos += set_data(buf+buf_pos,(addr_wk >> 9) & 0xff);
++ buf_pos += set_data(buf+buf_pos,(addr_wk >> 1) & 0xff);
++ buf_pos += set_data(buf+buf_pos, 0);
++ }
++#endif
++ if (i >= n_bytes) {
++ buf[buf_pos++] = 0; // sck down
++ }
++ ft245r_send(pgm, buf, buf_pos);
++ put_request(addr_save, buf_pos, 0);
++ //ft245r_sync(pgm);
++#if 0
++fprintf(stderr, "send addr 0x%04x bufsize %d [%02x %02x] page_write %d\n",
++ addr_save,buf_pos,
++ extract_data_out(buf , (0*4 + 3) ),
++ extract_data_out(buf , (1*4 + 3) ),
++ do_page_write);
++#endif
++ req_count++;
++ if (req_count > REQ_OUTSTANDINGS)
++ do_request(pgm, m);
++ if (do_page_write) {
++#if defined(USE_INLINE_WRITE_PAGE)
++ while (do_request(pgm, m))
++ ;
++ usleep(m->max_write_delay);
++#else
++ int addr_wk = addr_save - (addr_save % m->page_size);
++ int rc;
++ while (do_request(pgm, m))
++ ;
++ rc = avr_write_page(pgm, p, m, addr_wk);
++ if (rc != 0) {
++ return -2;
++ }
++#endif
++ req_count = 0;
++ }
++ report_progress(i, n_bytes, NULL);
++ }
++ while (do_request(pgm, m))
++ ;
++ return i;
++}
++
++
++static int ft245r_paged_write(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m,
++ int page_size, int n_bytes)
++{
++ if (strcmp(m->desc, "flash") == 0) {
++ return ft245r_paged_write_flash(pgm, p, m, page_size, n_bytes);
++ }
++ else if (strcmp(m->desc, "eeprom") == 0) {
++ return ft245r_paged_write_gen(pgm, p, m, page_size, n_bytes);
++ }
++ else {
++ return -2;
++ }
++}
++
++static int ft245r_paged_load_gen(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m,
++ int page_size, int n_bytes)
++{
++ unsigned char rbyte;
++ unsigned long i;
++ int rc;
++
++ for (i=0; i<n_bytes; i++) {
++ rc = avr_read_byte_default(pgm, p, m, i, &rbyte);
++ if (rc != 0) {
++ return -2;
++ }
++ m->buf[i] = rbyte;
++ report_progress(i, n_bytes, NULL);
++ }
++ return 0;
++}
++
++
++static int ft245r_paged_load_flash(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m,
++ int page_size, int n_bytes)
++{
++ unsigned long i,j,n;
++ //int rc;
++ int addr,addr_save,buf_pos;
++ int req_count = 0;
++ char buf[FT245R_FRAGMENT_SIZE+1];
++
++ addr = 0;
++ for (i=0; i<n_bytes; ) {
++ buf_pos = 0;
++ addr_save = addr;
++ for (j=0; j< FT245R_FRAGMENT_SIZE/8/FT245R_CYCLES/4; j++) {
++ if (i >= n_bytes) break;
++ buf_pos += set_data(buf+buf_pos, (addr & 1)?0x28:0x20 );
++ buf_pos += set_data(buf+buf_pos, (addr >> 9) & 0xff );
++ buf_pos += set_data(buf+buf_pos, (addr >> 1) & 0xff );
++ buf_pos += set_data(buf+buf_pos, 0);
++ addr ++;
++ i++;
++ }
++ if (i >= n_bytes) {
++ buf[buf_pos++] = 0; // sck down
++ }
++ n = j;
++ ft245r_send(pgm, buf, buf_pos);
++ put_request(addr_save, buf_pos, n);
++ req_count++;
++ if (req_count > REQ_OUTSTANDINGS)
++ do_request(pgm, m);
++ report_progress(i, n_bytes, NULL);
++ }
++ while (do_request(pgm, m))
++ ;
++ return 0;
++}
++
++static int ft245r_paged_load(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m,
++ int page_size, int n_bytes)
++{
++ if (strcmp(m->desc, "flash") == 0) {
++ return ft245r_paged_load_flash(pgm, p, m, page_size, n_bytes);
++ }
++ else if (strcmp(m->desc, "eeprom") == 0) {
++ return ft245r_paged_load_gen(pgm, p, m, page_size, n_bytes);
++ }
++ else {
++ return -2;
++ }
++}
++
++void ft245r_initpgm(PROGRAMMER * pgm)
++{
++ strcpy(pgm->type, "ft245r");
++
++ /*
++ * mandatory functions
++ */
++ pgm->initialize = ft245r_initialize;
++ pgm->display = ft245r_display;
++ pgm->enable = ft245r_enable;
++ pgm->disable = ft245r_disable;
++ pgm->program_enable = ft245r_program_enable;
++ pgm->chip_erase = ft245r_chip_erase;
++ pgm->cmd = ft245r_cmd;
++ pgm->open = ft245r_open;
++ pgm->close = ft245r_close;
++ pgm->read_byte = avr_read_byte_default;
++ pgm->write_byte = avr_write_byte_default;
++
++ /*
++ * optional functions
++ */
++ pgm->paged_write = ft245r_paged_write;
++ pgm->paged_load = ft245r_paged_load;
++
++ pgm->read_sig_bytes = ft245r_read_sig_bytes;
++}
++#else
++static int ft245r_initialize(PROGRAMMER * pgm, AVRPART * p)
++{
++ return -1;
++}
++
++void ft245r_initpgm(PROGRAMMER * pgm)
++{
++ pgm->initialize = ft245r_initialize;
++}
++
++#endif
Added: trunk/dports/cross/avrdude/files/patch-ft245r.h.diff
===================================================================
--- trunk/dports/cross/avrdude/files/patch-ft245r.h.diff (rev 0)
+++ trunk/dports/cross/avrdude/files/patch-ft245r.h.diff 2009-08-06 12:01:16 UTC (rev 55055)
@@ -0,0 +1,11 @@
+--- /dev/null 2009-08-02 22:44:47.000000000 +0200
++++ ft245r.h 2009-08-02 21:56:45.000000000 +0200
+@@ -0,0 +1,8 @@
++#ifndef ft245r_h
++#define ft245r_h
++
++#include "avrpart.h"
++
++void ft245r_initpgm (PROGRAMMER * pgm);
++
++#endif /* ft245r_h */
Added: trunk/dports/cross/avrdude/files/patch-lexer.l.diff
===================================================================
--- trunk/dports/cross/avrdude/files/patch-lexer.l.diff (rev 0)
+++ trunk/dports/cross/avrdude/files/patch-lexer.l.diff 2009-08-06 12:01:16 UTC (rev 55055)
@@ -0,0 +1,11 @@
+--- lexer.l.orig 2009-03-06 21:09:11.000000000 +0100
++++ lexer.l 2009-08-02 22:31:27.000000000 +0200
+@@ -120,6 +120,8 @@
+ arduino { yylval=NULL; return K_ARDUINO; }
+ avr910 { yylval=NULL; return K_AVR910; }
+ avr910_devcode { yylval=NULL; return K_AVR910_DEVCODE; }
++serjtag { yylval=NULL; return K_SERJTAG; }
++ft245r { yylval=NULL; return K_FT245R; }
+ usbasp { yylval=NULL; return K_USBASP; }
+ usbtiny { yylval=NULL; return K_USBTINY; }
+ bank_size { yylval=NULL; return K_PAGE_SIZE; }
Added: trunk/dports/cross/avrdude/files/patch-serjtag.c.diff
===================================================================
--- trunk/dports/cross/avrdude/files/patch-serjtag.c.diff (rev 0)
+++ trunk/dports/cross/avrdude/files/patch-serjtag.c.diff 2009-08-06 12:01:16 UTC (rev 55055)
@@ -0,0 +1,727 @@
+--- /dev/null 2009-08-02 22:44:47.000000000 +0200
++++ serjtag.c 2009-08-02 21:56:45.000000000 +0200
+@@ -0,0 +1,724 @@
++/*
++ * avrdude - A Downloader/Uploader for AVR device programmers
++ * Copyright (C) 2003-2004 Theodore A. Roth <troth at openavr.org>
++ *
++ * 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$ */
++
++/* serjtag -- Serial Jtag Cable (using AVR) */
++
++#include "ac_cfg.h"
++
++#include <stdio.h>
++#include <stdlib.h>
++#include <string.h>
++#include <errno.h>
++#include <sys/time.h>
++#include <unistd.h>
++
++#include "avr.h"
++#include "pgm.h"
++#include "serjtag.h"
++#include "serial.h"
++
++#define SERJTAG_DEBUG 0
++
++extern char * progname;
++extern int do_cycles;
++extern int ovsigck;
++extern int verbose;
++
++static int serjtag_send(PROGRAMMER * pgm, char * buf, size_t len)
++{
++ return serial_send(&pgm->fd, (unsigned char *)buf, len);
++}
++
++
++static int serjtag_recv(PROGRAMMER * pgm, char * buf, size_t len)
++{
++ int rv;
++
++ rv = serial_recv(&pgm->fd, (unsigned char *)buf, len);
++ if (rv < 0) {
++ fprintf(stderr,
++ "%s: serjtag_recv(): programmer is not responding\n",
++ progname);
++ exit(1);
++ }
++ return 0;
++}
++
++
++static int serjtag_drain(PROGRAMMER * pgm, int display)
++{
++ return serial_drain(&pgm->fd, display);
++}
++
++static int serjtag_chip_erase(PROGRAMMER * pgm, AVRPART * p)
++{
++ unsigned char cmd[4];
++ unsigned char res[4];
++
++ if (p->op[AVR_OP_CHIP_ERASE] == NULL) {
++ fprintf(stderr, "chip erase instruction not defined for part \"%s\"\n",
++ p->desc);
++ return -1;
++ }
++
++ memset(cmd, 0, sizeof(cmd));
++
++ avr_set_bits(p->op[AVR_OP_CHIP_ERASE], cmd);
++ pgm->cmd(pgm, cmd, res);
++ usleep(p->chip_erase_delay);
++ pgm->initialize(pgm, p);
++
++ return 0;
++}
++
++#if SERJTAG_DEBUG == 1
++static void serjtag_check(PROGRAMMER * pgm) {
++ int i,bytes;
++ char buf[128];
++
++fprintf(stderr,"check response\n");
++fflush(stderr);
++ i=0;
++ buf[i++] = 'r';
++ buf[i++] = 0;
++ buf[i++] = 0;
++ serjtag_send(pgm, buf, i);
++ serjtag_recv(pgm, buf, 1);
++fprintf(stderr,"\tCommonad = 0x%02x %c\n",buf[0],buf[0]);
++ serjtag_recv(pgm, buf+1, 1);
++fprintf(stderr,"\tFlags = 0x%02x\n",buf[1]);
++ serjtag_recv(pgm, buf+2, 1);
++fprintf(stderr,"\tBytes = 0x%02x\n",buf[2]);
++ bytes = buf[2];
++ if (buf[1] & JTAG_BITS) bytes++;
++ if (bytes) {
++ fprintf(stderr,"\t");
++ for (i=0; i<bytes; i++) {
++ serjtag_recv(pgm, buf+2+i, 1);
++ fprintf(stderr,"%02x ",buf[2+i]);
++ }
++ fprintf(stderr,"\n");
++ }
++}
++#endif
++
++static int serjtag_recv_j(PROGRAMMER * pgm, char * buf, size_t len, int verbose)
++{
++ int bytes;
++ serjtag_recv(pgm, buf, 3); /* header */
++#if 0
++ if (verbose) {
++ fprintf(stderr,"recv_j(0) %c 0x%02x %d :",buf[0],buf[1],buf[2]);
++ }
++#endif
++ bytes = buf[2];
++ if (buf[1] & JTAG_BITS) {
++ bytes++;
++ }
++ len -= 3;
++ if (len >= bytes) {
++ serjtag_recv(pgm, buf+3, bytes);
++ } else {
++ char tmp[1];
++ int i;
++ serjtag_recv(pgm, buf+3, len);
++ for (i=0; i< bytes - len; i++) {
++ serjtag_recv(pgm, tmp, 1);
++ }
++ }
++ if (verbose) {
++ int i;
++ fprintf(stderr,"recv_j %c 0x%02x %d :",buf[0],buf[1],buf[2]);
++ for (i=0; i<bytes; i++) {
++ fprintf(stderr,"%02x ",buf[3+i]&0xff);
++ }
++ fprintf(stderr,"\n");
++ }
++ return 0;
++}
++
++static int delay_param = 3;
++static int use_delay = JTAG_USE_DELAY;
++static unsigned char saved_signature[3];
++
++static void serjtag_set_delay(PROGRAMMER * pgm) {
++ use_delay = JTAG_USE_DELAY;
++ if (pgm->bitclock == 0.0) { // using default
++ delay_param = 3;
++ } else if (pgm->bitclock >= 4.0) {
++ delay_param = 0;
++ use_delay = 0;
++ } else {
++ delay_param = (int)((2.26/3.0) / pgm->bitclock);
++ if (delay_param > 15) delay_param = 15;
++ }
++ if ((verbose>=1) || SERJTAG_DEBUG) {
++ fprintf(stderr," serjtag:delay %d (%s) ( bitclk %.3f )\n"
++ ,delay_param, use_delay? "enabled":"disabled", pgm->bitclock);
++ }
++}
++
++/*
++ * issue the 'program enable' command to the AVR device
++ */
++static int serjtag_program_enable(PROGRAMMER * pgm, AVRPART * p)
++{
++ char buf[128];
++ int i;
++ int retry_count = 0;
++
++ serjtag_set_delay(pgm);
++
++ serjtag_send(pgm, "j", 1); // enter jtag mode
++ serjtag_recv(pgm, buf, 1);
++ if (buf[0] != 'Y') {
++ return -1;
++ }
++#if SERJTAG_DEBUG == 1
++fprintf(stderr," Enter jtag mode .. success \n");
++#endif
++
++retry:
++ i=0;
++ buf[i++] = 's'; /* Set Port */
++ buf[i++] = 0; /* flags */
++ buf[i++] = 1; /* bytes */
++ buf[i++] = 0; /* TDI(MOSI) = 0, TMS(RESET) = 0, TCK(SCK) = 0 */
++ serjtag_send(pgm, buf, i);
++ usleep(5000); // 5ms
++ i=0;
++ buf[i++] = 's'; /* Set Port */
++ buf[i++] = 0; /* flags */
++ buf[i++] = 1; /* bytes */
++ buf[i++] = JTAG_SET_TMS; /* TDI(MOSI) = 0, TMS(RESET) = 1, TCK(SCK) = 0 */
++ serjtag_send(pgm, buf, i);
++ usleep(5000); // 5ms
++ i=0;
++ buf[i++] = 's'; /* Set Port */
++ buf[i++] = 0; /* flags */
++ buf[i++] = 1; /* bytes */
++ buf[i++] = delay_param & JTAG_SET_DELAY; /* TMS(RESET) = 0, set delay */
++ serjtag_send(pgm, buf, i);
++ usleep(5000); // 5ms
++
++ i = 0;
++ buf[i++] = 'd'; /* PUT TDI Stream */
++ buf[i++] = JTAG_RECIEVE | JTAG_USE_DELAY;
++ buf[i++] = 0; /* bytes : set after*/
++ /* check */
++ buf[i++] = 0xAC;
++ buf[i++] = 0x53;
++ buf[i++] = 0;
++ buf[i++] = 0;
++ /* signature[0] */
++ buf[i++] = 0x30;
++ buf[i++] = 0;
++ buf[i++] = 0;
++ buf[i++] = 0;
++ /* signature[1] */
++ buf[i++] = 0x30;
++ buf[i++] = 0;
++ buf[i++] = 1;
++ buf[i++] = 0;
++ /* signature[2] */
++ buf[i++] = 0x30;
++ buf[i++] = 0;
++ buf[i++] = 2;
++ buf[i++] = 0;
++ buf[2] = i - 3; /* set bytes */
++ buf[i++] = 'r'; /* Request Recieved Data */
++ buf[i++] = 0; /* flags */
++ buf[i++] = 0; /* bytes */
++ serjtag_send(pgm, buf, i);
++#if SERJTAG_DEBUG == 1
++ fprintf(stderr,"enabling program delay %d retry %d\n",delay_param,retry_count);
++#endif
++ serjtag_recv_j(pgm, buf, 3+4*4, SERJTAG_DEBUG?1:0);
++
++ saved_signature[0] = buf[3+4*1 +3];
++ saved_signature[1] = buf[3+4*2 +3];
++ saved_signature[2] = buf[3+4*3 +3];
++#if SERJTAG_DEBUG == 1
++ fprintf(stderr,"saved_signature %02x %02x %02x\n"
++ , saved_signature[0]
++ , saved_signature[1]
++ , saved_signature[2]);
++#endif
++ if ((buf[3+2] == 0x53) && (saved_signature[0] == 0x1e)) // success
++ {
++ return 0;
++ }
++ if (retry_count < 5) {
++ retry_count++;
++ goto retry;
++ }
++ return -1;
++}
++
++static int serjtag_read_sig_bytes(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m)
++{
++ m->buf[0] = saved_signature[0];
++ m->buf[1] = saved_signature[1];
++ m->buf[2] = saved_signature[2];
++ return 3;
++}
++
++/*
++ * initialize the AVR device and prepare it to accept commands
++ */
++static int serjtag_initialize(PROGRAMMER * pgm, AVRPART * p)
++{
++ char id[8];
++ char sw[3];
++
++ /* Get the programmer identifier. Programmer returns exactly 7 chars
++ _without_ the null.*/
++
++ serjtag_send(pgm, "S", 1);
++ serjtag_recv(pgm, id, 7);
++ id[7] = 0;
++
++ /* Get the HW and SW versions to see if the programmer is present. */
++
++ serjtag_send(pgm, "V", 1);
++ serjtag_recv(pgm, sw, 2);
++ sw[2] = 0;
++
++ fprintf(stderr, "Found programmer: Id = \"%s\"; Revison = %s\n", id, sw);
++
++ if (strncmp(id, "SERJTAG", 7) && strncmp(id, "USB910A", 7)
++ && strncmp(id, "USB910A", 7) )
++ {
++ fprintf(stderr, "\tserjtag protocol not supported.\n");
++ exit(1);
++ }
++ return serjtag_program_enable(pgm, p);
++}
++
++static void serjtag_disable(PROGRAMMER * pgm)
++{
++ char buf[2];
++ serjtag_send(pgm, "V", 1);
++ serjtag_recv(pgm, buf, 2);
++
++ return;
++}
++
++
++static void serjtag_enable(PROGRAMMER * pgm)
++{
++ /* Do nothing. */
++
++ return;
++}
++
++
++/*
++ * transmit an AVR device command and return the results; 'cmd' and
++ * 'res' must point to at least a 4 byte data buffer
++ */
++static int serjtag_cmd(PROGRAMMER * pgm, unsigned char cmd[4],
++ unsigned char res[4])
++{
++ char buf[10];
++
++ /* FIXME: Insert version check here */
++
++ buf[0] = 'd'; /* PUT TDI Stream */
++ buf[1] = JTAG_RECIEVE | use_delay;
++ buf[2] = 4; /* bytes */
++ buf[3] = cmd[0];
++ buf[4] = cmd[1];
++ buf[5] = cmd[2];
++ buf[6] = cmd[3];
++ buf[7] = 'r'; /* Request Recieved Data */
++ buf[8] = 0;
++ buf[9] = 0;
++
++ serjtag_send (pgm, buf, 10);
++ serjtag_recv (pgm, buf, 7);
++
++ res[0] = 0x00; /* Dummy value */
++ res[1] = cmd[0];
++ res[2] = cmd[1];
++ res[3] = buf[6];
++
++ return 0;
++}
++
++
++static int serjtag_open(PROGRAMMER * pgm, char * port)
++{
++ /*
++ * If baudrate was not specified use 19.200 Baud
++ */
++ if(pgm->baudrate == 0) {
++ pgm->baudrate = 19200;
++ }
++
++ strcpy(pgm->port, port);
++ serial_open(port, pgm->baudrate, &pgm->fd);
++
++ /*
++ * drain any extraneous input
++ */
++ serjtag_drain (pgm, 0);
++
++ return 0;
++}
++
++static void serjtag_close(PROGRAMMER * pgm)
++{
++ serial_close(&pgm->fd);
++ pgm->fd.ifd = -1;
++}
++
++
++static void serjtag_display(PROGRAMMER * pgm, char * p)
++{
++ return;
++}
++
++static int serjtag_paged_write_gen(PROGRAMMER * pgm, AVRPART * p,
++ AVRMEM * m, int page_size, int n_bytes)
++{
++ unsigned long i;
++ int rc;
++ for (i=0; i<n_bytes; i++) {
++ report_progress(i, n_bytes, NULL);
++
++ rc = avr_write_byte_default(pgm, p, m, i, m->buf[i]);
++ if (rc != 0) {
++ return -2;
++ }
++
++ if (m->paged) {
++ /*
++ * check to see if it is time to flush the page with a page
++ * write
++ */
++ if (((i % m->page_size) == m->page_size-1) || (i == n_bytes-1)) {
++ rc = avr_write_page(pgm, p, m, i);
++ if (rc != 0) {
++ return -2;
++ }
++ }
++ }
++ }
++ return i;
++}
++
++#define SERJTAG_BUFFERD_WRITE
++
++#ifdef SERJTAG_BUFFERD_WRITE
++#define SERJTAG_BUF_SIZE 1024
++unsigned char *serjtag_buf;
++int serjtag_buf_len;
++
++static void serjtag_flush(PROGRAMMER * pgm) {
++ if (!serjtag_buf || (serjtag_buf_len == 0)) return;
++ serjtag_send(pgm, serjtag_buf, serjtag_buf_len);
++ serjtag_buf_len = 0;
++}
++
++static void serjtag_write(PROGRAMMER * pgm, unsigned char *buf, int size) {
++ if (!serjtag_buf) {
++ serjtag_buf = malloc(SERJTAG_BUF_SIZE);
++ if (!serjtag_buf) {
++ fprintf(stderr, "can't alloc memory\n");
++ exit(1);
++ }
++ }
++ if (SERJTAG_BUF_SIZE < serjtag_buf_len + size) {
++ serjtag_flush(pgm);
++ }
++ memcpy(serjtag_buf + serjtag_buf_len, buf, size);
++ serjtag_buf_len += size;
++}
++#else
++static void serjtag_flush(PROGRAMMER * pgm) {
++}
++static void serjtag_write(PROGRAMMER * pgm, unsigned char *buf, int size) {
++ serjtag_send(pgm, buf, size);
++}
++#endif
++
++#define USE_INLINE_WRITE_PAGE
++
++static int serjtag_paged_write_flash(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m,
++ int page_size, int n_bytes)
++{
++ unsigned int i,j;
++ int addr,addr_save,buf_pos,do_page_write;
++ char buf[128];
++
++ addr = 0;
++ for (i=0; i<n_bytes; ) {
++ addr_save = addr;
++ buf_pos = 0;
++ buf[buf_pos++] = 'd'; /* PUT TDI Stream */
++ buf[buf_pos++] = use_delay;
++ buf[buf_pos++] = 0; /* bytes : set after */
++ do_page_write = 0;
++ for (j=0; j<(JTAG_BUFSIZE-3)/4; j++) { // 15 bytes
++ buf[buf_pos++] = (addr & 1)?0x48:0x40;
++ buf[buf_pos++] = (addr >> 9) & 0xff;
++ buf[buf_pos++] = (addr >> 1) & 0xff;
++ buf[buf_pos++] = m->buf[i];
++ addr ++;
++ i++;
++ if ( (m->paged) &&
++ (((i % m->page_size) == 0) || (i == n_bytes))) {
++ do_page_write = 1;
++ break;
++ }
++ }
++ buf[2] = buf_pos - 3;
++#ifdef USE_INLINE_WRITE_PAGE
++ if (do_page_write) {
++ int addr_wk = addr_save - (addr_save % m->page_size);
++ /* If this device has a "load extended address" command, issue it. */
++ if (m->op[AVR_OP_LOAD_EXT_ADDR]) {
++ OPCODE *lext = m->op[AVR_OP_LOAD_EXT_ADDR];
++
++ buf[buf_pos++] = 'd'; /* PUT TDI Stream */
++ buf[buf_pos++] = JTAG_RECIEVE | use_delay;
++ buf[buf_pos++] = 4; /* bytes */
++
++ memset(buf+buf_pos, 0, 4);
++ avr_set_bits(lext, buf+buf_pos);
++ avr_set_addr(lext, buf+buf_pos, addr/2);
++ buf_pos += 4;
++ }
++ buf[buf_pos++] = 'd'; /* PUT TDI Stream */
++ buf[buf_pos++] = JTAG_RECIEVE | use_delay;
++ buf[buf_pos++] = 4; /* bytes */
++ buf[buf_pos++] = 0x4C; /* Issue Page Write */
++ buf[buf_pos++] = (addr_wk >> 9) & 0xff;
++ buf[buf_pos++] = (addr_wk >> 1) & 0xff;
++ buf[buf_pos++] = 0;
++ buf[buf_pos++] = 'r'; /* Request Recieved Data */
++ buf[buf_pos++] = 0;
++ buf[buf_pos++] = 0;
++ }
++#endif
++ serjtag_write(pgm, buf, buf_pos);
++#if 0
++fprintf(stderr, "send addr 0x%04x size %d bufsize %d i %d page_write %d\n",
++ addr_wk,buf[2],buf_pos,i,do_page_write);
++#endif
++ if (do_page_write) {
++#ifdef USE_INLINE_WRITE_PAGE
++ serjtag_flush(pgm);
++ usleep(m->max_write_delay);
++ serjtag_recv_j(pgm, buf, 4 + 3, 0);
++#else
++ int rc;
++ serjtag_flush(pgm);
++ addr_wk = (i-1) / m->page_size * m->page_size;
++ rc = avr_write_page(pgm, p, m, addr_wk);
++ if (rc != 0) {
++ return -2;
++ }
++#endif
++ }
++ report_progress(i, n_bytes, NULL);
++ }
++ serjtag_flush(pgm);
++ return i;
++}
++
++
++static int serjtag_paged_write(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m,
++ int page_size, int n_bytes)
++{
++ if (strcmp(m->desc, "flash") == 0) {
++ return serjtag_paged_write_flash(pgm, p, m, page_size, n_bytes);
++ }
++ else if (strcmp(m->desc, "eeprom") == 0) {
++ return serjtag_paged_write_gen(pgm, p, m, page_size, n_bytes);
++ }
++ else {
++ return -2;
++ }
++}
++
++
++static int serjtag_paged_load_gen(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m,
++ int page_size, int n_bytes)
++{
++ unsigned char rbyte;
++ unsigned long i;
++ int rc;
++
++ for (i=0; i<n_bytes; i++) {
++ rc = avr_read_byte_default(pgm, p, m, i, &rbyte);
++ if (rc != 0) {
++ return -2;
++ }
++ m->buf[i] = rbyte;
++ report_progress(i, n_bytes, NULL);
++ }
++ return 0;
++}
++
++
++static struct serjtag_request {
++ int addr;
++ int bytes;
++ int n;
++ struct serjtag_request *next;
++} *req_head,*req_tail,*req_pool;
++
++static void put_request(int addr, int bytes, int n)
++{
++ struct serjtag_request *p;
++ if (req_pool) {
++ p = req_pool;
++ req_pool = p->next;
++ } else {
++ p = malloc(sizeof(struct serjtag_request));
++ if (!p) {
++ fprintf(stderr, "can't alloc memory\n");
++ exit(1);
++ }
++ }
++ memset(p, 0, sizeof(struct serjtag_request));
++ p->addr = addr;
++ p->bytes = bytes;
++ p->n = n;
++ if (req_tail) {
++ req_tail->next = p;
++ req_tail = p;
++ } else {
++ req_head = req_tail = p;
++ }
++}
++
++static int do_request(PROGRAMMER * pgm, AVRMEM *m)
++{
++ struct serjtag_request *p;
++ int addr, bytes, j, n;
++ char buf[128];
++
++ if (!req_head) return 0;
++ p = req_head;
++ req_head = p->next;
++ if (!req_head) req_tail = req_head;
++
++ addr = p->addr;
++ bytes = p->bytes;
++ n = p->n;
++ memset(p, 0, sizeof(struct serjtag_request));
++ p->next = req_pool;
++ req_pool = p;
++
++ serjtag_recv_j(pgm, buf, bytes + 3, 0);
++ for (j=0; j<n; j++) {
++ m->buf[addr++] = buf[3 + 4*j + 3];
++ }
++ return 1;
++}
++
++#define REQ_OUTSTANDINGS 10
++static int serjtag_paged_load_flash(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m,
++ int page_size, int n_bytes)
++{
++ unsigned long i,j,n;
++ //int rc;
++ int addr,addr_save,bytes,buf_pos;
++ int req_count = 0;
++ char buf[128];
++
++ addr = 0;
++ for (i=0; i<n_bytes; ) {
++ buf_pos = 0;
++ buf[buf_pos++] = 'd'; /* PUT TDI Stream */
++ buf[buf_pos++] = JTAG_RECIEVE | use_delay;
++ buf[buf_pos++] = 0; /* bytes : set after */
++ addr_save = addr;
++ for (j=0; j<(JTAG_BUFSIZE-3*2)/4; j++) { // 14 bytes
++ if (i >= n_bytes) break;
++ buf[buf_pos++] = (addr & 1)?0x28:0x20;
++ buf[buf_pos++] = (addr >> 9) & 0xff;
++ buf[buf_pos++] = (addr >> 1) & 0xff;
++ buf[buf_pos++] = 0;
++ addr ++;
++ i++;
++ }
++ n = j;
++ buf[2] = bytes = buf_pos - 3;
++ buf[buf_pos++] = 'r'; /* Request Recieved Data */
++ buf[buf_pos++] = 0;
++ buf[buf_pos++] = 0;
++ serjtag_send(pgm, buf, buf_pos);
++ put_request(addr_save, bytes, n);
++ req_count++;
++ if (req_count > REQ_OUTSTANDINGS)
++ do_request(pgm, m);
++ report_progress(i, n_bytes, NULL);
++ }
++ while (do_request(pgm, m))
++ ;
++ return 0;
++}
++
++static int serjtag_paged_load(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m,
++ int page_size, int n_bytes)
++{
++ if (strcmp(m->desc, "flash") == 0) {
++ return serjtag_paged_load_flash(pgm, p, m, page_size, n_bytes);
++ }
++ else if (strcmp(m->desc, "eeprom") == 0) {
++ return serjtag_paged_load_gen(pgm, p, m, page_size, n_bytes);
++ }
++ else {
++ return -2;
++ }
++}
++
++void serjtag_initpgm(PROGRAMMER * pgm)
++{
++ strcpy(pgm->type, "serjtag");
++
++ /*
++ * mandatory functions
++ */
++ pgm->initialize = serjtag_initialize;
++ pgm->display = serjtag_display;
++ pgm->enable = serjtag_enable;
++ pgm->disable = serjtag_disable;
++ pgm->program_enable = serjtag_program_enable;
++ pgm->chip_erase = serjtag_chip_erase;
++ pgm->cmd = serjtag_cmd;
++ pgm->open = serjtag_open;
++ pgm->close = serjtag_close;
++ pgm->read_byte = avr_read_byte_default;
++ pgm->write_byte = avr_write_byte_default;
++
++ /*
++ * optional functions
++ */
++
++ pgm->paged_write = serjtag_paged_write;
++ pgm->paged_load = serjtag_paged_load;
++ pgm->read_sig_bytes = serjtag_read_sig_bytes;
++}
Added: trunk/dports/cross/avrdude/files/patch-serjtag.h.diff
===================================================================
--- trunk/dports/cross/avrdude/files/patch-serjtag.h.diff (rev 0)
+++ trunk/dports/cross/avrdude/files/patch-serjtag.h.diff 2009-08-06 12:01:16 UTC (rev 55055)
@@ -0,0 +1,25 @@
+--- /dev/null 2009-08-02 22:44:47.000000000 +0200
++++ serjtag.h 2009-08-02 21:56:45.000000000 +0200
+@@ -0,0 +1,22 @@
++#ifndef serjtag_h
++#define serjtag_h
++
++#include "avrpart.h"
++
++#define JTAG_BUFSIZE 64
++
++/* flags */
++#define JTAG_RECIEVE 0x80
++#define JTAG_TMS_HIGH 0x40
++#define JTAG_USE_DELAY 0x10
++#define JTAG_BITS 0x7
++
++/* 's' command (JTAG_SET) flags */
++#define JTAG_SET_TDI 0x80
++#define JTAG_SET_TMS 0x40
++#define JTAG_SET_TCK 0x20
++#define JTAG_SET_DELAY 0x0f
++
++void serjtag_initpgm (PROGRAMMER * pgm);
++
++#endif /* serjtag_h */
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macports-changes/attachments/20090806/fcf789e0/attachment-0001.html>
More information about the macports-changes
mailing list