1*3310c549SMarian BalakowiczU-boot new uImage source file format (bindings definition) 2*3310c549SMarian Balakowicz========================================================== 3*3310c549SMarian Balakowicz 4*3310c549SMarian BalakowiczAuthor: Marian Balakowicz <m8@semihalf.com> 5*3310c549SMarian Balakowicz 6*3310c549SMarian Balakowicz1) Introduction 7*3310c549SMarian Balakowicz--------------- 8*3310c549SMarian Balakowicz 9*3310c549SMarian BalakowiczEvolution of the 2.6 Linux kernel for embedded PowerPC systems introduced new 10*3310c549SMarian Balakowiczbooting method which requires that hardware description is available to the 11*3310c549SMarian Balakowiczkernel in the form of Flattened Device Tree. 12*3310c549SMarian Balakowicz 13*3310c549SMarian BalakowiczBooting with a Flattened Device Tree is much more flexible and is intended to 14*3310c549SMarian Balakowiczreplace direct passing of 'struct bd_info' which was used to boot pre-FDT 15*3310c549SMarian Balakowiczkernels. 16*3310c549SMarian Balakowicz 17*3310c549SMarian BalakowiczHowever, U-boot needs to support both techniques to provide backward 18*3310c549SMarian Balakowiczcompatibility for platforms which are not FDT ready. Number of elements 19*3310c549SMarian Balakowiczplaying role in the booting process has increased and now includes the FDT 20*3310c549SMarian Balakowiczblob. Kernel image, FDT blob and possibly ramdisk image - all must be placed 21*3310c549SMarian Balakowiczin the system memory and passed to bootm as a arguments. Some of them may be 22*3310c549SMarian Balakowiczmissing: FDT is not present for legacy platforms, ramdisk is always optional. 23*3310c549SMarian BalakowiczAdditionally, old uImage format has been extended to support multi sub-images 24*3310c549SMarian Balakowiczbut the support is limited by simple format of the legacy uImage structure. 25*3310c549SMarian BalakowiczSingle binary header 'struct image_header' is not flexible enough to cover all 26*3310c549SMarian Balakowiczpossible scenarios. 27*3310c549SMarian Balakowicz 28*3310c549SMarian BalakowiczAll those factors combined clearly show that there is a need for new, more 29*3310c549SMarian Balakowiczflexible, multi component uImage format. 30*3310c549SMarian Balakowicz 31*3310c549SMarian Balakowicz 32*3310c549SMarian Balakowicz2) New uImage format assumptions 33*3310c549SMarian Balakowicz-------------------------------- 34*3310c549SMarian Balakowicz 35*3310c549SMarian Balakowicza) Implementation 36*3310c549SMarian Balakowicz 37*3310c549SMarian BalakowiczLibfdt has been selected for the new uImage format implementation as (1) it 38*3310c549SMarian Balakowiczprovides needed functionality, (2) is actively maintained and developed and 39*3310c549SMarian Balakowicz(3) increases code reuse as it is already part of the U-boot source tree. 40*3310c549SMarian Balakowicz 41*3310c549SMarian Balakowiczb) Terminology 42*3310c549SMarian Balakowicz 43*3310c549SMarian BalakowiczThis document defines new uImage structure by providing FDT bindings for new 44*3310c549SMarian BalakowiczuImage internals. Bindings are defined from U-boot perspective, i.e. describe 45*3310c549SMarian Balakowiczfinal form of the uImage at the moment when it reaches U-boot. User 46*3310c549SMarian Balakowiczperspective may be simpler, as some of the properties (like timestamps and 47*3310c549SMarian Balakowiczhashes) will need to be filled in automatically by the U-boot mkimage tool. 48*3310c549SMarian Balakowicz 49*3310c549SMarian BalakowiczTo avoid confusion with the kernel FDT the following naming convention is 50*3310c549SMarian Balakowiczproposed for the new uImage format related terms: 51*3310c549SMarian Balakowicz 52*3310c549SMarian BalakowiczFIT - Flattened uImage Tree 53*3310c549SMarian Balakowicz 54*3310c549SMarian BalakowiczFIT is formally a flattened device tree (in the libfdt meaning), which 55*3310c549SMarian Balakowiczconforms to bindings defined in this document. 56*3310c549SMarian Balakowicz 57*3310c549SMarian Balakowicz.its - image tree source 58*3310c549SMarian Balakowicz.itb - image tree blob 59*3310c549SMarian Balakowicz 60*3310c549SMarian Balakowiczc) Image building procedure 61*3310c549SMarian Balakowicz 62*3310c549SMarian BalakowiczThe following picture shows how the new uImage is prepared. Input consists of 63*3310c549SMarian Balakowiczimage source file (.its) and a set of data files. Image is created with the 64*3310c549SMarian Balakowiczhelp of standard U-boot mkimage tool which in turn uses dtc (device tree 65*3310c549SMarian Balakowiczcompiler) to produce image tree blob (.itb). Resulting .itb file is is the 66*3310c549SMarian Balakowiczactual binary of a new uImage. 67*3310c549SMarian Balakowicz 68*3310c549SMarian Balakowicz 69*3310c549SMarian Balakowicztqm5200.its 70*3310c549SMarian Balakowicz+ 71*3310c549SMarian Balakowiczvmlinux.bin.gz mkimage + dtc xfer to target 72*3310c549SMarian Balakowiczeldk-4.2-ramdisk --------------> tqm5200.itb --------------> bootm 73*3310c549SMarian Balakowicztqm5200.dtb /|\ 74*3310c549SMarian Balakowicz... | 75*3310c549SMarian Balakowicz 'new uImage' 76*3310c549SMarian Balakowicz 77*3310c549SMarian Balakowicz - create .its file, automatically filled-in properties are omitted 78*3310c549SMarian Balakowicz - call mkimage tool on a .its file 79*3310c549SMarian Balakowicz - mkimage calls dtc to create .itb image and assures that 80*3310c549SMarian Balakowicz missing properties are added 81*3310c549SMarian Balakowicz - .itb (new uImage) is uploaded onto the target and used therein 82*3310c549SMarian Balakowicz 83*3310c549SMarian Balakowicz 84*3310c549SMarian Balakowiczd) Unique identifiers 85*3310c549SMarian Balakowicz 86*3310c549SMarian BalakowiczTo identify FIT sub-nodes representing images, hashes, configurations (which 87*3310c549SMarian Balakowiczare defined in the following sections), the "unit name" of the given sub-node 88*3310c549SMarian Balakowiczis used as it's identifier as it assures uniqueness without additional 89*3310c549SMarian Balakowiczchecking required. 90*3310c549SMarian Balakowicz 91*3310c549SMarian Balakowicz 92*3310c549SMarian Balakowicz3) Root node properties 93*3310c549SMarian Balakowicz----------------------- 94*3310c549SMarian Balakowicz 95*3310c549SMarian BalakowiczRoot node of the uImage Tree should have the following layout: 96*3310c549SMarian Balakowicz 97*3310c549SMarian Balakowicz/ o image-tree 98*3310c549SMarian Balakowicz |- description = "image description" 99*3310c549SMarian Balakowicz |- timestamp = <12399321> 100*3310c549SMarian Balakowicz |- #address-cells = <1> 101*3310c549SMarian Balakowicz | 102*3310c549SMarian Balakowicz o images 103*3310c549SMarian Balakowicz | | 104*3310c549SMarian Balakowicz | o img@1 {...} 105*3310c549SMarian Balakowicz | o img@2 {...} 106*3310c549SMarian Balakowicz | ... 107*3310c549SMarian Balakowicz | 108*3310c549SMarian Balakowicz o configurations 109*3310c549SMarian Balakowicz |- default = "cfg@1" 110*3310c549SMarian Balakowicz | 111*3310c549SMarian Balakowicz o cfg@1 {...} 112*3310c549SMarian Balakowicz o cfg@2 {...} 113*3310c549SMarian Balakowicz ... 114*3310c549SMarian Balakowicz 115*3310c549SMarian Balakowicz 116*3310c549SMarian Balakowicz Optional property: 117*3310c549SMarian Balakowicz - description : Textual description of the uImage 118*3310c549SMarian Balakowicz 119*3310c549SMarian Balakowicz Mandatory property: 120*3310c549SMarian Balakowicz - timestamp : Last image modification time being counted in seconds since 121*3310c549SMarian Balakowicz 1970-01-01 00:00:00 - to be automatically calculated by mkimage tool. 122*3310c549SMarian Balakowicz 123*3310c549SMarian Balakowicz Conditionally mandatory property: 124*3310c549SMarian Balakowicz - #address-cells : Number of 32bit cells required to represent entry and 125*3310c549SMarian Balakowicz load addresses supplied within sub-image nodes. May be omitted when no 126*3310c549SMarian Balakowicz entry or load addresses are used. 127*3310c549SMarian Balakowicz 128*3310c549SMarian Balakowicz Mandatory node: 129*3310c549SMarian Balakowicz - images : This node contains a set of sub-nodes, each of them representing 130*3310c549SMarian Balakowicz single component sub-image (like kernel, ramdisk, etc.). At least one 131*3310c549SMarian Balakowicz sub-image is required. 132*3310c549SMarian Balakowicz 133*3310c549SMarian Balakowicz Optional node: 134*3310c549SMarian Balakowicz - configurations : Contains a set of available configuration nodes and 135*3310c549SMarian Balakowicz defines a default configuration. 136*3310c549SMarian Balakowicz 137*3310c549SMarian Balakowicz 138*3310c549SMarian Balakowicz4) '/images' node 139*3310c549SMarian Balakowicz----------------- 140*3310c549SMarian Balakowicz 141*3310c549SMarian BalakowiczThis node is a container node for component sub-image nodes. Each sub-node of 142*3310c549SMarian Balakowiczthe '/images' node should have the following layout: 143*3310c549SMarian Balakowicz 144*3310c549SMarian Balakowicz o image@1 145*3310c549SMarian Balakowicz |- description = "component sub-image description" 146*3310c549SMarian Balakowicz |- data = /incbin/("path/to/data/file.bin") 147*3310c549SMarian Balakowicz |- type = "sub-image type name" 148*3310c549SMarian Balakowicz |- arch = "ARCH name" 149*3310c549SMarian Balakowicz |- os = "OS name" 150*3310c549SMarian Balakowicz |- compression = "compression name" 151*3310c549SMarian Balakowicz |- load = <00000000> 152*3310c549SMarian Balakowicz |- entry = <00000000> 153*3310c549SMarian Balakowicz | 154*3310c549SMarian Balakowicz o hash@1 {...} 155*3310c549SMarian Balakowicz o hash@2 {...} 156*3310c549SMarian Balakowicz ... 157*3310c549SMarian Balakowicz 158*3310c549SMarian Balakowicz Mandatory properties: 159*3310c549SMarian Balakowicz - description : Textual description of the component sub-image 160*3310c549SMarian Balakowicz - type : Name of component sub-image type, supported types are: 161*3310c549SMarian Balakowicz "standalone", "kernel", "ramdisk", "firmware", "script", "filesystem", 162*3310c549SMarian Balakowicz "fdt". 163*3310c549SMarian Balakowicz - data : Path to the external file which contains this node's binary data. 164*3310c549SMarian Balakowicz - compression : Compression used by included data. Supported compressions 165*3310c549SMarian Balakowicz are "gzip" and "bzip2". If no compression is used compression property 166*3310c549SMarian Balakowicz should be set to "none". 167*3310c549SMarian Balakowicz 168*3310c549SMarian Balakowicz Conditionally mandatory property: 169*3310c549SMarian Balakowicz - os : OS name, mandatory for type="kernel", valid OS names are: "openbsd", 170*3310c549SMarian Balakowicz "netbsd", "freebsd", "4_4bsd", "linux", "svr4", "esix", "solaris", "irix", 171*3310c549SMarian Balakowicz "sco", "dell", "ncr", "lynxos", "vxworks", "psos", "qnx", "u_boot", 172*3310c549SMarian Balakowicz "rtems", "artos", "unity". 173*3310c549SMarian Balakowicz - arch : Architecture name, mandatory for types: "standalone", "kernel", 174*3310c549SMarian Balakowicz "firmware", "ramdisk" and "fdt". Valid architecture names are: "alpha", 175*3310c549SMarian Balakowicz "arm", "i386", "ia64", "mips", "mips64", "ppc", "s390", "sh", "sparc", 176*3310c549SMarian Balakowicz "sparc64", "m68k", "nios", "microblaze", "nios2", "blackfin", "avr32", 177*3310c549SMarian Balakowicz "st200". 178*3310c549SMarian Balakowicz - entry : entry point address, address size is determined by 179*3310c549SMarian Balakowicz '#address-cells' property of the root node. Mandatory for for types: 180*3310c549SMarian Balakowicz "standalone" and "kernel". 181*3310c549SMarian Balakowicz - load : load address, address size is determined by '#address-cells' 182*3310c549SMarian Balakowicz property of the root node. Mandatory for types: "standalone" and "kernel". 183*3310c549SMarian Balakowicz 184*3310c549SMarian Balakowicz Optional nodes: 185*3310c549SMarian Balakowicz - hash@1 : Each hash sub-node represents separate hash or checksum 186*3310c549SMarian Balakowicz calculated for node's data according to specified algorithm. 187*3310c549SMarian Balakowicz 188*3310c549SMarian Balakowicz 189*3310c549SMarian Balakowicz5) Hash nodes 190*3310c549SMarian Balakowicz------------- 191*3310c549SMarian Balakowicz 192*3310c549SMarian Balakowiczo hash@1 193*3310c549SMarian Balakowicz |- algo = "hash or checksum algorithm name" 194*3310c549SMarian Balakowicz |- value = [hash or checksum value] 195*3310c549SMarian Balakowicz 196*3310c549SMarian Balakowicz Mandatory properties: 197*3310c549SMarian Balakowicz - algo : Algorithm name, supported are "crc32", "md5" and "sha1". 198*3310c549SMarian Balakowicz - value : Actual checksum or hash value, correspondingly 4, 16 or 20 bytes 199*3310c549SMarian Balakowicz long. 200*3310c549SMarian Balakowicz 201*3310c549SMarian Balakowicz 202*3310c549SMarian Balakowicz6) '/configurations' node 203*3310c549SMarian Balakowicz------------------------- 204*3310c549SMarian Balakowicz 205*3310c549SMarian BalakowiczThe 'configurations' node is optional. If present, it allows to create a 206*3310c549SMarian Balakowiczconvenient, labeled boot configurations, which combine together kernel images 207*3310c549SMarian Balakowiczwith their ramdisks and fdt blobs. 208*3310c549SMarian Balakowicz 209*3310c549SMarian BalakowiczThe 'configurations' node has has the following structure: 210*3310c549SMarian Balakowicz 211*3310c549SMarian Balakowiczo configurations 212*3310c549SMarian Balakowicz |- default = "default configuration sub-node unit name" 213*3310c549SMarian Balakowicz | 214*3310c549SMarian Balakowicz o config@1 {...} 215*3310c549SMarian Balakowicz o config@2 {...} 216*3310c549SMarian Balakowicz ... 217*3310c549SMarian Balakowicz 218*3310c549SMarian Balakowicz 219*3310c549SMarian Balakowicz Optional property: 220*3310c549SMarian Balakowicz - default : Selects one of the configuration sub-nodes as a default 221*3310c549SMarian Balakowicz configuration. 222*3310c549SMarian Balakowicz 223*3310c549SMarian Balakowicz Mandatory nodes: 224*3310c549SMarian Balakowicz - configuration-sub-node-unit-name : At least one of the configuration 225*3310c549SMarian Balakowicz sub-nodes is required. 226*3310c549SMarian Balakowicz 227*3310c549SMarian Balakowicz 228*3310c549SMarian Balakowicz7) Configuration nodes 229*3310c549SMarian Balakowicz---------------------- 230*3310c549SMarian Balakowicz 231*3310c549SMarian BalakowiczEach configuration has the following structure: 232*3310c549SMarian Balakowicz 233*3310c549SMarian Balakowiczo config@1 234*3310c549SMarian Balakowicz |- description = "configuration description" 235*3310c549SMarian Balakowicz |- kernel = "kernel sub-node unit name" 236*3310c549SMarian Balakowicz |- ramdisk = "ramdisk sub-node unit name" 237*3310c549SMarian Balakowicz |- fdt = "fdt sub-node unit-name" 238*3310c549SMarian Balakowicz 239*3310c549SMarian Balakowicz 240*3310c549SMarian Balakowicz Mandatory properties: 241*3310c549SMarian Balakowicz - description : Textual configuration description. 242*3310c549SMarian Balakowicz - kernel : Unit name of the corresponding kernel image (image sub-node of a 243*3310c549SMarian Balakowicz "kernel" type). 244*3310c549SMarian Balakowicz 245*3310c549SMarian Balakowicz Optional properties: 246*3310c549SMarian Balakowicz - ramdisk : Unit name of the corresponding ramdisk image (component image 247*3310c549SMarian Balakowicz node of a "ramdisk" type). 248*3310c549SMarian Balakowicz - fdt : Unit name of the corresponding fdt blob (component image node of a 249*3310c549SMarian Balakowicz "fdt type"). 250*3310c549SMarian Balakowicz 251*3310c549SMarian BalakowiczThe FDT blob is required to properly boot FDT based kernel, so the minimal 252*3310c549SMarian Balakowiczconfiguration for 2.6 FDT kernel is (kernel, fdt) pair. 253*3310c549SMarian Balakowicz 254*3310c549SMarian BalakowiczOlder, 2.4 kernel and 2.6 non-FDT kernel do not use FDT blob, in such cases 255*3310c549SMarian Balakowicz'struct bd_info' must be passed instead of FDT blob, thus fdt property *must 256*3310c549SMarian Balakowicznot* be specified in a configuration node. 257*3310c549SMarian Balakowicz 258*3310c549SMarian Balakowicz 259*3310c549SMarian Balakowicz8) Examples 260*3310c549SMarian Balakowicz----------- 261*3310c549SMarian Balakowicz 262*3310c549SMarian BalakowiczPlease see examples/*.its for actual image source files. 263