Cc: Anatolij Gustschin On 04/01/14 01:43, Przemyslaw Marczak wrote: > Changes: > - le16_to_cpu() to get_unaligned_le16() > - le32_to_cpu() to get_unaligned_le32() > when access fields in struct bmp header. > > This changes avoids data abort exception caused by unaligned data access. > > Signed-off-by: Przemyslaw Marczak <p.marc...@samsung.com> > > --- > Changes v2: > - new patch > > Changes v3: > - common/Makefile - remove CFLAG: -mno-unaligned-access > - common/lcd.c - fix data abort exception when access bmp_header > > common/lcd.c | 27 +++++++++++++-------------- > 1 file changed, 13 insertions(+), 14 deletions(-) > > diff --git a/common/lcd.c b/common/lcd.c > index 56bf067..aa81522 100644 > --- a/common/lcd.c > +++ b/common/lcd.c > @@ -26,7 +26,7 @@ > #endif > #include <lcd.h> > #include <watchdog.h> > - > +#include <asm/unaligned.h> > #include <splash.h> > > #if defined(CONFIG_CPU_PXA25X) || defined(CONFIG_CPU_PXA27X) || \ > @@ -777,9 +777,9 @@ static void lcd_display_rle8_bitmap(bmp_image_t *bmp, > ushort *cmap, uchar *fb, > int x, y; > int decode = 1; > > - width = le32_to_cpu(bmp->header.width); > - height = le32_to_cpu(bmp->header.height); > - bmap = (uchar *)bmp + le32_to_cpu(bmp->header.data_offset); > + width = get_unaligned_le32(&bmp->header.width); > + height = get_unaligned_le32(&bmp->header.height); > + bmap = (uchar *)bmp + get_unaligned_le32(&bmp->header.data_offset); > > x = 0; > y = height - 1; > @@ -900,9 +900,10 @@ int lcd_display_bitmap(ulong bmp_image, int x, int y) > return 1; > } > > - width = le32_to_cpu(bmp->header.width); > - height = le32_to_cpu(bmp->header.height); > - bmp_bpix = le16_to_cpu(bmp->header.bit_count); > + width = get_unaligned_le32(&bmp->header.width); > + height = get_unaligned_le32(&bmp->header.height); > + bmp_bpix = get_unaligned_le16(&bmp->header.bit_count); > + > colors = 1 << bmp_bpix; > > bpix = NBITS(panel_info.vl_bpix); > @@ -917,9 +918,7 @@ int lcd_display_bitmap(ulong bmp_image, int x, int y) > /* We support displaying 8bpp BMPs on 16bpp LCDs */ > if (bpix != bmp_bpix && !(bmp_bpix == 8 && bpix == 16)) { > printf ("Error: %d bit/pixel mode, but BMP has %d bit/pixel\n", > - bpix, > - le16_to_cpu(bmp->header.bit_count)); > - > + bpix, get_unaligned_le16(&bmp->header.bit_count)); > return 1; > } > > @@ -956,7 +955,6 @@ int lcd_display_bitmap(ulong bmp_image, int x, int y) > } > } > #endif > - > /* > * BMP format for Monochrome assumes that the state of a > * pixel is described on a per Bit basis, not per Byte. > @@ -987,15 +985,16 @@ int lcd_display_bitmap(ulong bmp_image, int x, int y) > if ((y + height) > panel_info.vl_row) > height = panel_info.vl_row - y; > > - bmap = (uchar *) bmp + le32_to_cpu(bmp->header.data_offset); > - fb = (uchar *) (lcd_base + > + bmap = (uchar *)bmp + get_unaligned_le32(&bmp->header.data_offset); > + fb = (uchar *)(lcd_base + > (y + height - 1) * lcd_line_length + x * bpix / 8); > > switch (bmp_bpix) { > case 1: /* pass through */ > case 8: > #ifdef CONFIG_LCD_BMP_RLE8 > - if (le32_to_cpu(bmp->header.compression) == BMP_BI_RLE8) { > + u32 compression = get_unaligned_le32(&bmp->header.compression); > + if (compression == BMP_BI_RLE8) { > if (bpix != 16) { > /* TODO implement render code for bpix != 16 */ > printf("Error: only support 16 bpix"); >
_______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot