Hi Bruce, Bruce_Leonard@selinc.com wrote: > Hi, > > I've got an MPC8347 running the 2.6.24-rc5 kernel and I'm trying to access > the GPIO registers. I already have a driver that's doing related work > (tho across PCI) and I just want to remap the internal CPU address to a > kernal address and be able to read/write the register using an IOCTL call > from user space. My problem is, every accessor I try does an endian > conversion before giving me my data. So here's some code snipits of what > I'm doing: > > request_mem_region(0xe0000c00, 24, "my driver"); // 0xe0000c00 is the > memory mapped location of the GPIO regs > data_ptr2 = ioremap(0xe0000c00, 24); > > Then in the IOCTL function I try to read from the register. First I > tried: > > ioread32(data_ptr2); > > I know that the mapping is working okay because I got the data from the > GPIO direction register, but it's been byte swapped. The contents of the > register are 0xFFFFFFE7, but what my user space app gets back is > 0xE7FFFFFF. I've tried all the varients I can find, readl(), inl(), > in_be32(), in_le32(), even __raw_readl(). They all give me back byte > swapped data. I'm very confused. Especially since I've looked at > in_be32() and in_le32(), they're both inline assembly, and they use > different instructions. They can't be giving me the same results. I'm > sure I'm not the first person to want to access PowerPC internal registers > through a driver. Can anyone give me a hint what I'm doing wrong? > > As an additional question related to PowerPC inline assembly, can anyone > tell me what "%U1%X1" means in the following: > > __asm__ __volatile__("lwz%U1%X1 %0,%1; twi 0,%0,0; isync" : "=r" (ret) : > "m" (*addr)); > > Thanks. > > See 'ya! > > Bruce > _______________________________________________ > I've attached a poorly-written-yet-functional GPIO driver that I wrote a while ago for the MPC8349 (same as what you have for all intents and purposes). It uses in_be32() and out_be32(). Let me know if you have any questions. regards, Ben