Driver <-> OS / App Как это работает?Пример - PullRequest
0 голосов
/ 06 марта 2012

Допустим, я хочу создать приложение, аппаратное обеспечение и драйвер для связи с ним.Допустим, устройство подключено либо к материнской плате, либо через USB.Устройство будет платой с 8 светодиодами.Мне нужен интерфейс

bool lock() //true if success
void unlock()
//each bit is matched up to an LED and set means the led is on. 
//Return value is <0 on error. 0 on success. >0 on noncritical error
int  set(char v)

Допустим, некритическая ошибка означает, что вы отправляете последнюю команду через <200 мс, поэтому она игнорируется, потому что устройство не хочет быстро включать / выключать светодиоды. </p>

Допустим, приложение, которое принимает строку текста и использует устройство, чтобы моргать азбукой Морзе буквы / слова.ОС не знает, как работает устройство.Как приложение взаимодействует с водителем?Я не верю, что DLL / SO используется, потому что драйвер находится в своем собственном процессе.

Как приложение взаимодействует с драйвером устройства в Windows или Linux?Меня не интересует, как написать драйвер устройства.Как приложение и ядро ​​общаются с ним.

1 Ответ

0 голосов
/ 13 июня 2016

Поскольку вы спрашивали о Windows и Linux, я отвечу на оба ваших вопроса.

Linux:

В мире Linux почти все является файлом.Все получается от A до B, используя перенаправление вывода из одного двоичного источника в приемник (файл или файл устройства) или передачу вывода из одного двоичного файла в другой двоичный.Простейшим примером является символьное устройство, а простейшим примером символьного устройства является драйвер последовательного порта.

Следующая команда:

echo ciao > /dev/ttyS0

- прекрасный пример подключения пространства пользователя.в пространство ядра.

ПРИМЕЧАНИЕ: / dev / ttyS0 является стандартной номенклатурой для последовательного порта и эквивалентна COM1 в Windows.

Я отправил по крайней мере 4 байта всимвольное устройство / dev / ttyS0.Выполнение кода начинается в пространстве ядра, поэтому вызывается функция open () (определенная в драйвере) для инициализации последовательного порта, который до сих пор был отключен.

Эта инициализация в linux не только подготавливаетпоследовательный порт, но открывает линию TTY.TTY обозначает teletype, и он прозрачно управляет перемещением строки «ciao» на аппаратное устройство.

Вот шаги:

  1. Подготовка последовательной линии (или gpio или чего-либо еще)
  2. Создание буфера данных в ОЗУ для помещения данных в
  3. Отображение памяти аппаратных адресов в доступное для ядра пространство памяти
  4. Копирование данных из буфера ОЗУ в отображаемое в памяти оборудованиеадрес.
  5. Аппаратное устройство будет тогда делать все, что предназначено для этих данных: то есть модулировать и передавать данные RS232 или устанавливать высокий или низкий GPIO.

Windows:

В Windows устройства обычно не представлены в виде файлов, поэтому это необходимо делать программно.Системные вызовы практически одинаковы, и обычно интерфейс пользовательского пространства к пространству ядра обычно обеспечивается функциями типа: open (), read (), write () и close ().

Оба:

Эти вызовы обычно используются для всех типов драйверов, включая графические и звуковые драйверы.В моем примере с Linux я описал, как отобразить строку в символьное устройство, но я мог бы также отобразить шестнадцатеричное значение, представляющее определенный тон или частоту, на мое аудиоустройство, которое можно найти в /dev/audio0.

В случае GPIO процесс будет аналогичным: open (случайный файл или буфер), write (1) или write (0), copyfromuserspacetohwbuffer ().

Также в случае GPIO,Linux предоставляет простой способ доступа к GPIO и манипулирования им из пользовательского пространства.Посмотрите файловую систему proc.Он экспортирует такие пути, как / proc / gpio / gpio1 / value, где вы можете очень легко выводить 0 или echo 1 из оболочки или из прикладной программы.

Надеюсь, это прояснило ваши сомнения!

-Vittorio

...