Оказалось, что подружить дудку с клоном avrisp_mkII проще простого, нужно было всего-то откатиться на версию avrdude 5.11. Вычитал на одном из форумов, что у дудки, начиная с версии 6.0.1, начались какие-то проблемы с программаторами avrisp_mkII, которые не исправлены до сих пор (до версии 6.3).
Об этом нужно писать большими красными буквами на всех форумах!Поэтому, все что нам нужно, это программатор
avrisp_mkII с "правильной" прошивкой под драйвер libusb, собственно, сам драйвер
libusb-win32-1.2.6.0, и
avrdude 5.11. Все.
Ну а далее поделюсь особенностью прошивки стандартного атмеловского загрузчика в atxmega128a4u при помощи avrdude.
Сам загрузчик был скачен с сайта атмела, архив назывался
AVR1916.zip - в нем содержатся загрузчики под всю линейку хмеги с индексом "u". Меня интересовал atxmega128a4u_104.hex. Здесь же отмечу, что в родном конфиге avrdude 5.11 нет данных для контроллера
atxmega128a4u, но есть
atxmega128a4, у которых сигнатуры и адресные пространства одинаковы, по крайней мере, по части расположения программы, загрузчика и фьюзов. Поэтому в командной строке для дудки выбираем контроллер atxmega128a4:
avrdude -c avrispmkII -P usb -p x128a4 -e -U boot:w:atxmega128a4u_104.hex:i -U fuse2:w:0xbd:m -U fuse5:w:0xe2:mПолучаем ошибку:
Спойлер
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.08s
avrdude: Device signature = 0x1e9746
avrdude: erasing chip
avrdude: reading input file "atxmega128a4u_104.hex"
avrdude: ERROR: address 0x20010 out of range at line 2 of atxmega128a4u_104.hex
avrdude: read from file 'atxmega128a4u_104.hex' failed
avrdude done. Thank you.Оказывается, дав дудке команду, что мы шьем загрузчик на положенное для него место (ключ
-U boot:w:...), мы пытаемся прописать туда hex-файл, в котором, как выяснилось, уже указанно смещение в адресном пространстве контроллера. Я не до конца разбираюсь в структуре hex-файлов, но очевидно, это смещение здесь задано в первой строке:
:020000022000DC
:1000000000C00091780005FD42C0F092400608E172
:10001000009353060FEF0A950023E9F70091480675
:1000200003FFECC0E0E0F0E0079116910F3F19F4F8
...Таким образом, получаем двойное смещение и просто выходим за границы имеющейся памяти.
Казалось бы, можно решить проблему, сказав дудке, что шить будем во флэш с начальных адресов:
avrdude -c avrispmkII -P usb -p x128a4 -e -U flash:w:atxmega128a4u_104.hex:i -U fuse2:w:0xbd:m -U fuse5:w:0xe2:mНо тогда получаем вот это:
Спойлер
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.05s
avrdude: Device signature = 0x1e9746
avrdude: erasing chip
avrdude: reading input file "atxmega128a4u_104.hex"
avrdude: writing flash (136674 bytes):
Writing | ################################################## | 100% 7.29s
avrdude: 136674 bytes of flash written
avrdude: verifying flash memory against atxmega128a4u_104.hex:
avrdude: load data flash data from input file atxmega128a4u_104.hex:
avrdude: input file atxmega128a4u_104.hex contains 136674 bytes
avrdude: reading on-chip flash data:
Reading | ################################################## | 100% 7.33s
avrdude: verifying ...
avrdude: verification error, first mismatch at byte 0x20000
0x00 != 0xff
avrdude: verification error; content mismatch
avrdude done. Thank you.Загрузчик шьется, но не проходит верификация. Так как мы шили код с ключем
-U flash:w:..., дудка читает флэш, начиная с нулевого адреса, а там пусто - 0xff. Так что нам требуется удалить первую строку "
:020000022000DC" в файле atxmega128a4u_104.hex и шить, как и в первый раз, в boot-область.
Спойлер
E:\Almer 4\SoftWare\BOOT_LDR>avrdude -c avrispmkII -P usb -p x128a4 -e -U boot:w:atxmega128a4u_104.hex:i -U fuse2:w:0xbd:m -U fuse5:w:0xe2:m
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.05s
avrdude: Device signature = 0x1e9746
avrdude: erasing chip
avrdude: reading input file "atxmega128a4u_104.hex"
avrdude: writing boot (5602 bytes):
Writing | ################################################## | 100% 0.62s
avrdude: 5602 bytes of boot written
avrdude: verifying boot memory against atxmega128a4u_104.hex:
avrdude: load data boot data from input file atxmega128a4u_104.hex:
avrdude: input file atxmega128a4u_104.hex contains 5602 bytes
avrdude: reading on-chip boot data:
Reading | ################################################## | 100% 0.57s
avrdude: verifying ...
avrdude: 5602 bytes of boot verified
avrdude: reading input file "0xbd"
avrdude: writing fuse2 (1 bytes):
Writing | ################################################## | 100% 0.02s
avrdude: 1 bytes of fuse2 written
avrdude: verifying fuse2 memory against 0xbd:
avrdude: load data fuse2 data from input file 0xbd:
avrdude: input file 0xbd contains 1 bytes
avrdude: reading on-chip fuse2 data:
Reading | ################################################## | 100% 0.01s
avrdude: verifying ...
avrdude: 1 bytes of fuse2 verified
avrdude: reading input file "0xe2"
avrdude: writing fuse5 (1 bytes):
Writing | ################################################## | 100% 0.01s
avrdude: 1 bytes of fuse5 written
avrdude: verifying fuse5 memory against 0xe2:
avrdude: load data fuse5 data from input file 0xe2:
avrdude: input file 0xe2 contains 1 bytes
avrdude: reading on-chip fuse5 data:
Reading | ################################################## | 100% 0.01s
avrdude: verifying ...
avrdude: 1 bytes of fuse5 verified
avrdude done. Thank you.Аллилуйя, все заработало. Наконец-то!
