Мы подготовили статью-гайд для пошаговой сборки и запуска базовой прошивки с CPSS на отладочной плате Marvell RD-AC3X-48G4X2XL-A. Эта плата предназначена для проектирования и отладки управляемых коммутаторов до 48 портов. Чем она примечательна для инженера-разработчика? У нее на борту установлен коммутатор Marvell Prestera DX 98DX3257 с мощной СнК семейства Prestera. А Ethernet-коммутаторы Prestera DX позволяют реализовать 5G при самой низкой в отрасли мощности и занимаемой площади. 

А что касается CPSS, то это базовый программный уровень для железа Marvell Prestera или другими словами Core Prestera Software Suite. CPSS используется проектом Open Compute Project как часть открытой операционной системы SONiC. Эта операционка расширяет функции центра обработки данных в сложных системах, например, в системах интеллектуального хранения данных и машинного обучения. А еще высокоуровневое API CPSS примечательно тем, что для его использования и подключения возможностей Marvell Packet Processor разработчикам не требуются глубокие знания регистров и таблиц чипсетов Prestera. 

CPSS находится в пространстве пользователя. В нем есть несколько функций, которые требуют поддержки конкретного ядра:

  • Прерывания: для пересылки прерываний Packet Processor в CPSS требуется специальный модуль ядра.

  • Пакет to-and-fro CPU: для передачи пакетов между интерфейсом PCIe в выделенную память SDMA требуется другой модуль ядра.

С помощью этого API можно полностью настраивать свитч на базе Prestera.

На нашей отладке уже есть u-boot, он загружается в nand-память устройства на стороне производителя. Для дальнейшей работы вам понадобится создать аккаунт на портале Marvell (для этого нужно подписать NDA).

Шаг 0: Создать рабочую директорию

mkdir ~/marvell && cd marvell

Ниже будут перечислены нужные компоненты для загрузки и распаковки в этой директории (~/marvell), относительно нее будут указаны все пути в этой статье. 

Итак, начинаем работу с раздела раздела Products на портале Marvell:

 

Шаг 1: Скачать toolchain (компилятор и пр.) для сборки ядра и cpss-приложения

1.1 Зайти на портал Marvell и выбрать в центре  сверху Products.

1.2 Далее в меню слева: Tools→Marvell GNU Tools→MGCC-5→201511.

1.3 Выбираем в окне справа Toolkit и скачиваем нужный тулчейн. На момент написания статьи это armv7 marvell linux gnueabihf hard 5.2.1 x86_64 20160301.tar.xz.

1.4 Распаковываем архив в рабочую директорию.

 

Шаг 2: Скачать сборочную систему Marvell с исходниками CPSS

2.1 В том же разделе Products на портале Marvell выбираем в меню слева Switching→Software →cpss→4.2.2020.3→Software.

2.2 Нажимаем в окне справа Base SDK и скачиваем CPSS 4.2.2020.3 release - GIT Source.

2.3 Распаковываем архив в рабочую директорию.

 

Шаг 3: Скачать инструкцию по сборке и использованию образа Linux Marvell и CPSS

3.1 Снова в разделе Products выбираем в меню слева Switching→Software →cpss→4.2.2020.3→Documents.

3.2 Нажимаем в окне справа User Guide и скачиваем PSDK PIPE 4.2.2020.3 Release – User Guide.

3.3 User Guide — набор html-страниц для браузера. Для просмотра распаковываем архив и открываем страницу в корне – PSDK_home.html.

 

Шаг 4: Клонировать ядро Linux-Marvell с Marvell Github и настроить его

4.1 git clone https://github.com/MarvellEmbeddedProcessors/linux-marvell.git

4.2 mv ./linux-marvell ./cpss_release_git_CPSS_4.2_2020_03_018/kernel 

Обратите внимание: ядро должно лежать рядом с исходниками cpss и называться kernel.

4.3 cd ./cpss_release_git_CPSS_4.2_2020_03_018/kernel

4.4 git checkout remotes/origin/linux-4.4.52-armada-17.10

4.5 export ARCH=arm && make mvebu_v7_lsp_defconfig

Далее включаем поддержку RAM-диска в ядре. Для этого есть два способа:

– через make menuconfig 

– прописать в файл .config: 

CONFIG_BLK_DEV_RAM=y

CONFIG_BLK_DEV_RAM_COUNT=2 (максимально возможное количество РАМ-дисков)

CONFIG_BLK_DEV_RAM_SIZE=524288 (максимальный размер RAM-диска в кб, который поддерживает ядро; 524288 – 512 мб)

 

Шаг 5: Настроить рабочее окружение

Процесс настройки изучаем в User Guide из Шага 3.

5.1 cd PSDK_PIPE_4.2.2020.3_UserGuide

5.2 Открываем PSDK_home.html.

5.3 CPSS User Guide слева.

5.4 Слева на экране: Building CPSS →  Building CPSS in Linux → Installing the Development Environment.

5.5 Tool Chain Installation пропускаем,  мы уже его установили. Обращаемся к Configuring the Development Environment. Там делаем все дальнейшие настройки.

 

Следующие шаги с 6 по 12 выполняем в директории ./cpss_release_git_CPSS_4.2_2020_03_018/cpss

 

Шаг 6: Собрать ядро и дерево устройств

6.1 git checkout cpss_4.2

6.2 make ARCH=arm CROSS_COMPILE=$(pwd)/../../armv7-marvell-linux-gnueabihf-hard-5.2.1_x86_64_20160301/bin/arm-marvell-linux-gnueabihf- TARGET=armv7 FAMILY=DX DEBUG_INFO=Y kernel

 

Шаг 7: Собрать CPSS

make ARCH=arm CROSS_COMPILE=$(pwd)/../../armv7-marvell-linux-gnueabihf-hard-5.2.1_x86_64_20160301/bin/arm-marvell-linux-gnueabihf- TARGET=armv7 FAMILY=DX DEBUG_INFO=Y appDemo

 

Шаг 8: Собрать модули ядра для работы CPSS

make ARCH=arm CROSS_COMPILE=$(pwd)/../../armv7-marvell-linux-gnueabihf-hard-5.2.1_x86_64_20160301/bin/arm-marvell-linux-gnueabihf- TARGET=armv7 FAMILY=DX DEBUG_INFO=Y modules

Marvell предоставляет 3 модуля ядра:

  • mvIntDrv.ko — для обработки прерываний от/для Packet Processor

  • mvDmaDrv.ko — для выделения памяти DMA, которая передает пакеты от/к CPU

  • mvMbusDrv.ko — для доступа к внутренним ресурсам при использовании внутреннего процессора Prestera 

Дальше соберем файловую систему. 

 

Шаг 9: Скачать busybox 1.21.1

mkdir busybox && wget -P busybox https://busybox.net/downloads/busybox-1.21.1.tar.bz2

 

Шаг 10: Исправить Makefile 

Откройте корневой Makefile в cpss_release_git_CPSS_4.2_2020_03_018/cpss

и замените строку: 

tools/build/rootfs/crfs.sh $(BUILD_FOLDER)/rootfs $(CROSS_COMPILE) /nfs/pt/swdev/areas/readonly/swtools/devsources/root_fs/files/busybox/busybox-1.22.1.tar.bz2; \

на:

tools/build/rootfs/crfs.sh $(BUILD_FOLDER)/rootfs $(CROSS_COMPILE) $(MY_DIR)/busybox/busybox-1.21.1.tar.bz2;  

Шаг 11: Собрать файловую систему 

Файловая система будет храниться не «жёстко» на устройстве, а на RAM-диске, который будет загружаться в оперативную память устройства. Это самый выгодный вариант хранения, т.к. используемый объем памяти не превышает 256 Мб. 

11.1 make ARCH=arm CROSS_COMPILE=$(pwd)/../../armv7-marvell-linux-gnueabihf-hard-5.2.1_x86_64_20160301/bin/arm-marvell-linux-gnueabihf- TARGET=armv7 FAMILY=DX DEBUG_INFO=Y rootfs

Мы уже собрали CPSS и модуль для работы с ним, выполняя шаги 7 и 8. Теперь копируем их в файловую систему:

11.2 cp compilation_root/cpss_4.2/armv7_DX/appDemo cpssEnabler/mainExtDrv/src/gtExtDrv/linuxNoKernelModule/drivers/mvDmaDrv.ko cpssEnabler/mainExtDrv/src/gtExtDrv/linuxNoKernelModule/drivers/mvIntDrv.ko cpssEnabler/mainExtDrv/src/gtExtDrv/linuxNoKernelModule/drivers/mvMbusDrv.ko compilation_root/cpss_4.2/armv7_DX/rootfs/home/user/

Компилируем образ файловой системы, который подходит для u-boot. Делаем это с помощью mke2fs и mkimage: 

11.3  cd compilation_root/cpss_4.2/armv7_DX && mke2fs -L '' -N 0 -O ^64bit -d rootfs -t ext2 rootfs.ext2 256M && gzip rootfs.ext2 && mkimage -A arm -O linux -T ramdisk -C gzip -n "Build Root File System" -d rootfs.ext2.gz rootfs.ext2.gz.uboot && cd -

Ядро, дерево устройств и RAM-диск файловой системы загрузятся на устройство по протоколу TFTP. Также их можно записать в NAND-память устройства после окончания цикла разработки и отладки. Мы же остановимся на варианте с TFTP. Для этого потребуется соединение хост-машины с девайсом (Ethernet-порт на задней части корпуса девайса) и TFTP-сервер на хосте.

 

Шаг 12: Установить и настроить TFTP-сервер

12.1 sudo apt install -y tftpd-hpa

12.2 sudo systemctl enable tftpd-hpa && sudo systemctl restart tftpd-hpa 

Копируем ядро, дерево устройств и RAM-диск файловой системы в директорию /var/lib/tftpboot. /var/lib/tftpboot — домашнюю для TFTP-сервера.

12.3 sudo cp ../kernel/arch/arm/boot/zImage ../kernel/arch/arm/boot/dts/armada-38x-interposer.dtb compilation_root/cpss_4.2/armv7_DX/rootfs.ext2.gz.uboot /var/lib/tftpboot/

 

Шаг 13: Настроить u-boot на устройстве

13.1 Подключаем Ethernet-кабель в порт MGMT на задней части устройства – это соединение для TFTP.

13.2 Подключаем кабель  RS232 (хост) – RJ-45 (девайс) в порт CONSOLE — это ваша консоль.

13.3 Запускаем minicom для соединения с консолью устройства. Настройки порта: 115200 8N1.

13.4 Включаем устройство. Мгновенно загрузчик выдаст сообщение: “Hit any key to stop autoboot:”. Нажмите любую клавишу, чтобы войти в меню настройки u-boot.

13.5 Последовательно выполняем  следующие команды в консоли u-boot:

  • setenv bootcmd "run bootcmd_ram ;"

  • setenv  bootcmd_ram "run tftp_ramdisk; setenv bootargs $console root=/dev/ram0 rw; tftp $loadaddr $image_name; tftp $fdtaddr $fdtfile; bootz $loadaddr ${ramdisk_addr}:${initrd_size} $fdtaddr ;"

  • setenv tftp_ramdisk "tftp $ramdisk_addr $ramdisk_name; setenv initrd_size ${filesize}"

  • setenv ramdisk_addr "0x05200000"

  • setenv ramdisk_name  "rootfs.ext2.gz.uboot"

  • setenv console "ttyS0,115200"

  • setenv  loadaddr "0x02000000"

  • setenv  image_name "zImage"

  • setenv  fdtaddr "0x1000000"

  • setenv  fdtfile "armada-38x-interposer.dtb"

  • saveenv

13.6 Загружаемся! :-)

  • boot

 

Шаг 14: Проверить работоспособность CPSS-приложения на устройстве 

Загружаем модули ядра:

14.1  cd /home/user && insmod mvDmaDrv.ko && insmod mvIntDrv.ko && insmod mvMbusDrv.ko

Запускаем CPSS-приложение:

14.2 ./appDemo 

Попадаем в консоль CPSS-приложения. В консоли можем настраивать Ethernet-порты свитча и всю систему Prestera. Для проверки работоспособность приложения соединим Ethernet-кабелем один из портов свитча на передней панели (любой) со свободным портом на хост-машине. После объединения их в сеть пропингуем хост выполнением следующих команд:

14.3: autoInitSystem — инициализация системы Prestera —  эта команда должна выполняться после каждой перезагрузки свитча.

14.4:  Далее последовательно выполним следующие команды:

  • configure

  • mac address 00:00:00:00:11:22

  • interface ethernet 0/35

  • ip address <IP в одной подсети с хостом> <маска этой подсети>

  • force link up

  • end

  • traffic

  • protocol enable arp

  • protocol enable ping

  • ping <IP хоста, который хотите пропинговать>

Если пинг прошел, увидим следующее:

Console(traffic)# ping 192.168.15.3
Pinging 192.168.15.3 using src mac: 00:00:00:00:11:22 src ip:192.168.15.10
Ping to ip 192.168.15.3 successful.

Поздравляем! Вы только что настроили Linux и CPSS на отладке Marvell RD-AC3X-48G4X2XL-A с Ethernet-коммутатором Prestera DX! Полное описание команд CPSS находится в User guide из Шага 3 в разделе Lua CLI User Guide.

На фото: промышленный Ethernet-коммутатор 1Gb/10Gbps на базе OS Linux, разработанный на том же семействе сетевых чипов, что и отладка (48 нисходящих портов + 4 восходящих, рабочий диапазон от −20 до +70°C)

Этот гайд полезен и в теории, и на практике. Вы можете оценить возможности коммутатора Marvell Prestera (L2, CAPWAP, CNC, DCE, PHY, EEE, IP, NAT и др.) вместе с Lua CLI. А можете разработать собственное высокоуровневое приложение на базе Marvell Prestera. 

Комментарии (3)


  1. aectaan
    30.09.2021 10:50
    +1

    Хороший гайд, спасибо. Попробую по нему PrimaBox восстановить.


  1. Pcholl
    11.10.2021 12:10
    +1

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


    1. Promwad Автор
      11.10.2021 12:13

      Спасибо! Добавили такую пометку при первом упоминании портала Marvell.