запись в ioport, в результате чего возникают ошибки - PullRequest
1 голос
/ 11 апреля 2010

Я пишу для одноплатного компьютера 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);

и я segfault ... в частности "не удалось обработать запрос на подкачку ядра по виртуальному адресу fffffc20."

Мне кажется, что я не выделяю правильное пространство памяти ...

любая полезная идея была бы великолепна ...

1 Ответ

3 голосов
/ 12 апреля 2010

Вы должны отобразить запрошенный регион памяти.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 можно найти здесь
На самом деле, навигация по источникам ядра с использованием lxr, вероятно, лучший способ научиться тому, как это делается.

...