2010-04-11 52 views
1

我正在写为爱特梅尔AT91SAM9260臂9芯单板计算机的IOPORT [glomation gesbc9260]写入造成的段错误

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

工作正常和在/proc/iomem

显示出来然后我试着写端口在FC20的最后一位与

writel(0x1, 0xFFFFFC20);

和我segfault ...特别是“无法处理在虚拟地址fffffc20的内核寻呼请求。”

我说我不分配正确的内存空间心灵......

任何有益的见解将是巨大的......

回答

3

您需要的ioremap您所请求的MEM区域。 ioremap将虚拟地址映射到物理地址。 writel使用虚拟地址,而不是物理地址。

/* request mem_region */ 
... 

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

什么你可能需要的是写你的驱动程序作为的platform_driver,并在board_file

可以发现here
其实相对简单的platform_driver的例子声明了一个平台设备,航经使用lxr的内核资源可能是学习如何使用这种东西的最好方法。

+0

真棒 - 那我整理出来:) thaks – Sniperchild 2010-04-12 20:35:26

+0

应该用'Iowrite32'来代替吗? – 2011-03-04 09:00:29

+0

如果另一个驱动程序已经将它映射到虚拟内存中,request_mem_region是否仍然需要以及“ioremap”? – 2011-03-04 10:14:07