Hey guys, me again. :)
So, my device is working great now that I can access the GPIO pins via userspace (using iotools w/ Tom Sylla's help) and can power on the device. However, I'd like to be able to toggle the power on via a kernel driver as well, but I'm having trouble accessing the same memory range from kernelspace.
For example:
iotools io_read8 0xA00
Will return the state of the first 5 GPIO pins. I see that iotools calls iopl() to be able to access this location from userspace.
When I try to do the same thing in the kernel:
unsigned short b; unsigned short* ptr = (unsigned short*)(0xA00);
if(access_ok(VERIFY_READ, ptr, 8)) { get_user(b, ptr);
...I immediately get a segfault. From what I've read and seen in other example code, I believe I'm doing this right. However, I may be making some wrong assumptions. I was just curious if anyone would be able to shed some light on the subject--perhaps I'm missing some virtual memory offset functions or similar...
Your address is in I/O address space, not memory address space. Take a look at io_rw.c in iotools, you need to be using inb/outb (not just reading/writing memory).
Tom
On Thu, Apr 14, 2011 at 4:12 PM, Jeremy Moles jeremy@emperorlinux.com wrote:
Hey guys, me again. :)
So, my device is working great now that I can access the GPIO pins via userspace (using iotools w/ Tom Sylla's help) and can power on the device. However, I'd like to be able to toggle the power on via a kernel driver as well, but I'm having trouble accessing the same memory range from kernelspace.
For example:
iotools io_read8 0xA00
Will return the state of the first 5 GPIO pins. I see that iotools calls iopl() to be able to access this location from userspace.
When I try to do the same thing in the kernel:
unsigned short b; unsigned short* ptr = (unsigned short*)(0xA00);
if(access_ok(VERIFY_READ, ptr, 8)) { get_user(b, ptr);
...I immediately get a segfault. From what I've read and seen in other example code, I believe I'm doing this right. However, I may be making some wrong assumptions. I was just curious if anyone would be able to shed some light on the subject--perhaps I'm missing some virtual memory offset functions or similar...
-- coreboot mailing list: coreboot@coreboot.org http://www.coreboot.org/mailman/listinfo/coreboot