Драйвер SPI для Linux
Драйвер SPI для Linux

1. Протокол SPI

SPI — это аббревиатура английского последовательного периферийного интерфейса. Как следует из названия, это последовательный периферийный интерфейс. Это высокоскоростная полнодуплексная синхронная коммуникационная шина, впервые использованная компанией Motorola в процессорах серии MC68HCXX. Она занимает всего четыре линии на выводах чипа, что позволяет экономить контакты чипа и обеспечивает удобство и простоту использования.

2. Разработка аппаратного интерфейса SPI.

Когда мы изучаем SPI, мы должны сначала посмотреть, что такое сам SPI. Просто смотреть на код и пересаживать его не имеет особого смысла. Нам следует избавиться от идеи «человека-инструментария» и изучить его. логика построения всей конструкции и реализации SPI, начиная с аппаратного интерфейса.

1) Аппаратный интерфейс

Интерфейс SPI имеет в общей сложности 4 сигнальные линии, а именно: линия выбора чипа, линия синхронизации, линия последовательных выходных данных, линия последовательных входных данных. Модель шины SPI представляет собой структуру кольцевой шины, состоящую из ss(cs), sck, sdi. , sdo Его синхронизация в основном контролируется sck, а обмен данными осуществляют два двунаправленных сдвиговых регистра.

  • MOSI (вход ведомого устройства Masterout), называемый MO: вывод данных ведущего устройства, ввод данных ведомого устройства.
  • MISO (главный вход, подчиненный выход) MI для краткости: ввод данных ведущего устройства, вывод данных ведомого устройства.
  • SCLK, сокращенно CLK: тактовый сигнал CLK, генерируемый основным устройством.
  • SS: Ведомое устройство включает сигнал выбора чипа, управляемый ведущим устройством.

2)SPI CLK

Поскольку сигналы делятся на высокие и низкие уровни и фазы, SPI имеет четыре режима работы.

CPOL: уровень тактового сигнала SPI в режиме ожидания (1: высокий уровень, 0: низкий уровень) CPHA: выборки SPI, по какому фронту тактового сигнала (1: начинается со второго фронта, 0: начинается с первого фронта) Чаще всего используются MODE0 и MODE3.

3) MOSI

Как следует из названия, главный выход подчиненного устройства — это процесс отправки инструкций ведущим устройству подчиненному. Вообще говоря, отправленный сигнал отправляется ведущим датчиком для получения данных в датчике.

4) MISO

Вот процесс сбора основных данных. Подчиненная машина отправляет полученные данные на главную машину, а главная машина обрабатывает данные.

5) СС еще называют КС

Cs буквально означает сигнал выбора чипа. Вообще говоря, одна из наших платформ поддерживает более одного канала SPI. Разработчики OEM-чипов могут разработать несколько интерфейсов SPI для выбора производителя. Это зависит от чипа, который должен работать. Сигнал выбора чипа CS.

6) RST,AVDD,INT

Вот три нестандартных сигнала. Вообще говоря, SPI — это всего лишь интерфейс связи, но для фактической сборки его в датчик необходимы два выхода AVDD и RST, а также три входа и выхода обратной связи INT. Один из них обеспечивает вход питания на стороне датчика, другой обеспечивает контакт сброса на стороне датчика для обработки распространенных исключений и обеспечения защиты, а другой обеспечивает функцию обратной передачи главного сигнала на стороне датчика. Эти три. предоставить гарантии на основные функции устройства.

Таким образом, полный рабочий процесс SPI должен выглядеть следующим образом:

3. Временная диаграмма SPI

После получения базового понимания аппаратного интерфейса SPI давайте посмотрим на временную диаграмму SPI. Изучение временной диаграммы SPI поможет нам лучше понять совместную работу между этими сигналами.

Это относительно чистая и простая для понимания диаграмма временной связи SPI. Сначала давайте объясним некоторые ключевые положения.

1) Временная диаграмма использует режим SPI 0, то есть уровень ожидания CPOL является низким, то есть высокий уровень активен, а первый фронт сигнала CPHA используется для сбора данных.

2) Сигнал выбора чипа SS, эффективен при низком уровне.

3) Сбор данных. Отправка по нарастающему фронту, прием по спадающему фронту и отправка сначала старшего бита. При появлении нарастающего фронта уровень на sdo будет отправлен в регистр ведомого устройства. При наступлении спадающего фронта уровень на SDI будет поступать в регистр ведущего устройства.

4) Данные MSB передаются первым со старшим битом.

Далее мы сосредоточимся на анализе того, как осуществляется дуплексная связь SPI.

Как показано на рисунке:

1. Сначала CS понижается

2.CLK начинает работать.

3. Сбор данных начинается на нарастающем фронте первого высокого уровня.

4. Данные MO/MI отправляются.

5.MI/MO собирает данные.

6. Повторите 3–5

На этом обмен данными внутри цикла завершается. В чем тут сложность? Основная трудность здесь в том, что надо обратить внимание на то, что МО и МИ работают одновременно. В цикле не одна линия для сбора данных. , но две линии одновременно передают данные полупериода и собирают данные полупериода. То, что собирает МО, — это данные датчиков, отправленные МИ, а МИ получает — это инструкции по управлению данными, отправленные МО. Вообще говоря, это рабочий механизм.

4. Структура драйверов устройств Fingerprint SPI

Имея хорошее базовое понимание аппаратного обеспечения, код фактически является программной реализацией интерфейса SPI. Поскольку производители платформ обычно предоставляют нам части спиконтроллера и спайкера, следующее краткое описание в основном относится к части драйвера устройства SPI. Часть кода взята из открытого исходного кода linuxkernel https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/?h=v4.14.258.

1) Автобус

Spi bus, регистрация и снятие с регистрации spi bus

2) Три структуры данных

a、Spi_driver

b、spi_transfer

c、spi_message

3) Три шага использования

а. Зарегистрируйте устройство SPI, вызовите функцию зонда, создайте класс и установите скорость связи SPI.

Этот код легко понять: зарегистрирован драйвер устройства spidev_dt_ids. Здесь необходимо отметить, что содержимое dts не является основной темой этой главы. .

б. Настройте параметры, относящиеся к устройствам SPI.

Как показано на рисунке, есть три ключевых момента для сравнения: первый — это хранение данных структуры данных spi-связи, второй — регистрация узла устройства и третий — установка скорости spi.

c. Отправка и получение данных, на примере spi write.

Исходный код ядра вставлен сюда, чтобы показать вам процесс инкапсуляции этих данных. Из-за его справочной значимости ни одна строка кода здесь не была удалена.

Во-первых, давайте взглянем на spidev_write. Этот интерфейс предполагает интерфейс системного вызова с пользовательским пространством и регистрируется драйвером символьного устройства fops.

spidev_sync_write имеет базовую структуру данных для поддержки дуплексной связи.

Данные tx_buf отправляются, rx_buf — данные принимаются, а len отправляет длину.

После того как данные инкапсулируются с помощью spi_transfer, они собираются с помощью structspi_message и, наконец, отправляются базовой структурой данных spi через spi_sync.

Чтение данных практически такое же, как и этот процесс. Поскольку это дуплексная связь, spi_transfer может одновременно вводиться как tx и считываться как rx.

На данный момент основной процесс работы драйвера устройства spi приведен здесь. Некоторые основные настройки конфигурации ioctl spi можно найти в исходном коде spidev.c.

5. Резюме

Лично я понимаю, что в условиях нынешней тенденции технологического развития, на фоне мобильных телефонов, Интернета вещей, автомобилей и другого терминального оборудования, разработка датчиков является очень важной движущей силой, овладение базовыми возможностями программного обеспечения для вождения также является важным. является главным приоритетом. Linux предоставил нам хорошую платформу для качественного изучения кода на плечах наших предшественников. Нам также необходимо воспользоваться этой возможностью и усердно работать, хорошо выполняя основную работу. и продолжайте двигаться вперед. Желаю вам всего наилучшего и желаю себе идти все дальше и дальше по пути технологий.

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose