Nikita Kiryanov | c088048 | 2013-02-24 21:28:43 +0000 | [diff] [blame^] | 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. |