Перейти к основному содержимому

Включение SPI • Драйвер spidev

Руководство иллюстрирует использование порта SPI0 микросхем СКИФ или К1892ВМ21Я с драйвером spidev. Пример применим к отладочным комплектам:

  • ELV-SMARC-CB r2.10.3 с установленным ELV-MC03-SMARC r1.1.
  • ELV-SMARC-CB r3.3.0 с установленным ELV-MC03-SMARC r3.0.

Для конфигурации DTS для других модулей необходимо руководствоватся схемой электрической на выбранный модуль и учитывать схему подключения процессора к периферийным устройствам.

Добавить в файл DTS описание spidev

На разъем XP14 отладочного модуля выведены два CS (CS0 и CS1), а также сигналы CLK, MOSI, MISO.

  • CS0 - Используется для общения с микросхемой NOR-флеш W25Q128JW.
  • CS1 - Свободен.
  1. Скачать необходимую версию Buildroot с сайта (достаточно архива *defconfig-src.tar.gz).

  2. Распаковать и перейти в папку mcom03r-defconfig-src.

  3. Распаковать архив ./buildroot/dl/linux/linux-mcom03-6.6.y-br1.tar.gz в произвольную папку. Далее по тексту путь к папке обозначен CUSTOM_LINUX_PATH.

  4. В файле CUSTOM_LINUX_PATH/linux-headers-mcom03-6.6.y/arch/arm64/boot/dts/elvees/mcom03r-elvmc03smarc-r3.0.0-elvsmarccb-r3.3.0.dts, в блок &spi0{ ... } добавить:

    spidev: spidev@1{
    status = "okay";
    compatible = "rohm,dh2228fv";
    reg = <1>;
    #address-cells = <1>;
    #size-cells = <0>;
    spi-max-frequency = <500000>;
    };

    Эти строки добавляют поддержку драйвера spidev для указанного SPI контроллера.

  5. Сохранить изменения.

  6. Создать файл ./buildroot/local.mk.

  7. Прописать в него путь к исходникам ядра LINUX_OVERRIDE_SRCDIR = <CUSTOM_LINUX_PATH>/linux-headers-mcom03-6.6.y.

    warning

    путь CUSTOM_LINUX_PATH - должен быть абсолютным без пробелов.

    Подробнее

  8. Применить defconfig ./docker-build.sh make mcom03r_defconfig

  9. Войти в menuconfig ./docker-build.sh make menuconfig

  10. Добавить spidev_test: Target packages → Debugging, profiling and benchmark → [*] spidev_test.

  11. Сохранить конфигурацию и выйти.

  12. Запустить сборку

    ./docker-build.sh make

    Либо пересобрать только ядро

    ./docker-build.sh 'make linux-rebuild && make'
  13. Записать полученный образ buildroot/output/images/rootfs.tar.gz на uSD.

  14. Запустить модуль и проверить наличие файла вида /dev/spidevX.Y

Опционально можно включить Python-модуль:

  1. ./docker-build.sh make menuconfig

  2. Target packages → Interpreter languages and scripting → External python modules → [*] python-spidev

  3. Пересобрать python:

    ./docker-build.sh 'make python-rebuild && make'

Тестирование интерфейса

spidev_test

  1. Соединить контакты MISO и MOSI.

    Распиновка разъема GPIO HEADER на отладочной плате
  2. Запуск приложения:

    spidev_test -D /dev/spidevX.Y
    Вывод команды
    spi mode: 0x0
    bits per word: 8
    max speed: 500000 Hz (500 KHz)
    RX | FF FF FF FF FF FF 40 00 00 00 00 95 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
    F0 0D
  3. Для проверки работоспособности создайте файл test.bin и внести в него любые данные:

    echo "1234-hello-from-spi-000123" > test.bin
  4. Запуск теста:

    spidev_test -D /dev/spidevX.Y -i test.bin -o result.bin
  5. Должен появиться файл result.bin содержимое которого идентично test.bin.

    cat result.bin
    1234-hello-from-spi-000123

Python-пример

  1. На плате создать текстовый файл spi-test.py.

  2. Скопировать в него код:

    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()
  3. Запуск примера:

    python spi-test.py -p /dev/spidevX.Y
    Результат теста
    Speed, Hz       error_cnt
    10000 0
    30000 0
    100000 0
    300000 0
    1000000 0
    3000000 0
    10000000 0
    30000000 0
    40000000 0
    50000000 0

Образ файловой системы с spidev

По ссылке доступны образы файловой системы (rootfs.tar.gz) для прошивки на uSD для следующих отладочных комплектов:

  • ELV-SMARC-CB r2.10.3 с установленным ELV-MC03-SMARC r1.1.
  • ELV-SMARC-CB r3.3.0 с установленным ELV-MC03-SMARC r3.0.
  • Салют-ЭЛ24ОМ1 с установленным Салют-ЭЛ24ПМ2

https://nc2.elvees.com/index.php/s/6WwCp6XRWGa4CQD