2016-05-03 37 views
0

私は、CPUの内部レジスタを使用してウォッチドッグ用のLinuxカーネルドライバを作成しています(ウォッチドッグリセットの場合にデバッグ情報を格納する専用の永続RAM)。デバイスツリーを使用して1つのLinuxカーネルドライバで2つのデバイスのリソースをマップする方法はありますか?

私のボードファイルには、内部レジスタ(内部レジスタのベースアドレス+オフセット)とRAM(絶対メモリアドレス)の2種類のリソースがありました。ボードファイルにはIORESOURCE_MEMという2種類のリソースがありました。

platform_get_resource()で適切なインデックスを使用してアクセスできます。

デバイスツリーを備えた新しい世界では、ウォッチドッグ用のノードは内部CPUレジスタのドメインにあり、問題なくアクセスできます。

しかし、RAMに自分のメモリの場所を追加するにはどうすればよいですか? RAMのベースアドレスはCPU内部レジスタとは異なりますので、単に "reg"エントリに別の範囲を追加することはできません(reg = <0x20300 0x408>, <0x3BFFE000 0x1000>;など)。このような新しい「デバイス」を追加する必要はありますか?

PRAM { 
    #address-cells = <1>; 
    #size-cells = <1>;  
    PRAM0: Watchdog_Crash_Debug_Context {    
     reg = <0x3BFFE000 0x1000>; 
    }; 
}; 

しかし、どのように私は、ウォッチドッグデバイスドライバで参照できますか?または、ウォッチドッグデバイスのツリーエントリにありますか?

Linuxバージョンは4.1.18です。

+0

ハードウェアウォッチドッグのハードウェア? – jgr208

+0

ハードウェアウォッチドッグ(Marvell Armada XP上) –

答えて

0

その間に私は解決策を自分で見つけました。秘密は魔法の機能でしたof_parse_phandle()

デバイスツリーの設定:コード内

soc { 
    ... 
    internal-regs { 
     ... 
     watchdog_global { 
      ... 
      PRAM_address = <&PRAM0>; 
     }; 
    }; 
}; 


PRAM { 
    #address-cells = <1>; 
    #size-cells = <1>; 
    ranges = <0 0 0x3b000000 0x5000000>; 

    PRAM0: Watchdog_Crash_Debug_Context {    
     reg = <0xFFE000 0x1000>; 
    }; 
}; 

は、使用方法(本当に簡単!):pdev->dev.of_nodeがデバイスツリーノードwatchdog_globalを参照し、debug_infoは自己定義構造体へのポインタである

struct device_node *PRAM_node = of_parse_phandle(pdev->dev.of_node, "PRAM_address", 0); 
debug_info = of_iomap(PRAM_node, 0); 
of_node_put(PRAM_node); 

関連する問題