Включение SPI • Драйвер spidev
- СКИФ
- 1892ВМ14Я
Руководство иллюстрирует использование порта SPI0 микросхемы СКИФ с драйвером spidev. Пример применим только к отладочному модулю ELV-SMARC-CB r2.10.3 с установленным ELV-MC03-SMARC r1.1.
Руководство иллюстрирует использование порта SPI1 микросхемы 1892ВМ14Я с драйвером spidev. Пример применим только к отладочному модулю Салют-ЭЛ24ОМ1 с установленным Салют-ЭЛ24ПМ2.
Для конфигурации DTS для других модулей необходимо руководствоватся схемой электрической на выбранный модуль и учитывать схему подключения п роцессора к периферийным устройствам.
Добавить в файл DTS описание spidev
- СКИФ
- 1892ВМ14Я
На разъем XP6 отладочного модуля выведены два CS (CS0 и CS1) а также сигналы CLK, MOSI, MISO.
- CS0 - Используется для общения с микросхемой w25q128jw.
- CS1 - Свободен.
-
Скачать необходимую версию buildroot с сайта.
-
Распаковать и перейти в папку mcom03-defconfig-src.
-
Распаковать архив
./buildroot/dl/linux/linux-mcom03-5.10.y-br1.tar.gz
в произвольную папку. Далее по тексту эта папка обозначенаCUSTOM_LINUX_PATH
. -
В файле
CUSTOM_LINUX_PATH/linux-headers-mcom03-5.10.y/arch/arm64/boot/dts/elvees/mcom03-elvmc03smarc-r1.0-elvsmarccb-r2.10.dts
, в блок&spi0{ ... }
добавить:spidev: spidev@1{
status = "okay";
compatible = "spidev";
reg = <1>;
#address-cells = <1>;
#size-cells = <0>;
spi-max-frequency = <500000>;
}; -
Сохранить изменения.
-
Создать файл
./buildroot/local.mk
. -
Прописать в него
LINUX_OVERRIDE_SRCDIR = <CUSTOM_LINUX_PATH>/linux-headers-mcom03-5.10.y
. -
Применить defconfig
./docker-build.sh make mcom03_defconfig
-
Войти в menuconfig
./docker-build.sh make menuconfig
-
Добавить spidev_test: Target packages → Debugging, profiling and benchmark → [*] spidev_test.
-
Сохранить конфигурацию и выйти.
-
Запустить сборку
./docker-build.sh make
Либо пересобрать только ядро
./docker-build.sh 'linux-rebuild && make'
-
Записать полученный образ
buildroot/output/images/rootfs.tar.gz
на uSD. -
Запустить модуль и проверить наличие файла вида /dev/spidevX.Y
На разъем XP5 отладочного модуля выведены два CS (CS0 и CS1) а также сигналы CLK, MOSI, MISO.
-
Скачать последнюю версию buildroot с сайта.
-
Распаковать архив и перейти в папку mcom02-buildroot-v3.1.4-111-*.
-
В файле
./u-boot/arch/arm/dts/mcom02-salute-el24om1-r1.1-1.2.dtsi
, после блока&spi0{ ... }
добавить:&spi1 {
num-cs = <2>;
cs-gpios = <&gpioa 25 0>,<&gpioa 26 0>; //nCS0 GPIO -> SPI
status = "okay";
spidev: spidev@0{
compatible = "spidev";
reg = <0>;
#address-cells = <1>;
#size-cells = <0>;
spi-max-frequency = <6000000>;
status = "okay";
};
}; -
Дописать
spi1 = &spi1
в блок aliases:aliases {
spi0 = &spi0;
spi1 = &spi1;
}; -
Сохранить изменения в файле.
-
Собрать загрузчик U-Boot командой:
make toolchain && make -f Makefile.u-boot salutepm2
-
Полученный файл uboot-images/mcom02-salute-el24pm2-r1.0-1.1-om1-r1.2-uboot.img прошить в SPI-Flash.
-
Необходимо вызвать конфигуратор ядра Linux
make linux-menuconfig
-
Выбрать пункт (клавиша
M
)Device Drivers → SPI support → User mode SPI device driver support (перемещение по меню — стрелки, перейти в пункт — пробел).
-
Выйти из menuconfig, согласиться с сохранением конфига.
-
Войти в конфигуратор buildroot
make menuconfig
. -
Включить тесты
Target packages → Debugging, profiling and benchmark → [*] spidev_test.
-
(Опционально) Включить Python-модуль:
Target packages → Interpreter languages and scripting → External python modules → [*] python-spidev
-
Сохранить и выйти.
-
Запустить сборку Linux:
make
Либо пересобрать ядро и pythonmake linux-rebuild && \
make python-rebuild && \
make -
Полученный образ
buildroot/output/images/mcom02-buildroot-sdcard.img
записать на SD-карту.ls -la /dev/sd*
dd if=buildroot/output/images/mcom02-buildroot-sdcard.img of=/dev/sdX bs=4M; sync -
Запустить модуль и проверить наличие файла вида /dev/spidevX.Y
Тестирование интерфейса
spidev_test
-
Соединить контакты MISO и MOSI.
- СКИФ
- 1892ВМ14Я
-
Запуск приложения:
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 -
Для проверки работоспособности создайте файл test.bin и внести в него любые данные:
echo "1234-hello-from-spi-000123" > test.bin
-
Запуск теста:
spidev_test -D /dev/spidevX.Y -i test.bin -o result.bin
-
Должен появиться файл result.bin содержимое которого идентично test.bin.
cat result.bin
1234-hello-from-spi-000123
Python-пример
-
На плате создать текстовый файл spi-test.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() -
Запуск примера:
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