views:

41

answers:

1

I'm writing for an atmel at91sam9260 arm 9 cored single board computer [glomation gesbc9260]

Using request_mem_region(0xFFFFFC00,0x100,"name"); //port range runs from fc00 to fcff

that works fine and shows up in /proc/iomem

then i try to write to the last bit of the port at fc20 with

writel(0x1, 0xFFFFFC20);

and i segfault...specifically "unable to handle kernel paging request at virtual address fffffc20.

I'm of the mind that i'm not allocating the right memory space...

any helpful insight would be great...

+2  A: 

You need to ioremap the mem region you requested. ioremap maps a virtual address to a physical one. writel works with virtual addresses, not with physical ones.

/* request mem_region */
...

base = ioremap(0xFFFFFC00, 0x100);
if(base == NULL)
    release_mem_region(...);
/* now you can use base */
writel(0x1, base + 20)
...

What you probably need is to write your driver as a platform_driver, and declare a platform device in your board_file

An example of a relatively simple platform_driver can be found here
In fact, navigating through the kernel sources using lxr is probably the best way to learn how to stuff like this.

shodanex
awesome - that sorted me out :) thaks
Sniperchild