Как из AVR-USB162 сделать ISP программатор, совместимый с avrdude Печать
Добавил(а) microsin   

Тем, кто хорошо во всем разбирается, дам только ссылку [1], и дальше можно не читать.

И, на всякий случай, расписываю процесс по шагам (на платформе Windows XP).

1. Скачайте AVRopendous-2009-02-10b.zip [2].

2. Распакуйте из архива 2 файла - AVRISP_Programmer.hex и LUFA AVR ISP Programmer.inf в произвольное удобное место. Файлы в архиве запрятаны в папке AVRopendous \ Firmware \ AVRISP_Programmer.

3. Подключите макетную плату AVR-USB162 к компьютеру через интерфейс USB. Если платка не чистая (в ней что-то записано, но bootloader еще не стерт), то введите платку в режим DFU Flip (активизация USB бутлоадера). Для этого нажмите кнопку SW1 RESET, удерживайте её, нажмите кнопку SW2 HWB и, удерживая её, отпустите кнопку SW1 RESET, потом отпустите SW2 HWB. После этой процедуры в операционной системе Windows должно появиться устройство LibUSB-Win32 Devices\AT90USB162 (см. в Диспетчере Устройств). Если не появилось, значит надо перепрошить bootloader (Вы его каким-то образом стерли).

Прошивка бутлоадера возможна с помощью программатора ISP. Если у Вас в чипе разрешен режим debugWire, то необходимо сначала отключить этот режим, чтобы заработал режим последовательного программирования ISP (в режиме debugWire технология Flip тоже не работает). Чтобы отключить debugWire, проделайте следующее.

- запустите AVR Studio.
- подключите макетную плату с чипом AT90USB162 к JTAGICE mkII через коннектор ISP.
- запустите отладку (чего угодно, хотя бы пустого проекта. У меня на этот случай заготовлена пустая болванка проекта). Build -> Rebuild All. Debug -> Start Debugging.
- после того, как отладка успешно запустится, отключите debugWire. Это делается так - Debug -> JTAGICE mkII Options, закладка Connection, нажмите кнопку Disable debugWIRE. На запрос "... Would you like to disable debugWIRE?" ответьте Yes.

Если бутлоадер DFU FLIP прошит, то можно его активизировать (с помощью уже описанной процедуры с кнопками) и перейти к шагу 4. Если не вышло, то нужно стереть чип ISP-программатором, и этим же программатором залить прошивку AVRISP_Programmer.hex.

4. Запустите программную оболочку Flip (как её устанавливать и что это такое, см. [3]). В меню утилиты Flip выберите Device -> Select... -> AT90USB162. Далее выберите Settings -> Communication -> USB -> USB Port Connection -> Open. Программа должна "ожить" - все недоступные элементы управления (которые были серенькие) должны стать доступны - наше устройство AT90USB162 определилось и готово к прошивке.

5. Откройте файл прошивки AVRISP_Programmer.hex, который мы распаковали на шаге 2 - в меню выберите File -> Load HEX File..., и выберите наш файл AVRISP_Programmer.hex. В левой части окна программы должны стоять галки Erase, Program, Verify, а галка Blank Check должна быть неустановленной. Нажмите кнопку Run слева внизу. За несколько секунд наша платка прошьется.

6. Теперь можно закрыть программу Flip, отключить платку от USB и снова подключить (можно этого не делать, а просто нажать кнопку Start Application в правой нижней части окна программы Flip. Галка Reset должна быть установленной). После этого в системе обнаружится новое устройство, и будет предложено установить для него драйвер. Скормите операционной системе второй распакованный на шаге 2 файл - LUFA AVR ISP Programmer.inf. На предупреждение о неподписанных драйверах говорим "все равно установить". После этого в системе появится новое устройство - виртуальный последовательный порт (его также можно найти в Диспетчере Устройств). У меня порт установился как Ports (COM & LPT)\USB Virtual Serial Port (COM8). Запомните номер/имя порта (COM8), это понадобится для проверки работы программной оболочки программатора avrdude.

7. Теперь можно проверить, видится ли наша платка программой avrdude как программатор. Небольшое отступление для тех, что не в курсе, что такое avrdude. Это open-source проект, который представляет собой консольную программу, управляющую большим количеством существующих в мире программаторов. Avrdude можно свободно скачать из Интернета и скомпилировать, но лучше не париться, а просто взять её из пакета программ WinAVR (как ставить и что это такое [4]), она находится в папке c:\WinAVR-20080610\bin\ (циферки в имени означают просто дату сборки пакета WinAVR). Проверьте как теперь работает AVR-USB162 в качестве программатора - перейдите в папку c:\WinAVR-20080610\bin и вводите в командной строке:

c:\WinAVR-20080610\bin>avrdude -vv -F -P COM8 -c avr910 -p t261

Не случайно выделил COM8 жирным шрифтом - имя порта должно совпадать с тем, который у Вас определился на шаге 7. В ответ должны получить нечто наподобие:

avrdude: Version 5.5, compiled on Jun  9 2008 at 14:32:04
         Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
         System wide configuration file is "c:\WinAVR-20080610\bin\avrdude.conf"
         Using Port            : COM8
         Using Programmer      : avr910
         AVR Part              : ATTINY261
         Chip Erase delay      : 4000 us
         PAGEL                 : PB3
         BS2                   : PB2
         RESET disposition     : dedicated
         RETRY pulse           : SCK
         serial program mode   : yes
         parallel program mode : yes
         Timeout               : 200
         StabDelay             : 100
         CmdexeDelay           : 25
         SyncLoops             : 32
         ByteDelay             : 0
         PollIndex             : 3
         PollValue             : 0x53
         Memory Detail         :
                                  Block Poll               Page
      Polled
           Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
           ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
           eeprom        65    10     4    0 no        128    4     32  4000  4000 0xff 0xff
           flash         65     6    32    0 yes      2048   32     64  4500  4500 0xff 0xff
           signature      0     0     0    0 no          3    0      0     0 0 0x00 0x00
           lock           0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           lfuse          0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           hfuse          0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           efuse          0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           calibration    0     0     0    0 no          1    0      0     0 0 0x00 0x00
         Programmer Type : avr910
         Description     : Atmel Low Cost Serial Programmer
Found programmer: Id = "AVR ISP"; type = S
    Software Version = 2.3; Hardware Version = 1.0
Programmer supports auto addr increment.
Programmer supports the following devices:
    Device code: 0x55 = ATtiny12
    Device code: 0x56 = ATtiny15
    Device code: 0x5e = ATtiny2313
    Device code: 0x76 = ATMEGA8
    Device code: 0x74 = ATMEGA6450
    Device code: 0x72 = ATMEGA32
    Device code: 0x45 = ATMEGA64
    Device code: 0x74 = ATMEGA6450
    Device code: 0x43 = ATMEGA128
    Device code: 0x63 = ATMEGA162
    Device code: 0x78 = ATMEGA169
    Device code: 0x6c = AT90S4434
    Device code: 0x38 = AT90S8515
    Device code: 0x65 = (unknown)
avrdude: warning: selected device is not supported by programmer: t261
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.00s
avrdude: Device signature = 0xff0000
avrdude: Expected signature for ATTINY261 is 1E 91 0C
avrdude: safemode: lfuse reads as FF
avrdude: safemode: Verify error - unable to read hfuse properly. Programmer may
not be reliable.
avrdude: safemode: To protect your AVR the programming will be aborted
avrdude done.  Thank you.

Все в порядке, наша платка заработала (как программатор avr910, "Atmel Low Cost Serial Programmer").

8. Теперь осталось немного поработать паяльником - спаять нехитрую схемку (цоколевка "мамы" стандартная для ISP-коннектора Atmel, и совпадает с цоколевкой коннекторов ISP макетных плат AVR-USB-MEGA16, AVR-USB-TINY45 и AVR-USB162). Хотя... назвать это схемой как-то язык не поворачивается, настолько она простая:
AVR_ISP_Programmer01.JPG

Вот готовое устройство в сборе. Как видно на фотографии - почти все сигналы (кроме RESET) берутся с разъема ISP платы, и нумерация контактов совпадает.
AVR_ISP_Programmer02_IMG_8354.jpg

9. Подключите программируемое устройство к плате программатора. Если устройство потребляет мало тока, то питание для него можно отдельно не подсоединять, а взять прямо с коннектора ISP. При этом перемычка J3, установленная на плате программатора, будет переключать напряжение питания программируемого устройства - 5 или 3.3 вольт (иногда это может понадобиться). Я подключил для программирования плату AVR-USB-MEGA16.

AVR_ISP_Programmer03_IMG_8340.jpg AVR_ISP_Programmer04_IMG_8358.jpg

Записывается прошивка в программируемую плату (firmware) следующей командой:

c:\myproject>c:\WinAVR-20080610\bin\avrdude.exe -vv -F -P COM8 -c avr910 -p m16 -U flash:w:main.hex

Перемычки (fuses) записываются следующей командой:

c:\myproject>c:\WinAVR-20080610\bin\avrdude.exe -v -F -P COM8 -c avr910 -p m16 -U hfuse:w:0x09:m -U lfuse:w:0xff:m

Немного пояснений по опциям командной строки avrdude. В этом примере я записывал в макетную плату AVR-USB-MEGA16 прошивку HID-устройства, управляющего светодиодом (файл main.hex). Он указывается в команде -U flash:w:main.hex. Здесь -U означает "универсальную" команду, которая сразу последовательно делает чтение/запись/проверку чипа. Опции -v и -vv включают подробный и более подробный вывод сообщений соответственно. Опция -F игнорирует слово сигнатуры, считываемое с чипа (оно уникальное для каждого типа чипа Atmel), что позволяет программировать даже те чипы, которые программатор типа avr910 не поддерживает. Опция -P COM8 задает порт подключения программатора (виртуальный COM-порт, о котором мы уже говорили). Опция -c avr910 задает тип программатора. Опция -p m16 задает тип программируемого чипа, в данном случае задан микроконтроллер ATmega16, который установлен на программируемой плате AVR-USB-MEGA16. Опции -U hfuse:w:0x09:m -U lfuse:w:0xff:m задают прошивку байтов фьюзов (старший байт здесь равен 09h, младший ffh).

10. В архиве AVRopendous-2009-02-10b.zip, который мы скачали на шаге 1, есть обновление конфига для avrdude, включающее поддержку чипа AT90USB162. Это обновление имеется в новом файле конфига avrdude.conf, который лежит в той же папке архива AVRopendous\Firmware\AVRISP_Programmer\. Это простой текстовый файл, удобный для чтения и редактирования. Тупо переписывать Ваш старый конфиг на новый не надо, сначала сравните их и посмотрите, чем они отличаются (возможно, Ваш конфиг более новый, и поддержка AT90USB162 там уже есть). Вот секция конфига, которая добавляет поддержку чипа AT90USB162 (можно просто её добавить текстовым редактором в Ваш старый конфигурационный файл avrdude.conf):

#------------------------------------------------------------   
# AT90USB162
#------------------------------------------------------------
 
part
    id               = "usb162";
    desc             = "AT90USB162";
    signature        = 0x1e 0x94 0x82;
    has_jtag         = no;
    chip_erase_delay = 9000;
    pagel            = 0xD7;
    bs2              = 0xA0;
    reset            = dedicated;
    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 0  0 0 0 0",
                       "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;
    chiperasepulsewidth = 0;
    chiperasepolltimeout = 10;
    programfusepulsewidth = 0;
    programfusepolltimeout = 5;
    programlockpulsewidth = 0;
    programlockpolltimeout = 5;
    idr                 = 0x31;
    spmcr               = 0x57;
    rampz               = 0x3b;
    allowfullpagebitstream = no;
    memory "eeprom"
        paged           = no; /* leave this "no" */
        page_size       = 4;  /* for parallel programming */
        size            = 512;
        min_write_delay = 9000;
        max_write_delay = 9000;
        readback_p1     = 0x00;
        readback_p2     = 0x00;
        read            = "  1   0   1   0      0   0   0   0",
                          "  x   x   x   x      x a10  a9  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",
                          "  x   x   x   x      x a10  a9  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  a2  a1  a0",
                          "  i   i   i   i      i   i   i   i";
        writepage       = "  1   1   0   0      0   0   1   0",
                          "  0   0   x   x      x a10  a9  a8",
                          " a7  a6  a5  a4     a3   0   0   0",
                          "  x   x   x   x      x   x   x   x";
        mode            = 0x41;
        delay           = 10;
        blocksize       = 8;
        readsize        = 256;
      ;
    memory "flash"
        paged           = yes;
        size            = 16384;
        page_size       = 128;
        num_pages       = 128;
        min_write_delay = 4500;
        max_write_delay = 4500;
        readback_p1     = 0x00;
        readback_p2     = 0x00;
        read_lo         = "  0   0   1   0      0   0   0   0",
                          "  0 a14 a13 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 a14 a13 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",
                          "  x   x   x   x      x   x   x   x",
                          "  x  a6  a5  a4     a3  a2  a1  a0",
                          "  i   i   i   i      i   i   i   i";
        loadpage_hi     = "  0   1   0   0      1   0   0   0",
                          "  x   x   x   x      x   x   x   x",
                          "  x  a6  a5  a4     a3  a2  a1  a0",
                          "  i   i   i   i      i   i   i   i";
        writepage       = "  0   1   0   0      1   1   0   0",
                          "  0 a14 a13 a12    a11 a10  a9  a8",
                          " a7   x   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;
        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";
        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";
        min_write_delay = 9000;
        max_write_delay = 9000;
      ;
    memory "hfuse"
        size            = 1;
        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";
        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";
        min_write_delay = 9000;
        max_write_delay = 9000;
      ;
    memory "efuse"
        size            = 1;
        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  i i i i";
        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  o o o o  o o o o";
        min_write_delay = 9000;
        max_write_delay = 9000;
      ;
    memory "lock"
        size            = 1;
        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";
        min_write_delay = 9000;
        max_write_delay = 9000;
      ;
    memory "calibration"
        size            = 1;
        read            = "0 0 1 1  1 0 0 0    x x x 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   x  x  x  x   x  x  x  x",
                          "x  x  x  x   x  x a1 a0   o  o  o  o   o  o  o  o";
      ;
  ;

11. Для удобства можно воспользоваться графической оболочкой, которая есть для avrdude - avrdude-gui [5]. Установки приложение не требует - достаточно просто скачать и запустить его:

avrdude-gui01.JPG
Программа почти работоспособна. Говорю почти, потому что у неё есть глюки, которые, правда, исправимы. Вот ошибки, что я нашел:

- неправильно подписана галочка для опции -F Verify the device signature. На самом деле опция -F выключает проверку сигнатуры чипа, т. е. следовало бы подписать "disable verify the device signature".
- неправильно подставляется опция для записи байт фьюзов - неверно указывается шестнадцатеричный формат (без префикса 0x), и в конце опции пропускается суффикс :m.

Обе ошибки поправимы, поскольку можно вручную откорректировать строку "Command line:" перед нажатием кнопки Execute. Правильнее было бы, конечно, поправить исходный код и перекомпилировать программу.

К сожалению, к программе совсем нет справки (как водится у всех GPL-программ). Мне не удалось разобраться, что такое "GiveIO Driver" и 3 кнопки Install, Remove, Status.

[Ссылки]

1. avropendous AVR ISP Programmer (AVRdude-compatible) site:code.google.com.
2. AVRopendous-2009-02-10b.zip site:code.google.com.
3. Макетная плата AVR-USB162.
4. Разработка устройства USB - как начать работу с библиотеками AVR USB (V-USB) и libusb.
5. avrdude-gui site:sourceforge.net.