Если Вы столкнулись с тем, что изображение с камеры отсутствует на экране мобильного или планшета, но при этом коптер делает фотографии, пишет видео и передает телеметрию - то добро пожаловать под кат. Сегодня мы будем перепрошивать WiFi модуль данного коптера и устранять эту проблему.
Про ненадежность WiFi модуля 2-го Фантома знают многие. Говорят тем же грешен и 3-й, хоть и в меньшей степени. Поскольку основная причина выхода из строя этого дивного блока в том, что он греется как утюг - встречаются 2 основные неисправности:
от перегрева дохнет аппаратная часть модуля;
от него же "бьется" прошивка в NAND-памяти и не может нормально стартануть та часть, которая отвечает за онлайн трансляцию картинки.
При первом варианте модуль отмирает, как правило, полностью и лечится это только полной заменой, что выливается в какие-то аномальные деньги. Ну а второй вариант наш и имеет возможность обойтись чисто программной реанимацией (с минимальной пайкой, куда без этого?). Для этого нам потребуется следующий набор хирургического оборудования:
паяльник;
USB-TTL конвертер;
тонкие провода для соединения конвертера и модуля;
термопаста или термопрокладки;
отвертки и прочее подобное барахло;
Тут, кстати, стоит заметить, что слет прошивки иногда случается от долго стояния коптера без полетов. Чудеса.
И так. Первое, что мы видим в приложении:
Подготовка
Приступаем к разборке Фантома и извлечению из него злополучного модуля. Снимаем верхнюю часть корпуса, не забываем отсоединить разъем GPS-модуля и откладываем крышку в сторону. Наша цель - блок в металлическом корпусе.
Отсоединяем от него 2 антенных разъема сверху (условимся что низ - там где вставляется батарея в коптер), слева 2 мелких разъема и один широкий снизу. По левому краю видим шуруп - отворачиваем его. Все, модуль можно извлекать. Сам он приклеен через двухстороннюю прокладку типа скотча.
Чтобы разобрать снятый модуль, нужно отклеить от него медную фольгу, которая опоясывает его по контуру. 146% что она у Вас порвется. В принципе - не смертельно.
Извлекаем нижнюю плату. К ее контактным площадкам будем подпаивать провода или штыревые разъемы как я и потом через все это хозяйство шить через USB-TTL конвертер. Кстати, парочку таких конвертеров можно увидеть на фотографиях выше. Подойдут любые от китайских братьев, главное чтобы на конвертере были выведены:
GND (оно же минус/земля);
+5 вольт;
RX;
TX;
Наличие +3.3 вольта не обязательно.
В принципе, на фотографии ниже четко видно какие контактные площадки нас интересуют. К ним подпаиваем провода или разъемы как у меня.
Тут ВНИМАНИЕ!
cлева снизу - подключение +5 вольт от конвертера USB-TTL
справа снизу - ставится перемычка в процессе перепрошивки (поэтому я паял штыревые разъемы - так проще)
сверху же, слева направо: GND, RX. TXПодключается USB-TTL так: +5 на +5, GND на GND, RX конвертера на TX модуля и TX конвертера на RX модуля (т.е. крест на крест).
Ставим перемычку между площадками справа снизу!Прошивка
Скачиваем необходимое ПО. Программу терминала
Подключаем конвертер к компу. Ищем его в диспетчере устройств и запоминаем под каким номером COM-порта он там определился. Запускаем Putty и указываем в типе подключения Serial, пишем имя порта COM** (подставить свой номер) и скорость подключения 115200. Жмем соединение.
После этого подключаем конвертер к модулю как описано выше. Если все удачно, то на экране побегут надписи "BOOTME". Это говорит о том, что все подключено правильно и модуль готов к перепрошивке. Если на экране какой-то другой текст - то тут уже нужно смотреть что к чему. Если крякозябры - попробуйте изменить скорость порта, возможно она отличается от 115200, хотя и не должна (варианты: 9600, 57600).
закрываем Putty;
распаковываем архив с прошивальщиком и прошивками (например на диск "C" в папку "C:\Phantom");
запускаем командную строку (жмем Win + R, пишем CMD и жмем энтер)
переходим в папку с прошивками (в открытом окне консоли пишем "cd c:\Phantom\" без кавычек и опять же жмем энтер)
Далее пишем в том же окне такую строку:
sfh_DM36x.exe -nandflash -v -p COM?? dm6467_297_ubl.img u-boot_modifiedByGaucho.img
- где вместо знаков вопроса в "COM??" подставляем номер COM-порта, под которым определился USB-TTL. И жмем энтер в очередной раз. Должен запуститься первый этап прошивки, который по окончании сообщит "Operation completed successfully". Если при заливке прошивки поползли надписи BOOTME без остановки. Прерываем процесс нажатием CTRL + C и запускаем еще раз. Такое поведение нормальное и у кого-то шьется так, у кого-то с первого раза. У меня BOOTME вылезло и пришлось стартовать снова.
Вот мой лог удачной прошивки первого этапа:
----------------------------------------------------- TI Serial Flasher Host Program for DM36x (C) 2009, Texas Instruments, Inc. Ver. 1.50 ----------------------------------------------------- Flashing NAND with dm6467_297_ubl.img and u-boot_modifiedByGaucho.img. Attempting to connect to device COM6... Press any key to end this program at any time. Waiting for the DM36x... Target: BOOTME BOOTME commmand received. Returning ACK and header... ACK command sent. Waiting for BEGIN command... Target: BEGIN BEGIN commmand received. Sending CRC table... 100% CRC table sent.... Waiting for DONE... Target: DONE DONE received. Sending the UBL... 100% UBL sent.... Target: DONE DONE received. UBL was accepted. UBL transmitted successfully. Waiting for SFT on the DM36x... Target: Starting UART Boot... Target: BOOTUBL BOOTUBL commmand received. Returning CMD and command... CMD value sent. Waiting for DONE... Target: DONE DONE received. Command was accepted. Sending the UBL image Waiting for SENDIMG sequence... Target: SENDIMG SENDIMG received. Returning ACK and header for image data... ACK command sent. Waiting for BEGIN command... Target: BEGIN BEGIN commmand received. 100% Image data sent... Waiting for DONE... Target: DONE DONE received. All bytes of image data received... Target: Writing UBL to NAND flash Target: Unprotecting blocks 0x00000001 through 0x00000018. Target: Number of blocks needed for header and data: 0x0x00000001 Target: Attempting to start in block number 0x0x00000001. Target: Erasing block 0x00000001 through 0x00000001. Target: Writing header and image data to Block 0x00000001, Page 0x00000000 Target: Erasing block 0x00000002 through 0x00000002. Target: Writing header and image data to Block 0x00000002, Page 0x00000000 Target: Erasing block 0x00000003 through 0x00000003. Target: Writing header and image data to Block 0x00000003, Page 0x00000000 Target: Erasing block 0x00000004 through 0x00000004. Target: Writing header and image data to Block 0x00000004, Page 0x00000000 Target: Erasing block 0x00000005 through 0x00000005. Target: Writing header and image data to Block 0x00000005, Page 0x00000000 Target: Erasing block 0x00000006 through 0x00000006. Target: Writing header and image data to Block 0x00000006, Page 0x00000000 Target: Erasing block 0x00000007 through 0x00000007. Target: Writing header and image data to Block 0x00000007, Page 0x00000000 Target: Erasing block 0x00000008 through 0x00000008. Target: Writing header and image data to Block 0x00000008, Page 0x00000000 Target: Erasing block 0x00000009 through 0x00000009. Target: Writing header and image data to Block 0x00000009, Page 0x00000000 Target: Erasing block 0x0000000A through 0x0000000A. Target: Writing header and image data to Block 0x0000000A, Page 0x00000000 Target: Erasing block 0x0000000B through 0x0000000B. Target: Writing header and image data to Block 0x0000000B, Page 0x00000000 Target: Erasing block 0x0000000C through 0x0000000C. Target: Writing header and image data to Block 0x0000000C, Page 0x00000000 Target: Erasing block 0x0000000D through 0x0000000D. Target: Writing header and image data to Block 0x0000000D, Page 0x00000000 Target: Erasing block 0x0000000E through 0x0000000E. Target: Writing header and image data to Block 0x0000000E, Page 0x00000000 Target: Erasing block 0x0000000F through 0x0000000F. Target: Writing header and image data to Block 0x0000000F, Page 0x00000000 Target: Erasing block 0x00000010 through 0x00000010. Target: Writing header and image data to Block 0x00000010, Page 0x00000000 Target: Erasing block 0x00000011 through 0x00000011. Target: Writing header and image data to Block 0x00000011, Page 0x00000000 Target: Erasing block 0x00000012 through 0x00000012. Target: Writing header and image data to Block 0x00000012, Page 0x00000000 Target: Erasing block 0x00000013 through 0x00000013. Target: Writing header and image data to Block 0x00000013, Page 0x00000000 Target: Erasing block 0x00000014 through 0x00000014. Target: Writing header and image data to Block 0x00000014, Page 0x00000000 Target: Erasing block 0x00000015 through 0x00000015. Target: Writing header and image data to Block 0x00000015, Page 0x00000000 Target: Erasing block 0x00000016 through 0x00000016. Target: Writing header and image data to Block 0x00000016, Page 0x00000000 Target: Erasing block 0x00000017 through 0x00000017. Target: Writing header and image data to Block 0x00000017, Page 0x00000000 Target: Erasing block 0x00000018 through 0x00000018. Target: Writing header and image data to Block 0x00000018, Page 0x00000000 Target: Protecting the entire NAND flash. Target: DONE Sending the Application image Waiting for SENDIMG sequence... Target: SENDIMG SENDIMG received. Returning ACK and header for image data... ACK command sent. Waiting for BEGIN command... Target: BEGIN BEGIN commmand received. 100% Image data sent... Waiting for DONE... Target: DONE DONE received. All bytes of image data received... Target: Writing APP to NAND flash Target: Unprotecting blocks 0x00000019 through 0x00000032. Target: Number of blocks needed for header and data: 0x0x00000003 Target: Attempting to start in block number 0x0x00000019. Target: Erasing block 0x00000019 through 0x0000001B. Target: Writing header and image data to Block 0x00000019, Page 0x00000000 Target: Erasing block 0x0000001C through 0x0000001E. Target: Writing header and image data to Block 0x0000001C, Page 0x00000000 Target: Erasing block 0x0000001F through 0x00000021. Target: Writing header and image data to Block 0x0000001F, Page 0x00000000 Target: Erasing block 0x00000022 through 0x00000024. Target: Writing header and image data to Block 0x00000022, Page 0x00000000 Target: Erasing block 0x00000025 through 0x00000027. Target: Writing header and image data to Block 0x00000025, Page 0x00000000 Target: Erasing block 0x00000028 through 0x0000002A. Target: Writing header and image data to Block 0x00000028, Page 0x00000000 Target: Erasing block 0x0000002B through 0x0000002D. Target: Writing header and image data to Block 0x0000002B, Page 0x00000000 Target: Erasing block 0x0000002E through 0x00000030. Target: Writing header and image data to Block 0x0000002E, Page 0x00000000 Target: Protecting the entire NAND flash. Target: DONE Target: DONE Operation completed successfully.
Далее приступаем к заливки второй части. Для этого пишем следующее:
sfh_DM36x.exe -nandflash -v -p COM?? ubl1_editedByGaucho.img u-boot_modifiedByGaucho.img
* не забываем подставить свой номер COM-порта.
Результат выглядит как-то так:
----------------------------------------------------- TI Serial Flasher Host Program for DM36x (C) 2009, Texas Instruments, Inc. Ver. 1.50 ----------------------------------------------------- Flashing NAND with ubl1_editedByGaucho.img and u-boot_modifiedByGaucho.img. Attempting to connect to device COM6... Press any key to end this program at any time. Waiting for the DM36x... Target: BOOTME BOOTME commmand received. Returning ACK and header... ACK command sent. Waiting for BEGIN command... Target: BEGIN BEGIN commmand received. Sending CRC table... 100% CRC table sent.... Waiting for DONE... Target: DONE DONE received. Sending the UBL... 100% UBL sent.... Target: DONE DONE received. UBL was accepted. UBL transmitted successfully. Waiting for SFT on the DM36x... Target: Starting UART Boot... Target: BOOTUBL BOOTUBL commmand received. Returning CMD and command... CMD value sent. Waiting for DONE... Target: DONE DONE received. Command was accepted. Sending the UBL image Waiting for SENDIMG sequence... Target: SENDIMG SENDIMG received. Returning ACK and header for image data... ACK command sent. Waiting for BEGIN command... Target: BEGIN BEGIN commmand received. 100% Image data sent... Waiting for DONE... Target: DONE DONE received. All bytes of image data received... Target: Writing UBL to NAND flash Target: Unprotecting blocks 0x00000001 through 0x00000018. Target: Number of blocks needed for header and data: 0x0x00000001 Target: Attempting to start in block number 0x0x00000001. Target: Erasing block 0x00000001 through 0x00000001. Target: Writing header and image data to Block 0x00000001, Page 0x00000000 Target: Erasing block 0x00000002 through 0x00000002. Target: Writing header and image data to Block 0x00000002, Page 0x00000000 Target: Erasing block 0x00000003 through 0x00000003. Target: Writing header and image data to Block 0x00000003, Page 0x00000000 Target: Erasing block 0x00000004 through 0x00000004. Target: Writing header and image data to Block 0x00000004, Page 0x00000000 Target: Erasing block 0x00000005 through 0x00000005. Target: Writing header and image data to Block 0x00000005, Page 0x00000000 Target: Erasing block 0x00000006 through 0x00000006. Target: Writing header and image data to Block 0x00000006, Page 0x00000000 Target: Erasing block 0x00000007 through 0x00000007. Target: Writing header and image data to Block 0x00000007, Page 0x00000000 Target: Erasing block 0x00000008 through 0x00000008. Target: Writing header and image data to Block 0x00000008, Page 0x00000000 Target: Erasing block 0x00000009 through 0x00000009. Target: Writing header and image data to Block 0x00000009, Page 0x00000000 Target: Erasing block 0x0000000A through 0x0000000A. Target: Writing header and image data to Block 0x0000000A, Page 0x00000000 Target: Erasing block 0x0000000B through 0x0000000B. Target: Writing header and image data to Block 0x0000000B, Page 0x00000000 Target: Erasing block 0x0000000C through 0x0000000C. Target: Writing header and image data to Block 0x0000000C, Page 0x00000000 Target: Erasing block 0x0000000D through 0x0000000D. Target: Writing header and image data to Block 0x0000000D, Page 0x00000000 Target: Erasing block 0x0000000E through 0x0000000E. Target: Writing header and image data to Block 0x0000000E, Page 0x00000000 Target: Erasing block 0x0000000F through 0x0000000F. Target: Writing header and image data to Block 0x0000000F, Page 0x00000000 Target: Erasing block 0x00000010 through 0x00000010. Target: Writing header and image data to Block 0x00000010, Page 0x00000000 Target: Erasing block 0x00000011 through 0x00000011. Target: Writing header and image data to Block 0x00000011, Page 0x00000000 Target: Erasing block 0x00000012 through 0x00000012. Target: Writing header and image data to Block 0x00000012, Page 0x00000000 Target: Erasing block 0x00000013 through 0x00000013. Target: Writing header and image data to Block 0x00000013, Page 0x00000000 Target: Erasing block 0x00000014 through 0x00000014. Target: Writing header and image data to Block 0x00000014, Page 0x00000000 Target: Erasing block 0x00000015 through 0x00000015. Target: Writing header and image data to Block 0x00000015, Page 0x00000000 Target: Erasing block 0x00000016 through 0x00000016. Target: Writing header and image data to Block 0x00000016, Page 0x00000000 Target: Erasing block 0x00000017 through 0x00000017. Target: Writing header and image data to Block 0x00000017, Page 0x00000000 Target: Erasing block 0x00000018 through 0x00000018. Target: Writing header and image data to Block 0x00000018, Page 0x00000000 Target: Protecting the entire NAND flash. Target: DONE Sending the Application image Waiting for SENDIMG sequence... Target: SENDIMG SENDIMG received. Returning ACK and header for image data... ACK command sent. Waiting for BEGIN command... Target: BEGIN BEGIN commmand received. 100% Image data sent... Waiting for DONE... Target: DONE DONE received. All bytes of image data received... Target: Writing APP to NAND flash Target: Unprotecting blocks 0x00000019 through 0x00000032. Target: Number of blocks needed for header and data: 0x0x00000003 Target: Attempting to start in block number 0x0x00000019. Target: Erasing block 0x00000019 through 0x0000001B. Target: Writing header and image data to Block 0x00000019, Page 0x00000000 Target: Erasing block 0x0000001C through 0x0000001E. Target: Writing header and image data to Block 0x0000001C, Page 0x00000000 Target: Erasing block 0x0000001F through 0x00000021. Target: Writing header and image data to Block 0x0000001F, Page 0x00000000 Target: Erasing block 0x00000022 through 0x00000024. Target: Writing header and image data to Block 0x00000022, Page 0x00000000 Target: Erasing block 0x00000025 through 0x00000027. Target: Writing header and image data to Block 0x00000025, Page 0x00000000 Target: Erasing block 0x00000028 through 0x0000002A. Target: Writing header and image data to Block 0x00000028, Page 0x00000000 Target: Erasing block 0x0000002B through 0x0000002D. Target: Writing header and image data to Block 0x0000002B, Page 0x00000000 Target: Erasing block 0x0000002E through 0x00000030. Target: Writing header and image data to Block 0x0000002E, Page 0x00000000 Target: Protecting the entire NAND flash. Target: DONE Target: DONE Operation completed successfully.
Все. Модуль Фантома прошит!
Далее:
закрываем окно консоли;
отключаем USB-TTL от компа;
отключаем модуль WiFi от USB-TTL;
убираем перемычку справа внизу;
подключаем USB-TTL обратно к компу;
запускаем Putty и открываем соединение;
подключаем модуль к USB-TTL;
При удачной прошивке вы увидите лог загрузки модуля типа такого (тут представлен начальный кусок в некотором сокращении в местах со звездочками "***"):
DM36x initialization passed! UBL Product Vesion : DJI-GSP-UBL-1.0-rc10(2014-08-15) Dji UBL Version: 1.51(Aug 15 2014 - 17:05:12) Booting Catalog Boot Loader BootMode = NAND Starting NAND Copy... Valid magicnum, 0xA1ACED66, found in block 0x00000019. Uboot Checksum:0x7E25B44B Actua Checksum:0x7E25B44B *** Net: Ethernet PHY: GENERIC @ 0xff DaVinci-EMAC Press ESC to abort autoboot in 1 seconds Loading from nand0, offset 0x900000 Image Name: Linux-2.6.32.17-davinci1 Created: 2014-04-09 12:21:58 UTC Image Type: ARM Linux Kernel Image (uncompressed) Data Size: 3823424 Bytes = 3.6 MiB Load Address: 80008000 Entry Point: 80008000 ## Booting kernel from Legacy Image at 80700000 ... Image Name: Linux-2.6.32.17-davinci1 Created: 2014-04-09 12:21:58 UTC Image Type: ARM Linux Kernel Image (uncompressed) Data Size: 3823424 Bytes = 3.6 MiB Load Address: 80008000 Entry Point: 80008000 Loading Kernel Image ... OK OK Starting kernel ... Kernel Product Vesion : DJI-Kernel-1.0-rc2 Linux version 2.6.32.17-davinci1 (root@ubuntu) (gcc version 4.3.3 (Sourcery G++ Lite 2009q1-203) ) #6 PREEMPT Wed Apr 9 05:21:55 PDT 2014 CPU: ARM926EJ-S revision 5 (ARMv5TEJ), cr=00053177 CPU: VIVT data cache, VIVT instruction cache Machine: DaVinci DM36x EVM Memory policy: ECC disabled, Data cache writeback DaVinci dm36x_rev1.2 variant 0x8 ***
Если у Вас в логе пишется что-то типа:
DM36x initialization passed! UBL Product Vesion : DJI-UBL-1.0-rc2 Dji UBL Version: 1.51(Jun 19 2014 — 01:14:42) Booting Catalog Boot Loader BootMode = NAND Starting NAND Copy... Valid magicnum, 0xA1ACED66, found in block 0x00000019. Valid magicnum, 0xA1ACED66, found in block 0x0000001B. Valid magicnum, 0xA1ACED66, found in block 0x0000001D. Valid magicnum, 0xA1ACED66, found in block 0x0000001F. No valid boot image found! NAND Boot failed. Aborting...
то можно попробовать прошить модуль еще раз. Но если в логе опять будет нечто похожее - стало быть проблема не только в прошивке и возможно требуется ремонт или замена модуля. Но в основном все заканчивается удачно.
Дальше ставим модуль в коптер, присоединяем все, что было отключено и смотрим на результат.
После проверки я собрал все в обратном порядке. Промазал свежей термопастой то, что было намазано с завода, а микросхему на нижней плате модуля поставил через новую термопрокладку. Старая как-то не внушала доверия.
За сим все!
Удачных полетов!