Mettre un bootloader sur un atmega168 avec un Mac

je n'ai pas d'expérience sur le bootcloner...
En tous les cas belle réalisation.

Nicolas

J'ai enfin réussi à faire tourner le sketch jusqu'au bout, mais apparemment le boot loader n'a pas atteint la cible.

J'aimerais essayer la méthode bit bang, j'ai déjà préparer mes prises, par contre je ne sais pas comment faire avec ma console.

La je maitrise plus :slight_smile:
Perso j'étais parti de cet article tuxgraphics.org: 07052, AvrUsb500v2 -- an open source Atmel AVR Programmer, stk500 V2 compatible, with USB interface

En résumé guido socher propose de faire un programmeur d'avr mais pour résoudre le pb de la poule et de l'oeuf (= comment programmer l'avr qui va servir de programmateur sans programmateur) il utilise le bitbang de la puce ftdi (très lent mais un fois que le bootloader est dessus = OK).

Pour cela il modifie uisp (un équivalent de avrdude qui permet de flasher un avr) pour qu'il puisse utiliser les pins bit bang du FTDI 232R. Il faut faire qq modif de ce code la http://tuxgraphics.org/common/src2/article07052/uisp-20050207-with-usb-bbpg-patch.tar.gz
puis le compiler.

Essaye de compiler ce code ci dessus sous mac et après je t'indiquerai la suite si OK (je sais pas si c'est compilable sous mac).

Ok, je vais essayer de faire ça... :slight_smile:

Je suis tombé sur ce site

et sur un autre

encore un autre avec un fil de discussion sur un forum

Je ne sais pas si c'est adéquat.

J'ai installé MacPack

Ce pack contient ça :

  • gcc 3.4.6
  • gcc 4.2.2
  • GNU binutils 2.18
  • avr-libc 1.4.7
  • avrdude 5.5
  • libusb 0.1.12
  • gdb 6.5
  • avarice 2.7
  • simulavr 0.1.2.2
  • GNU make 3.81

Maintenant, je fais quoi ? :wink:

En ouvrant une console, et en mettant un code du genre :

avrdude -p m168 -c stk500 -P /dev/tty.usbserial-A1001N2Y -i5 .....

J'arrive a avoir une liaison avec ma plaque.

Maintenant il me reste à trouver comment mettre mon bootloader .

en fait ni la distribution de uisp ni celle de avrdude ne fonctionne d'office avec le mode bit bang.
Il te faut donc :

  • récupérer le source (facile)
  • le modifier en appliquant un patch (facile)
  • le compiler (et la c'est pas forcément une partie de plaisir).

c'est déja bon tu arrives a accéder a ta plaque en ligne de commande mais il te reste maintenant a compiler un avrdude pour avoir une commande du genre (avrdude -c ftbb)

Nicolas

Donc si j'ai bien compris il faut que je trouve le code source de Avrdude que j'ai installer, que j'y rajoute un patch et que je recompile le tout ?

La commande que tu dis serait celle qui permet de faire un bit bang ?

Est-ce que ça peux être un fichier qui s'apelle ATmegaBOOT_168.c ?

Je sens que je vais encore y passé quelques soirées ::slight_smile:

non ce fichier est le code source du bootloader qui une fois compilé est a flasher sur l'atmega a l'aide du programmer que tu es en train de construire.

le patch se trouve par la je pense AVR Downloader/UploaDEr - Patches: patch #4330, Adds experimental FTDI bit bang... [Savannah] mais ca doit aller avec une version d'avrdude particuliere

Nicolas

Je dois télécharger les 5 fichiers joints ?

Dans la discussion qui se trouve sur la page que tu m'as indiquée Thomas Fischl parle d'un test qu'il aurait effectué avec Mac osx.

Ceci mis à part j'ai downloadé les 5 fichiers, il me semblent qu'ils sont complémentaires.

Est ce que la méthode bitbang fait passer le bootloader bit par bit ?
si c'est le cas cela doit prendre un certain temps à faire un "burn".

mais ca doit aller avec une version d'avrdude particuliere

Si je me réfère aux dates sur cette page la version avrdude pour ce patch serait la 5.2 ou la 5.3.1 :-?

J'ai trouvé un fichier avrdude.conf avec ça dedans :

...

#
#   programmer
#       id       = <id1> [, <id2> [, <id3>] ...] ;  # <idN> are quoted strings
#       desc     = <description> ;                  # quoted string
#       type     = par | stk500 | stk500v2 | stk500pp | stk500hvsp | stk500generic |
#                  avr910 | butterfly | usbasp |
#                  jtagmki | jtagmkii | jtagmkii_isp | jtagmkii_dw |
#                  dragon_dw | dragon_jtag | dragon_isp | dragon_pp |
#                  dragon_hvsp; # programmer type
#       baudrate = <num> ;                          # baudrate for avr910-programmer
#       vcc      = <num1> [, <num2> ... ] ;         # pin number(s)
#       reset    = <num> ;                          # pin number
#       sck      = <num> ;                          # pin number
#       mosi     = <num> ;                          # pin number
#       miso     = <num> ;                          # pin number
#       errled   = <num> ;                          # pin number
#       rdyled   = <num> ;                          # pin number
#       pgmled   = <num> ;                          # pin number
#       vfyled   = <num> ;                          # pin number

...

Qu'est-ce que c'est ce fichier?

Dans le même fichier j'ai trouvé ça :

#------------------------------------------------------------
# ATmega168
#------------------------------------------------------------

part
    id              = "m168";
    desc            = "ATMEGA168";
     has_debugwire = yes;
     flash_instr   = 0xB6, 0x01, 0x11;
     eeprom_instr  = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00,
                   0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF,
                   0x99, 0xF9, 0xBB, 0xAF;
    stk500_devcode  = 0x86;
    # avr910_devcode = 0x;
    signature       = 0x1e 0x94 0x06;
    pagel           = 0xd7;
    bs2             = 0xc2;
    chip_erase_delay = 9000;
    pgm_enable       = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1",
                       "x x x x x x x x x x x x x x x x";

    chip_erase       = "1 0 1 0 1 1 0 0 1 0 0 x x x x x",
                       "x x x x x x x x x x x x x x x x";

    timeout         = 200;
    stabdelay       = 100;
    cmdexedelay     = 25;
    synchloops      = 32;
    bytedelay       = 0;
    pollindex       = 3;
    pollvalue       = 0x53;
    predelay        = 1;
    postdelay       = 1;
    pollmethod      = 1;

    pp_controlstack     =
      0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F,
      0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F,
      0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B,
      0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00;
    hventerstabdelay    = 100;
    progmodedelay       = 0;
    latchcycles         = 5;
    togglevtg           = 1;
    poweroffdelay       = 15;
    resetdelayms        = 1;
    resetdelayus        = 0;
    hvleavestabdelay    = 15;
    resetdelay          = 15;
    chiperasepulsewidth = 0;
    chiperasepolltimeout = 10;
    programfusepulsewidth = 0;
    programfusepolltimeout = 5;
    programlockpulsewidth = 0;
    programlockpolltimeout = 5;

    memory "eeprom"
        paged           = no;
        page_size       = 4;
        size            = 512;
        min_write_delay = 3600;
        max_write_delay = 3600;
        readback_p1     = 0xff;
        readback_p2     = 0xff;
        read            = " 1 0 1 0 0 0 0 0",
                          " 0 0 0 x x x x a8",
                          " a7 a6 a5 a4 a3 a2 a1 a0",
                          " o o o o o o o o";
    
        write           = " 1 1 0 0 0 0 0 0",
                          " 0 0 0 x x x x a8",
                          " a7 a6 a5 a4 a3 a2 a1 a0",
                          " i i i i i i i i";

      loadpage_lo      = "  1   1   0   0      0   0   0   1",
                    "  0   0   0   0      0   0   0   0",
                    "  0   0   0   0      0   0  a1  a0",
                    "  i   i   i   i      i   i   i   i";

      writepage      = "  1   1   0   0      0   0   1   0",
                    "  0   0   x   x      x   x   x  a8",
                    " a7  a6  a5  a4     a3  a2   0   0",
                    "  x   x   x   x      x   x   x   x";

      mode            = 0x41;
      delay            = 5;
      blocksize      = 4;
      readsize      = 256;
        ;

    memory "flash"
        paged           = yes;
        size            = 16384;
        page_size       = 128;
        num_pages       = 128;
        min_write_delay = 4500;
        max_write_delay = 4500;
        readback_p1     = 0xff;
        readback_p2     = 0xff;
        read_lo         = " 0 0 1 0 0 0 0 0",
                          " 0 0 0 a12 a11 a10 a9 a8",
                          " a7 a6 a5 a4 a3 a2 a1 a0",
                          " o o o o o o o o";
        
        read_hi          = " 0 0 1 0 1 0 0 0",
                           " 0 0 0 a12 a11 a10 a9 a8",
                           " a7 a6 a5 a4 a3 a2 a1 a0",
                           " o o o o o o o o";
        
        loadpage_lo     = " 0 1 0 0 0 0 0 0",
                          " 0 0 0 x x x x x",
                          " x x a5 a4 a3 a2 a1 a0",
                          " i i i i i i i i";
        
        loadpage_hi     = " 0 1 0 0 1 0 0 0",
                          " 0 0 0 x x x x x",
                          " x x a5 a4 a3 a2 a1 a0",
                          " i i i i i i i i";
        
        writepage       = " 0 1 0 0 1 1 0 0",
                          " 0 0 0 a12 a11 a10 a9 a8",
                          " a7 a6 x x x x x x",
                          " x x x x x x x x";

        mode        = 0x41;
        delay       = 6;
        blocksize   = 128;
        readsize    = 256;

        ;
        
    memory "lfuse"
        size            = 1;
        min_write_delay = 4500;
        max_write_delay = 4500;
        read            = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0",
                          "x x x x x x x x o o o o o o o o";
        
        write           = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0",
                          "x x x x x x x x i i i i i i i i";
        ;
    
    memory "hfuse"
        size            = 1;
        min_write_delay = 4500;
        max_write_delay = 4500;
        read            = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0",
                          "x x x x x x x x o o o o o o o o";
        
        write           = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0",
                          "x x x x x x x x i i i i i i i i";
        ;
    
    memory "efuse"
        size            = 1;
        min_write_delay = 4500;
        max_write_delay = 4500;
        read            = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0",
                          "x x x x x x x x x x x x x o o o";
        
        write           = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0",
                          "x x x x x x x x x x x x x i i i";
        ;
    
    memory "lock"
        size            = 1;
        min_write_delay = 4500;
        max_write_delay = 4500;
        read            = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0",
                          "x x x x x x x x x x o o o o o o";
        
        write           = "1 0 1 0 1 1 0 0 1 1 1 x x x x x",
                          "x x x x x x x x 1 1 i i i i i i";
        ;
    
    memory "calibration"
        size            = 1;
        read            = "0 0 1 1 1 0 0 0 0 0 0 x x x x x",
                          "0 0 0 0 0 0 0 0 o o o o o o o o";
        ;
    
    memory "signature"
        size            = 3;
        read            = "0 0 1 1 0 0 0 0 0 0 0 x x x x x",
                          "x x x x x x a1 a0 o o o o o o o o";
        ;
;

J'ai compris que ça se rapporte au Mega168 (c'était pas dur à deviner.. ;D) mais j'aimerais savoir ce que cela indique.

Pour le code source que je dois patcher où est ce qu'il devrait se trouver ?

En cherchant le code source d'avrdude 5.5 pour osx , je suis tombé sur cette page.

Tout en bas il y a ça :

What's New in This Release: [ read full changelog ]

· Add support for the USBtinyISP programmer (patch #6233)
· Add support for the C2N232I serial bitbang programmer (patch #6121)
· Bugfixes

Cela voudrait-il dire que la version 5.5 est déjà patchée bitbang ?

Dans ce topic "stk500" est remplacé par "dasa".

Avec stk500 j'avais quelque chose genre :

programmer is not responding : time out

Avec dasa, j'ai ça :

avrdude -p m168 -c dasa -P /dev/tty.usbserial-A1001N2Y -F

avrdude: AVR device not responding
avrdude: initialization failed, rc=-1
avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.32s

avrdude: Device signature = 0x000000
avrdude: Yikes!  Invalid device signature.
avrdude: Expected signature for ATMEGA168 is 1E 94 06

avrdude: safemode: Fuses OK

avrdude done.  Thank you.

Toujours dans le fichier avrdude.conf, j'ai trouvé ça :

...

#
# some ultra cheap programmers use bitbanging on the 
# serialport.
#
# PC - DB9 - Pins for RS232:
#
# GND   5   -- |O
#              |   O| <-   9   RI
# DTR   4   <- |O   |
#              |   O| <-   8   CTS
# TXD   3   <- |O   |
#              |   O| ->   7   RTS
# RXD   2   -> |O   |
#              |   O| <-   6   DSR
# DCD   1   -> |O
#
# Using RXD is currently not supported.
# Using RI is not supported under Win32 but is supported under Posix.

...


# unknown (dasa in uisp)
# reset=rts sck=dtr mosi=txd miso=cts

programmer
  id    = "dasa";
  desc  = "serial port banging, reset=rts sck=dtr mosi=txd miso=cts";
  type  = serbb;
  reset = 7;
  sck   = 4;
  mosi  = 3;
  miso  = 8;
;


...

et pour ISP :


Je ne sais pas si l'on peut vraiment comparer le port RS232 avec le FT232R, mais si c'est le cas en comparant la configuration pour "dasa" et l'ISP de l'arduino, les pins miso, mosi, sck et reset ne sont pas aux bons endroits.

Je me demande si il ne faut pas refaire la configuration des pins sur la broche icsp ?

Oula j'ai du retard....
Désolé.

Je te répond dans l'ordre :
pour la lenteur du bitbang (bb) oui je confirme que pour burner mon bootloader (avec uisp) j'avais mis 20 minutes (sans la vérification) et le double avec la vérification.
C'est très long mais une fois que tu as le bootloader tu n'as plus besoin de passer par cette methode :slight_smile:
Je te réponds sur la suite plus tard.

Nicolas

Ok, c'est bien ce que je me disais, merci pour ces infos.

Je suis en train de refaire mon installation, je me suis aperçu hier que lorsque j'ai installé Xcode, GCC n'avait pas été installé, c'est chose faite maintenant.

Sur cette page est décrite une procédure pour installer avrdude sur Os X, une des étapes concerne justement gcc.
Est-ce que je dois réinstaller gcc une deuxième fois depuis le répertoire qui contiendra avrdude ?

Edit : je vais essayer sans le réinstaller une deuxième fois, car lorsque j'invoque gcc depuis n'importe quel répertoire, il répond présent...

si tu as gcc en ligne de commande ca doit etre bon.
Sinon pour revenir sur les anciens posts

C2N232I serial bitbang programmer : ca doit etre le bb pour la puce C2N2321 pas pour la FTDI232R

avrdude.conf c'est le fichier de conf de avrdude qui lui permet de saisir les particularités de chaque puce avr.

pour les options tu as stk500 ou dasa qui sont des programmeurs particuliers le tien (grace au patch) sera ftbb si mes souvenirs sont bons

si tu craques avec avrdude je peux t'aider avec uisp

essaye juste ca pour voir si ca vaut le coup d'aller + loin

download ca http://www.tuxgraphics.org/common/src2/article07052/uisp-20050207-with-usb-bbpg-patch.tar.gz

ensuite dans un terminal tu détares et dezippe puis tu fais un cd dans le repertoire créé et tu fais

% ./configure
% make

si ca marche ca veut dire que tu n'es plus très loin de la solution

(je t'enverrai ensuite les modifs de code pour que ca marche sur l'arduino + les lignes de commandes pour faire du bb)

Nicolas

Grosse panne d'internet dans ma région ce soir ... >:(

J'ai essayé d'installer le patch, il s'est apparemment configuré, mais "make" me donne :

.....
DAPA.C:1314: error: 'ftdibb_setBitMode' cannot be used as a function
DAPA.C: In destructor 'TDAPA::~TDAPA()':
DAPA.C:1375: error: 'bbpg_dev_handle' was not declared in this scope
DAPA.C:1375: error: 'ftdibb_setBitMode' cannot be used as a function
DAPA.C:1376: error: 'ftdibb_close' cannot be used as a function
make[2]: *** [DAPA.o] Error 1
make[1]: *** [all] Error 2
make: *** [all-recursive] Error 1

Autrement on dirait que averdude est installé :

$ avrdude -v

avrdude: Version 5.6cvs, compiled on Nov 20 2008 at 19:22:47
         Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/

         System wide configuration file is "/etc/avrdude.conf"
         User configuration file is "/Users/JFS/.avrduderc"
         User configuration file does not exist or is not a regular file, skipping


avrdude: no programmer has been specified on the command line or the config file
         Specify a programmer using the -c option and try again

cette version possède des librairies qui s'appellent bitbang.h ...
mais après je patauge :-?