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