2016-05-03 2 views
0

Ich schreibe einen Linux-Kernel-Treiber für einen Watchdog mit den internen Registern der CPU und eine dedizierte Stelle in (persistent) RAM für die Speicherung von Debug-Informationen im Falle eines Watchdog-ausgelöstes Reset.Wie können Ressourcen von zwei Geräten in einem Linux-Kernel-Treiber mithilfe der Gerätebaumstruktur abgebildet werden?

In der alten Welt hatte ich zwei Ressourcen vom Typ IORESOURCE_MEM in meiner Board-Datei: die internen Register (Basisadresse der internen Regs plus Offset) und die Position im RAM (absolute Speicheradresse).

Ich könnte diese über platform_get_resource() mit dem entsprechenden Index zugreifen, und dann könnte ich neu zuordnen.

In der neuen Welt mit einem Gerätebaum befindet sich mein Knoten für den Watchdog im Bereich der internen CPU-Register und ich kann ohne Probleme auf sie zugreifen.

Aber wie kann ich meinen Speicherplatz im RAM hinzufügen? Die Basisadresse des RAM unterscheidet sich von den CPU-internen Registern, so dass ich nicht einfach einen anderen Bereich zum "reg" -Eintrag hinzufügen kann (wie reg = <0x20300 0x408>, <0x3BFFE000 0x1000>;). Muss ich vielleicht ein neues "Gerät" hinzufügen?

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

Aber wie referenziere ich es im Watchdog-Gerätetreiber? Oder im Watchdog-Gerätebaumeintrag?

Linux-Version ist 4.1.18.

+0

Hardware von Software Watchdog? – jgr208

+0

Hardware-Wachhund (auf Marvell Armada XP) –

Antwort

0

In der Zwischenzeit habe ich die Lösung selbst gefunden. Das Geheimnis war die magische Funktion of_parse_phandle().

Gerätestrukturaufbau:

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>; 
    }; 
}; 

Usage in Code (wirklich einfach!):

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); 

wo pdev->dev.of_node zu Knoten Gerätebaum watchdog_global und debug_info ist ein Zeiger auf eine selbstdefinierte struct bezieht .

Verwandte Themen