Emulateur dongle AVR

Une question sur l’un des microcontrôleurs de la série des AT90, ATtiny ou des ATmega ? Une question sur la programmation assembleur ? C’est par ici.

Modérateur: Modérateur

Emulateur dongle AVR

Messagede thomasalbert1993 le 28 Jan 2008 18:39

Bonjour

Je souhaite réaliser un emulateur de dongle AVR en utilisant un ATMEGA8535 qui programmerait un autre ATMEGA8535. Le principe est simple, j'enverrai par liaison série (converttisseur serie USB en réalité) le contenu du fichier .hex a programmer (sous forme d'une trame de caracteres ascii) à l'émulateur de dongle. Ensuite, ce programme serait stocké dans une RAM. L'émulateur de dongle programmerait ensuite l'atmega8535 à programmer.

Voila voila

Quelqu'un saurait il quels sont les signaux à envoyer pour programmer un aTMEGA8535 (reset, miso, mosi, sck...)

Merci beaucoup

Thomas A.
www.pyrotechnicalement.com !!! Inscrivez vous tous !!!
thomasalbert1993
NOUVEAU
NOUVEAU
 
Messages: 9
Inscription: 19 Déc 2006 18:13

Messagede thomasalbert1993 le 28 Jan 2008 19:54

ça ressemble un peu à cela ce que je souhaite faire :

http://www.reality.be/elo/labos2/usbasp.htm

cette realisation, si je trouvais le code source en c, pourrait m'aider à saoir les trames à envoyer sur les ports MISO, MOSI SCK... etc

mais il n'y a que le .hex de disponible, et je n'y connais rien en hex ou asm etc...

Pourriez vous jetter un oeil ?

merci beaucoup
www.pyrotechnicalement.com !!! Inscrivez vous tous !!!
thomasalbert1993
NOUVEAU
NOUVEAU
 
Messages: 9
Inscription: 19 Déc 2006 18:13

Messagede thomasalbert1993 le 28 Jan 2008 20:31

http://www.fischl.de/usbasp/

sur ce site, on peut telecharger les fvhiers tar.gz qui comprennent les sources en c :) mais je ne copprend pas trop comment ça fonctionne :S

Voici le code du fichier main.c :

Code: Tout sélectionner
/*
  USBasp - USB in-circuit programmer for Atmel AVR controllers

  Thomas Fischl <tfischl@gmx.de>

  License........: GNU GPL v2 (see Readme.txt)
  Target.........: ATMega8 at 12 MHz
  Creation Date..: 2005-02-20
  Last change....: 2007-07-23

  PC2 SCK speed option. GND  -> slow (8khz SCK),
                        open -> fast (375kHz SCK)
*/

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <avr/wdt.h>

#include "usbdrv.h"
#include "isp.h"
#include "clock.h"

#define USBASP_FUNC_CONNECT     1
#define USBASP_FUNC_DISCONNECT  2
#define USBASP_FUNC_TRANSMIT    3
#define USBASP_FUNC_READFLASH   4
#define USBASP_FUNC_ENABLEPROG  5
#define USBASP_FUNC_WRITEFLASH  6
#define USBASP_FUNC_READEEPROM  7
#define USBASP_FUNC_WRITEEEPROM 8
#define USBASP_FUNC_SETLONGADDRESS 9

#define PROG_STATE_IDLE         0
#define PROG_STATE_WRITEFLASH   1
#define PROG_STATE_READFLASH    2
#define PROG_STATE_READEEPROM   3
#define PROG_STATE_WRITEEEPROM  4

#define PROG_BLOCKFLAG_FIRST    1
#define PROG_BLOCKFLAG_LAST     2

#define ledRedOn()    PORTC &= ~(1 << PC1)
#define ledRedOff()   PORTC |= (1 << PC1)
#define ledGreenOn()  PORTC &= ~(1 << PC0)
#define ledGreenOff() PORTC |= (1 << PC0)

static uchar replyBuffer[8];

static uchar prog_state = PROG_STATE_IDLE;

static uchar prog_address_newmode = 0;
static unsigned long prog_address;
static unsigned int prog_nbytes = 0;
static unsigned int prog_pagesize;
static uchar prog_blockflags;
static uchar prog_pagecounter;


uchar usbFunctionSetup(uchar data[8]) {

  uchar len = 0;

  if(data[1] == USBASP_FUNC_CONNECT){

    /* set SCK speed */
    if ((PINC & (1 << PC2)) == 0) {
      ispSetSCKOption(ISP_SCK_SLOW);
    } else {
      ispSetSCKOption(ISP_SCK_FAST);
    }

    /* set compatibility mode of address delivering */
    prog_address_newmode = 0;

    ledRedOn();
    ispConnect();

  } else if (data[1] == USBASP_FUNC_DISCONNECT) {
    ispDisconnect();
    ledRedOff();

  } else if (data[1] == USBASP_FUNC_TRANSMIT) {
    replyBuffer[0] = ispTransmit(data[2]);
    replyBuffer[1] = ispTransmit(data[3]);
    replyBuffer[2] = ispTransmit(data[4]);
    replyBuffer[3] = ispTransmit(data[5]);
    len = 4;

  } else if (data[1] == USBASP_FUNC_READFLASH) {
   
    if (!prog_address_newmode)
      prog_address = (data[3] << 8) | data[2];
   
    prog_nbytes = (data[7] << 8) | data[6];
    prog_state = PROG_STATE_READFLASH;
    len = 0xff; /* multiple in */

  } else if (data[1] == USBASP_FUNC_READEEPROM) {
   
    if (!prog_address_newmode)
       prog_address = (data[3] << 8) | data[2];

    prog_nbytes = (data[7] << 8) | data[6];
    prog_state = PROG_STATE_READEEPROM;
    len = 0xff; /* multiple in */

  } else if (data[1] == USBASP_FUNC_ENABLEPROG) {
    replyBuffer[0] = ispEnterProgrammingMode();;
    len = 1;

  } else if (data[1] == USBASP_FUNC_WRITEFLASH) {

    if (!prog_address_newmode)
      prog_address = (data[3] << 8) | data[2];

    prog_pagesize = data[4];
    prog_blockflags = data[5] & 0x0F;
    prog_pagesize += (((unsigned int)data[5] & 0xF0)<<4);
    if (prog_blockflags & PROG_BLOCKFLAG_FIRST) {
      prog_pagecounter = prog_pagesize;
    }
    prog_nbytes = (data[7] << 8) | data[6];
    prog_state = PROG_STATE_WRITEFLASH;
    len = 0xff; /* multiple out */

  } else if (data[1] == USBASP_FUNC_WRITEEEPROM) {

    if (!prog_address_newmode)
      prog_address = (data[3] << 8) | data[2];

    prog_pagesize = 0;
    prog_blockflags = 0;
    prog_nbytes = (data[7] << 8) | data[6];
    prog_state = PROG_STATE_WRITEEEPROM;
    len = 0xff; /* multiple out */

  } else if(data[1] == USBASP_FUNC_SETLONGADDRESS) {

    /* set new mode of address delivering (ignore address delivered in commands) */
    prog_address_newmode = 1;
    /* set new address */
    prog_address = *((unsigned long*)&data[2]);
  }

  usbMsgPtr = replyBuffer;

  return len;
}


uchar usbFunctionRead(uchar *data, uchar len) {

  uchar i;

  /* check if programmer is in correct read state */
  if ((prog_state != PROG_STATE_READFLASH) &&
      (prog_state != PROG_STATE_READEEPROM)) {
    return 0xff;
  }

  /* fill packet */
  for (i = 0; i < len; i++) {
    if (prog_state == PROG_STATE_READFLASH) {
      data[i] = ispReadFlash(prog_address);
    } else {
      data[i] = ispReadEEPROM(prog_address);
    }
    prog_address++;
  }

  /* last packet? */
  if (len < 8) {
    prog_state = PROG_STATE_IDLE;
  }

  return len;
}


uchar usbFunctionWrite(uchar *data, uchar len) {

  uchar retVal = 0;
  uchar i;

  /* check if programmer is in correct write state */
  if ((prog_state != PROG_STATE_WRITEFLASH) &&
      (prog_state != PROG_STATE_WRITEEEPROM)) {
    return 0xff;
  }


  for (i = 0; i < len; i++) {

    if (prog_state == PROG_STATE_WRITEFLASH) {
      /* Flash */

      if (prog_pagesize == 0) {
   /* not paged */
   ispWriteFlash(prog_address, data[i], 1);
      } else {
   /* paged */
   ispWriteFlash(prog_address, data[i], 0);
   prog_pagecounter --;
   if (prog_pagecounter == 0) {
     ispFlushPage(prog_address, data[i]);
     prog_pagecounter = prog_pagesize;
   }
      }

    } else {
      /* EEPROM */
      ispWriteEEPROM(prog_address, data[i]);
    }

    prog_nbytes --;

    if (prog_nbytes == 0) {
      prog_state = PROG_STATE_IDLE;
      if ((prog_blockflags & PROG_BLOCKFLAG_LAST) &&
     (prog_pagecounter != prog_pagesize)) {

   /* last block and page flush pending, so flush it now */
   ispFlushPage(prog_address, data[i]);
      }
    
     retVal = 1; // Need to return 1 when no more data is to be received
    }

    prog_address ++;
  }

  return retVal;
}


int main(void)
{
  uchar   i, j;

  PORTD = 0;
  PORTB = 0;      /* no pullups on USB and ISP pins */
  DDRD = ~(1 << 2);   /* all outputs except PD2 = INT0 */

  DDRB = ~0;            /* output SE0 for USB reset */
  j = 0;
  while(--j){           /* USB Reset by device only required on Watchdog Reset */
      i = 0;
      while(--i);       /* delay >10ms for USB reset */
  }
  DDRB = 0;             /* all USB and ISP pins inputs */

  DDRC = 0x03;          /* all inputs except PC0, PC1 */
  PORTC = 0xfe;

  clockInit();          /* init timer */

  ispSetSCKOption(ISP_SCK_FAST);

  usbInit();
  sei();
  for(;;){           /* main event loop */
    usbPoll();
  }
  return 0;
}


Voici le conenu du fichier clock.c :

Code: Tout sélectionner
/*
  clock.c - part of USBasp

  Autor..........: Thomas Fischl <tfischl@gmx.de>
  Description....: Provides functions for timing/waiting
  Licence........: GNU GPL v2 (see Readme.txt)
  Creation Date..: 2005-02-23
  Last change....: 2005-04-20
*/

#include <inttypes.h>
#include <avr/io.h>
#include "clock.h"

/* wait time * 320 us */
void clockWait(uint8_t time) {
 
  uint8_t i;
  for (i = 0; i < time; i++) {
    uint8_t starttime = TIMERVALUE;
    while ((uint8_t) (TIMERVALUE - starttime) < CLOCK_T_320us) {}   
  }
}


Voici le conenu du fichier isp.c :

Code: Tout sélectionner
/*
  isp.c - part of USBasp

  Autor..........: Thomas Fischl <tfischl@gmx.de>
  Description....: Provides functions for communication/programming
                   over ISP interface
  Licence........: GNU GPL v2 (see Readme.txt)
  Creation Date..: 2005-02-23
  Last change....: 2007-07-23
*/

#include <avr/io.h>
#include "isp.h"
#include "clock.h"

#define spiHWdisable() SPCR = 0

void spiHWenable() {

  /* enable SPI, master, 375kHz SCK */
  SPCR = (1 << SPE) | (1 << MSTR) | (1 << SPR1);
  SPSR = (1 << SPI2X);
}

void ispSetSCKOption(uchar option) {

  if (option == 0) {

    /* use software spi */
    ispTransmit = ispTransmit_sw;
    //    spiHWdisable();

  } else {

    /* use hardware spi */
    ispTransmit = ispTransmit_hw;

  }
}
 
void ispDelay() {

  uint8_t starttime = TIMERVALUE;
  while ((uint8_t) (TIMERVALUE - starttime) < 12) { }
}

void ispConnect() {

  /* all ISP pins are inputs before */
  /* now set output pins */
  ISP_DDR |= (1 << ISP_RST) | (1 << ISP_SCK) | (1 << ISP_MOSI);

  /* reset device */
  ISP_OUT &= ~(1 << ISP_RST);   /* RST low */
  ISP_OUT &= ~(1 << ISP_SCK);   /* SCK low */

  /* positive reset pulse > 2 SCK (target) */
  ispDelay();
  ISP_OUT |= (1 << ISP_RST);    /* RST high */
  ispDelay();               
  ISP_OUT &= ~(1 << ISP_RST);   /* RST low */

  if (ispTransmit == ispTransmit_hw) {
    spiHWenable();
  }
}

void ispDisconnect() {
 
  /* set all ISP pins inputs */
  ISP_DDR &= ~((1 << ISP_RST) | (1 << ISP_SCK) | (1 << ISP_MOSI));
  /* switch pullups off */
  ISP_OUT &= ~((1 << ISP_RST) | (1 << ISP_SCK) | (1 << ISP_MOSI));

  /* disable hardware SPI */
  spiHWdisable();
}

uchar ispTransmit_sw(uchar send_byte) {

  uchar rec_byte = 0;
  uchar i;
  for (i = 0; i < 8; i++) {

    /* set MSB to MOSI-pin */
    if ((send_byte & 0x80) != 0) {
      ISP_OUT |= (1 << ISP_MOSI);  /* MOSI high */
    } else {
      ISP_OUT &= ~(1 << ISP_MOSI); /* MOSI low */
    }
    /* shift to next bit */
    send_byte  = send_byte << 1;

    /* receive data */
    rec_byte = rec_byte << 1;
    if ((ISP_IN & (1 << ISP_MISO)) != 0) {
      rec_byte++;
    }

    /* pulse SCK */
    ISP_OUT |= (1 << ISP_SCK);     /* SCK high */
    ispDelay();
    ISP_OUT &= ~(1 << ISP_SCK);    /* SCK low */
    ispDelay();
  }
   
  return rec_byte;
}

uchar ispTransmit_hw(uchar send_byte) {
  SPDR = send_byte;
 
  while (!(SPSR & (1 << SPIF)));
  return SPDR;
}
   
uchar ispEnterProgrammingMode() {
  uchar check;
  uchar count = 32;

  while (count--) {
    ispTransmit(0xAC);
    ispTransmit(0x53);
    check = ispTransmit(0);
    ispTransmit(0);
   
    if (check == 0x53) {
      return 0;
    }

    spiHWdisable();
   
    /* pulse SCK */
    ISP_OUT |= (1 << ISP_SCK);     /* SCK high */
    ispDelay();
    ISP_OUT &= ~(1 << ISP_SCK);    /* SCK low */
    ispDelay();

    if (ispTransmit == ispTransmit_hw) {
      spiHWenable();
    }
 
  }
 
  return 1;  /* error: device dosn't answer */
}

uchar ispReadFlash(unsigned long address) {
  ispTransmit(0x20 | ((address & 1) << 3));
  ispTransmit(address >> 9);
  ispTransmit(address >> 1);
  return ispTransmit(0);
}


uchar ispWriteFlash(unsigned long address, uchar data, uchar pollmode) {

  /* 0xFF is value after chip erase, so skip programming
  if (data == 0xFF) {
    return 0;
  }
  */

  ispTransmit(0x40 | ((address & 1) << 3));
  ispTransmit(address >> 9);
  ispTransmit(address >> 1);
  ispTransmit(data);

  if (pollmode == 0)
    return 0;

  if (data == 0x7F) {
    clockWait(15); /* wait 4,8 ms */
    return 0;
  } else {

    /* polling flash */
    uchar retries = 30;
    uint8_t starttime = TIMERVALUE;
    while (retries != 0) {
      if (ispReadFlash(address) != 0x7F) {
   return 0;
      };
     
      if ((uint8_t) (TIMERVALUE - starttime) > CLOCK_T_320us) {
   starttime = TIMERVALUE;
   retries --;
      }

    }
    return 1; /* error */
  }

}


uchar ispFlushPage(unsigned long address, uchar pollvalue) {
  ispTransmit(0x4C);
  ispTransmit(address >> 9);
  ispTransmit(address >> 1);
  ispTransmit(0);


  if (pollvalue == 0xFF) {
    clockWait(15);
    return 0;
  } else {

    /* polling flash */
    uchar retries = 30;
    uint8_t starttime = TIMERVALUE;

    while (retries != 0) {
      if (ispReadFlash(address) != 0xFF) {
   return 0;
      };

      if ((uint8_t) (TIMERVALUE - starttime) > CLOCK_T_320us) {
   starttime = TIMERVALUE;
   retries --;
      }

    }

    return 1; /* error */
  }
   
}


uchar ispReadEEPROM(unsigned int address) {
  ispTransmit(0xA0);
  ispTransmit(address >> 8);
  ispTransmit(address);
  return ispTransmit(0);
}


uchar ispWriteEEPROM(unsigned int address, uchar data) {

  ispTransmit(0xC0);
  ispTransmit(address >> 8);
  ispTransmit(address);
  ispTransmit(data);

  clockWait(30); // wait 9,6 ms

  return 0;
  /*
  if (data == 0xFF) {
    clockWait(30); // wait 9,6 ms
    return 0;
  } else {

    // polling eeprom
    uchar retries = 30; // about 9,6 ms
    uint8_t starttime = TIMERVALUE;

    while (retries != 0) {
      if (ispReadEEPROM(address) != 0xFF) {
   return 0;
      };

      if ((uint8_t) (TIMERVALUE - starttime) > CLOCK_T_320us) {
   starttime = TIMERVALUE;
   retries --;
      }

    }
    return 1; // error
  }
  */

}


voici le conetnu du fichier clock.h :

Code: Tout sélectionner
/*
  clock.h - part of USBasp

  Autor..........: Thomas Fischl <tfischl@gmx.de>
  Description....: Provides functions for timing/waiting
  Licence........: GNU GPL v2 (see Readme.txt)
  Creation Date..: 2005-02-23
  Last change....: 2006-11-16
*/

#ifndef __clock_h_included__
#define   __clock_h_included__

#define F_CPU           12000000L   /* 12MHz */
#define TIMERVALUE      TCNT0
#define CLOCK_T_320us   60

#ifdef __AVR_ATmega8__
#define TCCR0B  TCCR0
#endif

/* set prescaler to 64 */
#define clockInit()  TCCR0B = (1 << CS01) | (1 << CS00);

/* wait time * 320 us */
void clockWait(uint8_t time);

#endif /* __clock_h_included__ */


Voici le contenu du fichier isp.h :

Code: Tout sélectionner
/*
  isp.h - part of USBasp

  Autor..........: Thomas Fischl <tfischl@gmx.de>
  Description....: Provides functions for communication/programming
                   over ISP interface
  Licence........: GNU GPL v2 (see Readme.txt)
  Creation Date..: 2005-02-23
  Last change....: 2007-07-23
*/

#ifndef __isp_h_included__
#define   __isp_h_included__

#ifndef uchar
#define   uchar   unsigned char
#endif

#define   ISP_OUT   PORTB
#define ISP_IN    PINB
#define ISP_DDR   DDRB
#define ISP_RST   PB2
#define ISP_MOSI  PB3
#define ISP_MISO  PB4
#define ISP_SCK   PB5

#define ISP_DELAY 1
#define ISP_SCK_SLOW 0
#define ISP_SCK_FAST 1

/* Prepare connection to target device */
void ispConnect();

/* Close connection to target device */
void ispDisconnect();

/* read an write a byte from isp using software (slow) */
uchar ispTransmit_sw(uchar send_byte);

/* read an write a byte from isp using hardware (fast) */
uchar ispTransmit_hw(uchar send_byte);

/* enter programming mode */
uchar ispEnterProgrammingMode();

/* read byte from eeprom at given address */
uchar ispReadEEPROM(unsigned int address);

/* write byte to flash at given address */
uchar ispWriteFlash(unsigned long address, uchar data, uchar pollmode);

uchar ispFlushPage(unsigned long address, uchar pollvalue);

/* read byte from flash at given address */
uchar ispReadFlash(unsigned long address);

/* write byte to eeprom at given address */
uchar ispWriteEEPROM(unsigned int address, uchar data);

/* pointer to sw or hw transmit function */
uchar (*ispTransmit)(uchar);

/* set SCK speed. call before ispConnect! */
void ispSetSCKOption(uchar sckoption);

#endif /* __isp_h_included__ */


Voici le contenu du fichier usbconfig.h :

Code: Tout sélectionner
/* Name: usbconfig.h
* Project: AVR USB driver
* Author: Christian Starkjohann, Thomas Fischl
* Creation Date: 2005-04-01
* Tabsize: 4
* Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH
* License: GNU GPL v2 (see License.txt) or proprietary (CommercialLicense.txt)
*/

#ifndef __usbconfig_h_included__
#define __usbconfig_h_included__

/*
General Description:
This file contains parts of the USB driver which can be configured and can or
must be adapted to your hardware.

Please note that the usbdrv contains a usbconfig-prototype.h file now. We
recommend that you use that file as a template because it will always list
the newest features and options.
*/

/* ---------------------------- Hardware Config ---------------------------- */

#define USB_CFG_IOPORTNAME      B
/* This is the port where the USB bus is connected. When you configure it to
* "B", the registers PORTB, PINB and DDRB will be used.
*/
#define USB_CFG_DMINUS_BIT      0
/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected.
* This may be any bit in the port.
*/
#define USB_CFG_DPLUS_BIT       1
/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected.
* This may be any bit in the port. Please note that D+ must also be connected
* to interrupt pin INT0!
*/
/* #define USB_CFG_CLOCK_KHZ       (F_CPU/1000) */
/* Clock rate of the AVR in MHz. Legal values are 12000, 16000 or 16500.
* The 16.5 MHz version of the code requires no crystal, it tolerates +/- 1%
* deviation from the nominal frequency. All other rates require a precision
* of 2000 ppm and thus a crystal!
* Default if not specified: 12 MHz
*/

/* ----------------------- Optional Hardware Config ------------------------ */

/* #define USB_CFG_PULLUP_IOPORTNAME   D */
/* If you connect the 1.5k pullup resistor from D- to a port pin instead of
* V+, you can connect and disconnect the device from firmware by calling
* the macros usbDeviceConnect() and usbDeviceDisconnect() (see usbdrv.h).
* This constant defines the port on which the pullup resistor is connected.
*/
/* #define USB_CFG_PULLUP_BIT          4 */
/* This constant defines the bit number in USB_CFG_PULLUP_IOPORT (defined
* above) where the 1.5k pullup resistor is connected. See description
* above for details.
*/

/* --------------------------- Functional Range ---------------------------- */

#define USB_CFG_HAVE_INTRIN_ENDPOINT    0
/* Define this to 1 if you want to compile a version with two endpoints: The
* default control endpoint 0 and an interrupt-in endpoint 1.
*/
#define USB_CFG_HAVE_INTRIN_ENDPOINT3   0
/* Define this to 1 if you want to compile a version with three endpoints: The
* default control endpoint 0, an interrupt-in endpoint 1 and an interrupt-in
* endpoint 3. You must also enable endpoint 1 above.
*/
#define USB_CFG_IMPLEMENT_HALT          0
/* Define this to 1 if you also want to implement the ENDPOINT_HALT feature
* for endpoint 1 (interrupt endpoint). Although you may not need this feature,
* it is required by the standard. We have made it a config option because it
* bloats the code considerably.
*/
#define USB_CFG_INTR_POLL_INTERVAL      10
/* If you compile a version with endpoint 1 (interrupt-in), this is the poll
* interval. The value is in milliseconds and must not be less than 10 ms for
* low speed devices.
*/
#define USB_CFG_IS_SELF_POWERED         0
/* Define this to 1 if the device has its own power supply. Set it to 0 if the
* device is powered from the USB bus.
*/
#define USB_CFG_MAX_BUS_POWER           50
/* Set this variable to the maximum USB bus power consumption of your device.
* The value is in milliamperes. [It will be divided by two since USB
* communicates power requirements in units of 2 mA.]
*/
#define USB_CFG_IMPLEMENT_FN_WRITE      1
/* Set this to 1 if you want usbFunctionWrite() to be called for control-out
* transfers. Set it to 0 if you don't need it and want to save a couple of
* bytes.
*/
#define USB_CFG_IMPLEMENT_FN_READ       1
/* Set this to 1 if you need to send control replies which are generated
* "on the fly" when usbFunctionRead() is called. If you only want to send
* data from a static buffer, set it to 0 and return the data from
* usbFunctionSetup(). This saves a couple of bytes.
*/
#define USB_CFG_IMPLEMENT_FN_WRITEOUT   0
/* Define this to 1 if you want to use interrupt-out (or bulk out) endpoint 1.
* You must implement the function usbFunctionWriteOut() which receives all
* interrupt/bulk data sent to endpoint 1.
*/
#define USB_CFG_HAVE_FLOWCONTROL        0
/* Define this to 1 if you want flowcontrol over USB data. See the definition
* of the macros usbDisableAllRequests() and usbEnableAllRequests() in
* usbdrv.h.
*/

/* -------------------------- Device Description --------------------------- */

#define  USB_CFG_VENDOR_ID  0xc0, 0x16  /* 5824 in dec, stands for VOTI */
/* USB vendor ID for the device, low byte first. If you have registered your
* own Vendor ID, define it here. Otherwise you use obdev's free shared
* VID/PID pair. Be sure to read USBID-License.txt for rules!
*/
#define USB_CFG_DEVICE_ID   0xdc, 0x05  /* 1500 in dec, obdev's free PID */
/* This is the ID of the product, low byte first. It is interpreted in the
* scope of the vendor ID. If you have registered your own VID with usb.org
* or if you have licensed a PID from somebody else, define it here. Otherwise
* you use obdev's free shared VID/PID pair. Be sure to read the rules in
* USBID-License.txt!
*/
#define USB_CFG_DEVICE_VERSION  0x02, 0x01
/* Version number of the device: Minor number first, then major number.
*/
#define   USB_CFG_VENDOR_NAME     'w', 'w', 'w', '.', 'f', 'i', 's', 'c', 'h', 'l', '.', 'd', 'e'
#define USB_CFG_VENDOR_NAME_LEN 13
/* These two values define the vendor name returned by the USB device. The name
* must be given as a list of characters under single quotes. The characters
* are interpreted as Unicode (UTF-16) entities.
* If you don't want a vendor name string, undefine these macros.
* ALWAYS define a vendor name containing your Internet domain name if you use
* obdev's free shared VID/PID pair. See the file USBID-License.txt for
* details.
*/
#define   USB_CFG_DEVICE_NAME      'U', 'S', 'B', 'a', 's', 'p'
#define   USB_CFG_DEVICE_NAME_LEN   6
/* Same as above for the device name. If you don't want a device name, undefine
* the macros. See the file USBID-License.txt before you assign a name.
*/
/*#define USB_CFG_SERIAL_NUMBER   'N', 'o', 'n', 'e' */
/*#define USB_CFG_SERIAL_NUMBER_LEN   0 */
/* Same as above for the serial number. If you don't want a serial number,
* undefine the macros.
* It may be useful to provide the serial number through other means than at
* compile time. See the section about descriptor properties below for how
* to fine tune control over USB descriptors such as the string descriptor
* for the serial number.
*/
#define USB_CFG_DEVICE_CLASS    0xff
#define USB_CFG_DEVICE_SUBCLASS 0
/* See USB specification if you want to conform to an existing device class.
*/
#define USB_CFG_INTERFACE_CLASS     0
#define USB_CFG_INTERFACE_SUBCLASS  0
#define USB_CFG_INTERFACE_PROTOCOL  0
/* See USB specification if you want to conform to an existing device class or
* protocol.
*/
#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH    0   /* total length of report descriptor */
/* Define this to the length of the HID report descriptor, if you implement
* an HID device. Otherwise don't define it or define it to 0.
*/

/* ------------------- Fine Control over USB Descriptors ------------------- */
/* If you don't want to use the driver's default USB descriptors, you can
* provide our own. These can be provided as (1) fixed length static data in
* flash memory, (2) fixed length static data in RAM or (3) dynamically at
* runtime in the function usbFunctionDescriptor(). See usbdrv.h for more
* information about this function.
* Descriptor handling is configured through the descriptor's properties. If
* no properties are defined or if they are 0, the default descriptor is used.
* Possible properties are:
*   + USB_PROP_IS_DYNAMIC: The data for the descriptor should be fetched
*     at runtime via usbFunctionDescriptor().
*   + USB_PROP_IS_RAM: The data returned by usbFunctionDescriptor() or found
*     in static memory is in RAM, not in flash memory.
*   + USB_PROP_LENGTH(len): If the data is in static memory (RAM or flash),
*     the driver must know the descriptor's length. The descriptor itself is
*     found at the address of a well known identifier (see below).
* List of static descriptor names (must be declared PROGMEM if in flash):
*   char usbDescriptorDevice[];
*   char usbDescriptorConfiguration[];
*   char usbDescriptorHidReport[];
*   char usbDescriptorString0[];
*   int usbDescriptorStringVendor[];
*   int usbDescriptorStringDevice[];
*   int usbDescriptorStringSerialNumber[];
* Other descriptors can't be provided statically, they must be provided
* dynamically at runtime.
*
* Descriptor properties are or-ed or added together, e.g.:
* #define USB_CFG_DESCR_PROPS_DEVICE   (USB_PROP_IS_RAM | USB_PROP_LENGTH(18))
*
* The following descriptors are defined:
*   USB_CFG_DESCR_PROPS_DEVICE
*   USB_CFG_DESCR_PROPS_CONFIGURATION
*   USB_CFG_DESCR_PROPS_STRINGS
*   USB_CFG_DESCR_PROPS_STRING_0
*   USB_CFG_DESCR_PROPS_STRING_VENDOR
*   USB_CFG_DESCR_PROPS_STRING_PRODUCT
*   USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER
*   USB_CFG_DESCR_PROPS_HID
*   USB_CFG_DESCR_PROPS_HID_REPORT
*   USB_CFG_DESCR_PROPS_UNKNOWN (for all descriptors not handled by the driver)
*
*/

#define USB_CFG_DESCR_PROPS_DEVICE                  0
#define USB_CFG_DESCR_PROPS_CONFIGURATION           0
#define USB_CFG_DESCR_PROPS_STRINGS                 0
#define USB_CFG_DESCR_PROPS_STRING_0                0
#define USB_CFG_DESCR_PROPS_STRING_VENDOR           0
#define USB_CFG_DESCR_PROPS_STRING_PRODUCT          0
#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER    0
#define USB_CFG_DESCR_PROPS_HID                     0
#define USB_CFG_DESCR_PROPS_HID_REPORT              0
#define USB_CFG_DESCR_PROPS_UNKNOWN                 0

/* ----------------------- Optional MCU Description ------------------------ */

/* The following configurations have working defaults in usbdrv.h. You
* usually don't need to set them explicitly. Only if you want to run
* the driver on a device which is not yet supported or with a compiler
* which is not fully supported (such as IAR C) or if you use a differnt
* interrupt than INT0, you may have to define some of these.
*/
/* #define USB_INTR_CFG            MCUCR */
/* #define USB_INTR_CFG_SET        ((1 << ISC00) | (1 << ISC01)) */
/* #define USB_INTR_CFG_CLR        0 */
/* #define USB_INTR_ENABLE         GIMSK */
/* #define USB_INTR_ENABLE_BIT     INT0 */
/* #define USB_INTR_PENDING        GIFR */
/* #define USB_INTR_PENDING_BIT    INTF0 */

#endif /* __usbconfig_h_included__ */


Voila si quelque'un pourrait m'aider à comprendre et trouver les trames MISO MOSI ET SCK à envoyer en fonction du fichier .hex

merci

Thomas
www.pyrotechnicalement.com !!! Inscrivez vous tous !!!
thomasalbert1993
NOUVEAU
NOUVEAU
 
Messages: 9
Inscription: 19 Déc 2006 18:13

Messagede lebomb le 25 Fév 2008 14:23

ce que tu decris est identique au programmateur AVR910
J'en ai fait un et j'ai changé le cable serie par un module bluettoth !
Maintenant j'ai donc un programmateur ISP sans fil, c'est trop de la balle.

J'ai mis une description sur mon site www.lebomb.fr
rubrique elec.
Si tu veux le schéma, envoi un mail
lebomb
HABITUE
HABITUE
 
Messages: 47
Inscription: 13 Oct 2006 16:48


Retourner vers AT90-ATmega-ATtiny

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités

cron