2016-05-03 3 views
0

Я пишу драйвер ядра Linux для сторожевого таймера с использованием внутренних регистров процессора и выделенное место в (постоянном) ОЗУ для хранения отладочной информации в случае сброса с помощью сторожевого таймера.Как сопоставить ресурсы двух устройств в одном драйвере ядра Linux с использованием дерева устройств?

В старом мире у меня было два ресурса типа IORESOURCE_MEM в моем файле платы: внутренние регистры (базовый адрес внутренних регистров плюс смещение) и местоположение в ОЗУ (абсолютный адрес памяти).

Я мог бы получить доступ к ним через platform_get_resource() с соответствующим индексом, а затем я мог бы переназначить.

В новом мире с деревом устройств мой узел для сторожевого таймера находится в домене внутренних регистров процессора, и я могу получить к ним доступ без проблем.

Но как мне добавить место в памяти в ОЗУ? Базовый адрес ОЗУ отличается от внутренних регистров 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>; 
    }; 
}; 

Использование в коде (очень просто!):

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

где pdev->dev.of_node относится к узлу дерева устройства watchdog_global и debug_info является указателем на самоопределяемую структуру ,

Смежные вопросы