Мы подготовили статью-гайд для пошаговой сборки и запуска базовой прошивки с 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.