Yosemite/440EP why are readl()/ioread32() setup to read little-endian?
Eugene Surovegin
ebs at ebshome.net
Thu Jan 26 05:51:31 EST 2006
On Wed, Jan 25, 2006 at 10:26:55AM -0800, David Hawkins wrote:
> Hi Stefan,
>
> >>readl() and ioread32() read the registers in little-endian format!
> >
> > Correct. That's how it is implemented on all platforms. Think for example of
> > an pci device driver. Using these IO functions, the driver will become
> > platform independent, running without modifications on little- and big-endian
> > machines.
>
> Ok, I figured that was probably the case. Thanks for the confirmation.
>
> >>Should I just be using pointers for remapped processor
> >>registers, and only use readl(), ioread32(), etc, on external
> >>memory?
> >
> > That's how I do it. Only use readl() and friends for pci spaces (or other
> > little endian memory mapped areas).
>
> I took a look at the Yosemite network and USB drivers, it looks like
> the authors of those drivers chose to use in_be32() and out_be32().
>
> Personally I like the concept of using pointers, or more usefully
> pointers to structure overlays for device control. However, the
> impression I have is that this is inherently more non-portable
> than using the readl()/writel(), ioread32()/iowrite32(), and
> now I guess I can add in_be32()/out_be32() to that list.
>
> But if you use pointers, thats good enough for me!
use in_/out_ accessors, not pointers. Look at other 4xx drivers (i2c,
emac)
Also, you don't have worry about this code being non-portable, because
every chip has it's own GPIO impl anyway.
--
Eugene
More information about the Linuxppc-embedded
mailing list