Mister Christmas WL-2CS Контроллер mister
История бренда Christmas Light. Christmas Light — это бренд уникальной коллекции осветительного оборудования для создания праздничной атмосферы, входящий в созвездие новогодних брендов Mister Christmas.
Бизнес-программа по продаже продукции для Нового года. Бизнес-программа по продаже сувенирной и подарочной
На данной странице вы сможете найти подарки, сувениры,промосувениры на которые можно нанести логотип вашей компании.
Mr. Christmas Carousel alt=»Новогодний свет» width=»560″ height=»315″ /> alt=»Раздел «Гирлянды, дожди, мишура»: подарки и сувениры с логотипом» width=»560″ height=»315″ />
Zynq 7000. Прикручиваем Wi-Fi модуль RTL8822CS с использованием SDIO через EMIO
Наконец-то пришла пора продолжить изучение возможностей платы Zynq QMTech и SoC XC7Z020. Следующая интересная задача, которую я для себя придумал в качестве обучающей — оснастить плату Wi-Fi модулем Realtek RTL8822CS и, если Wi-Fi модуль будет не нужен, а нужна будет ещё одна флешка — вторым портом для SD-карточки. Если интересны подробности того, как я это всё реализовал — добро пожаловать под кат.
Важно! Перед началом повествования, хотелось бы заранее оговориться, что основная цель, которую я преследую при написании этой статьи — рассказать о своем опыте, с чего можно начать, при изучении отладочных плат на базе Zynq. Я не являюсь профессиональным разработчиком под ПЛИС и SoC Zynq, не являюсь системным программистом под Linux и могу допускать какие-либо ошибки в использовании терминологии, использовать не самые оптимальные пути решения задач, etc. Но отмечу, что любая конструктивная и аргументированная критика только приветствуется. Что ж, поехали…
Сформулируем цель и задачи
Итак, у нас есть плата, описанная в этой статье и есть желание прикрутить к ней Wi-Fi модуль Realtek RTL8822CS. Модуль, разумеется, должен корректно инициализироваться в ОС Linux и обеспечить пропускную способность до 150 Мбит\с (с чем связано такое ограничение и именно этой цифрой — ниже). В качестве альтернативного варианта для использования выведенного SDIO — необходимо организовать второй порт для подключения SD-карт.
Исходя из этого можно сформировать несколько задач, решив которые мы можем достигнуть цели:
Проверить возможность выноса линий SDIO через EMIO (т.е. через пины PL-части Zynq) и подготовить bitstream-файл;
Проверить работоспособность SDIO через EMIO в приложении baremetal с использованием microSD-карточки;
Изготовить мезонинные платы для Wi-Fi модуля и смонтировать на них компоненты;
Подготовить First Stage Bootloader, Device Tree Source, U-Boot, Linux Kernel в нужной конфигурации для запуска Wi-Fi модуля;
Подготовить модуль ядра для работы Wi-Fi модуля, а именно модуль cfg80211, который является линуксовым API для 802.11 устройств;
Подготовить модуль ядра 88x2cs, который является драйвером для модуля Wi-Fi RTL8822CS который работает поверх SDIO-шины;
Проверить работоспособность сети, сделать сканы эфира, посмотреть рабочие уровни, сделать замеры скорости downstream/upstream-трафиком через iPerf;
Итак. Перейдем к реализации намеченного, в целом, не выглядит сильно сложно =)
Настройка проекта в Vivado и конфигурация PL
В этой главе я кратко (без скриншотов) опишу процедуру создания нового проекта с акцентами на важных моментах. Если необходима инструкция с картинками — можно обратиться к моим предыдущим статьям.
Открываем Vivado и создаем проект через кнопку Create Project. Откроется мастер настройки нового проекта, быстро пройдемся по шагам.
Даём имя проекту, например SDIO_EMIO и указываем папку сохранения;
Указываем, что это RTL Project, оставляем включенной галочку Do not specify sources at this time;
Находим модель SoC использованного на плате. В моем случае это xc7z020clg400-1;
В левом меню IP Integrator нажимаем Create Block Design и создаем новый дизайн. Назовём его для простоты block_design.
Добавляем примитив процессорной системы Zynq на диаграмму через нажатие правой кнопкой Add IP — ZYNQ7 Processing System. Сразу же выполним предложенные действия от автоматизатора, через команду на зеленом поле Run Block Automation и откроем настройки процессорной системы.
Я заранее сохранил шаблон настроек PS, чтобы в каждом проекте не прописывать всё заново. Взять его можно тут: ссылка на Github. Через меню Presets — Apply Configuration применяем его и сразу переходим в меню Peripherial I/O Pins.
Ставим галочку возле меню SD 1 и проверяем, что выбран вариант подключения через EMIO:
Остальные настройки я оставил без изменений, в т.ч. частоты тактирования SDIO, PL. Получаем следующую картину (если развернуть группу сигнальных линий SDIO_1):
В данном случае нас интересуют линии CLK, CMD и 4 линии DATA, что в общем-то является стандартным набором для SDIO-шины. Но вот незадача, каждая из линий организована тремя отдельными сигналами. Для решения этой задачи нам необходимо руками создать буфер IOBUF, который будет управляться через активный пин T с тремя состояниями и разрулит Input, Output сигналы как нам нужно для использования его с двунаправленным сигналом I/O. Выглядит он следующим образом:
Т.к. в стандартной библиотеке графических примитивов он отсутствует — нужно будет создать свой IP-модуль и добавить его на схему. Для каждого из сигнала он будет свой.
Через меню Sources — Add Sources (Alt + A) добавляем Design Source — Create File, выбираем тип файла Verilog и назовём его iobuf_cmd.
Запишем следующее содержимое:
То же самое сделаем для сигнала CLK, только файл назовём iobuf_clk. Запишем в него следующее содержание:
С SDIO DATA немного сложнее т.к. она состоит из нескольких линий. Так же создадим файл iobuf_data и запишем в него следующее содержимое:
Для каждой из линии создается свой экземпляр примитива IOBUF.
Поочередно размещаем добавленные модули на диаграмму через клик правой мышкой по Diagram — Add Module. Соединяем сигналы с нужными портами и получится следующее:
Хотелось бы обратить внимание на две важные вещи:
На порт iobuf_t модуля для сигнала CLK я добавил Constant с шириной в 1 бит и со значением 0, т.к. управляющего T-пина для CLK не предусмотрено;
Сделал порты iobuf_io как External и дал им соответствующие названия;
Соединил порты Input с портами Output;
На текущем этапе можно запустить синтез и назначить выходы портов на реальные физические порты. Для этого нужно:
Нажимаем на меню block_design правой кнопкой и выбираем команду Create HDL Wrapper.
В меню IP Integrator выбираем Generate Block Design;
Выбираем Synthesis Option — Global и нажимаем Apply, затем Generate.
Дожидаемся окончания генерации;
Выбираем Run Synthesis для старта синтеза нашего дизайна.
Дожидаемся окончания синтеза;
После окончания синтеза переходим в меню Open Synthesized Design и откроется меню Package с нижним меню I/O Ports. Далее необходимо:
Отметить подходящие физические I/O пины
Убедиться, что включена подтяжка PULLUP на всех пинах кроме CLK;
В моем случае получается следующее:
Сохраняем настройки, будет предложено создать файл с constraints. Называем его как удобно и нажимаем Ok. После нажимаем Generate bitstream, соглашаемся с тем, что синтез устарел и ждем окончания всех необходимых процедур до получения сообщения:
После этого можем экспортировать BSP в SDK и запустить проверку работоспособности SDIO в baremetal. Делается это через меню File — Export — Export Hardware, ставим Include bitstream. Нажимаем Ok и запускаем SDK через команду File — Launch SDK.
Проверка SDIO через microSD-карту в Baremetal
Прежде чем приступить к проверке необходимо подключить microSD-карту к пинам, которые мы размечали в следующем разделе. Смотрим в первую очередь на распиновку microSD-карты:
С пинами VDD (3.3V) и VSS (GND) всё в целом понятно. С другими пинами есть нюанс, для пина CMD и шины DATA требуется подтяжка к высокому уровню через 10 кОм резисторы. В моем случае, чтобы не городить навесным монтажом резисторы, я взял одну из плат, заготовленных для Wi-Fi модуля и запаял на него все что нужно:
Если посмотреть на принципиальную схему этой платы — все выглядит вот таким образом:
Питание подключено напрямую в соответствии с тем, как оно выведено на гребенку. Для удобства отладки логическим анализатором — я подпаивал МГТФ-проводки.
После того, как все необходимые линии подключены — можно вернуться в SDK к созданию проекта. После запуска SDK обзываем проект SDIO_EMIO и нажимаем Next, выбираем шаблон проекта Hello World.
Открываем файл helloworld.c из древа проекта и пишем в него следующий код, который подключит нужные библиотеки и поможет нам быстро сделать проверку:
Кликаем правой кнопкой по проекту SDIO_EMIO и выбираем Build Project. Смотрим, что проект собирается без проблем. Важный момент — выбрать правильный SDIO-контроллер в строке SdConfig = XSdPs_LookupConfig(XPAR_XSDPS_1_DEVICE_ID);
Подключаем JTAG-отладчик и после сборки проекта заливаем bitstream-файл выполнив команду Xilinx — Program FPGA и дожидаемся сигнала FPGA DONE на плате.
Открываем Serial Port, который принадлежит нашей плате. Например: minicom -D /dev/ttyUSB0. Узнать какой порт принадлежит плате можно запустив команду udevadm monitor | grep ttyUSB и выткнуть-воткнуть miniUSB кабель из платы. Там можно увидеть сообщения по которым можно понять какой у нас порт. Например:
После запускаем проект также кликнув по корневому значку проекта выбрав меню Run As — Launch on hardware (System Debugger). В выводе в консоль мы должны увидеть следующее:
Что означают эти сообщения? Это значит, что драйвер успешно “достучался” до карточки и может спокойно начать с ней обмен. Значит наш SDIO-контроллер работает. Идём дальше.
Трассировка и изготовление мезонинных плат для Wi-Fi модуля
Следующим шагом нужно подготовить платы, на которые я запаяю радиомодуль, со всей необходимой обвязкой. В качестве первого радиомодуля был взят модуль от FN-Link с Realtek RTL8822CS чипом, модель модуля 6222B-SRC. Подробнее можно посмотреть тут, ссылка на Datasheet.
Кратко скажу, что это простой MIMO 2×2 Dual Band модуль Wi-Fi с поддержкой 802.11ac и Bluetooth 4.2 или 5.0 в зависимости от модели.
Так как модуль мы будем подключать к гребенке PLS на плате с шагом в 2.54мм. — было решено сделать такой же разъем и на мезонинной плате.
Распиновка со стороны платы:
Распиновка со стороны модуля:
Решено было вывести в т.ч. и Bluetooth для дальнейших экспериментов. В итоге общая обвязка модуля выглядит следующим образом:
Всё в целом достаточно примитивно и в соответствии с референсной схемой и небольшими изменениями, такими как пин включения\выключения питания модуля и прочих мелких доработок. Антенный тракт было решено вывести на u.FL-разъем, для удобства и возможности подключения любых подходящих для 2.4/5ГГц антенн.
Получившиеся платы достаточно просты в трассировке и не представляют собой никакого технического ноу-хау, но линии данных нужно выровнять т.к. SDIO-шина тут достаточно скоростная, чтобы пренебречь таким важным аспектом трассировки.
Результат трассировки в 2D:
Результат трассировки в 3D:
Вид платы после монтажа компонентов:
Т.к. плата изначально разрабатывалась не только для этой версии Wi-Fi модуля — остались не установленными некоторые компоненты.
В целом можно переходить к подготовке всего необходимого для работы с радиомодулем с точки зрения основных управляющих сигналов и подготовки необходимых файлов для работы радиомодуля в Linux. Об этом в следующих главах.
Небольшое дополнение проекта в Vivado
Для того, чтобы была возможность запустить радиомодуль необходимо соблюсти два условия:
Подать низкое напряжение на затвор P-канального ключа VT1, т.е. на линию WL_BT_ON, чтобы подать питание на радиомодуль;
Подать высокое напряжение на ножку WL_REG_ON радиомодуля, чтобы запустить его;
Поэтому на этом этапе нам будет нужно слегка модернизировать проект и добавить 2 сигнала с AXI GPIO-контроллера и завести их на соответствующие ножки:
Для транзисторного ключа это ножка 11 на общей гребенке, что соответствует физическому пину W20;
Для сигнала WL_REG_ON это 25-я ножка на той же гребенке, что соответствует в моем случае пину V17;
Как работать с AXI GPIO Я рассказывал в этой статье и на деталях повторяться не буду. В нашем случае нужно выполнить лишь несколько шагов:
Добавляем в дизайн IP-модуль AXI GPIO;
Выполняем предложенные шаги автоматизации предложенные Vivado, отметив все галочки;
Появится блок AXI GPIO, необходимо зайти в его опции и поставить галочку All Outputs, поставить ширину шины GPIO Width в значение 2 (нужно 2 сигнала) и в Default Output вписать 0x00000002, чтобы по умолчанию после загрузки bitstream-файла оба пина приняли необходимое значение;
Называем External Interface от AXI GPIO как MGMT_GPIO и сохраняемся. Должно получиться следующее:
Синтезируем дизайн, проверяем, что всё прошло успешно;
Переходим в меню Open Synthesized Design и назначаем MGMT_GPIO[0] пин W20, а MGMT_GPIO[1] пин V17;
Изменяем у этих двух пинов I/O Std на LVCMOS3.3 и сохраняем;
Запускаем генерацию bitstream-файла через Generate bitstream;
Экспортируем сгенерированный bitstream и всё что необходимо для дальнейших шагов через команду File — Export — Export Hardware;
Все изменения, необходимые на этом этапе мы внесли. Переходим к подготовке всего необходимого для работы с радиомодулем в Linux;
Подготовка FSBL, Device Tree Sources, U-Boot
На этом этапе можно переходить к созданию загрузчиков, файлу описания железа и компиляции ядра Linux. Многие моменты и детали Я целенаправленно опущу т.к. уже рассказывал в предыдущей статье а отличающимся моментам посвящу основную часть повествования.
Первым этапом надо подготовить FSBL. Для этого нужно:
В меню Xilinx SDK переходим в меню File — New — Application Project;
Именуем его как FSBL;
Нажимаем клавишу Next;
Из заготовок выбираем Zynq FSBL;
Дожидаемся окончания компиляции и проверяем, что появился файл FSBL.elf
Вторым этапом необходимо подготовить Device Tree Source/Blob файл который будет использован для сборки U-Boot. Для этого сделаем следующее:
Добавляем BSP Repository из репозитория device-tree-xlnx. Для этого нужно выбрать меню Xilinx — Repositories и указать папку с device-tree-xlnx в секцию Global Repositories.
Добавляем BSP Project через меню File — New — Board Support Package, даём ему имя и выбираем внизу меню device_tree и в следующем меню нажимаем Ok, если не требуется внесения каких-либо изменений.
Выполним редактирование файла zynq-7000.dtsi и находим секцию описывающую SDIO1 в строке sdhci1: mmc@e0101000;
Дополняем секцию следующим содержанием (файл можно взять тут) :
Переходим в папку с сгенерированными dts-файлами в системной консоли:
Компилируем в blob:
Всё. Device Tree готов.
Следующим этапом необходимо подготовить U-Boot для нашей платы. Нужно выполнить несколько простых шагов:
Перейти в папку с U-Boot: cd u-boot-xlnx
Задать переменные для кросс-компиляции: export CROSS_COMPILE=arm-linux-gnueabihf-; export ARCH=arm
Очистить сырцы от предыдущих результатов компиляции и применить конфиг для Zynq по умолчанию: make distclean; make xilinx_zynq_virt_defconfig
Положить в папку с U-Boot полученный в предыдущем шаге system.dtb в папку arch/arm/dts/ c именем zynq-qmtech.dtb
Указываем какой Device Tree файл использовать: export DEVICE_TREE=»zynq-qmtech»
Далее необходимо зайти в меню конфигуратора и изменить ряд опций: make menuconfig
Опция для того, чтобы активировать поддержку AXI GPIO, которая используется для включения питания модуля и подачи сигнала WL_REG_ON на радиомодуле: Device Drivers — GPIO Support — Xilinx GPIO Driver
Сохраняем конфиг (можно взять тут) в файл .config
Запускаем сборку: make -j$(nproc) и дожидаемся окончания компиляции;
После этого можно скомпоновать FSBL, Bitstream-файл и U-Boot в один загрузочный файл BOOT.BIN. Подробное описание компоновки можно найти в моей прошлой статье. В целом надо выполнить несколько простых шагов:
Найти файл в каталоге с проектом First stage bootloader. По умолчанию он находится в SDIO_EMIO/SDIO_EMIO.sdk/FSBL/Debug/FSBL.elf
Найти Bitstream-файл для программируемой логики. Найти его можно в каталоге SDIO_EMIO/SDIO_EMIO.sdk/block_design_wrapper_hw_platform_0/block_design_wrapper.bit
Найти бинарный файл U-Boot. Данный файл после компиляции лежит в папке с U-Boot: u-boot-xlnx/u-boot.elf
Открываем в Xilinx SDK пункт меню Xilinx — Create Boot Image;
Выбираем куда сохранить новый bif-файл, я его сохраняю в корневом каталоге проекта;
Добавляем поочередно файлы FSBL.elf, block_design_wrapper.bit, u-boot.elf в секцию Boot Image Partitions;
Нажимаем Create Image и видим как в каталоге с bif-файлом появляется BOOT.BIN;
Теперь необходимо залить этот файл на загрузочную SD-карту и можно попробовать загрузиться. Если мы видим приглашение от U-Boot и что светится светодиод FPGA DONE — значит мы всё выполнили правильно.
Можно перейти к проверке того, проинициализирован ли AXI GPIO в U-Boot и проверим их. Для этого сначала выведем список устройств которые проинициализированы. Это можно сделать через команду dm tree.
Отлично. Видно, что у нас на борту есть два SDIO-контроллера, и два GPIO-контроллера. Попробуем изменить состояние ножки транзистора. Для этого нужно:
Посмотреть какие адреса в GPIO доступны и какие отвечают за те, или иные ножки: gpio status -a
В конце вывода видно, что есть Bank GPIO с двумя ножками, которые соответствуют значению по умолчанию:
Проверки ради можно изменить состояние ножки gpio@412000000 через команду: gpio toogle gpio@412000000 или gpio set gpio@412000000 / gpio clear gpio@412000000 для установки логической 1 или 0 соответственно
Так. Загрузчик подготовлен. Теперь можно переходить к подготовке ядра Linux и RootFS со всем необходимым для нас содержимым
Компиляция ядра Linux и подготовка RootFS с использованием Buildroot
Так же как и прошлых главах, для исключения необходимости подробного объяснения каждого шага, сошлюсь на предыдущую статью как скомпилировать ядро Linux. Перейдем к выполнению шагов, необходимых для сборки ядра с необходимыми модулями и драйверами. Для этого нужно:
Перейти в папку с клонированным репозиторием linux-xlnx;
Обновить его (при необходимости): cd linux-xlnx; git fetch -p; git checkout master; git pull;
Экспортируем также переменные для кросс-компиляции: export CROSS_COMPILE=arm-linux-gnueabihf-; export ARCH=arm
Делаем очистку от результатов предыдущих сборок: make distclean
Загружаем дефолтный конфиг: make ARCH=arm xilinx_zynq_defconfig;
Изменим дефолтный конфиг загрузив меню конфигурации: make ARCH=arm menuconfig
Изменим опции конфигурации (можно взять тут) , устанавливаем опцию (проследим, что там вместо [M] в поле выбора стоит символ звездочки [*] : Networking Support — Wireless — cfg80211
Сохраняем конфиг в файл .config и выходим из меню конфигурации;
Запускаем процесс компиляции: make ARCH=arm UIMAGE_LOADADDR=0x8000 uImage -j8
Компилируем модули ядра: make ARCH=arm -j8 modules
Копируем uImage из каталога linux-xlnx/arch/arm/boot/ на загрузочную SD-карту;
Далее необходимо подготовить образ RootFS с всеми необходимым userspace-утилитами, типа wpa_supplicant, wpa_cli, etc. Собирать RootFS будем с помощью системы сборки buildroot, статью о которой я писал до этого. Итак, перейдем к сборке, для этого нужно:
Заходим в папку с buildroot: cd buildroot
Обновляем его до последней версии: git fetch -p; git checkout master; git pull;
Делаем очистку от результатов предыдущих сборок: make distclean
Запускаем меню конфигурации: make -C /home/megalloid/buildroot O=$PWD ARCH=arm nconfig
Изменяем опции конфигурации по списку ниже;
Опция 1: Target options — Target Architecture — ARM (little endian)
Опция 2: Target options — Target Architecture Variant — cortex-A9
Опция 3: Target options — Enable NEON SIMD extension support — [*]
Опция 4: Target options — Enable VFP extension support — [*]
Опция 5: Target options — Target ABI — EABIhf
Опция 6: Target options — Floating point strategy — NEON
Опция 7: Build options — Number of jobs to run simultaneously — 8 (по количеству ядер CPU)
Опция 8: Toolchain — C library — glibc
Опция 9: Toolchain — Kernel headers — Custom Git Repository
Опция 10: Toolchain — URL of custom repository — </home/megalloid/linux-xlnx>
Опция 11: Toolchain — Custom repository version — <хэш-сумма от git show-ref | grep master из папки linux-xlnx>
Опция 12: Toolchain — Custom kernel headers series — 5.15.x
Опция 13: Toolchain — Install glibc utilities — [*]
Опция 14: Toolchain — GCC compiler Version — gcc 9.x
Опция 15: Toolchain — Enable C++ support — [*]
Опция 16: Toolchain — Enable compiler link-time-optimization support — [*]
Опция 17: Toolchain — Enable compiler OpenMP support — [*]
Опция 18: Target packages — Miscellaneous — haveged
Опция 19: Target packages — Networking applications — dhcpd
Опция 20: Target packages — Networking applications — dropbear
Опция 21: Target packages — Networking applications — ifupdown scripts
Опция 22: Target packages — Networking applications — hostapd
Опция 23: Target packages — Networking applications — iperf
Опция 24: Target packages — Networking applications — iperf3
Опция 25: Target packages — Networking applications — fping
Опция 26: Target packages — Networking applications — iw
Опция 27: Target packages — Networking applications — iwd
Опция 28: Target packages — Networking applications — wpa_supplicant
Опция 28: Target packages — Networking applications — wireless tools
Опция 29: Filesystem images — cpio the root filesystem — [*]
Опция 30: Filesystem images — Compression method — lzma
Опция 31: Host Utilites — host dosfstools
Опция 32: Host Utilites — host genimage
Опция 33: Host Utilites — host mtools
После этой длительной конфигурации выбираем Save и сохраняем конфиг (можно взять тут и подложить к себе);
Нажимаем F9 и запускаем процесс сборки: make -C /home/megalloid/buildroot O=» >PWD ARCH=arm BR2_JLEVEL formula inline» source=»((» alt=»((» src=»https://habrastorage.org/getpro/habr/upload_files/e5d/55b/77d/e5d55b77d535464756de9815f50f4c6a.svg» width=»15″ height=»24″/>(nproc) — 1))»
Ждём когда закончится компиляция, самое время заварить и выпить кофе =)
Теперь когда образ RootFS собрался надо его подписать и привести к виду, в котором его сможет корректно переварить U-Boot:
Переходим в папку с готовыми образами: cd buildroot/images
Производим подпись: mkimage -A arm -T ramdisk -C gzip -d rootfs.cpio uramdisk.image.gz
Складываем uramdisk.image.gz на загрузочную SD-карту;
Настраиваем загрузку образов в U-Boot:
Надо загрузиться в консоль U-Boot и записать туда: setenv mmc_boot “fatload mmc 0 0x2000000 uramdisk.image.gz; fatload mmc 0 0x4000000 uImage; fatload mmc 0 0x4500000 system.dtb; bootm 0x4000000 0x2000000 0x4500000;”
Сохраняем эту переменную через saveenv и перезагружаемся;
Дожидаемся загрузки ОС;
Теперь можно переходить к компиляции драйвера и непосредственно настройке Wi-Fi модуля.
Компиляция модуля ядра 88х2cs для Wi-Fi модуля
Переходим к последнему элементу, необходимому для работы Wi-Fi модуля — драйверу нашего Wi-Fi модуля. На просторах GITHUB я нашел вполне себе собираемый и рабочий вариант драйвера. Чтобы собрать драйвер out-of-tree нужно сделать следующее:
Переключим ветку на версию драйвера совместимую с 5.15: git checkout tune_for_jethub_5_14
Запускаем компиляцию: make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KSRC=»/home/megalloid/linux-xlnx» (где KSRC — путь до папки с ядром LInux из предыдущего шага);
На выходе мы получим в этой папке файл 88x2cs.ko, его нужно положить туда же на загрузочную SD-карту;
Проверяем, загрузится ли модуль ядра и появится ли wlan-интерфейс:
Монтируем SD-карту в файловую систему: mount /dev/mmcblk0p1 /mnt
Переходим в каталог SD-карты: cd /mnt/
Выполняем insmod 88x2cs.ko для загрузки модуля ядра;
Запускаем программу ifconfig — и видим, что появился wlan0 интерфейс:
Это говорит о том, что модуль ядра успешно загрузился и готов к работе. В следующей главе перейдем к настройке wlan0 интерфейса и проверке работоспособности Wi-Fi, прогону скорости через iPerf;
Настройка Wi-Fi интерфейса и измерение скорости с использованием iPerf
Для настройки Wi-Fi необходимо первым делом создать конфиг, удобнее всего в этом случае его создать на SD-карте в виде файла wpa_supplicant.conf.
Выполним в консоли Zynq следующие команды:
Создадим файл конфигурации: touch /mnt/wpa_supplicant.conf
Открываем его на редактирование: vi /mnt/wpa_supplicant.conf
Записываем в него следующее содержимое и сохраняем:
Запускаем wpa_supplicant: wpa_supplicant -B -Dnl80211 -iwlan0 -c/mnt/wpa_supplicant.conf -P/var/run/wpa_supplicant.pid -dd -f/mnt/wpa_supplicant.log
Через некоторое время появится IP-адрес на интерфейсе wlan0 и будет установлена связь с роутером;
Теперь можно прогнать трафик с компьютера (который подключен к роутеру кабелем) на Zynq и обратно. Для этого нужно:
Запустить на компьютере: iperf3 -s
Запустить на Zynq: iperf3 -c <IP компьютера> -N -i1 -t60 -u
Чтобы пустить трафик в обратном направлении на Zynq нужно выполнить: iperf3 -c <IP компьютера> -N -i1 -t60 -R -u
Скорость в целом соответствует заявленным Xilinx цифрам: около 20 Мбайт\сек (около 150 Мбит\с). В итоге если будем иметь подходящие условия в эфире — эта скорость будет максимальной и в 2.4 ГГц и 5 ГГц. Результат соответствует всем ожиданиям.
Подведем итог
После длительного кропотливого исследования без каких-либо how-to удалось обуздать эту железку. На общую проработку этого всего ушло около недели, что в целом доставило немало удовольствия по мере продвижения к решению задачи. Буду надеяться, что мой опыт кому-нибудь пригодится и будет высоко оценен. Спасибо!
Советы по настройке Larnitech
У меня сейчас активный период настройки нескольких систем Larnitech, я даже сделал отдельную страницу по этой услуге.
Настраивать с ноля систему Larnitech, уже установленную на объекте, крайне неудобно. Как, разумеется, и любую другую систему, особенно на шине.
Я немного замучил вопросами техподдержку, зато разобрался во многих моментах касательно настройки и нашёл, как работать с оборудованием проще. Что-то покажется вполне очевидным, до чего-то удалось дойти не сразу.
Сначала обновите программное обеспечение
Первым делом после подключения к новому контроллеру надо обновить программное обеспечение. Уже несколько раз мне поступали вопросы о том, почему что-то в системе на этапе первичной настройки работает не так, все проблемы решились обновлением ПО.
В web интерфейсе контроллера (в браузере) надо выбрать пункт меню «Обновления», там обновить до последних доступных версий LT Setup и LT Server. И нажать кнопку «установить заплатки безопасности».
На картинке ниже у LT Setup установлена версия 1.30, доступна более новая 1.91, нажимаем справа кнопку Обновить и ждём пару минут, всё произойдёт автоматически.
API Plugin отвечает за работу системы с голосовым помощником Siri. Все прочие пункты (Coolmaster, EIB и далее) устанавливаем и поддерживаем в актуальном состоянии только если соответствующие функции используются.
Далее заходим в Модули и смотрим, не предлагается ли обновить прошивку контроллера и подключенных модулей на релизной. Если доступно, то обновляем.
Редактор логики
Редактор логики находится в пункте интерфейса «Структура», кнопка «Редактировать логику».
Если в нём разобраться, то мы получим возможность гораздо быстрее выполнять настройку названий элементов и комнат. Хоть визуальное меню редактирования структуры тоже достаточно наглядное и удобное, но как минимум названия выходов и входов удобнее менять здесь.
А ещё в редакторе логики удобно быстро задавать назначение каждого входа и выхода. Нужно найти строчку с ID элемента :98.
Сразу видно назначение выходов модуля: L это лампа, B — штора, K — замок. В документации на wiki есть все возможные обозначения входов и выходов.
Съёмные клеммники
Клеммники подключения шины на всех модулях Larnitech, а также на датчиках CW-CO2 и CW-HTML — съёмные. Если надо переключить модуль, то проще всего снять клеммник и переставить на другой модуль, а не выдергивать проводки шины и питания.
Вот казалось бы, что это очевидно, а до меня дошло только на третьей системе. Вместо того чтобы разбирать все соединения и собирать потом заново, можно просто снять шину вместе с клеммниками и переставить на другие модули.
Настройка BW-SW06 и датчиков температуры
При подключении датчика температуры пола стандарта 1-wire (это FW-FT и FW-TS) к модулю BW-SW06 на контакт G подключается земля, на контакт 1 — сигнал, а на 2 — питание.
У FW-FT земля чёрная, сигнал жёлтый, а питание красное.
У FW-TS чуть сложнее: земля зелёная, сигнал бело-оранжевый, а питание оранжевое.
При настройке работы модуля BW-SW06.B мы задаём на вход 1 датчик температуры, а поле назначения входа 2 автоматически меняется на «Питание». Но вот с более новым модулем BW-SW06.C мы не можем выбрать «Питание», его нет в списке вообще.
Если замкнуть жилу питания на контакт GND, то датчик работает и показывает температуру, но нестабильно: чуть тронешь его, и показания пропадают. Если не подключать питание вообще, то датчик показывает ерунду: то -15 градусов, то +30.
Для решения проблемы заходим в меню «Структура», нажимаем «Редактировать логику». Находим строчку с номером модуля :98, и задаём для него настройку hw=»in=’T+BBBB’». То есть, принудительно задаём, что второй вход это +. Датчик подключаем как по инструкции.
Подключение датчиков протечки воды к DW-SW16
Для подключения датчиков протечки воды обычно используется модуль DW-WL02, к нему можно подключить до 16 датчиков протечки воды и 2 группы кранов. Иногда нам удобнее поставить для подключения датчиков протечки воды модуль дискретных входов DW-SW16, но при его настройке нам не задать в меню настроек HW назначение входа как «датчик протечки». Что делать?
Снова лезем в настройки логики и задаем тип входа L — leak. На скриншоте первые 9 входов модуля выключатели, далее 6 датчиков протечки воды. Последний вход — GND всех датчиков и выключателей.
Датчики протечки воды Larnitech работают не так, как обычные датчики, они периодически посылают сигнал автотеста кратковременным замыканием тревожного выхода. Так что при настройке его как геркон мы будем получать тревогу «Обрыв», так как геркон не посылает сигнал автотеста.
Пропали скрипты
В Larnitech большая база готовых стандартных скриптов для разных потребностей. Но вот мы заходим в меню Сценарии, нажимаем «Добавить скрипт», а список скриптов пустой. Что делать?
Нужно зайти в меню Обновления, найти там Scripts и нажать Переустановить. Хотя они и так установлены.
Но нажимаем, ждём загрузку, далее снова заходим в Сценарии, и список скриптов на месте.
Серийные номера модулей и датчиков
На всех датчиках и модулях есть серийный номер на серебристой наклеечке со штрих-кодом. Он продублирован также на такой же наклейке на коробке.
По этому серийному номеру можно идентифицировать модуль или датчик. Но если модуль можно идентифицировать и более просто, нажав на соответствующую кнопку в списке модулей (он начнёт мигать светодиодами), то на датчиках светодиодов нет, тут найти, где какой датчик, сложнее.
Эти самые серийные номера элементов можно посмотреть, почему-то, только в том же незаменимом редакторе логики. Нужно найти строчку <item addr=»ID:98 …>, там будет вписан серийный номер (sn). Эти номера я в рамках преднастройки системы переписываю в таблицу с цоколёвкой контроллера Larnitech.
Обновление прошивок модулей
Лучше всего все модули и датчики обновлять до прошивки «Релиз». Но иногда есть необходимость (например, по указанию техподдержки) обновить элемент до прошивки «Альфа» или «Бета». Просто так это не сделать. Нужно зайти в меню «Общие» и сдвинуть ползунок настроек обновления на «Advanced», это даст нам возможность выбора прошивки для обновления.
Перезагрузка контроллера
В процессе изменения ID устройств (а я люблю, когда ID модулей в щите нумеруются по порядку, так удобнее впоследствии) устройство с новым ID может не появляться в списке устройств. Сначала дайте системе немного времени: подождите секунд 10-15 и нажмите F5 для обновления списка модулей. Но если обновление списка модулей не помогает, нужно перезагрузить LT Setup, это можно сделать в меню Перезагрузка. Перезагрузка занимает порядка 10 секунд. Дёргать питание контроллера не нужно.
Ставим автоматы или предохранители на питание датчиков
При установке датчиков лучше отключать питание шины датчиков, чтобы случайное замыкание проводов не привело к отключению всего блока питания.
Если у нас в системе не стоит отдельный блок питания на датчики, а контроллер и датчики питаются от одного блока, лучше питание датчиков подключить через автомат, который можно было бы отключать при необходимости. Если от контроллера идёт 2 шины или больше шины датчиков, то ставим отдельные автоматы на разные шины, чтобы отключать только то, с чем собираемся работать.
Но вообще, система поддерживает «горячее» (без отключения питания) переподключение модулей отлично. В приложении Larnitech сразу отображаются подключенные элементы, даже если в списке устройств в web интерфейсе контроллера они не появились.
Хочу отдать должное контроллерам Larnitech. В процессе настройки нескольких систем, когда приходится много добавлять, убирать, переподключать, переименовывать модули, обновлять разные программные блоки, ни разу не возникало никаких зависаний контроллера, необходимости его полной перезагрузки или отказа интерфейса.
Sorry, you have been blocked
This website is using a security service to protect itself from online attacks. The action you just performed triggered the security solution. There are several actions that could trigger this block including submitting a certain word or phrase, a SQL command or malformed data.
What can I do to resolve this?
You can email the site owner to let them know you were blocked. Please include what you were doing when this page came up and the Cloudflare Ray ID found at the bottom of this page.
Cloudflare Ray ID: 75b6d43fd87a77f1 • Your IP: Click to reveal 155.133.64.137 • Performance & security by Cloudflare