Hi Oliver,Ok I think I like the Endianess, ioread32be does the right thing then? I'll read up on that.
On Fri, May 24, 2013 at 11:50:38PM +0200, Oliver Schinagl wrote:On 05/18/13 19:19, Oliver Schinagl wrote:
<snip>
But i'm not smart enough :pI didn't want to depend on the fixed layout of memory, but consider it+
+
+/* We read the entire key, using a look up table. Returned is only the
+ * requested byte. This is of course slower then it could be and uses 4 times
+ * more reads as needed but keeps code a little simpler.
+ */
+u8 sunxi_sid_read_byte(const int key)
+{
+ u32 sid_key;
+ u8 ret;
+
+ ret = 0;
+ if (likely((key <= SUNXI_SID_SIZE))) {
+ sid_key = ioread32(p->sid_base + keys_lut[key >> 2]);
+ switch (key % 4) {
+ case 0:
+ ret = (sid_key >> 24) & 0xff;
+ break;
+ case 1:
+ ret = (sid_key >> 16) & 0xff;
+ break;
+ case 2:
+ ret = (sid_key >> 8) & 0xff;
+ break;
+ case 3:
+ ret = sid_key & 0xff;
+ break;
+ }
+ }
Come on, you can do better. This lookup table is useless.
removed.
We can either use the look up table (which does have benefits as its
potentially more future proof), or do some ((key >> 2) << 2) to
'drop' the LSB's that we want to ignore (unless there's some smarter
way).
Personally, I think the LUT is a little cleaner and more readable,
but I guess if you look at poor efficiency, the lut costs some
memory, the left/right shift cost an additional >> 2 ... what you
prefer.
What about:
val = ioread32be(base + (key / 4));
val >>= (key % 4) * 8;
return val & 0xff;
No lookup table, no weird swich statement, and you get the endianness
conversion only when you need it.
Maxime