~ubuntu-branches/ubuntu/precise/avrdude/precise

« back to all changes in this revision

Viewing changes to jtagmkII.c

  • Committer: Bazaar Package Importer
  • Author(s): Michael Biebl
  • Date: 2009-07-14 15:09:17 UTC
  • mfrom: (1.1.7 upstream)
  • Revision ID: james.westby@ubuntu.com-20090714150917-vthf96lweuevgtds
Tags: 5.8-1
* New upstream release.
* Bump Standards-Version to 3.8.2. No further changes.

Show diffs side-by-side

added added

removed removed

Lines of Context:
22
22
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
23
23
 */
24
24
 
25
 
/* $Id: jtagmkII.c,v 1.34 2009/02/27 08:29:30 joerg_wunsch Exp $ */
 
25
/* $Id: jtagmkII.c 836 2009-07-10 22:39:37Z joerg_wunsch $ */
26
26
 
27
27
/*
28
28
 * avrdude interface for Atmel JTAG ICE mkII programmer
364
364
  unsigned char *buf;
365
365
 
366
366
  if (verbose >= 3)
367
 
    fprintf(stderr, "\n%s: jtagmkII_send(): sending %zd bytes\n",
 
367
    fprintf(stderr, "\n%s: jtagmkII_send(): sending %u bytes\n",
368
368
            progname, len);
369
369
 
370
370
  if ((buf = malloc(len + 10)) == NULL)
1016
1016
  return 0;
1017
1017
}
1018
1018
 
 
1019
static int jtagmkII_pre_write(PROGRAMMER * pgm)
 
1020
{
 
1021
  int status;
 
1022
  unsigned char *resp, c;
 
1023
  unsigned char buf[] = { CMND_0x34, 0x0, 0x0, 0x0, 0x0, 0x0 };
 
1024
  if (verbose >= 2)
 
1025
    fprintf(stderr, "%s: jtagmkII_pre_write(): Sending pre-write command: ",
 
1026
            progname);
 
1027
  jtagmkII_send(pgm, buf, 6);
 
1028
 
 
1029
  status = jtagmkII_recv(pgm, &resp);
 
1030
  if (status <= 0) {
 
1031
    if (verbose >= 2)
 
1032
      putc('\n', stderr);
 
1033
    fprintf(stderr,
 
1034
            "%s: jtagmkII_pre_write(): "
 
1035
            "timeout/error communicating with programmer (status %d)\n",
 
1036
            progname, status);
 
1037
    return -1;
 
1038
  }
 
1039
  if (verbose >= 3) {
 
1040
    putc('\n', stderr);
 
1041
    jtagmkII_prmsg(pgm, resp, status);
 
1042
  } else if (verbose == 2)
 
1043
    fprintf(stderr, "0x%02x (%d bytes msg)\n", resp[0], status);
 
1044
  c = resp[0];
 
1045
  free(resp);
 
1046
  if (c != RSP_OK) {
 
1047
    fprintf(stderr,
 
1048
            "%s: jtagmkII_pre_write(): "
 
1049
            "bad response to pre_write command: %s\n",
 
1050
            progname, jtagmkII_get_rc(c));
 
1051
    return -1;
 
1052
  }
 
1053
 
 
1054
  return 0;
 
1055
}
 
1056
 
 
1057
 
1019
1058
static int jtagmkII_program_disable(PROGRAMMER * pgm)
1020
1059
{
1021
1060
  int status;
1509
1548
  int addr, block_size;
1510
1549
  unsigned char *cmd;
1511
1550
  unsigned char *resp;
 
1551
  unsigned char par[4];
1512
1552
  int status, tries;
1513
1553
  long otimeout = serial_recv_timeout;
1514
1554
 
1526
1566
            progname);
1527
1567
    return -1;
1528
1568
  }
 
1569
  if ( p->flags & AVRPART_HAS_PDI )
 
1570
  {
 
1571
   u32_to_b4( par, m->offset );
 
1572
   (void) jtagmkII_setparm( pgm, PAR_PDI_OFFSET_START, par );
 
1573
   u32_to_b4( par, m->offset + m->size );
 
1574
   (void) jtagmkII_setparm( pgm, PAR_PDI_OFFSET_END, par );
 
1575
  }
1529
1576
 
1530
1577
  cmd[0] = CMND_WRITE_MEMORY;
 
1578
  cmd[1] = ( p->flags & AVRPART_HAS_PDI ) ? MTYPE_FLASH : MTYPE_FLASH_PAGE;
1531
1579
  if (strcmp(m->desc, "flash") == 0) {
1532
 
    cmd[1] = MTYPE_FLASH_PAGE;
1533
1580
    PDATA(pgm)->flash_pageaddr = (unsigned long)-1L;
1534
1581
    page_size = PDATA(pgm)->flash_pagesize;
1535
1582
  } else if (strcmp(m->desc, "eeprom") == 0) {
1549
1596
      free(cmd);
1550
1597
      return n_bytes;
1551
1598
    }
1552
 
    cmd[1] = MTYPE_EEPROM_PAGE;
 
1599
    cmd[1] = ( p->flags & AVRPART_HAS_PDI ) ? MTYPE_EEPROM : MTYPE_EEPROM_PAGE;
1553
1600
    PDATA(pgm)->eeprom_pageaddr = (unsigned long)-1L;
1554
1601
    page_size = PDATA(pgm)->eeprom_pagesize;
1555
1602
  }
1556
 
 
 
1603
  if ( cmd[1] == MTYPE_FLASH )  (void)jtagmkII_pre_write(pgm);
 
1604
  
1557
1605
  serial_recv_timeout = 100;
1558
1606
  for (addr = 0; addr < n_bytes; addr += page_size) {
1559
1607
    report_progress(addr, n_bytes,NULL);
1568
1616
              progname, addr, block_size);
1569
1617
 
1570
1618
    u32_to_b4(cmd + 2, page_size);
1571
 
    u32_to_b4(cmd + 6, addr);
 
1619
    u32_to_b4(cmd + 6, addr+m->offset );
1572
1620
 
1573
1621
    /*
1574
1622
     * The JTAG ICE will refuse to write anything but a full page, at
1653
1701
  page_size = m->readsize;
1654
1702
 
1655
1703
  cmd[0] = CMND_READ_MEMORY;
1656
 
  if (strcmp(m->desc, "flash") == 0) {
1657
 
    cmd[1] = MTYPE_FLASH_PAGE;
1658
 
  } else if (strcmp(m->desc, "eeprom") == 0) {
1659
 
    cmd[1] = MTYPE_EEPROM_PAGE;
 
1704
  cmd[1] = ( p->flags & AVRPART_HAS_PDI ) ? MTYPE_FLASH : MTYPE_FLASH_PAGE;
 
1705
  if (strcmp(m->desc, "eeprom") == 0) {
 
1706
    cmd[1] = ( p->flags & AVRPART_HAS_PDI ) ? MTYPE_EEPROM : MTYPE_EEPROM_PAGE;
1660
1707
    if (pgm->flag & PGM_FL_IS_DW)
1661
1708
      return -1;
 
1709
  } else if ( ( strcmp(m->desc, "prodsig") == 0 ) ) {
 
1710
    cmd[1] = MTYPE_PRODSIG;
 
1711
  } else if ( ( strcmp(m->desc, "usersig") == 0 ) ) {
 
1712
    cmd[1] = MTYPE_USERSIG;
1662
1713
  }
1663
 
 
1664
1714
  serial_recv_timeout = 100;
1665
1715
  for (addr = 0; addr < n_bytes; addr += page_size) {
1666
1716
    report_progress(addr, n_bytes,NULL);
1675
1725
              progname, addr, block_size);
1676
1726
 
1677
1727
    u32_to_b4(cmd + 2, block_size);
1678
 
    u32_to_b4(cmd + 6, addr);
 
1728
    u32_to_b4(cmd + 6, addr+m->offset );
1679
1729
 
1680
1730
    tries = 0;
1681
1731
 
1719
1769
      serial_recv_timeout = otimeout;
1720
1770
      return -1;
1721
1771
    }
1722
 
    memcpy(m->buf + addr, resp + 1, status);
 
1772
    memcpy(m->buf + addr, resp + 1, status-1);
1723
1773
    free(resp);
1724
1774
  }
1725
1775
  serial_recv_timeout = otimeout;
1746
1796
  cmd[0] = CMND_READ_MEMORY;
1747
1797
  unsupp = 0;
1748
1798
 
 
1799
  addr += mem->offset;
 
1800
  cmd[1] = ( p->flags & AVRPART_HAS_PDI ) ? MTYPE_FLASH : MTYPE_FLASH_PAGE;
1749
1801
  if (strcmp(mem->desc, "flash") == 0) {
1750
 
    cmd[1] = MTYPE_FLASH_PAGE;
1751
1802
    pagesize = mem->page_size;
1752
1803
    paddr = addr & ~(pagesize - 1);
1753
1804
    paddr_ptr = &PDATA(pgm)->flash_pageaddr;
1754
1805
    cache_ptr = PDATA(pgm)->flash_pagecache;
1755
1806
  } else if (strcmp(mem->desc, "eeprom") == 0) {
1756
 
    if (pgm->flag & PGM_FL_IS_DW) {
 
1807
    if ( (pgm->flag & PGM_FL_IS_DW) || ( p->flags & AVRPART_HAS_PDI ) ) {
1757
1808
      /* debugWire cannot use page access for EEPROM */
1758
1809
      cmd[1] = MTYPE_EEPROM;
1759
1810
    } else {
1782
1833
    cmd[1] = MTYPE_LOCK_BITS;
1783
1834
    if (pgm->flag & PGM_FL_IS_DW)
1784
1835
      unsupp = 1;
 
1836
  } else if (strncmp(mem->desc, "fuse", strlen("fuse")) == 0) {
 
1837
    cmd[1] = MTYPE_FUSE_BITS;
 
1838
  } else if (strcmp(mem->desc, "usersig") == 0) {
 
1839
    cmd[1] = MTYPE_USERSIG;
 
1840
  } else if (strcmp(mem->desc, "prodsig") == 0) {
 
1841
    cmd[1] = MTYPE_PRODSIG;
1785
1842
  } else if (strcmp(mem->desc, "calibration") == 0) {
1786
1843
    cmd[1] = MTYPE_OSCCAL_BYTE;
1787
1844
    if (pgm->flag & PGM_FL_IS_DW)
1816
1873
      }
1817
1874
      return 0;
1818
1875
    }
1819
 
    else if (mem->offset != 0) {
1820
 
      cmd[1] = MTYPE_SRAM;
1821
 
      addr += mem->offset;
1822
 
    }
1823
1876
 
1824
1877
  }
1825
1878
 
1919
1972
    fprintf(stderr, "%s: jtagmkII_write_byte(.., %s, 0x%lx, ...)\n",
1920
1973
            progname, mem->desc, addr);
1921
1974
 
 
1975
  addr += mem->offset;
 
1976
 
1922
1977
  writedata = data;
1923
1978
  cmd[0] = CMND_WRITE_MEMORY;
 
1979
  cmd[1] = ( p->flags & AVRPART_HAS_PDI ) ? MTYPE_FLASH : MTYPE_SPM;
1924
1980
  if (strcmp(mem->desc, "flash") == 0) {
1925
 
    cmd[1] = MTYPE_SPM;
1926
 
    need_progmode = 0;
1927
 
    PDATA(pgm)->flash_pageaddr = (unsigned long)-1L;
1928
 
    if (pgm->flag & PGM_FL_IS_DW)
1929
 
      unsupp = 1;
 
1981
     need_progmode = 0;
 
1982
     PDATA(pgm)->flash_pageaddr = (unsigned long)-1L;
 
1983
     if (pgm->flag & PGM_FL_IS_DW)
 
1984
       unsupp = 1;
1930
1985
  } else if (strcmp(mem->desc, "eeprom") == 0) {
1931
1986
    cmd[1] = MTYPE_EEPROM;
1932
1987
    need_progmode = 0;
1946
2001
    addr = 2;
1947
2002
    if (pgm->flag & PGM_FL_IS_DW)
1948
2003
      unsupp = 1;
 
2004
  } else if (strncmp(mem->desc, "fuse", strlen("fuse")) == 0) {
 
2005
    cmd[1] = MTYPE_FUSE_BITS;
 
2006
  } else if (strcmp(mem->desc, "usersig") == 0) {
 
2007
    cmd[1] = MTYPE_USERSIG;
 
2008
  } else if (strcmp(mem->desc, "prodsig") == 0) {
 
2009
    cmd[1] = MTYPE_PRODSIG;
1949
2010
  } else if (strcmp(mem->desc, "lock") == 0) {
1950
2011
    cmd[1] = MTYPE_LOCK_BITS;
1951
2012
    if (pgm->flag & PGM_FL_IS_DW)
2127
2188
  case PAR_OCD_JTAG_CLK: size = 1; break;
2128
2189
  case PAR_TIMERS_RUNNING: size = 1; break;
2129
2190
  case PAR_DAISY_CHAIN_INFO: size = 4; break;
 
2191
  case PAR_PDI_OFFSET_START:
 
2192
  case PAR_PDI_OFFSET_END: size = 4; break;
2130
2193
  default:
2131
2194
    fprintf(stderr, "%s: jtagmkII_setparm(): unknown parameter 0x%02x\n",
2132
2195
            progname, parm);