bug #28520: Programming with USBasp with low clock speed fails
* usbasp.c: Change blocksize depending on sck frequency to avoid usb transmition timeouts. git-svn-id: svn://svn.savannah.nongnu.org/avrdude/trunk/avrdude@897 81a1dc3b-b13d-400b-aceb-764788c761c2
This commit is contained in:
parent
4b515d005c
commit
6a17d2ca34
|
@ -1,3 +1,9 @@
|
||||||
|
2010-01-08 Thomas Fischl <tfischl@gmx.de>
|
||||||
|
|
||||||
|
bug #28520: Programming with USBasp with low clock speed fails
|
||||||
|
* usbasp.c: Change blocksize depending on sck frequency to
|
||||||
|
avoid usb transmition timeouts.
|
||||||
|
|
||||||
2010-01-08 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
2010-01-08 Joerg Wunsch <j.gnu@uriah.heep.sax.de>
|
||||||
|
|
||||||
bug #27505: serbb_posix does not cope with inverted pins
|
bug #27505: serbb_posix does not cope with inverted pins
|
||||||
|
|
82
usbasp.c
82
usbasp.c
|
@ -48,6 +48,7 @@
|
||||||
struct pdata
|
struct pdata
|
||||||
{
|
{
|
||||||
usb_dev_handle *usbhandle;
|
usb_dev_handle *usbhandle;
|
||||||
|
int sckfreq_hz;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define PDATA(pgm) ((struct pdata *)(pgm->cookie))
|
#define PDATA(pgm) ((struct pdata *)(pgm->cookie))
|
||||||
|
@ -340,15 +341,19 @@ static int usbasp_paged_load(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m,
|
||||||
return -2;
|
return -2;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (wbytes) {
|
/* set blocksize depending on sck frequency */
|
||||||
if (wbytes > USBASP_READBLOCKSIZE) {
|
if ((PDATA(pgm)->sckfreq_hz > 0) && (PDATA(pgm)->sckfreq_hz < 10000)) {
|
||||||
blocksize = USBASP_READBLOCKSIZE;
|
blocksize = USBASP_READBLOCKSIZE / 10;
|
||||||
wbytes -= USBASP_READBLOCKSIZE;
|
|
||||||
} else {
|
} else {
|
||||||
blocksize = wbytes;
|
blocksize = USBASP_READBLOCKSIZE;
|
||||||
wbytes = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
while (wbytes) {
|
||||||
|
if (wbytes <= blocksize) {
|
||||||
|
blocksize = wbytes;
|
||||||
|
}
|
||||||
|
wbytes -= blocksize;
|
||||||
|
|
||||||
/* set address (new mode) - if firmware on usbasp support newmode, then they use address from this command */
|
/* set address (new mode) - if firmware on usbasp support newmode, then they use address from this command */
|
||||||
unsigned char temp[4];
|
unsigned char temp[4];
|
||||||
memset(temp, 0, sizeof(temp));
|
memset(temp, 0, sizeof(temp));
|
||||||
|
@ -403,15 +408,21 @@ static int usbasp_paged_write(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m,
|
||||||
return -2;
|
return -2;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (wbytes) {
|
/* set blocksize depending on sck frequency */
|
||||||
if (wbytes > USBASP_WRITEBLOCKSIZE) {
|
if ((PDATA(pgm)->sckfreq_hz > 0) && (PDATA(pgm)->sckfreq_hz < 10000)) {
|
||||||
blocksize = USBASP_WRITEBLOCKSIZE;
|
blocksize = USBASP_WRITEBLOCKSIZE / 10;
|
||||||
wbytes -= USBASP_WRITEBLOCKSIZE;
|
|
||||||
} else {
|
} else {
|
||||||
|
blocksize = USBASP_WRITEBLOCKSIZE;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (wbytes) {
|
||||||
|
|
||||||
|
if (wbytes <= blocksize) {
|
||||||
blocksize = wbytes;
|
blocksize = wbytes;
|
||||||
wbytes = 0;
|
|
||||||
blockflags |= USBASP_BLOCKFLAG_LAST;
|
blockflags |= USBASP_BLOCKFLAG_LAST;
|
||||||
}
|
}
|
||||||
|
wbytes -= blocksize;
|
||||||
|
|
||||||
|
|
||||||
/* set address (new mode) - if firmware on usbasp support newmode, then
|
/* set address (new mode) - if firmware on usbasp support newmode, then
|
||||||
they use address from this command */
|
they use address from this command */
|
||||||
|
@ -451,20 +462,20 @@ static int usbasp_paged_write(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* The list of SCK frequencies in kHz supported by USBasp */
|
/* The list of SCK frequencies in Hz supported by USBasp */
|
||||||
static struct sckoptions_t usbaspSCKoptions[] = {
|
static struct sckoptions_t usbaspSCKoptions[] = {
|
||||||
{ USBASP_ISP_SCK_1500, 1500 },
|
{ USBASP_ISP_SCK_1500, 1500000 },
|
||||||
{ USBASP_ISP_SCK_750, 750 },
|
{ USBASP_ISP_SCK_750, 750000 },
|
||||||
{ USBASP_ISP_SCK_375, 375 },
|
{ USBASP_ISP_SCK_375, 375000 },
|
||||||
{ USBASP_ISP_SCK_187_5, 187.5 },
|
{ USBASP_ISP_SCK_187_5, 187500 },
|
||||||
{ USBASP_ISP_SCK_93_75, 93.75 },
|
{ USBASP_ISP_SCK_93_75, 93750 },
|
||||||
{ USBASP_ISP_SCK_32, 32 },
|
{ USBASP_ISP_SCK_32, 32000 },
|
||||||
{ USBASP_ISP_SCK_16, 16 },
|
{ USBASP_ISP_SCK_16, 16000 },
|
||||||
{ USBASP_ISP_SCK_8, 8 },
|
{ USBASP_ISP_SCK_8, 8000 },
|
||||||
{ USBASP_ISP_SCK_4, 4 },
|
{ USBASP_ISP_SCK_4, 4000 },
|
||||||
{ USBASP_ISP_SCK_2, 2 },
|
{ USBASP_ISP_SCK_2, 2000 },
|
||||||
{ USBASP_ISP_SCK_1, 1 },
|
{ USBASP_ISP_SCK_1, 1000 },
|
||||||
{ USBASP_ISP_SCK_0_5, 0.5 }
|
{ USBASP_ISP_SCK_0_5, 500 }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -481,6 +492,9 @@ static int usbasp_set_sck_period(PROGRAMMER *pgm, double sckperiod)
|
||||||
memset(cmd, 0, sizeof(cmd));
|
memset(cmd, 0, sizeof(cmd));
|
||||||
memset(res, 0, sizeof(res));
|
memset(res, 0, sizeof(res));
|
||||||
|
|
||||||
|
/* reset global sck frequency to auto */
|
||||||
|
PDATA(pgm)->sckfreq_hz = 0;
|
||||||
|
|
||||||
if (sckperiod == 0) {
|
if (sckperiod == 0) {
|
||||||
/* auto sck set */
|
/* auto sck set */
|
||||||
|
|
||||||
|
@ -489,22 +503,21 @@ static int usbasp_set_sck_period(PROGRAMMER *pgm, double sckperiod)
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
double sckfreq = 1 / sckperiod / 1000; /* sck in kHz */
|
int sckfreq = 1 / sckperiod; /* sck in Hz */
|
||||||
double usefreq = 0;
|
int usefreq = 0;
|
||||||
|
|
||||||
if (verbose >= 2)
|
if (verbose >= 2)
|
||||||
fprintf(stderr, "%s: try to set SCK period to %g s (= %g kHz)\n", progname, sckperiod, sckfreq);
|
fprintf(stderr, "%s: try to set SCK period to %g s (= %i Hz)\n", progname, sckperiod, sckfreq);
|
||||||
|
|
||||||
if (sckperiod >= 1500) {
|
|
||||||
clockoption = USBASP_ISP_SCK_1500;
|
|
||||||
usefreq = 1500;
|
|
||||||
|
|
||||||
|
if (sckfreq >= usbaspSCKoptions[0].frequency) {
|
||||||
|
clockoption = usbaspSCKoptions[0].id;
|
||||||
|
usefreq = usbaspSCKoptions[0].frequency;
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
/* find clock option next to given clock */
|
/* find clock option next to given clock */
|
||||||
int i;
|
int i;
|
||||||
for (i = 0; i < sizeof(usbaspSCKoptions) / sizeof(usbaspSCKoptions[0]); i++) {
|
for (i = 0; i < sizeof(usbaspSCKoptions) / sizeof(usbaspSCKoptions[0]); i++) {
|
||||||
if (sckfreq >= usbaspSCKoptions[i].frequency) {
|
if (sckfreq >= usbaspSCKoptions[i].frequency - 1) { /* subtract 1 to compensate round errors */
|
||||||
clockoption = usbaspSCKoptions[i].id;
|
clockoption = usbaspSCKoptions[i].id;
|
||||||
usefreq = usbaspSCKoptions[i].frequency;
|
usefreq = usbaspSCKoptions[i].frequency;
|
||||||
break;
|
break;
|
||||||
|
@ -512,7 +525,10 @@ static int usbasp_set_sck_period(PROGRAMMER *pgm, double sckperiod)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(stderr, "%s: set SCK frequency to %g kHz\n", progname, usefreq);
|
/* save used sck frequency */
|
||||||
|
PDATA(pgm)->sckfreq_hz = usefreq;
|
||||||
|
|
||||||
|
fprintf(stderr, "%s: set SCK frequency to %i Hz\n", progname, usefreq);
|
||||||
}
|
}
|
||||||
|
|
||||||
cmd[0] = clockoption;
|
cmd[0] = clockoption;
|
||||||
|
|
Loading…
Reference in New Issue