2017-11-14 4 views
2

私はLinuxカーネル4.13.x用のイーサネットドライバをBanana Pi M2 ultra用に書こうとしています。 Linuxカーネルインフラストラクチャでは、以前はいわゆる「デバイスツリー」(DT)が導入されました。 私はデバイスドライバを書いている間にDTを使った経験はあまりありません。そのために、 いくつか質問があります。バナナパイとデバイスツリーのLinuxデバイスドライバ

私が知る限り、バナナパイシステムの場合、所定の 周辺デバイスに対していくつかのクロックソースを提供する必要があります。このような時計を提供するのは、バナナパイのCCUの機能です。 CCUは、Linuxカーネルの一部のアドレスで利用可能なメモリ リソースです。私は がCCUからいくつかのクロックを必要とするイーサネット用のドライバを書いています。

CCUの物理アドレスは、ioremap()または同様の機能を使って仮想アドレスにマップする必要があることは知っています。

私の質問は、どのように私のイーサネットドライバでCCUの仮想アドレスを取得できますか? デバイスツリー経由で行うことはできますか?はいの場合 - これを行う方法?あるいは、この仮想アドレスは別の方法で取得できますか?

私はそれがDTかいくつかの手続きまたはグローバルポインタ経由で(virtアドレスを取得して)行われているかどうか分かりません。

アイデアや提案はありますか?

+1

ドライバはCCUの仮想アドレスを取得してはいけません。カーネルは、ドライバがそのようなアドレスやデータを共有しないように、データカプセル化などのオブジェクト指向技術を使用します。ドライバが必要なクロックを取得または有効にするために呼び出すことができる関数がいくつかあります。 – sawdust

答えて

0

Linuxカーネルにはプラットフォームドライバの例があります。私はラズベリーパイのi2cとi2sに取り組んだので、それらの例を引用することができます。プローブ機能でhttp://elixir.free-electrons.com/linux/v4.3.2/source/drivers/i2c/busses/i2c-bcm2835.c

探す場所

、それは

platform_get_resource(pdev, IORESOURCE_MEM, 0); 

サブシステムのAPIを呼び出し、この缶はioremapある物理アドレスを提供します。これについては

作成するために必要ですデバイスツリー内のデバイスノード内のデバイスノード https://github.com/raspberrypi/linux/blob/rpi-4.9.y/arch/arm/boot/dts/bcm283x.dtsi

i2c0 deviファイルbcm283x.dtsiのceノード。

物理アドレスが

reg = <0x7e205000  0x1000>; 

     physical add  size 

を保存されている場所にregキーがあるが、このヘルプあなたを願っています。

デバイスツリーは以前と同じプラットフォームデータと見なすことができます

+0

私はあなたのポイントを取得していないか、あなたは私のポイントを逃した。私は物理アドレスを配置する方法を探しているのではなく、このCCUを使用する必要があるすべての周辺デバイス間でCCUの仮想アドレスを共有する方法を探しています。すべての周辺機器ドライバは、CCU仮想アドレスを使用して、適切にクロックを設定する必要があります。したがって、これは関係1:n - 多くのドライバが周辺機器(CCU)の1つから仮想アドレスを使用します。私の主な問題はCCUのこの仮想アドレスへのアクセス方法です。 – user2699113

+0

これはデバイスツリーを通じて実行できます。 CCUクロック用のデバイスノードを作成し、それを必要とするすべての周辺デバイスにデバイスノードを共有することができます。デバイスツリーのファンドルという概念を使うことができます。クロックデバイスノードが異なるノード間でどのように共有されているかをご覧ください。https://github.com/raspberrypi/linux/blob/rpi-4.9.y/arch/arm/boot/dts/bcm283x.dtsi。うまくいけば私はあなたの質問を理解しました – Varun

+0

正しい方法は、クリックしたフレームワークを@sawdustが指すように正しく使用することです。 – 0andriy

関連する問題