开发者

writing to an ioport resulting in segfaults

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 p开发者_Python百科ort 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...


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.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜