[U-Boot] [PATCH] include/ns16550.h: Unify structure declaration for registers

Shinya Kuribayashi skuribay at pobox.com
Fri May 1 02:56:08 CEST 2009


Hi,

Detlev Zundel wrote:
> Thinking about it some more, I wonder about the following.  You said,
> this would work for you:
> 
> struct NS16550 {
>        unsigned long rbr;
>        unsigned long postpad_rbr[3];
> ....
> 
> while
> 
> struct NS16550 {
>        unsigned char rbr;
>        unsigned char postpad_rbr[12];
                                   15?
> ...
> 
> doesn't.  If we regard only the "significant" 8-bits, the first layout
> is congruent to the second shifted by 2 bytes (on big-endian machines).

I think you mean 'at offset 0x3', right?

My 16550 registers are like this:

        0    1    2    3
        +----+----+----+----+
0x00    |   reserved   |rbr |
        +----+----+----+----+
0x04    |     reserved      |
        +----+----+----+----+
0x08    |     reserved      |
        +----+----+----+----+
0x0c    |     reserved      |
        +----+----+----+----+
0x10    |   reserved   |ier |
        +----+----+----+----+
0x14    |     reserved      |
        +----+----+----+----+
0x18    |     reserved      |
        +----+----+----+----+
0x1c    |     reserved      |
        +----+----+----+----+
...

> So what about using +16 for your board and lower the base address by 2?
> Does that work?  What is your base address?  Is that 64-bit aligned?

With 64-bit (16 bytes) aligned base address, AND offset +0x3, AND
struct NS16550 configured by -16 (below)

struct NS16550 {
        unsigned char rbr;
        unsigned char postpad_rbr[15];
        unsigned char ier;
        unsigned char postpad_ier[15];
        ...
};

, then yes, I think this probably works for sane hardwares who can
handle byte read/write operations properly.

As for my hardware, however, this still doesn't work. My processor
(MIPS 4KEc) of couse supports byte read/write, on the other hand,
the address decoder at UART module can not handle byte addresses
properly; all byte read/write accesses with +1/+2/+3 offset, will
be round-down to +0.  Therefore, I can take 'offset +0x3' option.

This is the reasony I said 'my hardware requires 32-bit word access
to NS16550 registers'.

> This is somewhat hypothetical and outright ugly, but I still want to
> know if this works.

I know the address decoder of my UART hardware sucks, but it's not
unusual.

I'll reply to remaining mails shortly.

Thanks,

  Shinya



More information about the U-Boot mailing list