Полный перевод технических страниц 4–8 китайского RK-KF-YF-175 V1.1.0. Источник относится к RK3399 и ядрам 4.4/4.19. Это платформенный справочник: конкретная совместимая плата ArmSoM не подтверждена, поддержка не распространяется на все платы ArmSoM или другие SoC. Проверьте фактический SDK/BSP, выводы PCIe, питание, дерево устройств и драйверы периферии. Имеется только китайский PDF; его рисунки используются во всех четырёх языках. Таблицы содержат примеры производителя для RK3399 EVB3, не измерения ArmSoM. Аппаратная проверка не проводилась.
Сохранённые вопросы источника: синтаксис DTS
status = <okay>;и ссылка питанияvpcie0v9-supply = <&vdd_pcie1v8>;требуют проверки по реальному BSP/схеме, а не слепого копирования. Утверждения о перестановке линий, питании и скорости принадлежат источнику; перестановка линий производителем явно не проверена. Записывающий тест fio ниже уничтожает данные целевого блочного устройства; не запускайте его на устройстве с данными. Предложения повысить напряжение далее не являются безопасной инструкцией; не превышайте спецификации платы и компонентов.
ArmSoM Docs · Rockchip Linux kernel
1. Настройка DTS
-
ep-gpios = <&gpio3 13 GPIO_ACTIVE_HIGH>;задаёт сигнал сброса PCIe PERST#. Для устройства в разъёме и для распаянного устройства найдите этот вывод на схеме и настройте его правильно, иначе соединение не установится. -
num-lanes = <4>;задаёт число линий устройства PCIe. Обычно менять значение не требуется: ПО обнаруживает и отключает неиспользуемые линии для экономии энергии. -
status = <okay>;— точная запись источника. Включите оба узла:pcie0иpcie_phy. По умолчанию они отключены, поскольку обнаружение PCIe без периферии заметно увеличивает время загрузки. В проектах с PCIe их нужно включить. Перед применением см. замечание о синтаксисе источника. -
Необязательное свойство
vpcie3v3-supply = <&vdd_pcie3v3>;задаёт питание 3V3 периферии. Если плата должна управлять его включением, определите соответствующий regulator, как в примере. Настройка описана вDocumentation/devicetree/bindings/regulator/. -
vpcie1v8-supply = <&vdd_pcie1v8>;— см. пункт 4. -
vpcie0v9-supply = <&vdd_pcie1v8>;— см. пункт 4. Значение источника сохранено, но не подтверждено как правильное питание конкретной платы.
2. Настройка menuconfig
- Для работы PCIe включите следующие параметры:
CONFIG_PCI=y
CONFIG_PCI_DOMAINS=y
CONFIG_PCI_DOMAINS_GENERIC=y
CONFIG_PCI_SYSCALL=y
CONFIG_PCI_BUS_ADDR_T_64BIT=y
CONFIG_PCI_MSI=y
CONFIG_PCI_MSI_IRQ_DOMAIN=y
CONFIG_PHY_ROCKCHIP_PCIE=y
CONFIG_PCIE_ROCKCHIP=y
CONFIG_PCIEPORTBUS=y
CONFIG_PCIEASPM=y
CONFIG_PCIEASPM_POWERSAVE=y
CONFIG_PCIE_PME=y
CONFIG_GENERIC_MSI_IRQ=y
CONFIG_GENERIC_MSI_IRQ_DOMAIN=y
CONFIG_IRQ_DOMAIN=y
CONFIG_IRQ_DOMAIN_HIERARCHY=y
- Включите устройства NVMe (SSD с интерфейсом PCIe):
CONFIG_BLK_DEV_NVME=y
- Включите устройства AHCI (SATA SSD через адаптер PCIe–SATA):
CONFIG_SATA_PMP=y
CONFIG_SATA_AHCI=y
CONFIG_SATA_AHCI_PLATFORM=y
CONFIG_ATA_SFF=y
CONFIG_ATA=y
Примечание: исходное открытое ядро 4.4 поддерживает только устройства из списка в drivers/ata/ahci.c. По другим устройствам обращайтесь к производителю или поставщику.
- Настройку Wi-Fi с интерфейсом PCIe выполняйте по документации соответствующего производителя Wi-Fi.
3. Параметры командной строки ядра
Подробности см. в Documentation/kernel-parameters.txt ядра. Здесь рассмотрены лишь несколько важных параметров.
-
nomsi: для Legacy-прерываний добавьтеpci=nomsiв parameter. -
pcie_bus_safe: источник утверждает, чтоpci=pcie_bus_safeустанавливает максимальный MPS для устройств иерархии PCIe и может повысить пропускную способность. Это сохранённое утверждение источника; проверьте реализацию фактического ядра и ограничения устройств. -
pcie_aspm: для тестирования без динамического управления питанием линии задайтеpcie_aspm=off. Иначе по умолчанию применяется аппаратное согласование.
4. Частые вопросы по применению
Q1: Можно ли переставлять линии для упрощения разводки платы?
A1: По источнику это теоретически возможно: линии [1–4] RC могут произвольно соответствовать линиям [1–4] EP/switch, без изменения ПО. Производитель прямо указывает, что фактической проверки не было; нужна осторожная оценка.
Q2: Можно ли менять полярность дифференциальных сигналов одной линии?
Например, соединить RX+ линии RC с RX- EP/switch, TX+ с TX- или использовать другие сочетания полярностей RX/TX?
A2: Источник допускает такие соединения без дополнительной обработки в ПО: они учтены автоматом обнаружения PCIe.
Q3: Можно ли разделить четыре линии RK3399 на 1-1-1-1, 2-2 или иначе?
A3: У RK3399 один RC, такое разделение не поддерживается. Для нескольких устройств нужен PCIe switch. Производитель сообщал о проверке switch Pericom и называл его, вероятно, самым дешёвым на тот момент; это историческая оценка источника, не актуальная ценовая рекомендация.
Q4: Поддерживает ли RK3399 SSD?
A4: Источник различает NVMe SSD с физическим интерфейсом PCIe и mSATA SSD с SATA. Для второго типа нужен адаптер PCIe–SATA или USB–SATA.
Q5: Какова максимальная ёмкость NVMe и можно ли с него загружаться?
A5: По источнику ёмкость ограничивается файловой системой, а не драйвером. На RK3399 загрузка с NVMe поддерживается начиная с U-Boot; нужен дополнительный SPI-NOR для miniloader, поскольку MaskROM не содержит драйверов NVMe и PCIe.
Q6: Какова пропускная способность NVMe и как её измерить?
A6: Производитель использовал fio. Нужна собственная сборка fio со статически связанной libaio. Ниже приведены исходная команда и результаты производителя, не измерения ArmSoM.
./fio -filename=/dev/block/nvme0n1 -direct=1 -iodepth 4 -thread=1 -rw=write -ioengine=libaio -bs=1M -size=200G -numjobs=30 -runtime=60 -group_reporting -name=my

FIO · RK3399 EVB3 · PCIe1.0×4 · Payload:256 · SSD: Samsung SM961 MZVPW256HEGL
| Тест | iodepth | thread | ioengine | performance | AVG IOPS |
|---|---|---|---|---|---|
| 1M последовательное чтение | 4 | 1 | libaio | 784032KB/s | |
| 1M последовательная запись | 4 | 1 | libaio | 792945KB/s | |
| 4K случайная запись | 64 | 6 | libaio | 194343 | |
| 8K случайная запись | 64 | 6 | libaio | 98200 | |
| 16K случайная запись | 64 | 6 | libaio | 49159 | |
| 4K случайное чтение | 64 | 6 | libaio | 170677 | |
| 8K случайное чтение | 64 | 6 | libaio | 93934 | |
| 16K случайное чтение | 64 | 6 | libaio | 44893 |

FIO · RK3399 EVB3 · PCIe2.0×4 · Payload:256 · SSD: Samsung SM961 MZVPW256HEGL
| Тест | iodepth | thread | ioengine | performance | AVG IOPS |
|---|---|---|---|---|---|
| 1M последовательное чтение | 4 | 1 | libaio | 1452.2MB/s | |
| 1M последовательная запись | 4 | 1 | libaio | 1039.1MB/s | |
| 4K случайная запись | 64 | 6 | libaio | 208538 | |
| 8K случайная запись | 64 | 6 | libaio | 105924 | |
| 16K случайная запись | 64 | 6 | libaio | 47737 | |
| 4K случайное чтение | 64 | 6 | libaio | 246223 | |
| 8K случайное чтение | 64 | 6 | libaio | 174749 | |
| 16K случайное чтение | 64 | 6 | libaio | 80787 |
Q7: Поддерживает ли RK3399 дискретную видеокарту?
A7: Теоретически да при наличии ARM-драйвера, но источник считает практическую поддержку невозможной: для BAR доступно только 32M физического адресного пространства шины PCIe, а видеокартам обычно нужно больше. Switch не помогает: ему самому нужно адресное пространство, поэтому требования к RC возрастают.
Q8: Какое питание требуется устройствам PCIe?
A8: Источник перечисляет 0.9V, 3V3, 3V3_AUX и 12V. Питание 0.9V связывается в основном с PCIe Wi-Fi, 3V3 — с большинством устройств. Вспомогательное 3V3_AUX должно сохраняться в suspend, если устройство должно продолжать работу, например Wi-Fi для пробуждения хоста. 12V используется более мощными устройствами, например switch и видеокартами. Руководствуйтесь требованиями конкретного производителя EP/switch.
Q9: Как управлять ASPM на RK3399?
A9: Приведены пять способов:
- Добавить
pcie_aspm=offв командную строку ядра. - Настроить
link_stateиз консоли; требуетсяCONFIG_PCIEASPM_DEBUG=y:
# cat /sys/bus/pci/devices/0000:00:00.0/power/link_state
7
# echo 0 > /sys/bus/pci/devices/0000:00:00.0/power/link_state
- Отключить
CONFIG_PCIEASPM. - Использовать
setpci, напримерsetpci -s 0:0 0xd0.w=0xC00, предварительно выяснив BDF устройства. - Выполнить в консоли
echo performance > /sys/module/pcie_aspm/parameters/policy.
Q10: Как просмотреть сведения об устройствах PCIe на RK3399?
A10: В исходном вопросе чип написан как RK399. Скопируйте lspci на устройство и разрешите исполнение. lspci -vvv выводит свойства и состояние, lspci -t — дерево топологии PCIe. Остальные параметры описаны в lspci --help.
Q11: Как менять регистры PCIe из пользовательского пространства?
A11: Использовать setpci можно лишь после получения BDF устройства через lspci и изучения соответствующих смещений регистров протокола. См. setpci --help. Источник относит инструмент к продвинутым и не рекомендует его без достаточного знания PCIe.
5. Поиск неисправностей
5.1 Ошибка обучения линии
rockchip-pcie f8000000.pcie: PCIe link training gen1 timeout!
rockchip-pcie: probe of f8000000.pcie failed with error -1
Источник связывает сбой обучения с неработающей периферией. Сначала проверьте ep-gpios, затем наличие и достаточность питания. В нём говорится, что 3.3V теоретически достаточно, но утверждается, что некоторым устройствам требовались 3.8V или даже 4V. Это непроверенное историческое утверждение, а не указание подавать повышенное напряжение: не превышайте пределы платы и компонентов. При достаточном напряжении проверьте мощность; источник упоминает внешний источник питания. Такие испытания требуют проверенной схемы питания и безопасных пределов напряжения.
5.2 Зависание при конфигурировании
[ 0.459371] pci 0000:00:00.0: bridge configuration invalid ([bus 00-00]), reconfiguring
[ 0.459585] pci 0000:01:00.0: reg 0x10: initial BAR value 0x00000000 invalid
[ 0.460043] pci 0000:01:00.1: reg 0x10: initial BAR value 0x00000000 invalid
[ 0.460503] pci 0000:01:00.2: reg 0x10: initial BAR value 0x00000000 invalid
[ 0.460535] pci 0000:01:00.2: reg 0x14: initial BAR value 0x00000000 invalid
[ 0.460904] Bad mode in Error handler detected, code 0xbf000002 -- SError
[ 0.460919] Internal error: Oops - bad mode: 0 [#1] PREEMPT SMP
[ 0.466658] Modules linked in:
[ 0.466938] CPU: 5 PID: 1 Comm: swapper/0 Not tainted 4.4.55 #41
[ 0.467464] Hardware name: Rockchip RK3399 Excavator Board edp (Android) (DT)
[ 0.468089] task: ffffffc0f2160000 ti: ffffffc0f2168000 task.ti: ffffffc0f2168000
[ 0.468752] PC is at rockchip_pcie_rd_conf+0xb8/0x138
[ 0.469200] LR is at pci_bus_read_config_dword+0x78/0xbc
В этом примере устройство заработало и прошло перечисление, но затем связь зависла. Источник связывает большинство таких случаев с недостаточным напряжением или мощностью питания.
5.3 PLL PHY PCIe RK3399 не захватывает частоту
[ 0.440803] rockchip-pcie f8000000.pcie: no vpcie3v3 regulator found
[ 0.440831] rockchip-pcie f8000000.pcie: no vpcie1v8 regulator found
[ 0.440854] rockchip-pcie f8000000.pcie: no vpcie0v9 regulator found
[ 1.443759] pll lock timeout!
[ 1.443826] phy phy-phy@e220.5: phy poweron failed --> -22
[ 1.443847] rockchip-pcie f8000000.pcie: fail to power on phy, err -22
[ 1.443968] rockchip-pcie: probe of f8000000.pcie failed with error -22
Проверьте нормальное напряжение и достаточность питания PCIE_AVDD_0V9 и PCIE_AVDD_1V8. Источник требует для этой цепи питание от LDO; сверяйте с реальной схемой платы.
5.4 Ошибки при одновременной работе PCIe и USB 3.0
Следующий журнал источника показывает системную ошибку при подключении USB-устройства во время работы NVMe:
[ 2.801962] Unhandled fault: synchronous external abort (0x96000210) at 0xffffff800936401c
[ 2.801997] Internal error: : 96000210 [#1] PREEMPT SMP
[ 2.803157] Modules linked in:
[ 2.803437] CPU: 2 PID: 146 Comm: nvme Not tainted 4.4.16 #146
[ 2.803949] Hardware name: rockchip,rk3399-firefly-mini (DT)
[ 2.804445] task: ffffffc07187d400 ti: ffffffc071910000 task.ti: ffffffc071910000
[ 2.805108] PC is at nvme_kthread+0x84/0x1f8
[ 2.805484] LR is at nvme_kthread+0x60/0x1f8
Источник заключает, что питание PCIE_AVDD_0V9 недостаточно или нестабильно, и предлагает добавить ёмкость либо повысить напряжение. Это сохранено для прослеживаемости, не как одобренная модификация. До любых изменений проверьте целостность питания и допустимые параметры платы/компонентов; не повышайте напряжение сверх спецификации.
