Ядро Linux

Ядро основано на базе 5.10.y. Git-репозиторий исходного кода — https://github.com/elvees/linux/tree/mcom03-5.10.y.

Поддержка ELV-MC03-SMARC r1.1

Ядро поддерживает следующие интерфейсы и компоненты модуля:

  • CAN0, CAN1,

  • eMMC (SDMMC0),

  • I2C_PM (I2C0),

  • I2C_LOCAL (I2C1),

  • I2C_GP (I2C2),

  • I2C_CAM0 (через I2C-расширитель, подключенный к I2C3 MCom-03),

  • I2C_CAM1 (через I2C-расширитель, подключенный к I2C3 MCom-03),

  • I2C_LCD (через I2C-расширитель, подключенный к I2C3 MCom-03),

  • GBE0,

  • GBE1,

  • GPIO,

  • I2S1 (MFBSP0),

  • HDMI-аудио и видео (также см. Поддержка HDMI),

  • MIPI CSI 2.0,

  • MIPI DSI,

  • PCIe A 4x (PCIe1),

  • SATA (SATA-контроллер подключен к контроллеру PCIe0 MCom-03),

  • SDIO (SDMMC1),

  • Serial I2C EEPROM (I2C2),

  • SER0,

  • SER1 (UART0),

  • SER2 (UART2),

  • SER3 (UART1),

  • SPI0 (SPI0/SSI0),

  • SPI1 (QSPI1),

  • USB0, USB1, USB2, USB4, USB5 поддерживается USB 2.0 (USB1 с поддержкой хаба),

  • USB3 поддерживается USB 3.0 (USB0).

Примечание:

  • Наименования интерфейсов приведены в соответствии со спецификацией SMARC 2.1.

  • В скобках указаны контроллеры MCom-03.

Поддержка ELV-SMARC-CB r1.0

Ядро поддерживает следующие интерфейсы и компоненты модуля:

  • CAN0, CAN1,

  • CSI0, 2 линии (подключено к I2C_CAM0 SMARC-модуля),

  • CSI1, 4 линии (подключено к I2C_CAM1 SMARC-модуля),

  • DSI (дисплеи Raspberry Pi 7" DSI, Raspberry Pi Waveshare 4.3" DSI),

  • Eth0, Eth1,

  • USB 2.0 Type-A x2 (подключен к выводам USB0, USB1 SMARC-модуля),

  • HDMI-аудио и видео (также см. Поддержка HDMI),

  • microSD (подключен к SDIO SMARC-модуля),

  • USB 3.0 Type-A x2 (подключен к USB3 SMARC-модуля через USB hub 3.0),

  • PCIe x16 (подключено только 4 лейна SMARC-модуля),

  • SATA,

  • ID EEPROM (I2C_PM SMARC-модуля),

  • аудио (линейный вход, выход, микрофон),

  • контроллер вентилятора EMC2303.

Поддержка ELV-SMARC-CB r2.10.3

Ядро поддерживает следующие интерфейсы и компоненты модуля:

  • CAN0, CAN1,

  • CSI0, 2 линии (подключено к I2C_CAM0 SMARC-модуля),

  • CSI1, 4 линии (подключено к I2C_CAM1 SMARC-модуля),

  • Eth0, Eth1,

  • ID EEPROM (подключено к I2C_PM SMARC-модуля),

  • HDMI-аудио и видео (также см. Поддержка HDMI),

  • microSD (подключен к SDIO SMARC-модуля),

  • PWM Fan,

  • RTC,

  • RS-232 XP12 (подключено к SER0 SMARC-модуля),

  • RS-485 XP13 (подключено к SER0 SMARC-модуля),

  • SATA,

  • SPI флеш-память,

  • PCIe x16 (подключено только 4 лейна SMARC-модуля),

  • UART Rpi XP6 (подключено к SER2 SMARC-модуля),

  • UART XP15 (подключено к SER3 SMARC-модуля),

  • USB 2.0 XP4, XS2, XS3, XS10,

  • USB 3.0 XS9,

  • аудио (выход, микрофон),

  • светодиоды,

  • сенсор температуры.

Поддержка ELV-SMARC-CB r3.2.1

Ядро поддерживает следующие интерфейсы и компоненты модуля:

  • CAN0, CAN1,

  • CSI0, 2 линии (подключено к I2C_CAM0 SMARC-модуля),

  • CSI1, 4 линии (подключено к I2C_CAM1 SMARC-модуля),

  • Eth0, Eth1,

  • ID EEPROM (подключено к I2C_PM SMARC-модуля),

  • HDMI-аудио и видео (также см. Поддержка HDMI),

  • microSD (подключен к SDIO SMARC-модуля),

  • PWM Fan,

  • RTC,

  • RS-232 XP10 (подключено к SER0 SMARC-модуля),

  • RS-485 XP11 (подключено к SER0 SMARC-модуля),

  • SATA,

  • SPI флеш-память,

  • PCIe x16 (подключено только 4 лейна SMARC-модуля),

  • UART Rpi XP14 (подключено к SER2 SMARC-модуля),

  • UART XP13 (подключено к SER3 SMARC-модуля),

  • USB 2.0 XP2, XS2, XS3, XS10

  • USB 3.0 XS9

  • аудио (выход, микрофон),

  • светодиоды,

  • сенсор температуры.

Поддержка ROCK Pi N10

Ядро поддерживает следующие интерфейсы и компоненты модуля:

  • CSI0, 2 линии (подключено к I2C_CAM0 SMARC-модуля),

  • Ethernet,

  • HDMI-аудио и видео (также см. Поддержка HDMI),

  • I2C0,

  • I2C1,

  • I2C2,

  • I2C3,

  • DSI (дисплеи Raspberry Pi 7" DSI, Raspberry Pi Waveshare 4.3" DSI),

  • microSD (подключен к SDIO SMARC-модуля),

  • PCIe M.2 (подключен к PCIe_A 4x SMARC-модуля),

  • UART2 (подключен к SER1 SMARC-модуля),

  • USB 2.0 (2 порта),

  • USB 3.0 (1 порт),

  • микрофон и линейный аудио-выход.

Номера прерываний в DeviceTree

В руководстве пользователя на микросхему прерывания всех типов нумеруются сквозным образом:

  • 0-15 — SGI,

  • 16-31 — PPI,

  • 32-127 — SPI.

В Linux для каждого типа прерывания используется своя нумерация, начиная с нуля. Т.о. номер прерывания из РП преобразуется в описание в DeviceTree следующим образом:

N

Описание в DeviceTree

0-15

Не используется

16-31

<GIC_PPI (N-16) IRQ_TYPE_LEVEL_LOW>

32-127

<GIC_SPI (N-32) IRQ_TYPE_LEVEL_HIGH>

Драйверы pinctrl

API драйверов предназначен для управления контактными площадками MCom-03, мультиплексированием выводов GPIO согласно стандартному описанию в файле pinctl.rst.

Устройство управления конфигурированием/мультиплексированием выводов должно быть описано в DeviceTree в виде узла, содержащего дочерние узлы с описанием возможных конфигураций выводов. Другие устройства могут ссылаться на эти узлы согласно стандартному описанию в pinctrl-bindings.txt.

Поддержка управления пинами MCom-03 реализована набором драйверов pinctrl:

Драйверы pinctrl-mcom03-*:

  • pinctrl-mcom03-hsperiph: управление пинами подсистемы HSPERIPH, поддерживается pinconf/pinmux API;

  • pinctrl-mcom03-lsperiph: управление пинами подсистем LSPERIPH0/1, поддерживается pinconf API.

  • pinctrl-mcom03-media: управление пинами подсистемы MEDIA, поддерживается pinmux API.

Исходный код драйверов хранится в директории drivers/pinctrl/elvees. Описания bindings драйверов pinctrl-mcom03-* и примеры использования см. Documentation/devicetree/bindings/pinctrl/elvees,mcom03-*.yaml

Драйвер gpio-dwapb-pinctrl

Драйвер gpio-dwapb-pinctrl является расширением стандартного драйвера dwapb-gpio. К функциям стандартного драйвера добавлена возможность мультиплексирования пинов, подробнее см. Documentation/devicetree/bindings/pinctrl/snps-dwapb-gpio.txt.

Примечание

Для выводов GPIO1 по умолчанию отключен приёмник и при чтении состояний этих выводов (например, через команду gpioget всегда читается ноль. Для включения приёмника необходимо в Devicetree для нужного вывода указать input-enable. Например, для включения приёмника на выводах GPIO1_PORTC_5 и GPIO1_PORTD_2:

&lsperiph1_pinctrl {
        pinctrl-names = "default";
        pinctrl-0 = <&my_gpio_cfg>;

        my_gpio_cfg: my-gpio-cfg {
                my_gpio_pins {
                        pins = "GPIOC_5", "GPIOD_2";
                        input-enable;
                };
        };
};

Примечание

В debugfs наблюдается особенность при работе с GPIO-прерываниями: GPIO-подсистема показывает, что пин занят прерыванием, но PINCTRL показывает его свободным. Это происходит из-за того, что драйверы регистрируют прерывания в обход GPIO/PINCTRL-подсистем, но с ручной установкой флага FLAG_USED_AS_IRQ.

Драйвер управления сбросами устройств reset-mcom03

Драйвер reset-mcom03 управляет снятием/установкой сброса устройств в подсистемах SDR, MEDIA, HSPERIPH.

Ограничения драйвера:

  1. В подсистеме SDR поддерживаются только устройства PCIe0/1, DSP0/1.

Исходный код драйверов хранится в директории drivers/reset. Описание общих свойств контроллера сбросов см. Documentation/devicetree/bindings/reset/reset.txt. Описания DTS bindings драйвера reset-mcom03 и примеры использования см. Documentation/devicetree/bindings/reset/elvees,mcom03-reset.yaml.

Драйвер управления частотами

Описание элементов управления частотами в MCom-03

Данная глава является кратким изложением руководства пользователя MCom-03 в части управления частотами. В главе также описаны рекомендации по программированию частот.

Для управления частотами в MCom-03 имеются:

  • PLL

  • UCG

  • GATE

PLL

../_images/pll.svg

PLL предназначен для умножения входной частоты. Для всех PLL на вход подаётся частота резонатора/генератора XTI (на большинстве плат 27 МГц). Для настройки частоты можно настроить все коэффициенты вручную или использовать целочисленный множитель. После записи значения регистра, PLL выставит в единицу поле LOCK, означающее, что смена частоты завершена. Поле LOCK выставляется в единицу только если SEL не равен нулю (если PLL включен). Смена частоты PLL происходит без сбоев и может происходить во время работы устройств, использующих эту частоту. MCom-03 содержит 15 одинаковых PLL в разных подсистемах:

  • INTERCONNECT — 1 PLL

  • SERVICE — 1 PLL

  • MEDIA — 4 PLL

  • CPU — 1 PLL

  • SDR — 3 PLL

  • HSPERIPH — 1 PLL

  • LSPERIPH0 — 1 PLL

  • LSPERIPH1 — 1 PLL

  • DDR — 2 PLL

Настройка с использованием целочисленного множителя

Если поле MAN=0, то используется целочисленный множитель, который записывается в поле SEL. В поле SEL записывается значение множителя, уменьшенное на единицу. При SEL=0 (равносильно множителю 1) PLL отключен и частота на выходе PLL равна частоте XTI. При SEL=1 можитель равен 2, при SEL=2 множитель равен 3 и так далее. Максимальное значение множителя 116 (SEL=115). При указании большего значения, PLL будет настраиваться на значение множителя 116. Значения полей MAN_NR, MAN_NF, MAN_OD игнорируются.

Настройка с использованием коэффициентов

Если поле MAN=1, то настройка PLL состоит из выбора трёх коэффициентов: NR, NF и OD. При этом поле SEL должно быть не равно нулю (если SEL=0, то PLL отключен и частота на выходе PLL равна частоте XTI). Выходная частота PLL вычисляется по формуле: Fout = XTI * NF / NR / OD. При выборе коэффициентов необходимо руководствоваться следующими правилами:

  • NR следует выбирать минимальным (NR = 1). Чем больше его значение — тем больше будет джиттер выходной частоты. Большой джиттер может привести к нестабильной работе некоторых устройств.

  • Значение XTI * NF / NR должно быть не меньше 720 МГц и не больше 3600 МГц.

  • Коэффициент OD может иметь значение 1, либо любое чётное значение в диапазоне [2..16].

  • Желательно что бы значение XTI * NF / NR и коэффициент OD были как можно больше (в пределах вышеописанных ограничений).

В поля MAN_NR, MAN_NF, MAN_OD регистра записываются значения NR, NF и OD уменьшенные на единицу.

При использование MAN=1 требуются более сложные рассчёты, но это позволяет более гибко настраивать выходную частоту, чем при использовании целочисленного множителя.

UCG

../_images/ucg.svg

На UCG подаются до 4 входных частоты, из которых встроенный в него мультиплексор (REFMUX) выбирает только одну частоту. Из этой одной частоты формируются 16 выходных частот (каналов). У каждого канала имеется независимый делитель с коэффициентом от 1 до 1048575 (220- 1). Также, каждый канал может независимо быть включен или отключен. Так как при изменении коэффициента деления выходная частота канала может быть нестабильной, то перед изменением коэффициента включенный канал требуется переводить в режим Bypass, в котором частота канала будет равна частоте XTI, либо отключать. Последовательность при сменее коэффициента:

  1. Если канал включен, то включить режим Bypass для этого канала.

  2. Записать новое значение коэффициента деления.

  3. Дождаться выставления бита DIV_LOCK.

  4. Отключить режим Bypass для этого канала.

Если требуется, чтобы некоторые каналы были синхронны, то маску этих каналов необходимо записать в регистр SYNC_CLK. После этого фаза частот этих каналов станет одинаковой.

Переключать входную частоту REFMUX можно только если все каналы UCG выключены или находятся в режиме Bypass.

REFMUX управляется регистром в URB. Но у каждой подсистемы эти регистры отличаются. В некоторых подсистемах может отсутствовать способ управления REFMUX, если на вход UCG заведена только одна частота.

Пример подключения PLL и UCG в подсистеме HSPERIPH:

../_images/pll-ucg-hsp.svg

Особенности настройки UCG в разных подсистемах:

  • INTERCONNECT

    • Два UCG. У каждого по одному входу (у каждого UCG свой PLL). REFMUX не настраивается.

    • Обращаться к регистрам подсистемы может только RISC0 CPU.

    • У обоих UCG все каналы должны быть синхронны.

  • SERVICE

    • Один UCG. Один вход (PLL). REFMUX не настраивается.

    • Каналы 1, 2, 3 и 4 должны быть настроены одинаково.

    • Каналы 0, 5, 6, 7, 8, 9, 10 и 11 должны быть настроены одинаково и их частота должна быть меньше в целое количество раз относительно частоты каналов 1, 2, 3 и 4.

    • Каналы с 0 по 11 должны быть синхронны.

  • MEDIA

    • Четыре UCG. У каждого по одному входу (у каждого UCG свой PLL). REFMUX не настраивается.

  • CPU

    • Один UCG. Один вход (PLL). REFMUX не настраивается.

    • Частоты каналов 0, 1, 2 должны быть отношениями 1:4:2. Например, делитель канала 0 равен 4, делитель канала 1 равен 1, делитель канала 2 равен 2. По этой причине данный UCG должен настраиваться до включения ARM CPU, так как при включении Bypass для любого канала нарушится это отношение частот. В дальнейшем частота CPU меняется путём изменения частоты PLL.

    • Все каналы должны быть синхронны.

  • SDR

    • Семь UCG:

      • UCG0. Один вход (PLL0). REFMUX не настраивается.

      • UCG_PCIE0_REF. Три входа. REFMUX и сброс настраиваются в регистре UCG_PCI0_REF_CTL.

      • UCG_JESD0_TX. Три входа. REFMUX и сброс настраиваются в регистре UCG_JESD0_TX_REF_CTL.

      • UCG_JESD0_RX. Три входа. REFMUX и сброс настраиваются в регистре UCG_JESD0_RX_REF_CTL.

      • UCG_PCIE1_REF. Три входа. REFMUX и сброс настраиваются в регистре UCG_PCI1_REF_CTL.

      • UCG_JESD1_TX. Три входа. REFMUX и сброс настраиваются в регистре UCG_JESD1_TX_REF_CTL.

      • UCG_JESD1_RX. Три входа. REFMUX и сброс настраиваются в регистре UCG_JESD1_RX_REF_CTL.

      • N_DFE. Четыре входа. REFMUX и сброс настраиваются в регистре UCG_N_DFE_CTL.

    • Все UCG, кроме UCG0 по умолчанию недоступны, так как находятся в состоянии сброса, из которого их можно вывести через тот же регистр, который управляет REMUX’ом.

  • HSPERIPH

    • Четыре UCG. У каждого по два входа (PLL и внешний пин CLK125). REFMUX настраивается в регистре REFCLK.

    • REFMUX для UCG0 и UCG1 по умолчанию настроен на PLL.

    • REFMUX для UCG2 и UCG3 по умолчанию настроен на CLK125.

  • LSPERIPH0

    • Один UCG. Один вход (PLL). REFMUX не настраивается.

  • LSPERIPH1

    • Два UCG:

      • UCG0. Один вход (PLL). REFMUX не настраивается.

      • UCG_I2S. Два входа (PLL и внешний пин GPIO1_PORTB_5). REFMUX настраивается в регистре UCG_REF_CLK.

  • DDR

    • Два UCG. У каждого по одному входу (у каждого UCG свой PLL). REFMUX не настраивается.

GATE

GATE позволяет включать и отключать частоту. GATE есть в подсистеме SDR и SERVICE. В подсистеме SERVICE имеется 9 GATE, которые включают/отключают частоту XTI для других подсистем. Все GATE не требуют подготовительных этапов и включают/выключают частоту без сбоев частоты.

Описание драйвера

Драйвер частот поддерживает работу с блоками PLL, REFMUX, UCG и GATE.

Ограничения драйвера:

  1. В подсистеме SDR из всех UCG поддерживается только UCG0. Остальные UCG (PCIE0_REF, PCIE1_REF, JESD0_TX, JESD0_RX, JESD1_TX, JESD1_RX и N_DFE) не поддерживаются.

  2. В подсистеме SDR не поддерживается включение частот pci0_ref_alt и pci1_ref_alt (не имеет смысла без поддержки UCG PCIE0_REF/PCIE1_REF).

  3. При настройке PLL драйвер ограничивает значения коэффициентов NR. Для PLL в подсистеме HSPERIPH значение NR не может быть больше 3. Для остальных PLL значение NR может быть только равно 1. Такое ограничение необходимо для уменьшения джиттера, но уменьшает количество возможных частот, на которые можно настроить PLL. Например, если через clk_set_rate() запрашивается частота 2.4 ГГц при входной частоте 27 МГц, то драйвер мог бы настроить PLL на значения NR=9, NF=800, OD=1, что бы получилась частота 2.4 ГГц. Но для уменьшения джиттера драйвер настроит NR=1, NF=88, OD=1 и получит частоту 2.376 ГГц.

  4. Нет возможности выбирать округление для PLL. Для всех PLL частота округляется в меньшую сторону.

  5. Нет возможности выбирать округление для UCG. Каналы, используемые для UART всегда округляются в большую сторону, а остальные каналы - в меньшую сторону.

  6. Все каналы UCG в подсистеме DDR доступны только для чтения и драйвер никогда не отключает эти каналы. В Linux нет драйверов, которые используют эти частоты. Они добавлены для целей отладки.

  7. Все каналы UCG в подсистеме CPU и каналы с 0 по 11 в подсистеме SERVICE доступны только для чтения. Эти каналы взаимосвязанны и их нельзя перенастраивать независимо друг от друга.

  8. Не поддерживается работа с UCG системного коммутатора, так как доступ к этим UCG есть только у RISC0, а Linux работает на CPU ARM.

Исходный код драйвера хранится в директории drivers/clk/mcom03. Описание общих свойств см. Documentation/devicetree/bindings/clock/clock-bindings.txt. Описание DTS bindings драйвера и примеры использования см. Documentation/devicetree/bindings/clock/elvees,mcom03-clk-pm.yaml.

PLL

PLL (поддерживает изменение частоты) — умножитель частоты. На вход всегда подаётся частота внешнего резонатора/генератора XTI (27 МГц). Драйвер настраивает PLL на наиболее близкую частоту к запрашиваемой с округлением в меньшую сторону (частота будет округлена в большую сторону только если запрошена частота, меньше чем XTI).

Драйвер настраивает три коэффициента для PLL: NR, NF и OD. Частота вычисляется по формуле: Fout = Fin * NF / NR / OD, где Fin - это чатота XTI, подающаяся на чип (обычно 27 МГц). При рассчёте коэффициентов драйвер ограничивает значение NR (не более 3 для PLL в HSPERIPH и 1 для остальных PLL). При выборе значений драйвер руководствуется следующими приоритетами:

  1. Получилась частота, которая наиболее близка к запрошенной, но не превышает её.

  2. Значение NR минимальное при одинаковых частотах (см. Настройка с использованием коэффициентов).

  3. Значение OD максимально при прочих равных.

UCG

UCG (поддерживает изменение/включение/отключение частоты) — набор делителей частоты. У UCG имеется один вход и до 16 выходов (каналов). Вход обычно подключен к PLL, либо (для некоторых UCG) через REFMUX можно выбирать источник частоты (PLL или внешний источник частоты). Для каждого выхода имеется независимый делитель с коэффициентом от 1 до 1048575 (220- 1) и возможность отключения частоты. Драйвер автоматически рассчитывает коэффициент деления, что бы получить запрашиваемую частоту (с округлением в меньшую сторону для всех каналов, кроме тех, которые предназначены для тактирования блоков UART, для которых частота округляется в большую сторону).

Так как при изменении делителя не гарантируется стабильная выходная частота, то для включенного канала перед изменением коэффициента деления драйвер включает режим Bypass, при котором на выход канала подаётся частота XTI (27 МГц). После окончания изменения коэффициента деления, драйвер отключает режим Bypass и на выход UCG подаётся новая частота.

REFMUX

REFMUX (поддерживает выбор родительского источника частоты) — мультипрексор, позволяющий выбирать источник частоты в качестве входной для UCG. К REFMUX может быть подключено до 4 источников входной частоты. Если подключен только один источник входной частоты, то драйвер не создаёт REFMUX, а считает, что эта входная частота напрямую подключена к UCG.

Драйвер создаёт следующие REFMUX:

  • для UCG0…UCG3 в подсистеме HSPERIPH, которые позволяют выбрать в качестве входной частоты PLL, либо внешний сигнал с пада CLK125;

  • для UCG_I2S в подсистеме LSPERIPH1, который позволяет выбрать в качестве входной частоты PLL, либо внешний сигнал с пада GPIO1_PORTB_5.

В руководстве пользователя на MCom-03 REFMUX является частью UCG. Но с точки зрения подсистемы управления частотами Linux он является отдельной сущностью. Ниже представлена структурная схема REFMUX и UCG в Linux:

../_images/linux-refmux-ucg.svg

Так как REFMUX может исказить частоту в момент переключения, то драйвер переводит все включенные каналы UCG в режим Bypass (подаёт на них частоту напрямую с XTI) перед сменой родитеского источника частоты и восстанавливает делитель после завершения. Из-за того, что REFMUX выбирает входную частоту для всего UCG, выходы с которого используются разными устройствами, то драйверы этих устройств не должны самостоятельно переключать входную частоту для REFMUX, так как в момент переключения частоты на всех каналах UCG на короткое время будет присутствовать неправильная частота. Выбор входной частоты REFMUX должен осуществляться в Devicetree через указание assigned-clocks и assigned-clock-parents. Например, если требуется переключить UCG2 (который используется для нужд EMAC0 и EMAC1) в подсистеме HSPERIPH, то необходимо к обеим нодам emac0 и emac1 добавить строки:

assigned-clocks = <&hsperiph_clocks CLK_HSP_REFMUX2>;
assigned-clock-parents = <&hsperiph_clk125>;

В этом случае REFMUX будет переключен в тот момент, когда загрузится любой из драйверов, независимо от очерёдности. Когда будет загружаться второй драйвер, то повторного переключения не произойдёт, так как родительская частота уже правильная.

GATE

GATE (поддерживает включение/отключение частоты) повзоляет только включать или отключать частоту для какого-то блока. GATE имеются только в подсистеме SDR.

Драйвер mr75202

Драйвер mr75202 используется для управления и получения значений сенсоров блока PVT. Драйвер реализует стандартное API hwmon. Исходный код драйвера хранится в файле drivers/hwmon/mr75202.c. Спецификация формата описания блока и пример описания доступны в файле Documentation/devicetree/bindings/hwmon/moortec,mr75202.yaml.

Драйвер silvaco-qspi

Драйвер silvaco-qspi используется для работы с SPI-устройствами в режиме pio. Драйвер реализует ведущее устройство на шине SPI согласно модели драйверов Linux (см. Documentation/spi/spi-summary).

Драйвер поддерживает спецификацию ведущего и ведомых устройств на шине SPI согласно Documentation/devicetree/bindings/spi/spi-bus.txt.

Возможности драйвера:

  • Поддержка до четырех ведомых устройств.

  • Передача в формате CPHA = 0 (см. флаг SPI_CPHA режима).

  • Полярность сигнала синхронизации CPOL = 0 (см. флаг SPI_CPOL режима).

  • Сигнал CS в активном состоянии «логический 0» (см. флаг SPI_CS_HIGH режима).

  • Передача слов данных старшим битом вперед (см. флаг SPI_LSB_FIRST режима).

  • Ведущее устройство на шине SPI (см. флаг SPI_SLAVE режима).

  • Пересылка в режиме full-duplex:

    • Передача данных по одному выводу на шине SPI (см. флаг SPI_TX_BYTE режима).

    • Прием данных по одному выводу на шине SPI (см. флаг SPI_RX_SLOW режима).

  • Переключение скорости передачи между пакетами в соответствии с параметром слейва spi-max-frequency.

  • Переключение режимов XIP и Normal в соответствии со свойством DTS silvaco,qspi-mode.

Ограничения драйвера:

  • Не поддерживается установка скорости передачи. Частота на шине SPI равна частоте clk_ext, которая указывается в свойстве clocks в device tree. Частота clk_ext должна быть не больше частоты clk_axi на шине AXI.

  • Размер данных должен быть кратен восьми битам.

  • Передача в формате CPHA = 1 не поддерживается (флаг SPI_CPHA режима должен быть равен 0).

  • Полярность сигнала синхронизации CPOL = 1 не поддерживается (флаг SPI_CPOL режима должен быть равен 0).

  • Сигнал CS в активном состоянии «логическая 1» не поддерживается (флаг SPI_CS_HIGH режима должен быть равен 0).

  • Передача слов данных младшим битом вперед не поддерживается (флаг SPI_LSB_FIRST режима должен быть равен 0).

  • Передача/прием данных по одной линии не поддерживается (флаг SPI_3WIRE режима должен быть равен 0).

  • Режим loopback не поддерживается (флаг SPI_LOOP режима должен быть равен 0).

  • Режим ведомого устройства на шине SPI не поддерживается (флаг SPI_SLAVE режима должен быть равен 0).

  • Пропуск принятых байтов данных перед преамбулой не поддерживается (флаг SPI_PREAMBLE режима должен быть равен 0).

  • Передача данных по двум выводам на шине SPI не поддерживается (флаг SPI_TX_DUAL режима должен быть равен 0).

  • Передача данных по четырем выводам на шине SPI не поддерживается (флаг SPI_TX_QUAD режима должен быть равен 0).

  • Прием данных по двум выводам на шине SPI не поддерживается (флаг SPI_RX_DUAL режима должен быть равен 0).

  • Прием данных по четырем выводам на шине SPI не поддерживается (флаг SPI_RX_QUAD режима должен быть равен 0).

При инициализации драйвер выполняет:

  • захват и включение тактового сигнала;

  • вывод контроллера QSPI из состояния сброса;

  • инициализация SPI мастера;

  • начальную настройку контроллера QSPI.

При удалении драйвер выполняет:

  • выключение тактового сигнала;

  • ввод контроллера QSPI в состояние сброса;

  • удаление SPI мастера.

Драйвер irq-elvees-qlic

Драйвер irq-elvees-qlic предназначен для управления контроллером прерываниий QLIC. Драйвер реализован каскадированием контроллера прерываний QLIC с ведущим контроллером GICv3 в системе.

Драйвер irq-elvees-qlic реализует следующий функционал:

  1. Статическая настройка равноприоритетных прерываний.

  2. Поддержка динамического отображения прерываний на доступные QLIC цели, осуществляя балансировку нагрузки.

  3. Включение/выключение прерываний QLIC.

  4. Маскирование/размаскирование прерываний QLIC.

  5. Настройка прерываний ведущего контроллера.

  6. Обработка входящих прерываний.

Исходный код драйвера хранится в файлах drivers/irqchip/irq-elvees-qlic.c и drivers/irqchip/irq-elvees-qlic.h. Описания Devicetree bindings драйвера irq-elvees-qlic и примеры использования см. Documentation/devicetree/bindings/interrupt-controller/elvees,qlic.yaml

Драйвер mfbsp-can

Драйвер mfbsp-can управляет контроллером CAN - MFBSP-CAN. Драйвер реализует стандартный интерфейс CAN RAW, описанный в Documentation/networking/can.rst. Обработка RX-прерываний реализована с использованием интерфейса NAPI.

Возможности драйвера:

  • Драйвер реализует стандартное Linux SocketCAN API.

  • Драйвер позволяет выставить скорость передачи.

  • Драйвер поддерживает следующие режимы работы контроллера:

    • CAN_CTRLMODE_LOOPBACK,

    • CAN_CTRLMODE_LISTENONLY,

    • CAN_CTRLMODE_ONE_SHOT,

    • CAN_CTRLMODE_BERR_REPORTING.

  • Драйвер позволяет установить положения точки выборки.

  • Драйвер поддерживает автоматическое включение/выключение микросхем PHY через выводы Standby и Enable.

Ограничения драйвера:

  • Отсутствует поддержка работы счётчика времени, после которого выдача сообщения автоматически отменяется.

  • Отсутствует поддержка включения режима работы передатчика по приоритету.

  • Отсутствует поддержка Watermark-прерываний.

  • Отсутствует возможность конфигурации системной матрицы.

Исходный код драйвера хранится в файле drivers/net/can/mfbsp-can.c. Описания Devicetree bindings драйвера mfbsp-can и примеры использования см. Documentation/devicetree/bindings/net/can/elvees,mcom03-mfbsp-can.yaml

Драйвер dwc-pwm

Драйвер dwc-pwm предназначен для управления ШИМ сигнала с блока TIMERS. В блоке LSPERIPH1.TIMERS0 MCom-03 8 таймеров, 2 из которых могут быть использованы для вывода ШИМ сигналов.

Возможности драйвера:

  • Драйвер реализует стандартное Linux PWM API.

Ограничения драйвера:

  • Работа только в инверсном режиме выходного сигнала.

Описания Devicetree bindings драйвера dwc-pwm и примеры использования см. Documentation/devicetree/bindings/pwm/snps,dw-apb-timers-pwm2.yaml

Драйвер arasan-gemac

Драйвер arasan-gemac управляет контроллером Ethernet Arasan GEMAC. Драйвер реализует стандартный интерфейс network devices, описанный в Documentation/networking/netdevices.txt. Обработка RX-прерываний реализована с использованием интерфейса NAPI.

Драйвер поддерживает выполнение следующих операций из пространства пользователя:

  1. Установка скорости (10/100/1000 Мб/с);

  2. Установка дуплекса (full/half);

  3. Установка уровня сообщений драйвера;

  4. Установка MAC-адреса;

  5. Чтение регистров контроллера Ethernet Arasan GEMAC утилитой ethtool;

  6. Перезапуск автосогласования;

  7. Проверка физического подключения;

  8. Установка MTU кадра в диапазоне 68 – 3500 байт;

  9. Отключение фильтрации пакетов (Promiscuous mode).

    Включение promiscuous mode повышает нагрузку на CPU;

  10. Включение приема всех multicast-пакетов (IFF_ALLMULTI);

  11. Поддерживается фильтрация unicast-пакетов по MAC-адресу и multicast-пакетов по hash-таблице;

  12. Поддерживается доступ к регистрам PHY через MDIO;

  13. Поддержка PTP:

    • Передача PTPv2 пакетов по Ethernet и UDP IPv4;

    • Двухступенчатый режим проставления временных меток пакетов PTP;

    • Режим End-to-End PTP-синхронизации;

    • Синхронизация по PTP в ролях Ведущего и Ведомого устройства.

  14. Поддерживается чтение аппаратных счетчиков статистики утилитой ethtool;

  15. Поддерживается публикация тегов VLAN.

    Для использования VLAN необходимо загрузить модуль ядра с помощью команды modprobe 8021q.

Драйвер не поддерживает:

  1. Управление паузой;

  2. Чтение и запись EEPROM;

  3. Wake-on-Lan;

  4. Управление объединением прерываний;

  5. Одноступенчатый режим проставления временных меток пакетов PTP;

  6. Режим Peer-to-Peer PTP синхронизации;

  7. Передачу PTP пакетов по UDP IPv6.

Исходный код драйвера хранится в директории drivers/net/ethernet/arasan. Описания Devicetree bindings драйвера arasan-gemac и примеры использования см. Documentation/devicetree/bindings/net/arasan,gemac.yaml.

Драйвер pcie-mcom03

Драйвер управляет контроллерами PCI Express PCIe0 и PCIe1 в режиме root complex.

Исходный код драйвера хранится в файле drivers/pci/controller/dwc/pcie-mcom03.c. Описание Devicetree bindings драйвера pcie-mcom03 и примеры использования см. Documentation/devicetree/bindings/pci/pci-mcom03.txt

Особенности драйвера:

Драйвер поддерживает выбор контроллера MSI независимо от контроллера PCIe.

Драйвер поддерживает следующие контроллеры прерываний:

  • Встроенный в PCIe MSI-контроллер - прерывания устройств всегда обрабатывается одним ядром CPU.

  • Контроллер legacy прерываний - прерывания устройств всегда обрабатывается одним ядром CPU.

Предупреждение

Работа с GICv3 ITS в качестве контроллера MSI-прерываний не поддерживается.