2010-04-11 58 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