Home | History | Annotate | Download | only in doc
      1 If you are experiencing hangups/data-aborts when trying to display a BMP image,
      2 the following might be relevant to your situation...
      3 
      4 Some architectures cannot handle unaligned memory accesses, and an attempt to
      5 perform one will lead to a data abort. On such architectures it is necessary to
      6 make sure all data is properly aligned, and in many situations simply choosing
      7 a 32 bit aligned address is enough to ensure proper alignment. This is not
      8 always the case when dealing with data that has an internal layout such as a
      9 BMP image:
     10 
     11 BMP images have a header that starts with 2 byte-size fields followed by mostly
     12 32 bit fields. The packed struct that represents this header can be seen below:
     13 
     14 typedef struct bmp_header {
     15 	/* Header */
     16 	char signature[2];
     17 	__u32	file_size;
     18 	__u32	reserved;
     19 	__u32	data_offset;
     20 	... etc
     21 } __attribute__ ((packed)) bmp_header_t;
     22 
     23 When placed in an aligned address such as 0x80a00000, char signature offsets
     24 the __u32 fields into unaligned addresses (in our example 0x80a00002,
     25 0x80a00006, and so on...). When these fields are accessed by U-Boot, a 32 bit
     26 access is generated at a non-32-bit-aligned address, causing a data abort.
     27 The proper alignment for BMP images is therefore: 32-bit-aligned-address + 2.
     28