0

Petalinux 2016.2 で Zynq SoC を使用しています。最初に AXIS Fifo にアクセスするには、

open("/dev/mem", O_RDWR | O_SYNC)

mmap を使用してアクセスします。AXIS デバイスのレジスタにアクセスし、C アプリケーションを介してデバイスと正常にインターフェイスできました。

次に、プラットフォーム デバイス ドライバーと、デバイスにアクセスするためのその他のデバイス ノードを作成しました。デバイスがドライバーによって正常に認識されたので、

fd = open("/dev/devname, O_RDWR | O_SYNC)

次に、次のコマンドでデバイスを再度 mmap します。

info->mapped_base = mmap(0, AXIFIFO_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0)

レジスタを読み取ることができ、正しいメモリ領域のようです。しかし、いくつかのレジスタへの書き込みを開始すると、次のエラーが発生し始めます。

Unhandled fault: imprecise external abort (0x1406) at 0x36e42000
pgd = 40ab4000
[36e42000] *pgd=3bff0831, *pte=43c0075f, *ppte=43c00c7f
Bus error

最初は SRR リセット レジスタに書き込むときだけのように見えましたが、他にもいくつかの場所があります。

私が見逃している明らかなものはありますか?メモリがマップされ、アクセスできる方法に関連する特定のフラグに関係していると思われます。

現在、デバイス ドライバーに独自の mmap 関数があり、次の操作を行います。start と length は、AXIS FIFO のレジスターのマップされた領域のサイズを示します。

vm_iomap_memory(vma, start, length)
4

1 に答える 1

1

メモリが vma_area_struct にキャッシュされているとマークされているようです:

簡単に:

vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);

vm_iomap_memory(vma, start, length)

トリックをしました。

于 2016-09-06T11:11:07.180 に答える