7 стъпки, които следвам за разработване на драйвер за устройство

През годините, работейки в разработката на софтуер и след това преминавайки към поддръжка на клиенти в инженерството на софтуерни приложения, аз или разработвах драйвери за устройства от нулата, или модифицирах съществуващия софтуер за драйвери на устройства за клиент или конкретен вариант на хардуер.

Това, което забелязах е, че фазите за разработване на драйвер на устройство остават същите за всяко устройство на всяка операционна система, било то Windows, Linux или друга RTOS (с изключение на примитивно ядро ​​в реално време). Когато имам предвид „Стъпки, които следвам за разработване на драйвер на устройство“, съзнателно исках да избегна типичния урок за разработване на драйвер на устройство, включващ функции и API, които се използват (има тонове налична информация за това) и обвързване с конкретна операционна система (Windows, Linux и т.н.), по-скоро исках да споделя как приложих всяка стъпка „функционално“. Стъпките, които споменавам по-долу, трябва да са приложими за драйвери на устройства във всяка операционна система.

Това описание може да е по-полезно за човек, който не е разработчик на драйвери на устройства на пълен работен ден, но има нужда да разработва драйвери от време на време. Особено ако работите в компания за полупроводници (като мен) и ви е възложено да разработите драйвер за устройство за хардуерна платка, базиран на нов чип.

Стъпка 1: Запознайте се с хардуера

Познаването на хардуера включва...

  • Какъв е интерфейсът на шината, който този хардуер използва за комуникация с хоста (USB, PCIe, I2C и т.н.), където се намира софтуерът на драйвера на устройството.
  • Как да открием хардуера. В почти всички случаи хардуерната шина изисква от производителя на хардуер да присвои идентификатор. Начинът на присвояване на ID може да варира в зависимост от хардуерната шина.
  • Знания за дефиниция на регистъра. Обикновено листът с данни на устройството може да предостави тази информация.
  • Ако основното устройство е SoC (система върху чип), трябва ли вашият драйвер да взаимодейства с фърмуера, работещ в SoC? Знайте какъв е командният протокол, дефиниран от фърмуера
  • Знаейки как се извършва прехвърлянето на данни, запитване ли е или управлявано от прекъсване?

Стъпка 2: Кажете здравей на вашия хардуер (с други думи, говорете с вашия хардуер)

След като основната информация е известна за хардуера, тогава е време да говорите с хардуера. На този етап трябва да имате поне прототип на хардуер или финализирана версия на наличния хардуер.

Започнете да пишете своя драйвер за режим на ядрото. Документацията за разработка на драйвери за избраната операционна система (Windows, Linux, RTOS и др.) трябва да съдържа много информация.

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

Едно от основните задължения на функциите за зареждане/разтоварване е да открива хардуера, включен или не в системата. Ако хардуерът е включен, тогава функцията за зареждане е успешна, ако не извика разтоварване. Типичните начини за откриване на хардуера са чрез идентификатор на устройство, посочен от конкретната шина (напр. USB, PCIe и др.)

Стъпка 3: Инициализирайте вашия хардуер

След като сте в състояние да откриете вашия хардуер, следващото е да го инициализирате. Видът на необходимата инициализация може да варира за всеки хардуер. Може да варира от просто писане в няколко регистъра на устройството до целия път, изтегляне на микрокод на устройството и комуникация с помощта на патентован команден протокол.

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

Стъпка 4: Контролирайте вашия хардуер

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

Като вземем нашия пример с устройство за възпроизвеждане на аудио, да приемем, че искате да възпроизведете MP3 аудио файл, приложният софтуер от високо ниво може да прочете типовете и характеристиките на файловете, като честота на дискретизация на аудио потока, битрейт и т.н., и да изпрати съответните параметри до драйвера на ядрото на устройството. Драйверът на устройството от своя страна превежда тези параметри като команди към Audio DSP. Тази операция се повтаря за всеки файл, който се възпроизвежда. В някои случаи стъпки 3 и 4 може да бъдат обединени в една стъпка и това е добре.

Стъпка 5: Комуникация на данни към вашия хардуер

По-често вашето устройство може да работи с някаква форма на данни (аудио, видео, мрежови пакети и т.н.). След като устройството е инициализирано и готово за работа, към хардуера трябва да бъде доставен постоянен поток от данни.

Вашият драйвер на устройство действа като канал между приложението от по-високо ниво и хардуера/фърмуера от по-ниско ниво за прехвърляне на данните. Отново разберете какъв е протоколът, който е проектиран за комуникация на данни. Ако разработвате драйвер от нулата, трябва да сте разработили протокол с хората от хардуера/фърмуера за това как да направите прехвърляне на данни.

Обикновено прехвърлянето на данни може да бъде управлявано от прекъсване или запитване. Така или иначе, вашата операционна система трябва да предоставя съоръжения (програма за прекъсване на услугата, съобщения и т.н.). Ще използвате тези съоръжения за прехвърляне на данни.

Започнете с единичен пакет за прехвърляне на данни и се уверете, че целият процес от инициализиране до хардуерен контрол до прехвърляне на този пакет работи добре. Дефиницията на единичен пакет може да варира в зависимост от вашето приложение, да речем например, в Audio Device това може да са единични 64K аудио данни.

Стъпка 6: Стартирайте и спрете комуникацията с данни

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

Стъпка 7: Фина настройка и отстраняване на грешки във вашия драйвер въз основа на тестване.

До този момент вече почти знаете кода и ще бъдете авторитетът на драйвера на вашето устройство. В този момент вашият драйвер може да е готов за тестване в черна кутия, тъй като цялата разработка е готова.

Стъпките по-горе може да не отговарят точно на вашата ситуация, но трябва да са полезни, за да ви дадат цялостна представа как да процедирате при проектирането и разработването на драйвер на устройство или най-малкото трябва да са полезни при отговора на въпроса на интервюто „Как се разработва драйвер на устройство?”.

Приятно шофиране на устройството .. :)