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