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 に答える