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
_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to