Что я понял на данный момент, так это то, что владелец продукта уже написал некоторые функции для доступа к периферийному оборудованию, и все, что мне нужно сделать, - это вызвать их с помощью вызова некоторых специальных функций с использованием своих файлов .c. Цитата
Ваше понимание отчасти верно - у поставщика платы уже написаны драйверы (функции для чтения / записи аппаратных регистров). Однако это не так просто, как просто связать файлы c драйверами.
В Linux механизм использования этих драйверов (API драйвера) варьируется в зависимости от варианта использования. К драйверам можно получить доступ как из пространства пользователя, так и из ядра. Оба эти пространства имеют разные API для взаимодействия с драйверами. Существует много уровней (абстракция) в драйверах ядра Linux, и большая часть усилий заключается в ознакомлении со всеми задействованными уровнями абстракции.
При использовании драйвера из пользовательского пространства наиболее распространенным API являетсяиспользовать файлы устройства, представляющие устройство и выполняющие над ним операции с файлами. Например, UART от USB к последовательному порту обычно представлен файлом устройства / dev / ttyUSB0, и все взаимодействие с драйвером происходит через этот файл устройства. Вы можете искать пишущие драйверы персонажей в Linux, чтобы лучше понять это. По сути, ваш драйвер ядра Linux должен создать файл устройства, и вам необходимо сопоставить операции, выполняемые над этим файлом устройства (открыть, прочитать, записать, закрыть, ioctl), с аппаратными функциями устройства в вашем драйвере.
Linux опирается на это для создания определенных подсистем драйверов. Например, подсистема кадрового буфера Linux, которая обычно используется для рисования графики на дисплее. Это также файл устройства, но содержит операции, общие для всех устройств кадрового буфера. Специфичные для устройства функции перейдут в другой отдельный драйвер, который содержит аппаратные биты. Цель проста - разделить универсальный повторно используемый код и отдельные аппаратные биты.
Если вы хотите обойти API пользовательского пространства и напрямую взаимодействовать с каким-либо другим кодом или драйвером ядра, вам нужно написатьмодуль ядра, который работает в пространстве ядра, и здесь вы можете ссылаться на функции, экспортируемые общим драйвером ядра от поставщика. Это просто для того, чтобы дать вам основную идею, есть много базовых деталей, которые будут раскрыты, как только вы начнете писать код, взаимодействующий с драйверами. Я бы предложил начать с простого драйвера персонажа. Вы можете следовать этому учебнику