[Из песочницы] Китайский HID программатор USBISP (USBASP) в Linux. Препрошивка

Программирование микроконтроллеров и робототехника — очень перспективные направления деятельности. Об этом говорят уже на уровне государства. А начинается все с того, что новички собирают свой первый программатор или заказывают его в интернет-магазине. Самыми доступными по цене являются китайские поделки. Они не всегда готовы сразу порадовать своих новых хозяев. Тем не менее, обычно, они вполне работоспособны после доработки и/или перепрошивки.c48db4d092c0424f937e9d0b5d813c13.jpg

Ситуация осложняется тем, что существует множество похожих моделей и различных версий печатных плат китайской разработки. Мне достались программаторы с печатной платой, несовместимой с имеющейся в сети прошивкой. Банально, не совпадает назначение выводов микроконтроллера на плате и в программе. Далее я опишу процесс лечения мелкой партии этих программаторов и некоторые хитрости для новичков.

Надеюсь, кому-то эта статья окажется полезной, поскольку конкретно по этой версии программаторов информации в интернете, видимо, нет.

Для тех, кто хочет быстрого решения, в конце статьи есть ссылка на архив с доработанной мною прошивкой USBASP от Thomas Fischl и список изменений в формате git diff.

ПокупкаРешил я для занятий по робототехнике в нашем Центре детского компьютерного творчества приобрести комплект программаторов и микроконтроллеров. Выбор пал на Алиэкспресс. Дёшево и сердито.Заказал пачку Attiny13A, пару колодок для них, несколько Atmega32 на учебных платах, макетки, и, конечно же, десяток программаторов USBASP. Ранее я уже заказывал пару подобных программаторов — один из них даже работал.7d05b5a162cc448ba1cf4c11c2363b67.JPG

Как оказалось, доставленные программаторы оказались неработоспособными в Ubuntu Linux. Один из них соответствовал рекламной картинке, остальные 9 были чуть длиннее и не упакованы в антистатические пакетики. При этом все 10 имели на корпусе надпись USBISP и гордо определялись как устройство HID.

Описание программатора USBASP USBISP с алиэкспресс (кстати, про линукс — ни слова): The USBASP USBISP AVR / 51 Series Programmer Download Aluminum Shell No 64K Limit Support WIN7 64Description:

Perfectly support WIN7

1, support USB1.1 or USB2.0 communication.2, support WIN98, WINME, WIN2K, WINXP operation system.3. USB ports Power Supply, power supply output is 500 MA since the recovery, which can effectively prevent outside of USB influence short circuit, target board can supply with USB together.4, download not finish influence the operation of the target board.5, support S51 and AVR chips record, speed faster than parallel ISP, more stable; There is no parallel notebook computer and use the best choice.6, the latest version of exceed stable firmware, download speed jump line without choice, download speed faster, more stable.7, using standard IDC10 interface

Хитрые китайцы, желая упростить жизнь пользователям дефолтной ОС, написали прошивку, не требующую драйверов. Один минус — с этими программаторами может работать только одна китайская программа с интерфейсом на китайском же языке и только в одной ОС. Меня этот вариант категорически не устраивал.

Поиск решения Поиск в сети привел меня на страницу Hacking an AVR programmer.Там все замечательно и доступно описано. Я обрадовался и стал разбирать программаторы. Это оказалось легко. Поразили оригинальные конструкторские решения в виде изолятора из двустороннего скотча.f1c14231893140dd91275fc05d46c605.JPG

675456a75b2a41638848766e37845f70.JPG

Радовался я рано. На указанной странице был описан процесс перепрошивки для другой версии программатора (v3.0), которая разведена иначе. У меня на руках была неопознанная версия программатора.

f723b64851d54a8aa7d49f5ce3e5bfb1.JPG

Результатом изучения платы стала представленная ниже картинка. Все, что возможно, было разведено иначе, чем в уже знакомой третьей версии с синей платой. Это не помешало доработать прошивку, в которой пришлось менять номера выводов, их инициализацию (см. статью Hacking an AVR programmer) и алгоритм управления светодиодами.

64974285dab24303bf066fe4ad2fa928.jpg

В оригинальной usbasp прошивке за USB и светодиоды отвечают ножки 12,13 и 23,24. На плате же были разведены выводы 1,32 и 9,10. При этом светодиоды оказались подключены встречно-параллельно, что впоследствии было учтено в программе.

Никаких перемычек для программирования здесь не было. Поэтому пришлось слегка переделать шлейф, выпустив проводок «Reset» на волю. Этот провод я временно припаивал ко входу «Reset» для программирования жертвы.

8adccd3857284a4fa7ec6713ad5d64b6.JPG

5026b9fc77bb4d63be3a28a13c34aeb9.JPG

Наглядная картинка, оказавшая мне помощь в сопоставлении ножек контроллера (ATmega8):

2a6060e1e99c4740a23dc0c1c19dbf86.png

Хорошо, что в наличии рабочий программатор уже имелся. Как раз версии v3.0, но с рабочей прошивкой.

3cecf96c0e8d4fba9bd44aa22580695f.JPG

Перепрошивка Первые два программатора прошились успешно. Третий запротестовал. Оказалось, что в нем именно 29 ножка «Reset» была не пропаяна.0596a820240f4c74b05dc7b82d8ca1fe.JPG

Устранив этот косяк я продолжил работу.

8da96015b3e14f00bb8a249cb3cc3568.JPG

На пятом программаторе мне надоело подпаивать проводок к ресету, и я применил менее надежный, но более быстрый способ. Помогла дочкина резинка для волос.

7c4fa89717964baf8a799a13d010d1bb.JPG

Программатор-жертва воткнут в USB-хаб (синенький) только для того, чтобы стоял устойчивее — хаб никуда не подключён.Иногда я получал сообщения от avrdude, что контроллер не отвечает. Спасало понижение напряжения трёхметровым USB-удлинителем и уменьшение скорости программирования (ключ -B в строке «avrdude -c usbasp -p m8 -B 50 »).

На закуску самое главное Архив с оригинальной прошивкой: www.fischl.de/usbasp/usbasp.2011–05–28.tar.gzСмотрим в Readme.txt раздел «BUILDING AND INSTALLING FROM SOURCE CODE«Из архива извлекаем папку /usbasp.2011–05–28/firmware/Дорабатываем прошивку по вкусу.В консоли заходим в папку firmware и запускаем make для получения справки по доступным командам.Компилируем прошивку и заливаем ее в программатор (через другой рабочий программатор).Git diff для данного проекта (мои изменения) diff --git a/main.c b/main.c index a225432…64755ca 100755 --- a/main.c +++ b/main.c @@ -306,11 +306,16 @@ int main (void) { /* no pullups on USB and ISP pins */ PORTD = 0; PORTB = 0; + PORTC = 0; /* PORTC not connected */ /* all outputs except PD2 = INT0 */  — DDRD = ~(1 << 2); + //DDRD = ~(1 << 2); /* output SE0 for USB reset */ - DDRB = ~0; + // DDRB = ~0; + //DDRD = ~0; + DDRD = 0b01100000; // 1 = output (PD6+PD5 LEDS, PD3+PD2 USB) + ledRedOff(); + j = 0; /* USB Reset by device only required on Watchdog Reset */ while (--j) { @@ -322,10 +327,9 @@ int main(void) { /* all USB and ISP pins inputs */ DDRB = 0; - /* all inputs except PC0, PC1 */ - DDRC = 0x03; - PORTC = 0xfe; - + /* PORTC not connected -> all inputs*/ + DDRC = 0; + /* init timer */ clockInit (); diff --git a/usbasp.h b/usbasp.h index b60bd04…9c12652 100644 --- a/usbasp.h +++ b/usbasp.h @@ -62,9 +62,9 @@ #define USBASP_ISP_SCK_1500 12 /* 1.5 MHz */ /* macros for gpio functions */ -#define ledRedOn () PORTC &= ~(1 << PC1) -#define ledRedOff() PORTC |= (1 << PC1) -#define ledGreenOn() PORTC &= ~(1 << PC0) -#define ledGreenOff() PORTC |= (1 << PC0) +#define ledRedOn() PORTD |= (1 << PD5); PORTD &= ~(1 << PD6) +#define ledRedOff() PORTD &= ~(1 << PD5); PORTD |= (1 << PD6) +//#define ledGreenOn() PORTD &= ~(1 << PD5) +//#define ledGreenOff() PORTD |= (1 << PD5) #endif /* USBASP_H_ */ diff --git a/usbconfig.h b/usbconfig.h index 203239e..9fe7375 100755 --- a/usbconfig.h +++ b/usbconfig.h @@ -22,15 +22,15 @@ the newest features and options. /* ---------------------------- Hardware Config ---------------------------- */ -#define USB_CFG_IOPORTNAME B +#define USB_CFG_IOPORTNAME D /* 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 +#define USB_CFG_DMINUS_BIT 3 /* 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 +#define USB_CFG_DPLUS_BIT 2 /* 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! Бонусные фото Что удалось сделать из колодок для тинек (оказалось — очень удобно).39da9c75e8dd4fcfa36191984498c58c.JPG

Контрольный светодиод между выходами PB3-PB4.

7d7456b7ebb24f2c93ce9c4f65025a75.JPG

Ссылки Архив с доработанной прошивкой (исходник + скомпилированная прошивка main.hex): app.box.com/s/xz4neeubv663rvcem12pbctq91hutpp2Оригинальная прошивка (USBasp firmware from Thomas Fischl): www.fischl.de/usbaspHacking an AVR programmer: www.sciencetronics.com/greenphotons/? p=938Статья на хабре на эту же тему: «Как заставить китайский USB-программатор за $5 работать в Linux»

© Habrahabr.ru