В Linux, как измерить / дискретизировать ширину импульса GPIO

#linux-kernel #linux-device-driver #gpio #pwm

#linux-ядро #linux-драйвер устройства #gpio #шим

Вопрос:

На моей плате работал ARM Linux. Для подключения к входному сигналу будет использоваться GPIO, который кодирует информацию с разной шириной импульса, но с тем же периодом. Допустим, период равен 10 мс, а импульс 2 мс (высокий) будет представлять 0, а импульс 5 мс будет представлять 1.

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

Пожалуйста, дайте мне несколько советов.

Комментарии:

1. Нет способа получить его надежно. Первые шаги по смягчению — это привязать процесс к отдельному процессору и выгрузить его из других задач (в основном тратя полное ядро на выполнение чего-то, что должно выполняться MCU). Второй шаг — переход на RT Linux. И правильное решение — использовать MCU с ОСРВ (например, Zephyr).

2. Но, конечно, вы можете попробовать. Что вам нужно, так это выделенный таймер и вывод GPIO, установленный как прерывание по обоим краям. Всякий раз, когда прерывается, драйвер должен запускать или останавливать таймер и преобразовывать закодированные данные во все, что вы хотите.

3. Если ваше оборудование поддерживает этот режим, т.Е. декодирование PWM, вам просто нужен драйвер.

4. @0andriy Я полагаю, что вы подразумеваете под декодированием PWM то же самое, что я сказал PW-измерение. Я вижу, что в Linux была PW-модуляция, но не PW-измерение. В это трудно поверить. Мой MCU имеет аппаратные часы, которые поддерживают работу в режиме измерения импульсов. Так вы имеете в виду, что я должен написать свой собственный драйвер измерения PW?

5. Почему в это трудно поверить? Кажется, пока это никому не нужно. Для этого даже нет рамок. (Похоже, что подсистема IIO является ближайшей, но я не вижу там поддержки датчиков для декодирования / считывания PWM).

Ответ №1:

Причина, по которой никто не может дать вам конкретный ответ, заключается в том, что то, о чем вы просите, относится к конкретному процессору. Это можно сделать, если аппаратное обеспечение поддерживает это… Например, процессор Texas Instruments Jacinto6, который я использую, имеет ядра M4, которые могут запускать код, подобный микроконтроллеру, и одно из ядер M4 может быть настроено для обработки IRQ на отображенном GPIO. Затем, когда обнаруживается разная ширина импульса, вы можете отправить информацию в Linux, на ядрах A15 того же чипа. Семейство процессоров NXP iMX также имеет аппаратную поддержку для этого, но оно не на выделенном ядре, таком как чип Ti. Для iMX6 вы можете настроить GPIO для генерации IRQ с дельта-временем (из дерева часов), помещенным в регистр, отображенный в памяти. В этом случае для чтения отображенного в память регистра потребуется другой драйвер Linux, чем решение на основе Ti, из-за аппаратных различий. Надеюсь, это поможет пролить свет на то, почему вы просто не найдете возможности, которая уже есть в ядре / драйвере Linux….