From c72b97d2a80145f6c8bc0ccfa8260ef2bac21a5e Mon Sep 17 00:00:00 2001 From: Hannes Weisbach Date: Mon, 6 May 2013 12:50:42 +0000 Subject: [PATCH] avrftdi_tpi.[c|h]: integrate avr_tpi_[program_enable,chip_erase]() git-svn-id: svn://svn.savannah.nongnu.org/avrdude/trunk/avrdude@1168 81a1dc3b-b13d-400b-aceb-764788c761c2 --- ChangeLog | 4 +++ avrftdi_tpi.c | 92 +++------------------------------------------------ avrftdi_tpi.h | 2 -- 3 files changed, 8 insertions(+), 90 deletions(-) diff --git a/ChangeLog b/ChangeLog index 015c01fd..9caef9ac 100644 --- a/ChangeLog +++ b/ChangeLog @@ -46,6 +46,10 @@ avrftdi_tpi_[read,write]_byte(). Remove unnecessary set_pin call to set MOSI high, speeds up I/O. Removes SKEY array, moves it to tpi.h. + Integrate new avr_tpi_[program_enable,chip_erase]() and functions into + avrftdi_tpi. + * avrftdi_tpi.h: Remove avrftdi_tpi_[program_enable,chip_erase] forward + declarations. * avr.c: Adds avr_tpi_chip_erase() generic TPI chip erase function. Adds avr_tpi_program_enable() - generic TPI external programming enable function. Sets guard time, reads identification register, sends SKEY command diff --git a/avrftdi_tpi.c b/avrftdi_tpi.c index 7b34e213..c949f66e 100644 --- a/avrftdi_tpi.c +++ b/avrftdi_tpi.c @@ -22,6 +22,7 @@ #include static void avrftdi_tpi_disable(PROGRAMMER *); +static int avrftdi_tpi_program_enable(PROGRAMMER * pgm, AVRPART * p); static void avrftdi_debug_frame(uint16_t frame) @@ -77,7 +78,7 @@ avrftdi_tpi_initialize(PROGRAMMER * pgm, AVRPART * p) pgm->program_enable = avrftdi_tpi_program_enable; pgm->cmd_tpi = avrftdi_cmd_tpi; - pgm->chip_erase = avrftdi_tpi_chip_erase; + pgm->chip_erase = avr_tpi_chip_erase; pgm->disable = avrftdi_tpi_disable; pgm->paged_load = NULL; @@ -213,74 +214,10 @@ avrftdi_tpi_read_byte(PROGRAMMER * pgm, unsigned char * byte) return err; } -int +static int avrftdi_tpi_program_enable(PROGRAMMER * pgm, AVRPART * p) { - int retry; - int err; - unsigned char cmd[2]; - unsigned char response; - - log_info("TPI program enable\n"); - - /* set guard time */ - cmd[0] = TPI_OP_SSTCS(TPIPCR); - cmd[1] = TPIPCR_GT_2b; - pgm->cmd_tpi(pgm, cmd, sizeof(cmd), NULL, 0); - - /* send SKEY */ - pgm->cmd_tpi(pgm, tpi_skey_cmd, sizeof(tpi_skey_cmd), NULL, 0); - - /* check if device is ready */ - for(retry = 0; retry < 10; retry++) - { - log_info("Reading Identification register\n"); - cmd[0] = TPI_OP_SLDCS(TPIIR); - err = pgm->cmd_tpi(pgm, cmd, 1, &response, sizeof(response)); - if(err || response != TPI_IDENT_CODE) - { - log_err("Error. Sending break.\n"); - avrftdi_tpi_break(pgm); - avrftdi_tpi_break(pgm); - continue; - } - - log_info("Reading Status register\n"); - cmd[0] = TPI_OP_SLDCS(TPISR); - err = pgm->cmd_tpi(pgm, cmd, 1, &response, sizeof(response)); - if(err || !(response & TPISR_NVMEN)) - { - log_err("Error. Sending break.\n"); - avrftdi_tpi_break(pgm); - avrftdi_tpi_break(pgm); - continue; - } - - return 0; - } - - log_err("Error connecting to target.\n"); - return -1; -} - -static int -avrftdi_tpi_nvm_waitbusy(PROGRAMMER * pgm) -{ - const unsigned char cmd = TPI_OP_SIN(NVMCSR); - unsigned char response; - int err; - int retry; - - for(retry = 50; retry > 0; retry--) - { - pgm->cmd_tpi(pgm, &cmd, sizeof(cmd), &response, sizeof(response)); - //TODO usleep on bsy? - if(err || (response & NVMCSR_BSY)) - continue; - return 0; - } - - return -1; + return avr_tpi_program_enable(pgm, p, TPIPCR_GT_2b); } int @@ -306,27 +243,6 @@ avrftdi_cmd_tpi(PROGRAMMER * pgm, unsigned char cmd[], int cmd_len, return 0; } -int -avrftdi_tpi_chip_erase(PROGRAMMER * pgm, AVRPART * p) -{ - unsigned char cmd [] = { - TPI_OP_SSTPR(0), - 0x01, - TPI_OP_SSTPR(1), - 0x40, - TPI_OP_SOUT(NVMCMD), - NVMCMD_CHIP_ERASE, - TPI_OP_SST_INC, - 0x00 }; - pgm->cmd_tpi(pgm, cmd, sizeof(cmd), NULL, 0); - - avr_tpi_poll_nvmbsy(pgm); - - usleep(p->chip_erase_delay); - - return 0; -} - static void avrftdi_tpi_disable(PROGRAMMER * pgm) { diff --git a/avrftdi_tpi.h b/avrftdi_tpi.h index d38fa887..edf2f7c6 100644 --- a/avrftdi_tpi.h +++ b/avrftdi_tpi.h @@ -5,8 +5,6 @@ //int avrftdi_tpi_write_byte(PROGRAMMER * pgm, unsigned char byte); //int avrftdi_tpi_read_byte(PROGRAMMER * pgm, unsigned char * byte); -int avrftdi_tpi_program_enable(PROGRAMMER * pgm, AVRPART * p); -int avrftdi_tpi_chip_erase(PROGRAMMER * pgm, AVRPART * p); int avrftdi_cmd_tpi(PROGRAMMER * pgm, unsigned char cmd[], int cmd_len, unsigned char res[], int res_len); int avrftdi_tpi_initialize(PROGRAMMER * pgm, AVRPART * p);