How to write portable device drivers?

gmane at reliableembeddedsystems.com gmane at reliableembeddedsystems.com
Thu Jul 21 16:38:25 EDT 2011


Hi,

Please correct me, if I'm wrong, but that's my understanding.

include/linux/byteorder/generic.h defines macros, which take both the
CPU endianess and the endianess of the peripherial device you want to
access into account.

e.g. cpu_to_le32  will no matter what's the endianess of the CPU write
to a little endian 32 address (do the swapping or not)

but there are also in lib/iomap.c macros like iowrite32, which don't
seem to take the CPU endianess into account

Now looking e.g. at drivers/net/e100.c both kind of macros are used.

e.g. ioread32 and also cpu_to_le32

The iowritexxx macros seem to boil down to outxx macros and it looks
like iomap needs to be called before - maybe the endianess of the CPU is
taken into account there, if so it's not obvious to me;)

I'm a bit confused since we seem to have I/O ports and I/O memory.

Can you please elaborate a bit when to use what and what happens with
the CPU endianess in case of ioread/write macros?

My goal is to understand how to write portable drivers which can be used
with all kinds of funny CPU / peripheral endianess combinations.

Regards,

Robert

..."Everything should be built top-down, except the first time."

My public pgp key is available at:
http://pgp.mit.edu:11371/pks/lookup?op=get&search=0x90320BF1






More information about the Kernelnewbies mailing list