Structure de la flash

De neufbox 4

Attention : la plupart des informations contenues sur cette page sont valables pour un firmware <2.x. Voir en bas de page pour les structures des firmwares.

/proc/mtd

La structure de la flash est disponible dans /proc/mtd :

[root@Lost ~] cat /proc/mtd 
dev:    size   erasesize  name
mtd0: 00010000 00010000 "bootloader"
mtd1: 0041ff00 00010000 "main kernel+fs"
mtd2: 001d0000 00010000 "jffs2"
mtd3: 0017ff00 00010000 "rescue kernel+fs"
mtd4: 00070000 00010000 "adsl driver"
mtd5: 00010000 00010000 "nvram"

Informations au démarrage

Il y a aussi des informations intéressantes au démarrage avec un port série :

Boot Address 0xbe000000

Total memory used by CFE:  0x80401000 - 0x80528870 (1210480)
Initialized Data:          0x8041E4C0 - 0x8041FF70 (6832)
BSS Area:                  0x8041FF70 - 0x80426870 (26880)
Local Heap:                0x80426870 - 0x80526870 (1048576)
Stack Area:                0x80526870 - 0x80528870 (8192)
Text (code) segment:       0x80401000 - 0x8041E4B8 (119992)
Boot area (physical):      0x00529000 - 0x00569000
Relocation Factor:         I:00000000 - D:00000000

Booting from image (0xbe010000) ...
Code Address: 0x80010000, Entry Address: 0x80322018
Decompression OK!
Entry at 0x80322018
Closing network.
Starting program at 0x80322018

Parallel flash device: name EON FLASH, id 0x0000, size 8192KB
Total Flash size: 8192K with 128 sectors

9box mtd driver v1.0
8MB NOR flash: Found 1 x16 devices at 0x0 in 16-bit bank
 Amd/Fujitsu Extended Query Table at 0x0040
8MB NOR flash: CFI does not contain boot bank location. Assuming top.
number of CFI chips: 1
cfi_cmdset_0002: Disabling erase-suspend-program due to code brokenness.
Creating 6 MTD partitions on "8MB NOR flash":
0x00000000-0x00010000 : "bootloader"
0x00010100-0x00430000 : "main kernel+fs"
0x00430000-0x00600000 : "jffs2"
0x00600100-0x00780000 : "rescue kernel+fs"
0x00780000-0x007f0000 : "adsl driver"
0x007f0000-0x00800000 : "nvram"

On peut remarquer que les 256 premiers octets (100 en hexadécimal) du firmware principal et du firmware de secours ne seront pas accessibles par l'intermédiaire des mtdblock.

Ca correspond à l'entête du firmware principal (de 0x00010000 à 0x00010100) et du firmware de secours (de 0x00600000 à 0x00600100).

kernel.patch

On peut également trouver des informations intéressantes dans le fichier kernel.patch présent sur le site d'Efixo, à partir de la ligne 4620 :

+    brcm_partition_info[0].name       = "bootloader";
+    brcm_partition_info[0].offset     = EFIXO_CFE_START;
+    brcm_partition_info[0].size       = EFIXO_CFE_SIZE;
+    brcm_partition_info[0].mask_flags = MTD_WRITEABLE;
+
+    brcm_partition_info[1].name       = "main kernel+fs";
+    brcm_partition_info[1].offset     = EFIXO_MAIN_START + EFIXO_TAG_SIZE;
+    brcm_partition_info[1].size       = EFIXO_MAIN_SIZE - EFIXO_TAG_SIZE;
+    brcm_partition_info[1].mask_flags = MTD_WRITEABLE;
+
+    brcm_partition_info[2].name       = "jffs2";
+    brcm_partition_info[2].offset     = EFIXO_JFFS2_START;
+    brcm_partition_info[2].size       = EFIXO_JFFS2_SIZE;
+    brcm_partition_info[2].mask_flags = 0;
+
+    brcm_partition_info[3].name       = "rescue kernel+fs";
+    brcm_partition_info[3].offset     = EFIXO_RESCUE_START + EFIXO_TAG_SIZE;
+    brcm_partition_info[3].size       = EFIXO_RESCUE_SIZE - EFIXO_TAG_SIZE;
+    brcm_partition_info[3].mask_flags = MTD_WRITEABLE;
+
+    brcm_partition_info[4].name       = "adsl driver";
+    brcm_partition_info[4].offset     = EFIXO_ADSL_START;
+    brcm_partition_info[4].size       = EFIXO_ADSL_SIZE;
+    brcm_partition_info[4].mask_flags = 0;
+
+    brcm_partition_info[5].name       = "nvram";
+    brcm_partition_info[5].offset     = EFIXO_NVRAM_START;
+    brcm_partition_info[5].size       = EFIXO_NVRAM_SIZE;
+    brcm_partition_info[5].mask_flags = 0;

Par contre la définition de ces constantes ne sont pas dans le patch fourni :

$ grep -n EFIXO_CFE_START kernel.patch 
4621:+    brcm_partition_info[0].offset     = EFIXO_CFE_START;

Mais grâce aux informations affichées au démarrage (cf section Informations au démarrage), nous pouvons reconstituer ces définitions :

#define EFIXO_BOOT         0xbe000000

#define EFIXO_TAG_SIZE     0x100

#define EFIXO_CFE_START    0x00000000
#define EFIXO_CFE_SIZE     0x10000

#define EFIXO_MAIN_START   0x00010000
#define EFIXO_MAIN_SIZE    0x420000

#define EFIXO_JFFS2_START  0x00430000
#define EFIXO_JFFS2_SIZE   0x1d0000

#define EFIXO_RESCUE_START 0x00600000
#define EFIXO_RESCUE_SIZE  0x180000

#define EFIXO_ADSL_START   0x00780000
#define EFIXO_ADSL_SIZE    0x70000

#define EFIXO_NVRAM_START  0x007f0000
#define EFIXO_NVRAM_SIZE   0x10000

Structure du firmware

mtd.patch pour version <2.x

Un patch spécifique a été publié sur le site d'Efixo : mtd.patch.

Il comporte les modifications suivantes :

  • ajout de la config MTD_NEUFBOX dans kernel/linux/drivers/mtd/maps/Kconfig
  • ajout du fichier source kernel/linux/drivers/mtd/maps/neufbox-mtd.c
  • ajout du fichier d'entête kernel/linux/include/asm/mach-bcm963xx/neufbox/flash.h
  • ajout de la règle pour compiler le nouveau fichier source dans kernel/linux/drivers/mtd/maps/Makefile

Ce dernier fichier confirme totalement les valeurs proposées ci-dessus (Mb en base 1024) :

* +----------------------------------+
* |  Partition mapping               |
* |                                  |
* +-0x00000000-----------------------+
* |            cfe                   | 64 kb
* +-0x00010000-----------------------+
* |            main tag+kernel+fs    | 4.125 Mb
* +-0x00430000-----------------------+
* |            read/write partition  | 1.82 Mb
* +-0x00600000-----------------------+
* |            rescue tag+ kernel+fs | 1.5 Mb
* +-0x00780000-----------------------+
* |            read only partition   | 448 kb
* +-0x007f0000-----------------------+
* |            nvram                 | 64 kb
* +-0x007fffff-----------------------+

version >=2.x

Après publication des sources ici, nous remarquons que la structure du firmware a évolué avec un MAIN plus important et la partition contenant la config plus petite :

 * +----------------------------------+
 * |  Partition mapping               |
 * |                                  |
 * +-0x00000000-----------------------+
 * |            bootloader            | 64 kb
 * +-0x00010000-----------------------+
 * |            main firmware         | 5.3125 Mb
 * +-0x00560000-----------------------+
 * |            read/write partition  | 640 kb
 * +-0x00600000-----------------------+
 * |            rescue firmware       | 1.5 Mb
 * +-0x00780000-----------------------+
 * |            read only partition   | 448 kb
 * +-0x007f0000-----------------------+
 * |            nvram                 | 64 kb
 * +-0x007fffff-----------------------+