| | 1 | [[PageOutline]] |
| | 2 | |
| | 3 | = Flashage des Ardrone2 = |
| | 4 | |
| | 5 | == Lexique == |
| | 6 | |
| | 7 | * ardrone2 original : un drone non modifié par nous, neuf donc |
| | 8 | * ardrone2 hds : un drone avec nos noyaux et rootfs |
| | 9 | * plf : format propriétaire Parrot pour paqueter des données (rootfs, noyau, ligne de commande noyau, etc). Le format a été plus ou moins décodé. Des outils existent pour lire/écrire des plf (intégrés dans robomap3) |
| | 10 | * ardrone2-updater : machine (au sens poky) dans robomap3 ; permet de flasher le rootfs de production ; s’installe dans la flash (mtd2 pour le rootfs, mtd1 "alt_boot" pour le noyau ) |
| | 11 | * ardrone2-installer : machine (au sens poky) dans robomap3 ; permet de flasher complètement le système hds, c’est un ramfs |
| | 12 | * ardrone2: machine (au sens poky) dans robomap3 ; le système de production sur lequel on vol, s’installe dans la flash (mtd3 pour le rootfs, mtd1 "main_boot" pour le noyau ) |
| | 13 | |
| | 14 | == Organisation de la flash ardrone2 original == |
| | 15 | |
| | 16 | * mtd0 : 0x000000000000-0x000000080000 : "Pbootloader" 512Ko |
| | 17 | * mtd1 : 0x000000080000-0x000000880000 : "Pmain_boot" 8 Mo |
| | 18 | * mtd2 : 0x000000880000-0x000001080000 : "Pfactory" 8Mo |
| | 19 | * mtd3 : 0x000001080000-0x000003080000 : "Psystem" 32 Mo |
| | 20 | * mtd4 : 0x000003080000-0x000008000000 : "Pupdate" 81408 Ko |
| | 21 | |
| | 22 | mtd1 : contient les noyaux, 2 partitions ubifs |
| | 23 | * "main_boot" (4,1 Mo) noyau principal au format plf |
| | 24 | * "alt_boot" (2,9 Mo) noyau alternatif au format plf |
| | 25 | mtd2 : contient des infos produit (mac address, no série, etc), ubifs ("factory") monté dans /factory |
| | 26 | |
| | 27 | mtd3 : rootfs, ubifs ("system") monté dans / |
| | 28 | |
| | 29 | mtd4 : 2 partitions ubifs |
| | 30 | * "update" (16.1 Mo) monté dans /update |
| | 31 | * "data" (59,7 Mo) monté dans /data |
| | 32 | |
| | 33 | bootparams : |
| | 34 | {{{ |
| | 35 | mtdparts=omap2-nand.0:512K(Pbootloader),8M(Pmain_boot),8M(Pfactory),32M(Psystem),81408K(Pupdate) console=ttyO3,115200 loglevel=4 ubi.mtd=Pfactory,2048 ubi.mtd=Psystem,2048 ubi.mtd=Pupdate,2048 root=ubi1:system rootfstype=ubifs parrot5.low_latency=1 androidboot.bootloader=ecos-bootloader-omap3630-start-65-g6a040b5 |
| | 36 | }}} |
| | 37 | |
| | 38 | == Organisation de la flash ardrone2 hds == |
| | 39 | |
| | 40 | * mtd0 : 0x000000000000-0x000000080000 : "Pbootloader" 512Ko |
| | 41 | * mtd1 : 0x000000080000-0x000000880000 : "Pmain_boot" 8 Mo |
| | 42 | * mtd2 : 0x000000880000-0x000001080000 : "Pfactory" 8Mo |
| | 43 | * mtd3 : 0x000001080000-0x000008000000 : "Psystem" 114176Ko |
| | 44 | |
| | 45 | mtd1 : contient les noyaux, 2 partitions ubifs |
| | 46 | * "main_boot" (4,1 Mo) noyau production (ardrone2) au format plf |
| | 47 | * "alt_boot" (2,9 Mo) noyau updater (ardrone2-updater) au format plf |
| | 48 | mtd2 : contient le rootfs du ardrone2-updater |
| | 49 | |
| | 50 | mtd3 : 2 partitions ubifs |
| | 51 | * "rootfs" (58 Mo) monté dans / |
| | 52 | * "home" (45 Mo) monté dans /home/root |
| | 53 | |
| | 54 | bootparams : |
| | 55 | {{{ |
| | 56 | mtdparts=omap2-nand.0:512K(Pbootloader),8M(Pmain_boot),8M(Pfactory),114176K(Psystem) console=ttyO3,115200 loglevel=8 earlyprintk=ttyO3,115200 ubi.mtd=Pfactory,2048 ubi.mtd=Psystem,2048 root=ubi1:rootfs rootfstype=ubifs parrot5.low_latency=1 mem=80M mpurate=1000 |
| | 57 | }}} |
| | 58 | |
| | 59 | == Bootloader Parrot == |
| | 60 | |
| | 61 | Programme propriétaire dont nous n’avons pas les sources. Pas d’alternative open source fonctionnelle pour l’instant. Devrait pouvoir se remplacer par xloader (TI) et u-boot. |
| | 62 | |
| | 63 | Par défaut, le bootloader charge le noyau au format plf se trouvant dans la partition « main_boot » de mtd1. Pour booter sur un noyau alternatif (dans l’autre partition de mtd1, « alt_boot »), il faut au préalable échanger les étiquettes des deux partitions : |
| | 64 | ubiattach -p /dev/mtd1 |
| | 65 | ubirename /dev/ubix main_boot alt_boot alt_boot main_boot (x donné par ubittach) |
| | 66 | ubidetach -p /dev/mtd1 |
| | 67 | Ce renommage se fait automatiquement dans le script launch_update.sh (voir Mettre à jour le rootfs sur adrones2 hds). |
| | 68 | |
| | 69 | Si le drone est branché en USB au PC, le bootloader peut charger un autre bootloader (voir Flasher ardrone2 original avec câble USB). |
| | 70 | |
| | 71 | == Prérequis == |
| | 72 | |
| | 73 | un terminal série : cutecom, minicom, etc |
| | 74 | |
| | 75 | cross toolchain : https://devel.hds.utc.fr/software/flair/wiki/toolchain/install |
| | 76 | |
| | 77 | robomap3 : https://sourcesup.renater.fr/projects/robomap3-rt/ |
| | 78 | |
| | 79 | inst_usb_bootldr.bin :bootloader propriétaire Parrot, se charge et se lance en USB. Permet ensuite de charger en USB un fichier PLF (kernel+bootcmd+ramfs) et de lancer le noyau du PLF |
| | 80 | https://devel.hds.utc.fr/svn/uav_dev/trunk/bin/i686/unix/mykonos2_flash/bin/inst_usb_bootldr.bin |
| | 81 | |
| | 82 | ajouter une règle udev pour la connexion USB au drone (sinon faire les opérations USB en root): |
| | 83 | {{{ |
| | 84 | SUBSYSTEM=="usb", ATTRS{idVendor}=="0451", ATTRS{idProduct}=="d00e", ACTION=="add", GROUP="gsanahuj", MODE="0664" |
| | 85 | SUBSYSTEM=="usb", ATTRS{idVendor}=="19cf", ATTRS{idProduct}=="1111", ACTION=="add", GROUP="gsanahuj", MODE="0664" |
| | 86 | }}} |
| | 87 | |
| | 88 | == Flasher ardrone2 original avec câble USB == |
| | 89 | |
| | 90 | ''bitbake core-image-minimal-mtdutils'' pour la machine ardrone2-installer (se lance en ram depuis l’usb) |
| | 91 | ''bitbake core-image-minimal-mtdutils'' pour la machine ardrone2-updater (se met en flash) |
| | 92 | ''bitbake core-image-flair-uav'' pour la machine ardrone2 (se met en flash) |
| | 93 | |
| | 94 | brancher le câble USB et le série (115200bps), envoyer le ardrone2-installer : |
| | 95 | |
| | 96 | {{{ |
| | 97 | $ source /opt/robomap3/1.7.3/armv7a-neon/environment-setup-armv7a-vfp-neon-poky-linux-gnueabi |
| | 98 | $ ardrone2-usbloader inst_usb_bootldr.bin core-image-minimal-mtdutils-ardrone2-installer.plf |
| | 99 | }}} |
| | 100 | une fois le programme en attente, allumer le drone |
| | 101 | |
| | 102 | le drone fait une interface réseau par USB (ssh root@192.168.7.2) |
| | 103 | |
| | 104 | créer les partitions pour recevoir le système hds : |
| | 105 | {{{ |
| | 106 | # create_partitions.sh |
| | 107 | }}} |
| | 108 | |
| | 109 | copier les éléments de ardrone2-updater (''tmp/deploy/images/ardrone2-updater/zImage.plf'' et ''tmp/deploy/images/ardrone2-updater/core-image-minimal-mtdutils-ardrone2-updater.tar.gz'') sur le drone |
| | 110 | |
| | 111 | flasher le updater : |
| | 112 | {{{ |
| | 113 | # update_kernel.sh zImage.plf (doit afficher found an updater kernel) |
| | 114 | # install_updater_rootfs.sh core-image-minimal-mtdutils-ardrone2-updater.tar.gz |
| | 115 | }}} |
| | 116 | |
| | 117 | copier les éléments de ardrone2 (''tmp/deploy/images/ardrone2/zImage.plf'' et ''tmp/deploy/images/ardrone2/core-image-flair-uav-ardrone2.tar.bz2'') sur le drone |
| | 118 | |
| | 119 | flasher le système : |
| | 120 | {{{ |
| | 121 | # update_kernel.sh zImage.plf (doit afficher found a production kernel) |
| | 122 | # flash_rootfs.sh core-image-flair-uav-ardrone2.tar.bz2 (choisir l’option 1 : production) |
| | 123 | }}} |
| | 124 | reboot ! |
| | 125 | |
| | 126 | == Flasher ardrone2 original sans câble USB == |
| | 127 | |
| | 128 | TODO : scripter un peu plus tout ça ! |
| | 129 | |
| | 130 | se connecter en wifi au drone : |
| | 131 | ssid ardrone2_011152 (les 6 derniers chiffres dépendent du numéro de série, voir sur l’étiquette du drone) |
| | 132 | ip pc : 192.168.1.2 (donné par le dhcp du drone) |
| | 133 | ip drone : 192.168.1.1 |
| | 134 | |
| | 135 | On ne peut pas flasher d’un coup le système final hds. On commence par mettre le ardrone-updater ; puis on bootera sur celui la pour installer le reste. |
| | 136 | |
| | 137 | Copier par ftp les scripts de flashage (dans ''robomap3-rt/meta-poky/recipes-hds/ardrone-tools/ardrone2-flash-scripts'') et les outils mtd/ubi (ubiattach, ubidetach, etc). Sur le drone, les fichiers envoyés en ftp sont dans /data/video par défaut. Mettre tout ca dans /usr/bin. |
| | 138 | |
| | 139 | Copier les éléments de ardrone2-updater (''tmp/deploy/images/ardrone2-updater/zImage.plf'' et ''tmp/deploy/images/ardrone2-updater/core-image-minimal-mtdutils-ardrone2-updater.tar.gz'') sur le drone par ftp. Flasher le noyau et le rootfs de ardrone2-updater |
| | 140 | {{{ |
| | 141 | # update_kernel.sh zImage.plf |
| | 142 | # install_updater_rootfs.sh core-image-minimal-mtdutils-ardrone2-updater.tar.gz |
| | 143 | }}} |
| | 144 | |
| | 145 | rebooter sur le système ardrone2-updater |
| | 146 | {{{ |
| | 147 | # ubiattach -p /dev/mtd1 |
| | 148 | # ubirename /dev/ubix main_boot alt_boot alt_boot main_boot (x donné par ubittach) |
| | 149 | # ubidetach -p /dev/mtd1 |
| | 150 | # reboot |
| | 151 | }}} |
| | 152 | |
| | 153 | une fois sur le ardrone2-updater : (en port série car procédure à automatiser) |
| | 154 | {{{ |
| | 155 | # create_partitions.sh |
| | 156 | # flash_rootfs core-image-flair-uav-ardrone.tar.bz2 |
| | 157 | # swap kernel ubi labels |
| | 158 | # flash_kernel.sh zImage.plf |
| | 159 | }}} |
| | 160 | |
| | 161 | == Mettre à jour le noyau sur adrones2 hds == |
| | 162 | {{{ |
| | 163 | # flash_kernel.sh zImage.plf |
| | 164 | }}} |
| | 165 | |
| | 166 | == Mettre à jour le rootfs sur adrones2 hds == |
| | 167 | |
| | 168 | == Tester un noyau sans le flasher (avec câble USB) == |
| | 169 | |
| | 170 | Procédure identique au flash avec câble usb. On créé ici le plf avec noyau+rootfs à mettre en ram |
| | 171 | |
| | 172 | faire un fichier image.ini (adapter le chemin des 3 fichiers, le EntryPoint et le LoadAddr du zImage) : |
| | 173 | {{{ |
| | 174 | [file] |
| | 175 | Type=kernel |
| | 176 | EntryPoint=0x81588004 |
| | 177 | HdrVersion=11 |
| | 178 | VersionMajor=5 |
| | 179 | VersionMinor=8 |
| | 180 | VersionBugfix=0x1b |
| | 181 | TargetPlat=0x5 |
| | 182 | TargetAppl=0x59 |
| | 183 | HwCompatibility=0x1d400a4e |
| | 184 | LanguageZone=0 |
| | 185 | |
| | 186 | [zImage] |
| | 187 | LoadAddr=0x81588004 |
| | 188 | File=/home/gsanahuj/HDS/igep/ardrone2_src/linux-ardrone2-2.6.32-9/arch/arm/boot/zImage |
| | 189 | |
| | 190 | [InitRD] |
| | 191 | LoadAddr=0x81000000 |
| | 192 | File=/home/poky/poky-robomap3/build/tmp/deploy/images/ardrone2-installer/core-image-minimal-mtdutils-ardrone2-installer.cpio |
| | 193 | |
| | 194 | [BootParams] |
| | 195 | LoadAddr=0x80700000 |
| | 196 | File=/home/gsanahuj/HDS/igep/ardrone2_src_svn/trunk/linux-ardrone2-2.6.32-9/bootparams.txt |
| | 197 | }}} |
| | 198 | créer un plf avec le noyau et le rootfs : |
| | 199 | {{{ |
| | 200 | # /opt/robomap3/1.7.3/armv7a-neon/sysroots/x86_64-pokysdk-linux/usr/bin/plftool -b ./image.ini -o ./image.plf |
| | 201 | }}} |
| | 202 | brancher le câble USB et le série (115200bps), envoyer le ardrone2-installer : |
| | 203 | |
| | 204 | {{{ |
| | 205 | # source /opt/robomap3/1.7.3/armv7a-neon/environment-setup-armv7a-vfp-neon-poky-linux-gnueabi |
| | 206 | # ardrone2-usbload inst_usb_bootldr.bin image.plf |
| | 207 | }}} |
| | 208 | une fois le programme en attente, allumer le drone |
| | 209 | |
| | 210 | == Flasher ardrone2 briqué (avec câble USB) == |
| | 211 | |
| | 212 | suivre la procédure ardrone2 original avec câble USB. |
| | 213 | Envoyer le ardrone2-installer par USB, puis flasher le nécessaire pour dé-briquer (normalement le noyau). |
| | 214 | |