7 шагов, которым я следую для разработки драйвера устройства

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

Я заметил, что этапы разработки драйвера устройства остаются одинаковыми для любого устройства в любой ОС, будь то Windows, Linux или другая ОСРВ (за исключением примитивного ядра реального времени). Когда я имею в виду «Шаги, которые я выполняю для разработки драйвера устройства», я сознательно хотел избежать типичного руководства по разработке драйвера устройства, задействования функций и API, которые используются (для этого имеется множество информации) и привязки к конкретной ОС. (Windows, Linux и т. Д.), Скорее, я хотел рассказать, как я реализовал каждый шаг «функционально». Шаги, которые я упоминаю ниже, должны быть применимы к драйверам устройств в любой операционной системе.

Эта статья может быть более полезной для человека, который не является разработчиком драйверов устройств на полную ставку, но время от времени испытывает потребность в разработке драйверов. В частности, если вы работаете в полупроводниковой компании (например, я) и вам поручено разработать драйвер устройства для аппаратной платы на основе нового чипа.

Шаг 1. Узнайте об оборудовании

Знание об оборудовании требует ...

  • Какой интерфейс шины используется этим оборудованием для связи с хостом (USB, PCIe, I2C и т. Д.), На котором находится программное обеспечение драйвера устройства.
  • Как определить оборудование. Почти во всех случаях аппаратная шина требует, чтобы производитель оборудования назначил идентификатор. Способ присвоения идентификатора может зависеть от аппаратной шины.
  • Зарегистрируйтесь Определение знаний. Обычно эту информацию может предоставить техническое описание устройства.
  • Если основным устройством является SoC (система на кристалле), нужно ли вашему драйверу взаимодействовать с прошивкой, работающей в SoC? Знайте, какой протокол команд определяется прошивкой
  • Зная, как происходит передача данных: опрос или прерывание?

Шаг 2. Скажите привет своему оборудованию (другими словами, поговорите со своим оборудованием)

Как только основная информация об оборудовании известна, самое время поговорить с ним. На этом этапе у вас должен быть как минимум прототип оборудования или его финальная версия.

Начните писать драйвер режима ядра. Документация по разработке драйверов для выбранной ОС (Windows, Linux, RTOS и т. Д.) Должна содержать много информации.

Обычно первыми функциями, которые вы разрабатываете для своего драйвера устройства, являются функции загрузки и выгрузки (примечание: имена функций могут быть разными для каждой ОС), которые вызываются при запуске и выключении операционной системы соответственно.

Одна из основных задач функций загрузки / выгрузки - обнаружение оборудования, подключенного к системе, или нет. Если аппаратное обеспечение подключено, функция загрузки выполняется успешно, если не вызвать выгрузку. Типичные способы обнаружения оборудования - это идентификатор устройства, указанный на конкретной шине (например, USB, PCIe и т. Д.)

Шаг 3. Инициализируйте оборудование

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

Например, если вы разрабатываете драйвер устройства для устройства воспроизведения звука, вам может потребоваться загрузить код прошивки для Audio DSP (процессор цифровых сигналов), отправить команды для инициализации типа декодирования звука, которое необходимо выполнить ( MP3, Dolby AC3 и т. Д.). Короче говоря, подготовьте оборудование, чтобы оно было готово к работе.

Шаг 4. Управляйте своим оборудованием

Следующим шагом будет управление вашим оборудованием. До шага 3 операция может быть одноразовой при загрузке ОС, шаг 4 может потребоваться выполнить несколько раз после того, как операционная система будет запущена и запущена.

Рассмотрим наш пример устройства воспроизведения звука. Допустим, вы хотите воспроизвести аудиофайл MP3. Прикладное программное обеспечение высокого уровня может считывать типы и характеристики файлов, такие как частота дискретизации аудиопотока, битрейт и т. Д., И отправлять соответствующие параметры в драйвер устройства ядра. Драйвер устройства, в свою очередь, переводит эти параметры как команды в Audio DSP. Эта операция повторяется для каждого воспроизводимого файла. В некоторых случаях шаги 3 и 4 можно объединить в один, и это нормально.

Шаг 5. Передача данных на ваше оборудование

Чаще всего ваше устройство может иметь дело с некоторыми формами данных (аудио, видео, сетевые пакеты и т. Д.). Как только устройство инициализировано и готово к работе, на оборудование должен поступать постоянный поток данных.

Драйвер устройства действует как канал между приложением верхнего уровня и оборудованием / прошивкой нижнего уровня для передачи данных. Опять же, узнайте, какой протокол был разработан для передачи данных. Если вы разрабатываете драйвер с нуля, вам следовало бы обсудить с специалистами по аппаратному / микропрограммному обеспечению протокол о том, как осуществлять передачу данных.

Обычно передача данных может быть управляемой прерыванием или опросом. В любом случае ваша ОС должна предоставлять средства (процедура обработки прерываний, обмен сообщениями и т. Д.). Вы будете использовать эти средства для передачи данных.

Начните с одного пакета передачи данных и убедитесь, что весь процесс от инициализации до аппаратного управления и передачи этого пакета работает нормально. Определение одного пакета может варьироваться в зависимости от вашего приложения, например, в аудиоустройстве это могут быть аудиоданные размером 64К.

Шаг 6: запуск и остановка передачи данных

Следующим шагом будет управление передачей данных. Как и в нашем примере воспроизведения звука, отправка команды остановки на прерывание в прошивку после завершения файла аудиопотока. Типичные проблемы, с которыми здесь сталкиваются, могут заключаться в том, что остановка потока не происходит в нужное время, что приводит к переполнению или опустошению буфера.

Шаг 7. Тонкая настройка и отладка вашего драйвера на основе тестирования.

К этому времени вы уже почти знаете код и станете авторитетом драйвера вашего устройства. На этом этапе ваш драйвер может быть готов к тестированию методом «черного ящика», поскольку вся разработка завершена.

Вышеупомянутые шаги могут не точно соответствовать вашей ситуации, но должны быть полезны, чтобы дать вам общее представление о том, как действовать при проектировании и разработке драйвера устройства, или, по крайней мере, должны быть полезны при ответе на вопрос собеседования «Как вы разрабатываете драйвер устройства? ».

Удачного вождения устройства .. :)