[U-Boot] [PATCH] display_buffer: fix misaligned buffer
Reinhard Meyer
u-boot at emk-elektronik.de
Tue Aug 31 08:04:53 CEST 2010
Hi,
making the change to the union, I also realized that
/* Copy from memory into linebuf and print hex values */
for (i = 0; i < linelen; i++) {
uint32_t x;
if (width == 4)
x = lb.u32[i] = *(volatile uint32_t *)data;
else if (width == 2)
x = lb.u16[i] = *(volatile uint16_t *)data;
else
x = lb.u8[i] = *(volatile uint8_t *)data;
printf(" %0*x", width * 2, x);
data += width;
}
is still a bit "ugly". What about:
union data {
u_int32_t *u32;
u_int16_t *u16;
u_int8_t *u8;
void *v;
} dp;
dp.v = data;
then:
/* Copy from memory into linebuf and print hex values */
for (i = 0; i < linelen; i++) {
if (width == 4)
x = lb.u32[i] = *(dp.u32)++;
else if (width == 2)
x = lb.u16[i] = *(dp.u16)++;
else
x = lb.u8[i] = *(dp.u8)++;
printf(" %0*x", width * 2, x);
}
optionally calling printf inside the if:
/* Copy from memory into linebuf and print hex values */
for (i = 0; i < linelen; i++) {
if (width == 4)
printf(" %08x", lb.u32[i] = *(dp.u32)++);
else if (width == 2)
printf(" %04x", lb.u16[i] = *(dp.u16)++);
else
printf(" %02x", lb.u8[i] = *(dp.u8)++);
}
maybe it would even be more effective to swap for and if:
/* Copy from memory into linebuf and print hex values */
if (width == 4) {
for (i = 0; i < linelen; i++)
printf(" %08x", lb.u32[i] = *(dp.u32)++);
} else if (width == 2) {
for (i = 0; i < linelen; i++)
printf(" %04x", lb.u16[i] = *(dp.u16)++);
} else {
for (i = 0; i < linelen; i++)
printf(" %02x", lb.u8[i] = *(dp.u8)++);
}
Of course, all is purely cosmetic ;)
Reinhard
More information about the U-Boot
mailing list