MCom03-Linux

Материал из WIKI ELVEES

Обратно на СКИФ

Добавить пакеты/модули ядра в AltLinux из Buildroot

В этом руководстве будет добавлен модуль ядра SCTP в AltLinux

Добавить модуль ядра в buildroot и собрать

В папке с распакованным архивом  mcom03-defconfig-src.tar.gz применить defconfig (make mcom03_defconfig FRAGMENTS=rockpi) и выполнить команду

 make linux-menuconfig

Далее по пути

 │     -> Networking support

 │ (1)   -> Networking options

Включить клавишей `M`:  <M> The SCTP Protocol  --->

M – в виде модуля ядра.


При необходимости можно воспользоваться поиском (клавиша `/`) и ввести sctp. Чтобы включить дополнительные параметры.


Далее Save и выйти из menuconfig `ESC ESC`


В терминале в директории mcom03-defconfig-src:

 make linux-rebuild && make


При необходимости протестировать полученный rootfs на плате (удостовериться, что модуль ядра загружен и работает)

Сборка AltLinux

Понадобится rootfs AltLinux и rootfs из собранного buildroot (с включенными SCTP)


В архиве[1] скрипт, который копирует нужные папки и ядро из buildroot в Altlinux (см README)

Полученный образ Alt можно прошить на uSD и загрузиться. Также рекомендуем прошить sbl.bin на QSPI из текущей сборки buildroot.

Проверка загрузки модуля ядра на AltLinux

[elvees@altgo1 ~]$ uname -a
Linux altgo1 4 . 19.106 #2 SMP Wed Apr 5 16:24:31 MSK 2023 aarch64 GNU/Linux 
[elvees@altgo1 ~]$ lsmod | grep sctp 
sctp                  397312  4

Вопросы по сборке AltLinux p10

Где взять исходники бинарных пакетов чтобы пересобрать их с GLIBC-2.32 ? Может быть у вас уже есть готовые варианты этих пакетов cобранных с GLIBC-2.32 ?

Предварительный образ AltLinux p10 по ссылке ниже. Список установленных пакетов см. в файлах packages-elvees.txt и packages-all.txt.

Для запуска образа AltLinux p10 с ядром 5.10 требуется обновлённый SBL (обновлён исходный код рецептов сборки sbl, ddrinit, tfa, u-boot). Коммиты пакетов перечислены в файле git-info.json. Исходные коды SBL в сборке Buildroot.

Ссылка на образы: https://box.elvees.com/index.php/s/9pgWwrtp9drTAmx

Прошу предоставить пакет бинарников mcom03-vpu-libs собранный с GLIBC 2.32.

В составе mcom03-altlinux-p10-rootfs-20230801.tar.gz установлен RPM-пакет mcom03-vpu-libs-202306.1.4e2132a-elv.alt1.aarch64. Данный пакет собран под glibc-2.32-alt5.aarch6.

В AltLinux p10 используется GLIBC 2.32, ваши бинарники собраны с GLIBC 2.34 - как они у вас заработали на ALTLinux p10 ?

У нас исходные коды драйверов, в AltLinux p10 мы компилируем бинарники с той версией GLIBC, которая установлена в AltLinux.

HOWTO: spidev в Buildroot для СКИФа

На примере исследовательской платы MCom03-BuB.

В файл linux-mcom03/arch/arm64/boot/dts/elvees/mcom03-bub-r1.3.0.dts (dts-файл может поменяться) добавить:

&spi0 {
   status = "okay";
   num-cs = <1>;
   cs-gpios = <&gpio0c 6 GPIO_ACTIVE_LOW>;
   spidev: spidev@0{
       status = "okay";
       compatible = "spidev";
       reg = <0>;
       #address-cells = <1>;
       #size-cells = <0>;
       spi-max-frequency = <500000>;
   };
};

В сборке Buildroot включить пакет для Python, чтобы можно было запустить тестовый скрипт - python-spidev.

После этого в /dev/ должно появиться устройство вида /dev/spidev2.0

Для тестирования можно воспользоваться либо встроенной утилитой spidev-test (возможно ее нужно включить при конфигурации), либо самописной утилитой test_spi.py (код программы см. ниже).

Для проверки SPI необходимо соединить MISO и MOSI одним проводом (режим loopback).

test_spi.py

import argparse

import spidev


def freq_test(spi):
   send = bytearray(b"hello world")
   good_result = "hello world"

   kHz = 1000
   MHz = 1000000

   speeds = [
       10 * kHz,
       30 * kHz,
       100 * kHz,
       300 * kHz,
       1 * MHz,
       3 * MHz,
       10 * MHz,
       30 * MHz,
       40 * MHz,
       50 * MHz,
   ]

   print("{:<15} {:<30}".format("Speed, Hz", "error_cnt"))

   for speed in speeds:
       i = 0
       error_cnt = 0

       while i < 10:
           ret = spi.xfer(send, speed, 0, 8)
           ret = "".join(chr(e) for e in ret)
           if ret != good_result:
               error_cnt += 1
           i += 1
       print("{:<15} {:<30}".format(speed, error_cnt))

def main():
   parser = argparse.ArgumentParser(
       description="Script for SPI loopback test on different speeds. "
       "Required to connect MISO and MOSI by one wire. "
       )

   parser.add_argument(
       "-p",
       "--port",
       default="/dev/spidev2.0",
       help="Spidev device (/dev/spidevX.Y)",
   )

   args = parser.parse_args()

   spi_bus = int(args.port.replace("/dev/spidev", '')[0])
   spi_device = int(args.port.replace("/dev/spidev", '')[-1])

   spi = spidev.SpiDev()
   spi.open(spi_bus, spi_device)
   freq_test(spi)


if __name__ == '__main__':

   main()

Результаты работы скрипта примерно следующие:

  1. python spi_test.py -p /dev/spidev2.0

Speed, Hz       error_cnt

10000           0 30000           0 100000          0 300000          0 1000000         0 3000000         0 10000000        0 30000000        0 40000000        0 50000000        10

Ссылки