Оригинал V3.2.0: 44 страницы на китайском, 46 на английском. Версии: RK3588 Linux 6.1/5.10, RT-Thread v5.1.x/v4.1.x; RK3568 Linux 6.1/5.10/4.19, RT-Thread v5.1.x/v4.1.x; RK1820 RT-Thread 5.1.x. RT-Thread реализован только на стороне RK PCIe EP. Это платформенный справочник: для конкретной ArmSoM проверьте EP, выводы, питание, тактирование, BSP и ядро. Результаты производителя на EVB не являются измерениями ArmSoM; аппаратная проверка не проводилась. Здесь использованы оригинальные изображения английского PDF.
Сохранённые вопросы оригинала: R+2056B пересекается с предыдущим R+2560B; loopback ссылается на speed_test README; CTRL+L указан как сон Windows; Windows 10 2004, сборка 19042.1052 и смысл eq требуют проверки. Изменения Secure Boot и подписей приведены как исторические инструкции и здесь не выполняются.
1. Обзор карты EP
Комплект разработки стандартной карты RK PCIe EP объединяет аппаратные и программные материалы для изделий в форм-факторе карты RK PCIe EP. Он основан на демонстрационной плате RK EP (далее — карта EP) и включает:
- краткое руководство по работе с картой EP;
- схемы загрузки, разработку аппаратной и программной части PCIe и обновление OTA;
- основы прикладной обработки на карте EP;
- примеры приложений на этой основе.
2. Характеристики карты EP
2.1 Основные характеристики
| Основная микросхема | Схема загрузки | Расширение SMBus | Независимое тактирование |
|---|---|---|---|
| RK3568 | Поддерживает Flash Boot, Common Boot; не поддерживает PCIe Boot | N | Поддерживает SRNS; не поддерживает SRIS |
| RK3588 | Поддерживает Flash Boot, Common Boot; не поддерживает PCIe Boot | N | N |
| RK1820 | Поддерживает Flash Boot, Common Boot, EP Boot | Y | N |
Пояснение. Flash Boot включает две схемы:
- Flash Boot с интеграцией PCIe Bin и программной схемы EP Boot;
- Flash Boot с интеграцией PCIe Bin.
Для схем EP, не поддерживающих PCIe Boot, протокол PCIe требует перехода карты EP в режим обнаружения в течение 20 ms после снятия PERST#. Затем RC выполняет непрерывное обнаружение, согласование и перечисление; этот процесс может занимать до 100 ms. Поэтому для совместимости с универсальным RC рекомендуется использовать SPI Flash как загрузочный носитель, обеспечивающий быстрый запуск; обычно рекомендуется SPI NOR.
2.2 Разработка программного обеспечения
Комплект EP предназначен для демонстрации функций изделия PCIe, а не представляет собой готовое комплексное решение. Заказчик должен самостоятельно доработать PCIe и приложения верхнего уровня на его основе.
2.3 Операционные системы
Устройства EP: карта совместима с Linux, Android и RT-Thread.
Устройства RC:
- Совместимость с Linux проверена на определённых RC.
- Совместимость с Windows проверена на определённых RC, однако реализованы только базовые функции передачи. Остальные функции заказчик должен разработать самостоятельно, ориентируясь на драйвер Linux.
2.4 Требования к тактированию
Рекомендуется использовать общий опорный тактовый сигнал: EP получает опорную частоту 100M от RC. Если обе стороны используют микросхемы RK и карта EP поддерживает независимое тактирование, RC и EP могут использовать внутренние частоты 100M. Это позволяет отказаться от внешнего генератора и буфера тактового сигнала.
2.5 Идентификатор устройства PCI
По умолчанию карта RK PCIe EP использует идентификатор устройства, определённый RK. Для сторонних разработчиков действуют следующие требования исходного документа:
- При использовании устройства исключительно в закрытой внутренней среде можно использовать существующий VID RK PCIe.
- Для продажи или публичного использования устройства необходимо самостоятельно получить VID в PCI-SIG.
2.6 Горячее подключение
Карта RK PCIe EP не поддерживает горячее подключение.
2.7 Вспомогательные сигналы
| Вспомогательный сигнал | Функция | Стандартная схема EP | Соединение RK с независимым питанием |
|---|---|---|---|
| PRSNT# | N | ||
| PERST# | Вход GPIO | Обязательно; системный сброс всей платы | Обязательно; вход GPIO, программный сброс, DTS reset-gpios; |
| CLKREQ# | Вход FUNCTION | Необязательно; для расширения управления питанием ASPM L1SS. Ещё не реализовано, но рекомендуется резервировать; при отсутствии потребности можно не подключать | Необязательно; для расширения управления питанием ASPM L1SS. Ещё не реализовано, но рекомендуется резервировать; при отсутствии потребности можно не подключать |
| JTAG | N | ||
| SMBus | N | ||
| WAKE# | Выход GPIO | Обязательно; расширение пробуждения из сна, ещё не реализовано, рекомендуется резервировать | Обязательно; пробуждение, DTS wake-gpios; |
| +3.3Vaux | N |
Пояснения:
- При независимом питании соединённых микросхем RK одна сторона может потерять питание, пока другая продолжает выдавать сигналы. Рекомендуется защита IO от подачи напряжения/тока в обесточенную сторону.
- Контакты, используемые как GPIO, не следует настраивать в pinctrl как PCIe. Допускаются произвольные GPIO. Для сигналов FUNCTION выбирают соответствующие функциональные контакты.
- В стандартной схеме PERST# подключают к системному сбросу всей платы. Это крайнее средство физического сброса EP со стороны RC. Некоторые RC сразу после перечисления переходят в L2 и сбрасывают PERST#, что требует быстрого сброса.
- PERST на RC имеет сильный двухтактный выход PP, а контакт PMIC на EP — открытый сток OD. Независимо от уровня PERST 3.3V или 1.8V, RESET_L на EP необходимо управлять через согласующую схему.
2.8 Требования к производительности
Необходимо определить требуемую полосу передачи PCIe, направление потока данных (односторонняя передача RC/EP или двусторонняя), наличие мелких управляющих сообщений и больших блоков данных. Рекомендуется:
- изучить раздел измеренной производительности, чтобы понять верхний предел производительности комплекта chips_connect;
- изучить раздел «Производительность: пользовательский пример pcie_speed_test», чтобы оценить полосу передачи при разных размерах блоков.
3. Руководство по работе с картой EP
3.1 Подготовка среды
Карта EP поддерживает подключение к универсальному RC и к RK RC. Здесь кратко описана базовая функциональная проверка обоих вариантов.
3.1.1 Аппаратная среда
Стандартная плата RK3588 EP с RK3588 RC:
- RC: RK3588-EVB1-V10. Подключите питание, последовательный кабель, кабель загрузки прошивки USB–Type-C и HDMI к HDMI_OUT0.
- EP: RK3588-EVB4-V11. Питание подаётся непосредственно RC; отдельный кабель не нужен. Горячее подключение не поддерживается: соедините платы до включения RC.
Стандартная плата RK3588 EP с универсальным RC:
- RC: PC.
- EP: RK3588-EVB4-V11. Питание подаётся RC; отдельный кабель не нужен. Подключите карту до включения RC.
Соединение RK3588 с независимым питанием:
- RC: RK3588-EVB1-V10. Подключите питание, последовательный кабель, USB–Type-C для загрузки прошивки и HDMI_OUT0.
- EP: RK3588-EVB4-V12. Плата питается отдельно; R8114 и R2005 не устанавливаются.
Обязательно соедините PERST# и WAKE#, используя их как GPIO. Подключите питание, последовательный кабель и USB–Type-C для загрузки прошивки.
3.1.2 Программная среда
Необходимые loader, uboot, boot и файловая система находятся в каталоге images поставляемого пакета.
Flash Boot с интеграцией PCIe Bin: загрузочные файлы для платы RK3588 EP приведены ниже.
| Элемент | Имя файла | Описание |
|---|---|---|
| RC (для универсального RC не требуется) | rk3588-update-rc-evb7-v11.img | Запись во Flash RC |
| EP | rk3588-update-ep-evb4-v11.img | Запись во Flash EP |
Примечание: update.img включает MiniLoaderAll.bin, uboot.img, boot.img, rootfs.img и другие файлы.
Flash Boot с интеграцией PCIe Bin и EP Boot: загрузочные файлы для RK3588 EP приведены ниже.
| Элемент | Имя файла | Описание |
|---|---|---|
| RC (для универсального RC не требуется) | rk3588-update-rc-evb7-v11.img | Запись во Flash RC |
| EP | RK3588_MiniLoaderAll.bin | Запись во Flash EP |
| EP | pcie_idb.img | Запись во Flash EP |
| EP | normal_idb.img | Запись во Flash EP |
| EP | uboot.img | RC загружает в DDR EP по PCIe |
| EP | boot.img (содержит kernel+rootfs) | RC загружает в DDR EP по PCIe |
Загрузку прошивки с RC на EP по PCIe см. в следующем разделе функциональной проверки.
3.2 Функциональная проверка
Примеры проверки PCIe EP находятся в каталоге examples SDK. Они включают программы EP и RC, а также инкапсулированный код обмена сообщениями и данными.
3.2.1 Linux RC
Файлы bin и ресурсы для универсального RC находятся в images и копируются на RC вручную (только X86). Ресурсы RK RC уже входят в корневой каталог прошивки. После подготовки аппаратной и программной среды выполните следующие шаги. Если загрузка прошивки на EP не требуется, пропустите первый пункт.
- RC загружает прошивку на EP по PCIe.
Шаг 1. Скорость последовательного порта EP равна 1500000 (для RC также 1500000). После подключения постоянно выводится следующий журнал: канал PCIe установлен, EP ожидает прошивку от RC.
U-Boot SPL 2017.09-g614fe864bf-dirty #xyp (Apr 20 2023 - 11:19:22)
RKEP: 191277 - Link ready! Waiting RC to download Firmware:
RKEP: 191723 - Download uboot.img to BAR2+0
RKEP: 192068 - Download boot.img to BAR2+0x400000
RKEP: 192466 - Send CMD_LOADER_RUN to BAR0+0x400
RKEP: 1092850 - Waiting for FW, CMD: 0
RKEP: 2093146 - Waiting for FW, CMD: 0
RKEP: 3093443 - Waiting for FW, CMD: 0
RKEP: 4093740 - Waiting for FW, CMD: 0
RKEP: 5094036 - Waiting for FW, CMD: 0
Если EP сразу загружает систему, во Flash уже есть полная прошивка. Перезапишите pcie_idb.img и normal_idb.img в режиме maskrom.
Шаг 2. Выполните на RC ./pcie_download_test_rc 0 ./uboot.img ./boot.img. DMA переносит прошивку в заданную область памяти EP, затем команда запуска инициирует загрузку из DDR. EP выводит обычный журнал и входит в систему. При ошибке приложения RC см. examples/pcie_download_test/README.
- Пример предварительного просмотра декодированного видео.
Шаг 1. Скорость последовательного порта EP и RC — 1500000. Выполните на RC lspci -vvv \|grep 356a и ls /dev/pcie-rkep*. Следующий вывод устройств подтверждает обнаружение EP и нормальную загрузку драйвера RC.
[root@RK3588:/userdata]# lspci -vvv |grep 356a
01:00.0 Processing accelerators: Rockchip Electronics Co., Ltd Device 356a (rev 01)
[root@RK3588:/userdata]# ls /dev/pcie-rkep*
/dev/pcie-rkep0000:01:00.0
Шаг 2. После нормальной загрузки EP терминал выводит следующий журнал и блокируется в ожидании запуска приложения RC.
00:00:05.330 I [cmp_pcie_ep: cc_cmp_pcie_device: 390] rk pcie version: v3.0.0 - 2024-12-11
00:00:05.330 D [chipscon: cc_kernel_api_prob: 398] open rkep: /dev/pcie_ep Success.
00:00:05.330 D [chipscon: cc_kernel_api_prob: 403] probe pcie_rkep, fd = 3
00:00:05.330 I [core_pcie_ep: cc_core_pcie_dev_i: 53] bar0 size=0x400000
00:00:05.330 I [core_pcie_ep: cc_core_pcie_dev_i: 53] bar2 size=0x4000000
00:00:05.330 I [core_pcie_ep: cc_core_pcie_dev_i: 53] bar4 size=0x100000
00:00:05.330 E [chipscon: cc_kernel_api_reso: 141] cc_kernel_api_resource_mmap mmap failed, size=0, err=Invalid argument
00:00:05.330 E [core_pcie_ep: cc_core_pcie_dev_i: 73] no bar1
00:00:05.330 E [chipscon: cc_kernel_api_reso: 141] cc_kernel_api_resource_mmap mmap failed, size=0, err=Invalid argument
00:00:05.330 E [core_pcie_ep: cc_core_pcie_dev_i: 86] no bar5
00:00:05.330 I [pcie_dma: cc_core_pcie_dma_i: 590] - id=ffffffff
00:00:05.330 I [pcie_dma: cc_core_pcie_dma_i: 600] - id=356a1d87
00:00:05.330 I [pcie_dma: cc_core_pcie_dma_i: 609] - magic=524b4550, ver=1
......
00:00:05.331 D [cmp_pcie_ep: pcie_task_ep_msg_t: 264] start
00:00:05.331 D [cmp_pcie_ep: stream_speed_threa: 352] stream_speed_thread tart
Шаг 3. Настройте память системы RC по разделу настройки памяти пользовательского уровня.
Шаг 4. Для согласования с EP и начала передачи выполните:
- Универсальный RC:
./pcie_video_test_rc ./output1.h264 36 704 576 0 1 - RK RC:
pcie_video_test_rc /root/output1.h264 36 704 576 0 1
Дисплей RC выводит 1080P60: видны 36 потоков декодирования и обнаружение людей NN на первом потоке. Вывод RC использует DRM. RK RC поддерживает его по умолчанию; универсальному RC нужен libdrm-dev. Перед тестом переключитесь в терминал без GUI сочетанием Ctrl+F3.
Шаг 4 (нумерация оригинала). Для остановки нажмите Enter в приложении RC. Оно отправит EP сообщение об уничтожении прикладных ресурсов и завершится; EP после получения сообщения также освободит ресурсы и завершится. Необходимо штатное завершение: иначе обработка EP останется активной и следующий запуск будет некорректным.
Приложение EP по умолчанию автоматически запускается и повторно запускается при загрузке. Для другого теста закомментируйте текущий тест в загрузочном скрипте и перезагрузите RC и EP. В /etc/init.d/S99_pcie_ep.sh закомментируйте следующий код.
while true;
do
cd /
pcie_video_test_ep 1
done &
3.2.2 Windows RC
Поставляемый драйвер Windows RC поддерживает только системы ниже Windows 10 2004. Для более новых систем требуется самостоятельно подготовить среду сборки и собрать драйвер. См. раздел построения среды драйвера Windows, прежде всего версию системы и отключение проверки подписи драйверов. После подготовки вставьте EP до включения PC. В диспетчере устройств найдите PCI-устройство: «Обновить драйвер» → «Выполнить поиск драйверов на этом компьютере» → каталог Win-Driver-RC → «Далее». После установки отображается Rockchip RC PCIE Driver for the rk35xx Accelerator Card. Запускайте тестовый инструмент от имени администратора. Показанный инструмент поддерживает загрузку прошивки, проверку скорости, декодирование видео и обнаружение объектов. При ошибках см. раздел устранения проблем.

Технический рисунок оригинала, стр. 13
После подготовки оборудования и ПО выполните полную проверку PCIe по следующим шагам. Если загружать прошивку на EP не нужно, пропустите первый пункт.
- RC загружает прошивку на EP через PCIe.
Шаг 1. Скорость последовательного порта EP и RC — 1500000. После подключения постоянно выводится следующий журнал: PCIe-связь установлена, EP ожидает передачи прошивки от RC.
U-Boot SPL 2017.09-g614fe864bf-dirty #xyp (Apr 20 2023 - 11:19:22)
RKEP: 191277 - Link ready! Waiting RC to download Firmware:
RKEP: 191723 - Download uboot.img to BAR2+0
RKEP: 192068 - Download boot.img to BAR2+0x400000
RKEP: 192466 - Send CMD_LOADER_RUN to BAR0+0x400
RKEP: 1092850 - Waiting for FW, CMD: 0
RKEP: 2093146 - Waiting for FW, CMD: 0
RKEP: 3093443 - Waiting for FW, CMD: 0
RKEP: 4093740 - Waiting for FW, CMD: 0
RKEP: 5094036 - Waiting for FW, CMD: 0
Если EP сразу входит в систему, Flash уже содержит полную прошивку; перезапишите pcie_idb.img и normal_idb.img в maskrom.
Шаг 2. Откройте инструмент, выберите uboot и boot и нажмите загрузку прошивки. DMA передаст их по заданным адресам памяти EP, затем команда запуска загрузит EP из DDR. EP выведет обычный журнал запуска и войдёт в систему.
- Проверка предварительного просмотра декодированного видео.
Шаг 1. После загрузки EP выводит следующий журнал и блокируется, ожидая приложение RC.
00:00:05.330 I [cmp_pcie_ep: cc_cmp_pcie_device: 390] rk pcie version: v3.0.0 - 2024-12-11
00:00:05.330 D [chipscon: cc_kernel_api_prob: 398] open rkep: /dev/pcie_ep Success.
00:00:05.330 D [chipscon: cc_kernel_api_prob: 403] probe pcie_rkep, fd = 3
00:00:05.330 I [core_pcie_ep: cc_core_pcie_dev_i: 53] bar0 size=0x400000
00:00:05.330 I [core_pcie_ep: cc_core_pcie_dev_i: 53] bar2 size=0x4000000
00:00:05.330 I [core_pcie_ep: cc_core_pcie_dev_i: 53] bar4 size=0x100000
00:00:05.330 E [chipscon: cc_kernel_api_reso: 141] cc_kernel_api_resource_mmap mmap failed, size=0, err=Invalid argument
00:00:05.330 E [core_pcie_ep: cc_core_pcie_dev_i: 73] no bar1
00:00:05.330 E [chipscon: cc_kernel_api_reso: 141] cc_kernel_api_resource_mmap mmap failed, size=0, err=Invalid argument
00:00:05.330 E [core_pcie_ep: cc_core_pcie_dev_i: 86] no bar5
00:00:05.330 I [pcie_dma: cc_core_pcie_dma_i: 590] - id=ffffffff
00:00:05.330 I [pcie_dma: cc_core_pcie_dma_i: 600] - id=356a1d87
00:00:05.330 I [pcie_dma: cc_core_pcie_dma_i: 609] - magic=524b4550, ver=1
......
00:00:05.331 D [cmp_pcie_ep: pcie_task_ep_msg_t: 264] start
00:00:05.331 D [cmp_pcie_ep: stream_speed_threa: 352] stream_speed_thread tart
Шаг 2. Скопируйте тестовый поток в каталог инструмента и переименуйте его в output1.h264. Инструмент использует фиксированный формат необработанного потока h264. Задайте длительность и нажмите кнопку видеотеста. Экран проверки показан ниже.

Технический рисунок оригинала, стр. 15
3.3 Измеренная производительность
Производительность передачи PCIe EP
| EP | RC | Аппаратная конфигурация | Сценарий | Максимальная скорость |
|---|---|---|---|---|
| RK3588 | RK3588 | PCIE 3.0x4 Lane | EP записывает в RC | 2.95GB/s |
| EP читает из RC | 1.8GB/s | |||
| Одновременное чтение/запись EP и RC | Каждый 1.6GB/s | |||
| RK3588 | RK3588 (Using RC DMA включено) | PCIE 3.0x4 Lane | EP записывает в RC | 2.95GB/s |
| EP читает из RC | 2.95GB/s | |||
| Одновременное чтение/запись EP и RC | Каждый 2.85GB/s | |||
| X86 | PCIE 3.0x4 Lane | EP записывает в RC | 2.9GB/s | |
| EP читает из RC | 2.5GB/s | |||
| Одновременное чтение/запись EP и RC | Каждый 2.4GB/s | |||
| Windows | PCIE 3.0x4 Lane | EP записывает в RC | 650MB/s | |
| EP читает из RC | 700MB/s | |||
| Одновременное чтение/запись EP и RC | Каждый 320MB/s |
Производительность продолжает оптимизироваться. Windows пока не поддерживает проверку цепочечного DMA. Скорость сильно зависит от структуры памяти; крупные непрерывные блоки обеспечивают более высокую скорость.
3.4 Сборка примеров
Инструкции по сборке и использованию каждого примера находятся в examples/*/README.
4. Основы прикладной обработки карты EP
4.1 Принцип работы
Прикладная обработка EP передаёт исходные и обработанные процессором данные между сторонами по PCIe. Основные ресурсы:
RC:
- управление устройством EP через открытую стандартную библиотеку libpci;
- драйвер pcie-rkep выполняет отображение BAR (рекомендуется для управления), DMA (для блоков данных), обработку MSI, запуск ELBI и выделение DMA-памяти;
- пользовательский уровень активно опрашивает MSI для ускорения реакции, однако несколько согласований ограничивают работу в реальном времени;
- поддерживаются несколько процессов, например несколько pcie_speed_test.
EP:
- драйвер pcie_ep использует class id 0x1200 (Processing accelerators), отображает физическое входящее адресное пространство BAR, выполняет DMA, отправляет MSI и обрабатывает ELBI;
- активный опрос ELBI пользовательским уровнем ускоряет реакцию, но несколько согласований ограничивают работу в реальном времени;
- поддерживается многопоточность;
- VDEC, VENC, RGA, GPU и NPU доступны пользовательскому уровню через Rockit или RKNN.
5. Введение в Chips Connect
5.1 Принцип работы
Chips Connect — пользовательский комплект разработки на основе базовых функций EP. Он предоставляет интерфейсы передачи данных RC/EP в обоих направлениях и уведомления сообщениями, а также типовые прикладные сценарии.
Распределение BAR для обычных платформ с достаточной памятью на этапах SPL и Kernel:
| Пространство BAR | Начальный адрес | Конечный адрес | Функция |
|---|---|---|---|
| BAR0 | 0 | 4KB | Резерв EP: версия драйвера, состояние прерываний и т. д. |
| 12KB | 16KB | Конфигурация DEBUG | |
| 16KB | 128KB | Состояние устройства EP | |
| 128KB | 1M | Пользовательское | |
| 1M | 4M | Обмен командами и управление buff | |
| BAR1 (по умолчанию отключён) | 0 | 1MB | Пользовательское; включение см. «Настройка размера BAR» |
| BAR2 (BAR2/3 Bar Repair) | 0 | 64MB | Используется DMA RC |
| BAR4 | 0 | 4MB | Область регистров Wired для управления DMA |
| BAR5 (по умолчанию отключён) | 0 | 1MB | Пользовательское; включение см. «Настройка размера BAR» |
Пояснение: пользовательское пространство BAR на EP доступно для расширения; остальное требуется прикладному коду. BAR1 и BAR5 по умолчанию отключены, всё их пространство пользовательское. После включения они используются для управляющего потока. Входящий адрес CPU для BAR на EP задаётся конфигурацией отображения BAR; RC может динамически его менять.
Распределение BAR для платформ с ограниченной памятью на этапах SPL и Kernel:
| Пространство BAR | Начальный адрес | Конечный адрес | Функция |
|---|---|---|---|
| BAR0 | 0 | Reserved | Резерв; по умолчанию 0 |
| R | R+2048B | Резерв EP: версия драйвера, состояние прерываний и т. д. | |
| R+2048B | R+2560B | Конфигурация DEBUG | |
| R+2056B | R+3072B | Состояние устройства EP | |
| R+3072B | R+4KB | Пользовательское | |
| R+4KB | R+64KB | Обмен командами и управление buff | |
| BAR1 (по умолчанию отключён) | 1MB | Пользовательское; включение см. «Настройка размера BAR» | |
| BAR2 (BAR2/3 Bar Repair) | 0 | 64MB | Используется DMA RC |
| BAR4 | 0 | 4MB | Область регистров Wired для управления DMA |
| BAR5 (по умолчанию отключён) | 0 | 1MB | Пользовательское; включение см. «Настройка размера BAR» |
Пояснение: минимальное выравнивание BAR составляет 1MB; обычно для отображения выделяется 1MB. При ограниченной памяти допускается резервирование, а Chips Connect использует зарезервированную память. Пользовательское пространство EP BAR доступно для расширения, остальное требуется прикладному коду. BAR1 и BAR5 по умолчанию отключены и полностью пользовательские; после включения используются для управления. Входящий CPU-адрес задаётся конфигурацией BAR и может динамически меняться с RC.
5.2 Архитектура системы передачи PCIe
Структурная схема системы PCIe RC и EP

Технический рисунок оригинала, стр. 19
5.3 Управление BUFF и передача данных
Управление BUFF

Технический рисунок оригинала, стр. 19
Ниже кратко описан полный цикл инициализации, записи и чтения со стороны RC.
5.3.1 Инициализация
Выполняются две основные задачи:
-
Инициализация PCIe-устройства по VENDOR_ID, DEVICE_ID и адресу шины. Внутри libpci перечисляет PCIe-устройства системы и отображает BAR в приложение. Допускаются повторные вызовы rk_pcie_device_init с разными идентификаторами для инициализации устройств.
-
Вызов rk_pcie_task_create создаёт задачу и инициализирует память и состояние BUFF. Количество и размер буферов задаются struct pcie_task_attr_st. Конфигурация передаётся EP через BAR0; RC ожидает завершения инициализации EP.
EP получает сообщение создания задачи через rk_pcie_get_task_msg и запускает инициализацию, согласуя конфигурацию сторон. RC выбирает Hugepage/RKEP/RKDRM по параметрам сборки. Каждая карта EP создаёт на RC узел /dev/pcie-rkep* и получает отдельную большую непрерывную область памяти, если включена соответствующая настройка. EP после получения конфигурации инициализирует BUFF и выделяет физически непрерывную память через Hugepage/RKDRM. Данные BUFF обеих сторон размещаются в определённой области BAR0 для управления состоянием буферов.
#define VENDOR_ID 0x1d87
#define DEVICE_ID 0x356a
struct pcie_dev_bus dev_bus;
int ret;
//获取系统匹配的PCI设备总线地址
ret = rk_pcie_get_pci_bus_addresses(VENDOR_ID, DEVICE_ID, &rc_ctx.dev_bus);
if (ret != 0) {
printf("get pci bus address fail\n");
return -1;
}
printf("ep dev max num : %d\n", rc_ctx.dev_bus.dev_max_num);
if (rc_ctx.dev_bus.dev_max_num == 0) {
printf("no ep device, exit ... \n");
} else {
rc_ctx.dev_attr.using_rc_dma = 0;
rc_ctx.dev_attr.rc_dma_chn = 0;
rc_ctx.dev_attr.enable_speed = 1;
rc_ctx.dev_attr.vendor_id = VENDOR_ID;
rc_ctx.dev_attr.device_id = DEVICE_ID;
rc_ctx.dev_attr.use_dma_only_in_rc = 0;
rc_ctx.dev_attr.mem_type = E_MEM_TYPE_HUGEPAGE;
memcpy(rc_ctx.dev_attr.pci_bus_address, pci_bus_address, strlen(pci_bus_address));
//选择第⼀个匹配设备初始化
rc_ctx.rk_handle = rk_pcie_device_init(&rc_ctx.dev_attr);
//获取EP设备模式
rk_pcie_get_ep_mode(rc_ctx.rk_handle, &rc_ctx.devmode);
printf("ep device init, dev mode: %d, submode: %d\n", rc_ctx.devmode.mode,
rc_ctx.devmode.submode);
}
5.3.2 Передача данных
Передача состоит из трёх шагов:
-
Проверить наличие доступного BUFFER.
-
Получить BUFFER и записать в него данные.
-
Передать BUFFER другой стороне. Например, send_buff_num = 5 разрешает не более пяти передающих буферов. Отправитель получает свободный буфер и через struct pcie_buff_node узнаёт его физический и виртуальный адреса и размер. После прикладной обработки вызывается отправка. Внутри сначала очищается кэш буфера, чтобы физическая память содержала актуальные данные, затем DMA передаёт их другой стороне. Передаваемый размер node->size не должен превышать ёмкость BUFFER.
Отправленный буфер становится доступным снова только после освобождения получателем; иначе процесс блокируется. rk_pcie_get_buff пока не поддерживает блокирующий режим: ожидание реализуется циклом с sleep.
struct pcie_buff_node *node = rk_pcie_get_buff(rk_handle, E_SEND);
if(node) {
node->size = rk_pcie_get_buff_max_size(rk_handle, E_SEND);
//操作buff 写⼊数据
rk_pcie_send_buff(ctx->rk_handle, node);
} else {
usleep(1000);
}
Принцип передачи RC → EP:

Технический рисунок оригинала, стр. 22
Принцип передачи EP → RC:

Технический рисунок оригинала, стр. 23
5.3.3 Приём данных
Приём состоит из трёх шагов:
-
Проверить наличие доступного BUFFER.
-
Получить доступный BUFFER и прочитать данные.
-
Освободить BUFFER. Внутренняя реализация приёма похожа на передачу. Количество буферов задаётся recv_buff_num при инициализации; см. раздел передачи. Размер доступных данных равен node->size.
struct pcie_buff_node *node = rk_pcie_get_buff(rk_handle, E_RECV);
if(node) {
//操作buff 读取数据
rk_pcie_release_buff(rk_handle, node);
} else {
usleep(1000);
}
Принцип приёма EP:

Технический рисунок оригинала, стр. 24
Принцип приёма RC:

Технический рисунок оригинала, стр. 24
5.3.4 Конфигурация BUFF
-
Передача RC → EP. В декодирующей карте RC отправляет исходные потоки EP; объём отдельного канала сравнительно мал. Размер BUFF можно задать как 4KB × число видеоканалов. Каждый поток передаёт 4KB за раз, чтобы обновлять данные при каждой передаче без излишне малых пакетов, расходующих полосу PCIe. Рекомендуется 3–5 циклически используемых буферов, минимум три. Если нужна дополнительная обработка, количество следует увеличить, иначе цикл остановится и скорость упадёт. При многопоточной передаче число буферов также можно увеличить.
-
Передача EP → RC. Обычно передаются большие декодированные данные: один кадр 1080p YUV422 занимает примерно 3MB. Один BUFF размером 3MB–6MB передаёт данные одного или двух каналов. Поскольку нужны несколько буферов для чередования, не следует чрезмерно увеличивать отдельный BUFF, занимая слишком много памяти.
5.4 Настройка памяти пользовательского уровня
RC и EP поддерживают несколько способов выделения памяти. Сторона RC:
-
Драйвер pcie-rkep выделяет память, SDK получает её отображением mmap. Включение: CONFIG_PCIE_FUNC_RKEP_USERPAGES=y (по умолчанию выключено). Размер изменяется макросом RKEP_USER_MEM_SIZE в pcie-rkep.c; по умолчанию 64M.
-
HugePages — рекомендуемый способ.
-
Драйвер DRM; необходимо заранее зарезервировать CMA в DTS. Размер DMA-памяти изменяется в arch/arm64/boot/dts/rockchip/rk3588-linux.dtsi:
@@ -71,7 +71,7 @@ reserved-memory {
cma {
compatible = "shared-dma-pool";
reusable;
reg = <0x0 0x50000000 0x0 0x10000000>; //从地址0x50000000开始256MB⼤⼩
linux,cma-default;
};
- Dummy: пользователь управляет буфером данных, а инфраструктура управляет только узлом чередования и не выделяет сам буфер. Сейчас поддерживается только Windows.
Сторона EP:
- Драйвер DRM с предварительным резервированием CMA в DTS. Размер DMA-памяти изменяется в arch/arm64/boot/dts/rockchip/rk3588-linux.dtsi:
@@ -71,7 +71,7 @@ reserved-memory {
cma {
compatible = "shared-dma-pool";
reusable;
reg = <0x0 0x50000000 0x0 0x10000000>; //从地址0x50000000开始256MB⼤⼩
linux,cma-default;
};
- HugePages — рекомендуемый способ. Метод задаётся атрибутом при инициализации Task:
- RC: E_MEM_TYPE_HUGEPAGE / E_MEM_TYPE_RKDRM / E_MEM_TYPE_RKEP.
- EP: E_MEM_TYPE_HUGEPAGE / E_MEM_TYPE_RKDRM.
HugePages требует настройки системы; см. раздел HugePage.
5.5 Преимущества пользовательского драйвера
Перенос прикладного драйвера PCIe в пользовательский уровень упрощает использование и оптимизирует производительность.
Использование:
- Основа на PCIe-драйвере облегчает перенос между платформами.
- Прямое объединение с приложением позволяет вызывать rockit от RK или сторонние интерфейсы gstreamer.
В сравнении с драйвером интерфейса ядра:
- опрос вместо прерываний снижает расходы переключения режима CPU при частых прерываниях;
- уменьшаются переходы ядро/пользовательское пространство;
- рекомендуется привязка к CPU для уменьшения межъядерного планирования;
- устраняется копирование ядро/пользовательское пространство, обеспечивая zero-copy;
- Huge Page снижает промахи кэша TLB.
5.6 Несколько независимых приложений пользовательского уровня
Основа приложений RK chips_connect — Task:
- задачи независимы;
- сообщения пользователей RC независимы, RC Task поддерживает несколько процессов;
- сообщения пользователей EP управляются совместно, EP Task не поддерживает несколько процессов;
- внутри Task поддерживается многопоточность;
- Task ID выдаются в порядке запросов, конкретный ID задать нельзя.
В стандартном примере приложение не привязано к Task и другим ресурсам, поэтому независимые приложения параллельно не работают. Рекомендуется расширение через пользовательские сообщения с идентификатором приложения и принадлежностью Task. Пример для RK RT-Thread chips_connect:
- Определите правила пользовательских сообщений и добавьте управление приложениями:
struct task_user_cmd_st {
unsigned int app_id;
unsigned int cmd;
unsigned char data[4];
};
-
EP регистрирует приложение с уникальным app_id.
-
RC отправляет сообщения с уникальным app_id.
-
Основная программа EP вызывает обработчик сообщения приложения по app_id.
-
Приложение EP обрабатывает сообщения, включая создание и освобождение Task.

Технический рисунок оригинала, стр. 27
6. Конфигурация Chips Connect
6.1 Пользовательский драйвер карты EP
Это функциональный драйвер EP на стороне RC, включающий модули ядра и пользовательские приложения.
6.1.1 Режим Using-RC-DMA
Режим работает только при подключении EP к RK RC и позволяет максимально использовать полосу PCIe. По умолчанию используется лишь DMA EP. В Using-RC-DMA при записи EP → RC используется DMA EP, а при записи RC → EP — DMA RC, без взаимного вмешательства. DMA RC может передавать только в физические области, отображённые во входящий BAR, поэтому для него выделяется BAR2. По умолчанию размер 64M; он меняется DTS на EP. Эта память используется только при записи RC → EP и должна быть не меньше send_buff_size, задаваемого при инициализации.
Для включения не требуется менять драйверы RC/EP: достаточно настроить параметры инициализации приложения RC.
dev_attr.using_rc_dma = 1; //使⽤RC DMA
dev_attr.rc_dma_chn = 1; //通道1,⽀持0/1
После включения приложение RC выводит следующий журнал:
rk pcie version: v2.0.0 - 202300927
using rc dma: 1, chn: 1 //使能RC DMA,通道1
open rkrmd: /dev/pcie-rkep-0000:01:00.0 Success.
При создании Task приложение EP выводит следующий журнал:
task create id: 1
using rc dma: 1
Рекомендуемая конфигурация:
- Один EP: включить using_rc_dma и выбрать канал 0.
- Несколько EP: отключить using_rc_dma и использовать DMA каждого EP, чтобы скорости карт оставались примерно равными.
7. Типовые сценарии Chips Connect
7.1 Карта ускорения видео EP
Карта передаёт видеопоток RC по PCIe на EP для декодирования и обработки, затем возвращает результат основной микросхеме для отображения. Основной поток обработки показан ниже.

Технический рисунок оригинала, стр. 29
Отправитель получает данные видеопотока, копирует их в подготовленный send stream buffer и через PCIe DMA передаёт в recv stream buffer противоположной стороны. Там поток извлекается и через VDEC поступает в VPSS. VPSS выдаёт два потока: один идёт в GPU для композиции, другой — в RKNN. Результат композиции копируется в подготовленный send stream buffer и через PCIe DMA передаётся в recv stream buffer другой стороны. Получатель извлекает данные и передаёт их модулю VO для отображения. SDK реализует буферы отправителя и получателя; достаточно настроить параметры при инициализации, сосредоточившись на прикладной обработке.
8. Критерии приёмки Chips Connect
При первом использовании комплекта PCIe EP рекомендуется до собственной разработки пройти следующие проверки ПО, аппаратуры и базового прикладного процесса.
8.1 Состав комплекта разработки
Структура каталогов
.
├── bootloader # pcie ep bootloader源码⼯程
├── build # build编译脚本
├── core
│ ├── api # sdk对外api,包含rc和ep
│ └── component # pcie组件,主要是负责buf管理,消息通知等
│ └── framework # 框架层,主要负责和OS交互,对上提供系统能⼒以及PCIE功能
├── docs # PCIE EP SDK⽂档介绍
├── examples
│ ├── pcie_camera_test # EP卡典型业务,抓取EP Camera数据数据处理,仅android端使⽤
│ ├── pcie_speed_test # EP卡典型业务,PCIE传输速率测试Demo
│ └── pcie_video_test # EP卡典型业务,视频卡Demo
│ └── pcie_download_test # EP卡RC下载固件启动⽅案Demo
│ └── pcie_auto_test # EP卡功能⾃动化测试Demo
│ └── windows # EP卡Windows测试Demo
└── images # 功能验证固件
└── patch* # 补丁⽬录
└── third-party # 第三⽅依赖
Основные каталоги:
core/framework реализует общие для RC/EP функции: управление памятью, журналирование, linked_list, DMA, PCIe CONFIG и другие компоненты.
- framework/core/pcie: передача DMA и взаимодействие с конфигурацией DMA микросхемы.
- framework/core/mem: выделение и освобождение памяти при разных настройках.
- framework/osal: инкапсуляция интерфейсов ОС, скрывающая различия ОС от верхнего уровня.
- framework/base: базовые структуры, включая списки и очереди.
core/component инкапсулирует интерфейсы RC/EP, управление buf, сообщения и передачу данных, предоставляя API без вызовов через ОС. Три части:
- ep_pcie: управление buf, уведомления и передача на стороне EP.
- rc_pcie: те же функции для RC.
- cc_pcie_type.h и cc_cmp_pcie_type.h: единые структуры и типы данных для обмена RC/EP.
core/api инкапсулирует пользовательские интерфейсы различных систем. Оригинал называет четыре части, но перечисляет три:
- ep: RK EP нужен только arm; обёртка component/ep_pcie без дополнительной логики.
- rc/windows: реализация в форме драйвера с ioctl для пользователя.
- rc/other: другим системам драйверная форма не требуется; обёртка component/rc_pcie без дополнительной логики.
build: сборка SDK для Linux, Android и Windows.
docs: документация стандартной платы EP.
examples: тестовые примеры, описание и инструкции; см. README соответствующего каталога.
images: прошивки и примеры для непосредственной базовой проверки.
patch: патчи SDK для Linux и Android; инструкции в patch/README.
8.2 Обновление патчей: применение исходников пакета обновления одним действием
Цель: обновить версию драйвера стандартной карты с применением патчей каталога обновления одним действием. Метод для RK3588:
./ep_patch.sh release patch-kernel5.10/更新包 ./path-to-dst/
RK3568:
./ep_patch.sh release patch-kernel4.19/更新包 ./path-to-dst/
Дополнение: создание пакета патчей:
./ep_patch.sh release ./.. patch-kernel5.10/更新包
cd ./../kernel/
git checkout develop-4.19
cd -
./ep_patch.sh kernel ./.. patch-kernel4.19/更新包
8.3 Функциональность: ключевая информация журналов
8.3.1 Ключевая информация lspci на RC
Проверьте: BAR включены и правильно распределены.
MSI включены и правильно выделены; LnkCap поддерживает Gen3x4, ASPM не поддерживается; LnkSta показывает Gen3x4; Kernel driver in use: pcie-rkep. Пример журнала:
01:00.0 Class 1200: Device 1d87:356a (rev 01)
Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR-
FastB2B- DisINTx+
Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort-
>SERR- <PERR- INTx-
Latency: 0
Interrupt: pin A routed to IRQ 157
Region 0: Memory at f0400000 (32-bit, non-prefetchable) [size=4M]
Region 2: Memory at 900000000 (64-bit, prefetchable) [size=64M]
Region 4: Memory at f0200000 (32-bit, non-prefetchable) [size=1M]
Capabilities: [40] Power Management version 3
Flags: PMEClk- DSI- D1+ D2+ AuxCurrent=375mA PME(D0+,D1+,D2-,D3hot+,D3cold-)
Status: D0 NoSoftRst+ PME-Enable- DSel=0 DScale=0 PME-
Capabilities: [50] MSI: Enable+ Count=4/32 Maskable+ 64bit+
Address: 00000000fe670040 Data: 0000
Masking: fffffff0 Pending: 00000000
Capabilities: [70] Express (v2) Endpoint, MSI 08
DevCap: MaxPayload 256 bytes, PhantFunc 0, Latency L0s unlimited, L1
unlimited
ExtTag+ AttnBtn- AttnInd- PwrInd- RBE+ FLReset- SlotPowerLimit
0.000W
DevCtl: Report errors: Correctable- Non-Fatal- Fatal- Unsupported-
RlxdOrd+ ExtTag+ PhantFunc- AuxPwr- NoSnoop-
MaxPayload 256 bytes, MaxReadReq 256 bytes
DevSta: CorrErr- UncorrErr- FatalErr- UnsuppReq- AuxPwr- TransPend-
LnkCap: Port #0, Speed 8GT/s, Width x4, ASPM not supported, Exit Latency L0s
<4us, L1 <16us
ClockPM- Surprise- LLActRep- BwNot- ASPMOptComp+
LnkCtl: ASPM Disabled; RCB 64 bytes Disabled- CommClk-
ExtSynch- ClockPM- AutWidDis- BWInt- AutBWInt-
LnkSta: Speed 8GT/s, Width x4, TrErr- Train- SlotClk+ DLActive- BWMgmt-
ABWMgmt-
DevCap2: Completion Timeout: Not Supported, TimeoutDis+, LTR+, OBFF Via
message/WAKE#
DevCtl2: Completion Timeout: 50us to 50ms, TimeoutDis-, LTR+, OBFF Disabled
LnkCtl2: Target Link Speed: 8GT/s, EnterCompliance- SpeedDis-
Transmit Margin: Normal Operating Range, EnterModifiedCompliance-
ComplianceSOS-
Compliance De-emphasis: -6dB
LnkSta2: Current De-emphasis Level: -6dB, EqualizationComplete+,
EqualizationPhase1+
EqualizationPhase2+, EqualizationPhase3+, LinkEqualizationRequest-
Capabilities: [b0] MSI-X: Enable- Count=128 Masked-
Vector table: BAR=4 offset=00020000
PBA: BAR=4 offset=00028000
Capabilities: [100 v2] Advanced Error Reporting
UESta: DLP- SDES- TLP- FCP- CmpltTO- CmpltAbrt- UnxCmplt- RxOF- MalfTLP-
ECRC- UnsupReq- ACSViol-
UEMsk: DLP- SDES- TLP- FCP- CmpltTO- CmpltAbrt- UnxCmplt- RxOF- MalfTLP-
ECRC- UnsupReq- ACSViol-
UESvrt: DLP+ SDES+ TLP- FCP+ CmpltTO- CmpltAbrt- UnxCmplt- RxOF+ MalfTLP+
ECRC- UnsupReq- ACSViol-
CESta: RxErr- BadTLP- BadDLLP- Rollover- Timeout- NonFatalErr-
CEMsk: RxErr- BadTLP- BadDLLP- Rollover- Timeout- NonFatalErr+
AERCap: First Error Pointer: 00, GenCap+ CGenEn- ChkCap+ ChkEn-
Capabilities: [148 v1] #19
Capabilities: [168 v1] Address Translation Service (ATS)
ATSCap: Invalidate Queue Depth: 00
ATSCtl: Enable-, Smallest Translation Unit: 00
Capabilities: [178 v1] Page Request Interface (PRI)
PRICtl: Enable- Reset-
PRISta: RF- UPRGI- Stopped+
Page Request Capacity: 00000001, Page Request Allocation: 00000000
Capabilities: [188 v1] Latency Tolerance Reporting
Max snoop latency: 0ns
Max no snoop latency: 0ns
Capabilities: [190 v1] L1 PM Substates
L1SubCap: PCI-PM_L1.2+ PCI-PM_L1.1+ ASPM_L1.2+ ASPM_L1.1+ L1_PM_Substates+
PortCommonModeRestoreTime=10us PortTPowerOnTime=10us
Capabilities: [1a0 v1] #16
Capabilities: [1d0 v1] Vendor Specific Information: ID=0002 Rev=4 Len=100 <?>
Capabilities: [2d0 v1] Vendor Specific Information: ID=0006 Rev=0 Len=018 <?>
Capabilities: [2e8 v1] #15
Kernel driver in use: pcie-rkep
8.3.2 Журнал запуска spl.bin на EP
Проверьте вывод «already linkup» на этапе Kernel. Пример:
... #spl关键打印
U-Boot SPL board init
RKEP: Init PCIe EP
RKEP: 188259 - PHY Mode 0x4
RKEP: 189537 - RKEP: GRF:904=7, a04=7...
RKEP: 190138 - RKEP: GRF:904=7, a04=f...
RKEP: 190487 - RKEP: GRF:904=f, a04=f...
RKEP: 190827 - RefClock in common clock_mode
RKEP: 200593 - BAR0: 0x3c000000
RKEP: 200864 - BAR2: 0x010000000
RKEP: 201247 - init PCIe fast Link up
RKEP: 218243 - Link up 230011
RKEP: 259699 - Done
... #内核关键打印
[00-06-34.831][ 3.148198] rk-pcie-ep fe150000.pcie: bar0: assigned [0x3c000000-3c3fffff]
[00-06-34.834][ 3.149015] rk-pcie-ep fe150000.pcie: bar2: assigned [0x40000000-43ffffff]
[00-06-34.834][ 3.149027] rk-pcie-ep fe150000.pcie: no vpcie3v3 regulator found
[00-06-34.837][ 3.149046] rk-pcie-ep fe150000.pcie: already linkup
[00-06-34.837][ 3.149320] rk-pcie-ep fe150000.pcie: register misc device pcie_ep
8.3.3 Журнал запуска pcie.bin на EP
Проверьте и запишите время работы pcie.bin.
| Версия | Длительность |
|---|---|
| V1.00 | 360ms |
SPL выводит «already link up», Kernel — «already linkup». Пример журнала:
#pcie.bin关键打印
PCIe_EP Release Time: Jan 2 2025 V2.20
Gen3x4
phyMode4
HW
controlelr initialed
GRF:904=0007, a04=0007...
GRF:904=004F, a04=004F...
phy locked
phy initialed
vid=0x1D87 did=0x356A
ms=000C
Linking, ltssm:
00000001
00000002
00000007
00210022
00210023
00230011
Link up
rst_fun1
Link stable, ltssm
00230011
out
... #spl关键打印
U-Boot SPL board init
RKEP: Init PCIe EP
RKEP: already link up
... #内核关键打印
[00-06-34.831][ 3.148198] rk-pcie-ep fe150000.pcie: bar0: assigned [0x3c000000-3c3fffff]
[00-06-34.834][ 3.149015] rk-pcie-ep fe150000.pcie: bar2: assigned [0x40000000-43ffffff]
[00-06-34.834][ 3.149027] rk-pcie-ep fe150000.pcie: no vpcie3v3 regulator found
[00-06-34.837][ 3.149046] rk-pcie-ep fe150000.pcie: already linkup
[00-06-34.837][ 3.149320] rk-pcie-ep fe150000.pcie: register misc device pcie_ep
8.4 Функциональность: запись прошивки
По разделу подключения одиночной EP к универсальному RC определите необходимость быстрого запуска и выбранный носитель, затем проверьте обновление с PC для одного носителя, двух носителей или EP Boot. Подробности см. в разделе сборки прошивки EP.
8.5 Производительность: пользовательский пример pcie_speed_test
8.5.1 Цели проверки
Проверяются базовые функции:
- Wired DMA со стороны RC к EP, скорость DMA и двунаправленный DMA;
- Local DMA со стороны RC к RC, скорость DMA и двунаправленный DMA;
- отображение BAR и нормальный доступ;
- ELBI: RC уведомляет EP событием прерывания;
- MSI: EP уведомляет RC событием прерывания.
По требованиям также проверяются Local DMA RC → EP при использовании RK RC с поддержкой DMA, его скорость и загрузка прошивки. Термины направлений сохранены из оригинала.
8.5.2 Метод проверки
Подробности: examples/pcie_speed_test/README.md.
8.5.3 Результаты RK3588 Gen3x4
Оборудование:
- RC: RK3588-EVB1-LP4X-V10, PCIe 3.0 4 lanes; большое ядро 2.4G, малое 1.8G, CPU/DRAM фиксированы на высокой частоте.
- EP: RK3588-EVB4-LP4X-V10, PCIe 3.0 4 lanes; большое ядро 2.4G, малое 1.8G, CPU/DRAM фиксированы на высокой частоте.
Версия: Rockchip_PCIE_EP_Standard_Card_20231215.tar.gz. Используется DMA EP, task_num = 1. Результаты оригинала:
| Размер DMA | 64B | 256B | 4K | 64KB | 1MB | 4MB |
|---|---|---|---|---|---|---|
| Чтение RC (запись DMA) | 0.16MB/S | 0.65MB/S | 10.4MB/S | 165.8MB/S | 1898.7MB/S | 3271.3MB/s |
| Запись RC (чтение DMA) | 0.17MB/S | 0.73MB/S | 11.0MB/S | 171.1MB/S | 1630.6MB/S | 1735.6MB/s |
Если тест инициирует RC со стандартным DMA EP, запись фактически означает чтение DMA EP, а чтение — запись DMA EP. Чем меньше блок, тем больше планирования и ниже скорость; многопоточность может повысить общую производительность.
8.5.4 Результаты RK3588 Gen2x1
Оборудование: RC RK3588-EVB1-LP4X-V10, PCIe 3.0 4 lanes, большое ядро 2.4G, малое 1.8G. EP RK3588-EVB4-LP4X-V10, PCIe 3.0 4 lanes со снижением до Gen2 1 lane, те же частоты. Версия: Rockchip_PCIE_EP_Standard_Card_20231215.tar.gz. Параметры:
DMA EP, task_num = 1. Результаты:
| Размер DMA | 64B | 256B | 4K | 64KB | 1MB | 4MB |
|---|---|---|---|---|---|---|
| Запись | 0.16MB/S | 0.64MB/S | 10.2MB/S | 147.6MB/S | 394.0MB/S | 396.2MB/s |
| Чтение | 0.17MB/S | 0.70MB/S | 11.0MB/S | 149.2MB/S | 384.0MB/S | 384.1MB/s |
При тесте RC с DMA EP запись означает чтение DMA EP, чтение — запись DMA EP. Меньшая гранулярность увеличивает планирование и снижает скорость; многопоточность может повысить общую производительность.
8.5.5 Результаты RK1820 Gen2x1
Оборудование: RC RK3588-EVB1-LP4X-V10, PCIe 3.0 4 lanes, большое ядро 2.4G, малое 1.8G; EP RK1820, PCIe 2.0 1 lane. Версия RC: Rockchip_PCIE_EP_Standard_Card_20250523_V3.1.0.tar.gz. EP: RK RT-Thread SDK, ветка develop-v5.1.x. DMA EP, task_num = 1. Результаты памяти DRAM RK1820:
| Размер DMA | 64B | 256B | 4K | 8K | 64KB | 512KB |
|---|---|---|---|---|---|---|
| Запись RC (чтение DMA EP) | 3MB/S | 10MB/S | 136MB/S | 188MB/s | 303MB/s | 317MB/s |
| Чтение RC (запись DMA EP) | 3MB/S | 11MB/S | 143MB/S | 237MB/S | 363MB/s | 382MB/s |
При тесте RC с DMA EP запись означает чтение DMA EP, чтение — запись DMA EP. Мелкие блоки увеличивают планирование и снижают скорость, но несколько потоков повышают общую производительность. В отличие от Linux, RT-Thread является ОС реального времени и позволяет пользовательским программам быстро
реагировать на прерывания, поэтому даже малые блоки сохраняют высокий поток данных.
8.6 Производительность: пользовательский пример pcie_loopback_test
8.6.1 Цель проверки
Для типичного сценария отправки и приёма пакета измеряется время реакции последовательного процесса.

Технический рисунок оригинала, стр. 38
8.6.2 Метод проверки
Подробности оригинал отсылает к examples/pcie_speed_test/README.md.
8.6.3 Результаты RK3588 Gen2x1
Оборудование: RC RK3588-EVB1-LP4X-V10, PCIe 3.0 4 lanes, большое ядро 2.4G, малое 1.8G.
EP RK3588-EVB4-LP4X-V10, PCIe 3.0 4 lanes со снижением до Gen2 1 lane, большое ядро 2.4G, малое 1.8G. Версия: Rockchip_PCIE_EP_Standard_Card_20231215.tar.gz. DMA EP, task_num = 1. Результаты:
| Размер DMA | 4K |
|---|---|
| min/max | 105us/724us |
В тесте RC с DMA EP запись означает чтение DMA EP, чтение — запись DMA EP. Статистика собирается после первой секунды теста, исключая влияние инициализации. Это лучший случай непрерывной передачи; для худшего случая задайте интервалы и другую нагрузку согласно требованиям.
8.6.4 Результаты RK1820 Gen2x1
RC RK3588-EVB1-LP4X-V10, PCIe 3.0 4 lanes, большое ядро 2.4G, малое 1.8G. EP RK1820, PCIe 2.0 1 lane. Версия RC: Rockchip_PCIE_EP_Standard_Card_20250523_V3.1.0.tar.gz; EP: RK RT-Thread SDK, ветка develop-v5.1.x. DMA EP, task_num = 1. Результаты DRAM RK1820:
| Размер DMA | 4K |
|---|---|
| min/max | 83us/139us |
Примечания:
При инициировании RC с DMA EP запись фактически является чтением DMA EP, чтение — записью DMA EP. Статистика после первой секунды исключает инициализацию. Приведён лучший случай непрерывной передачи; интервалы и дополнительная нагрузка нужны для моделирования худшего случая.
8.7 Совместимость: перечисление
Цель: проверить совместимость и устойчивость обнаружения, идентификации и перечисления EP на разных RC. Основные RC для RK EP:
| Устройство EP | Устройство RC | Холодный старт | Пробуждение | Горячий старт | Метод подтверждения |
|---|---|---|---|---|---|
| RK3588 EVB4 V11 | RK3588 EVB1 V10 | 20/20 | 20/20 | 20/20 | Linux: lspci | grep 356a |
| RK3588 EVB4 V11 | PC ubuntu | 20/20 | 20/20 | 20/20 | Linux: lspci | grep 356a |
| RK3588 EVB4 V11 | PC windows | 20/20 | 20/20 | 20/20 | Проверить устройства в диспетчере устройств |
| Устройство RK3568 iotest | RK3588 EVB1 V10 | 20/20 | 20/20 | 20/20 | Linux: lspci | grep 356a |
| Устройство RK3568 iotest | PC ubuntu | 20/20 | 20/20 | 20/20 | Linux: lspci | grep 356a |
Примечания: конечный продукт должен охватывать как можно больше целевых RC.
Холодная загрузка PC: выключить питание, включить питание, нажать POWER.
Пробуждение:
- RK RC: вход и выход из сна кнопкой POWER.
- Ubuntu: в настольной версии через интерфейс; остальные варианты требуют уточнения.
- Windows: оригинал указывает CTRL+L; остальные варианты требуют уточнения.
Горячая загрузка RK3588: получить права root и выполнить reboot в shell.
Ubuntu: с правами root выполнить reboot. Windows: на рабочем столе ALT+F4 открывает варианты перезапуска; некоторые PC допускают перезапуск кнопкой питания.
8.8 Совместимость: сброс EP и повторное перечисление RC
Цель: устойчивость при отдельном сбросе EP — remove/rescan PCIe, восстановление связи и нормальная работа приложения. Проверять после успешного завершения предыдущих функциональных тестов. Соберите examples/pcie_auto_test и подготовьте среду по examples/pcie_auto_test/README.md.
Для устройства 0 выполните на RC ./pcie_auto_test_rc 2 0 и ./pcie_auto_test_rc 3 0 для Remove и Rescan. Для проверки восстановления связи и приложения выполните ./pcie_auto_test_rc 0 0 — проверку стабильности API устройства 0.
8.9 Функциональность: OTA
По разделу одиночной EP с универсальным RC определите потребность в быстром старте и тип хранения, затем проверьте OTA для одного носителя, двух носителей или EP Boot. Подробности в разделе OTA карты EP.
9. Устранение проблем Chips Connect
9.1 Ошибка mmap failed, Operation not permitted при инициализации PCIe на x86 RC
root@rk:/home/rc-sample# ./pcie_test 10240
resource path = /sys/bus/pci/devices/0000:01:00.0/enable
resource path = /sys/bus/pci/devices/0000:01:00.0/resource0
mmap failed, ret = 0, Operation not permitted
ep dev num : 1
Segmentation fault (core dumped)
Ответ оригинала: начиная с Ubuntu 20.04 используется kernel lockdown. Включённый Secure Boot в BIOS активирует lockdown и приводит к ошибке mmap. Оригинал предлагает отключить Secure Boot в BIOS. Это изменение защиты системы, а не выполненная здесь операция; применимость необходимо проверить для конкретной системы.
9.2 Настройка HugePage
RK поддерживает Hugepage 2M, 32M и 1GB; другие платформы зависят от системы. Размер одной Hugepage должен быть больше отдельного передающего и принимающего буфера SDK, а число страниц — достаточным для всех BUFF. Пример: пять передающих буферов по 4M и пять принимающих по 8M. 2M недостаточно, минимальная настройка — 32M.
Страницы отправки: (int) (5 / (32M / 4M)) + 1 = 1. Страницы приёма: (int) (5 / (32M / 8M)) + 1 = 2. Итого default_hugepagesz=32M, hugepagesz=32M, hugepages=3.
9.2.1 Платформа X86
Проверьте Hugepagesize.
rk@debian:~$ cat /proc/meminfo | grep Huge
HugePages_Total: 2
HugePages_Free: 2
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
Hugetlb: 4096 kB
Измените размер на 1GB.
Измените cmdline: в /etc/default/grub добавьте default_hugepagesz=1G.
GRUB_CMDLINE_LINUX_DEFAULT="quiet default_hugepagesz=1G hugepagesz=1G hugepages=1"
GRUB_CMDLINE_LINUX=""
Сгенерируйте конфигурацию.
/usr/sbin/grub-mkconfig -o /boot/grub/grub.cfg
Перезапустите устройство: reboot или systemctl poweroff. Проверьте размер и количество: cat /proc/meminfo | grep Hugepagesize.
rk@debian:~$ cat /proc/meminfo | grep Huge
HugePages_Total: 1
HugePages_Free: 1
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 1048576 kB
Hugetlb: 1048576 kB
9.2.2 Платформа RK
Включение Hugepage в ядре:
+++ b/arch/arm64/configs/rockchip_linux_defconfig
@@ -1,5 +1,10 @@
CONFIG_DEFAULT_HOSTNAME="localhost"
CONFIG_SYSVIPC=y
+CONFIG_HUGETLBFS=y
CONFIG_NO_HZ=y
CONFIG_HIGH_RES_TIMERS=y
CONFIG_PREEMPT_VOLUNTARY=y
Для 16 страниц по 32M добавьте в cmdline три свойства: default_hugepagesz=32M hugepagesz=32M hugepages=16.
+++ b/arch/arm64/boot/dts/rockchip/rk3588-linux.dtsi
@@ -6,7 +6,7 @@
/ {
chosen: chosen {
- bootargs = "earlycon=uart8250,mmio32,0xfeb50000 console=ttyFIQ0 irqchip.gicv3_pseudo_nmi=0 clk_gate.always_on=1 pm_domains.always_on=1 root=PARTUUID=614e0000-0000 rw rootwait";
+ bootargs = "earlycon=uart8250,mmio32,0xfeb50000 console=ttyFIQ0 irqchip.gicv3_pseudo_nmi=0 clk_gate.always_on=1 pm_domains.always_on=1 root=PARTUUID=614e0000-0000 rw rootwait default_hugepagesz=32M hugepagesz=32M hugepages=16";
};
cspmu: cspmu@fd10c000 {
Пересоберите и запишите ядро. После запуска проверьте /proc/meminfo.
[root@RK3588:/userdata]# cat /proc/meminfo | grep Huge
HugePages_Total: 16
HugePages_Free: 16
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 32768 kB
Hugetlb: 1048576 kB
9.3 Ошибка ядра или Bus error при доступе к user cmd или ep info после получения области через API
Две основные причины:
-
Использование memset или memcpy для этой области памяти.
-
Уровень оптимизации приложения выше -O1. В первом случае удалите memset/memcpy и используйте цикл for.
Во втором случае снизьте оптимизацию или добавьте -fno-tree-loop-optimize для отключения оптимизации циклов.
9.4 Среда сборки драйвера Windows
Среда разработки и проверки оригинала: Windows 10 2004, WDK 10.0.19041.685.
- Подтвердите версию системы.
Откройте свойства компьютера или Win+R → winver. Обратите внимание на сборку 19042.1052, указанную в оригинале.
版本 Windows 10 专业版
版本号 20H2
安装⽇期 2021/6/5
操作系统内部版本 19042.1052
-
Установите VS2019 и WDK, используя инструкции по их установке.
-
Оригинал перечисляет три способа отключения проверки подписи драйверов:
- Дополнительные параметры загрузки после перезапуска (обычно F8): выбрать отключение обязательной проверки подписи, если такой пункт доступен.
- Командная строка администратора: bcdedit /set testsigning on. Оригинал называет это временным отключением.
- Локальная групповая политика для Windows Pro и выше: gpedit.msc → Конфигурация компьютера → Административные шаблоны → Система → Установка драйверов; проверить разрешение установки неподписанных драйверов.
После перезапуска надпись Test Mode в правом нижнем углу указана как признак отключения. Согласно оригиналу, иначе драйвер не устанавливается. Эти изменения защиты здесь не выполнялись; Test Mode и отключение проверки подписей не следует автоматически считать тождественными.
- Откройте build/windows/rk_projects/rk_projects.sln. Проект rc_pcie содержит драйвер. Из-за устаревания части API после Windows 10 2004 используются четыре конфигурации, описанные в оригинале:
- Debug_eq_win10_2004: Debug, системы выше Windows 10 2004.
- Debug_less_win10_2004: Debug, системы не выше Windows 10 2004.
- Release_eq_win10_2004: Release, системы выше Windows 10 2004.
- Release_less_win10_2004: Release, системы не выше Windows 10 2004.
examples — тестовый проект с Debug и Release. Результаты драйвера и тестов сохраняются в build/windows/rk_projects/x64.
9.5 Не найдены MSVCP140.dll и vcruntime140.dll
Установите Visual C++ Redistributable for Visual Studio 2015.
9.6 Настройка отладки Windows защищена Secure Boot и не может быть изменена или удалена
Оригинал предлагает в BIOS Windows 10 установить secure boot в disable. Это изменение защиты системы; здесь оно не выполнялось.
10. Справочник Chips Connect API
См. Rockchip_Developer_Guide_PCIE_EP_Standard_Card_APIs.
