Драйвер ядра, всегда ли нужно свойство pinctrl при использовании оверлея GPIO? - PullRequest
0 голосов
/ 21 декабря 2018

Я задавал этот вопрос в Unix Stackexchange, но, похоже, это было неправильное место для такого рода проблем.Объявление rem:

Я создаю драйвер ядра для дисплея, управляемого SPI, который предназначен для работы с Raspberry PI.Помимо трех линий SPI, дисплей имеет 3 дополнительные линии управления: BUSY , RST и DC .Чтобы иметь возможность управления этими строками, мой DTS должен включать дополнительный фрагмент для GPIO.

fragment@0 {
    target = <&spi0>;
    __overlay__ {
        #address-cells = <1>;
        #size-cells = <0>;

        status = "okay";

        spidev@0 {
            status = "disabled";
        };

        epd0: epd@0 {
            compatible = "waveshare,epd";
            reg = <0>;

            pinctrl-names = "default";
            pinctrl-0 = <&epd_pins>;

            spi-max-frequency = <1000000>;

            width = <128>;
            height = <296>;

            dc-gpios = <&gpio 16 0>;
            reset-gpios = <&gpio 20 0>;
            busy-gpios = <&gpio 21 0>;

            status = "okay";
        };
    };
};

fragment@1 {
    target = <&gpio>;
    __overlay__ {
        epd_pins: epd_pins {
            brcm,pins = <16 20 21>; /* DC RST BUSY */
            brcm,function = <1 1 0>; /* out out in */
        };
    };
};

То, что DTS работает отлично, и я не ожидал никаких проблем.Но есть одна вещь, в которой я не уверен:

pinctrl-names = "default";
pinctrl-0 = <&epd_pins>;

Я видел подобные свойства в других DT с фрагментами gpio, но не всегда;иногда они есть, иногда нет.Если я закомментирую эти две строки, то, похоже, ничего не изменится, и мой драйвер все еще работает как надо.

У меня есть два вопроса:

  1. Какова цель этих pinctrl строк?Мне известна подсистема контроллера выводов, но я строго спрашиваю в контексте моего DT.
  2. Зачем мне объявлять оверлей gpio?В любом случае я устанавливаю функцию IN или OUT непосредственно из кода моего драйвера, и мои номера gpio определяются в оверлее spi (dc-gpios, reset-gpios, busy-gpios).

1 Ответ

0 голосов
/ 24 декабря 2018

Чтобы ответить на ваш вопрос (при условии, что вы понимаете функцию строки pinctrl в дереве устройств в целом).

  1. Когда ваше устройство проверяется ядром, если у вас есть теВ вашем dts строки pinctrl, а затем ядро ​​просит подсистему pinctrl сконфигурировать контакты, перечисленные в brcm,pins, в качестве соответствующих функций, определенных в brcm,function.Состояние pinctrl с именем default запрашивается ядром для автоматической установки.Вы можете определить другие состояния как

    pinctrl-names = "default", "sleep";

    pinctrl-0 = <&spi1_default>;

    pinctrl-1 = <&spi1_sleep>;

    , а для других состояний, таких как сон или режим ожидания, вы будете иметьявно вызывать их, когда драйвер изменяет состояние для управления питанием, вызывая функции pinctrl_pm_select_sleep_state или pinctrl_pm_select_idle_state соответственно.Вы можете вызывать эти функции только в том случае, если соответствующие состояния выводов определены в дереве устройств, иначе вам может потребоваться выполнить настройку вручную, вызывая pinctrl apis.

  2. В вашем случае это не требуется, так как выГоворят, что вы явно устанавливаете режимы и конфигурацию выводов в драйвере устройства, тогда в этом случае для вашего конкретного случая вам могут не понадобиться эти строки в дереве вашего устройства.

...