1

Как я понимаю, драйверы устройств платформы могут быть автоматически загружены, когда поле «совместимое» в дереве устройств совпадает с «совместимым» поле в модуле ядра. Вот pwm-overlay.dts файла с Raspberry Pi дистрибутива:Механизм автозагрузки драйвера устройства платформы

/ { 
    [email protected] { 
     target = <&gpio>; 
     __overlay__ { 
      pwm_pins: pwm_pins { 
       brcm,pins = <18>; 
       brcm,function = <2>; /* Alt5 */ 
      }; 
     }; 
    }; 

    [email protected] { 
     target = <&pwm>; 
     __overlay__ { 
      pinctrl-names = "default"; 
      pinctrl-0 = <&pwm_pins>; 
      status = "okay"; 
     }; 
    }; 

    [email protected] { 
     target = <&clk_pwm>; 
     frag2: __overlay__ { 
      clock-frequency = <100000000>; 
     }; 
    }; 

    __overrides__ { 
     pin = <&pwm_pins>,"brcm,pins:0"; 
     func = <&pwm_pins>,"brcm,function:0"; 
     clock = <&frag2>,"clock-frequency:0"; 
    }; 
}; 

Прежде всего, я не вижу «совместимое» поля, но в pwm-bcm2835.c файле есть такие строки:

static const struct of_device_id bcm2835_pwm_of_match[] = { 
    { .compatible = "brcm,bcm2835-pwm", }, 
    { /* sentinel */ } 
}; 

Кроме того, когда я load overlay, и автозагрузка также успешно загружена. Как это работает? Как он знает, какой драйвер для загрузки?

+0

Можете ли вы поделиться файлом dts (tree tree)? Я ожидаю ответа – levengli

ответ

2

Вы правы в отношении того, как «совместимые» поля сопоставляются для привязки драйвера к устройству, вы просто не ищете подходящее место для него.

Файл, на который вы смотрите, является наложением дерева устройства. Он добавляется в существующее дерево устройств, добавляет, удаляет или меняет некоторые узлы и свойства. Окончательное дерево устройств является результатом расчесывания оригинала с некоторым количеством наложений. Данное свойство может быть (повторно) определено в любом исходном файле оригинала и/или наложения. Это произвольное решение дизайнера о том, как структурировать исходный код дерева устройств.

Но подумайте о том, почему существуют оверлеи. Этот оверлей предназначен для настройки PWM, так как конфигурация PWM не идентична для каждой платы (вы вообще не можете ее использовать). Использование оверлеев для чего-то, что может измениться, позволяет нам сделать это изменение без создания и загрузки из нового дерева устройств. Существование оборудования ШИМ в SoC является постоянным. Даже если он не используется, его никогда не будет. Некоторые вещи об этом, как и базовый адрес регистров устройства, также не меняются. Поэтому нет смысла помещать это в оверлей, так как он не изменяется, и, скорее всего, он будет в источнике базового устройства.

В наложении [email protected] модифицирует существующий целевой узел с надписью «pwm». Если мы посмотрим на этот узел, мы находим его в bcm283x.dtsi:

  pwm: [email protected] { 
        compatible = "brcm,bcm2835-pwm"; 
        reg = <0x7e20c000 0x28>; 
        clocks = <&clocks BCM2835_CLOCK_PWM>; 
        assigned-clocks = <&clocks BCM2835_CLOCK_PWM>; 
        assigned-clock-rates = <10000000>; 
        #pwm-cells = <2>; 
        status = "disabled"; 
      }; 

И там у Вас есть совместимый свойство со значением «BRCM, bcm2835 ШИМ». Так как его не нужно менять, он находится в исходном дереве базового устройства, как и следовало ожидать.

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