1

我正在为 atmel at91sam9260 arm 9 核单板计算机 [glomation gesbc9260]

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

工作正常并显示在/proc/iomem

然后我尝试用 fc20 写入端口的最后一位

writel(0x1, 0xFFFFFC20);

我段错误...特别是“无法在虚拟地址 fffffc20 处处理内核分页请求。”

我想到我没有分配正确的内存空间......

任何有用的见解都会很棒...

4

1 回答 1

3

您需要 ioremap 您请求的内存区域。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 中声明一个平台设备

可以在这里
找到一个相对简单的 platform_driver 示例 事实上,使用 lxr 浏览内核源代码可能是学习如何进行此类操作的最佳方法。

于 2010-04-12T07:52:51.107 回答