2017-06-21 10 views
1

私の友人と私は、高度なオペレーティングシステムクラスの仮想デバイス用のデバイスドライバ(読み込み:PCIまたはUSBではない)を作成しようとしています。私たちはUbuntu 16.04を使用しています。私たちの仕事は、ドライバのIOCTLを呼び出して、RGB値(整数の配列)、空の宛先バッファ、および長さでいっぱいのソースバッファを与えることです。 DMAコントローラを呼び出してソースバッファの内容をデスティネーションバッファに転送し、次にデスティネーションバッファの所定の位置にある値に線形変換を適用します。LinuxでメモリからメモリへのDMA転送が可能ですか?もしそうなら、どの機能が転送を開始するためにDMAを呼び出すのでしょうか?

私たちはDMAなしで変換を成功させ、私たちのデバイスにDMAチャンネルを割り当てました。私たちは、DMAを使って転送を開始することを記述するのどこでもの機能を見つけることができないという問題があります。我々は完了時に割り込みを発生させたい(ドライバーは、転送が完了するのを待ってスピンしてはならない)。

このプロセスを説明する関数の定義がどこにあるかわかりたいと思います。この作業を完了するためのコードや正確な方法は求めていません。どの機能を使用できるか、そして/またはどのヘッダファイルを見つけるのかを知りたいだけです。私たちはlinux/dma-mapping.hを見て、一見奇妙なものです。 LDD3についてはしばらくの間見てきましたが、実際にDMA転送を開始するためにどの機能を使用するべきかについての情報をあまり与えずに、DMAを設定するプロセスを徹底的に行っているようです。 drivers/dmaディレクトリにできるメモリ間コピーのローカルDMAエンジンをサポートするために、最近のLinuxカーネルで「DMAエンジン」のAPIがあります

答えて

1

、彼らは実装されているか確認してください。

http://elixir.free-electrons.com/linux/latest/source/drivers/dma/Kconfig

menuconfig DMADEVICES 
bool "DMA Engine support" 
depends on HAS_DMA 
help 
    DMA engines can do asynchronous data transfers without 
    involving the host CPU. Currently, this framework can be 
    used to offload memory copies in the network stack and 
    RAID operations in the MD driver. This menu only presents 
    DMA Device drivers supported by the configured arch, it may 
    be empty in some cases. 

DMAエンジンはいくつかのハードウェアプラットフォームで実装されていますが、すべてのPC、サーバー、またはSoCでは実装されていません。 INTEL_IDMA64「Intel integrated DMA .. Intel Skylake PCH」、INTEL_IOATDMA「最近のIntel Xeonチップセットに搭載されたIntel(R)I/OAT DMAエンジン」のようなKconfigのオプションをチェックしてください。

その他のオプションは、qemuのような仮想化プラットフォームを使用し、独自のデバイスエミュレーションを実装することです(https://stackoverflow.com/a/44612957 eduデバイスとsimple driverhttp://wiki.qemu.org/Features/QOM)。

割り込みハンドラを登録する方法を尋ねる場合は、(仮想)バスと、(仮想)デバイスの接続方法(仮想デバイスの実装方法)を教えてください。そして、qemu's "edu" pci.c driver has some examples for PCI-compatible interruptsrequest_irq(pci_irq, irq_handler, IRQF_SHARED, "pci_irq_handler0", &major)

関連する問題