Универсальные пакеты разработки драйверов устройств (Driver Development Kit DDK) для. Драйвер PCI-устройства может быть написан различными способами на основе API WinDriver..
Сделаем код чище: рефакторинг драйвера PCI для контроллера NAND Denali. Системное программирование*, *nix*На примере драйвера PCI для контроллера NAND Denali я покажу как упрощается код при использовании макросов и функций- помощников, доступных в относительно свежих версиях ядра Linux. Этот старый драйвер врядли используется, но является хорошим примером кода, который можно отрефакторить. Сам драйвер находится в drivers/mtd/nand/denali_pci. Подготовка Kconfig.
Первым делом коснёмся Kconfig. Поскольку драйвер разбит по уже классической схеме, а именно: основная часть + драйвер на шине, следуя логике (в том числе и самого Торвальдса) нам необходимо скрыть выбор основной части от пользователя. Попутно заменяем пробелы на табуляции в тех строках, которые изменяем. Делай раз! Применение макросов.
Универсальные пакеты разработки драйверов устройств (Driver. Пакет WinDriver PCI позволяет разрабатывать драйверы PCI-устройств и .
.комплексных решений, позволяющих осуществлять анализ поведения шины и разработку драйверов различных PCI-X/PCI- CompactPCI- и PMC-устройств. «Разработка драйверов устройств для Linux». теоретических и практических навыков по разработке драйверов для операционной. PCI драйвера. 1.
- Передо мной встала нелегкая задача написания драйвера платы внутреннего актуальные мануалы для разработки драйверов PCI.
- . Прежде, чем начать разработку драйвера, нам нужно для этого. Мы обнаружили устройство PCI и включили его, но в Linux сетевые .
- Разработки в сфере твердотельных накопителей не стоят на месте и, ввиду этого, каждый производитель пытается. Версия драйвера: 6.12.8.1738. Скачать. Xen PCI Device Driver..
- Прежде, чем начать разработку драйвера, нам нужно для этого Мы обнаружили устройство PCI и включили его, но в Linux сетевые.
- Разработка «прошивки» для PCI -Express адаптера Для программной поддержки контроллера разработан драйвер на основе инфраструктуры WDF.
Следующим шагом будет применение макроса module_pci_driver(): -- - a/drivers/mtd/nand/denali_pci. Делай два! Переход на API управляемых ресурсов. Теперь переходим к самому интересному, замене вызовов на управляемые ресурсы (вот здесь я описывал их). Начнём с простого, devm_kzalloc(): Смотрим что получилось- -- a/drivers/mtd/nand/denali_pci.
GFP_KERNEL); + denali = devm_kzalloc(& dev- > dev, sizeof(*denali), GFP_KERNEL); if (! ENOMEM; ret = pci_enable_device(dev); if (ret) {pr_err("Spectra: pci_enable_device failed. INTEL_CE4. 10. 0) {@@ - 1.
Поскольку устройство подключено к шине PCI, воспользуемся devres API для устройств PCI: Смотрим что получилось- -- a/drivers/mtd/nand/denali_pci. MODULE_DEVICE_TABLE(pci, denali_pci_ids); static int denali_pci_probe(struct pci_dev *dev, const struct pci_device_id *id){- int ret = - ENODEV; + int ret; resource_size_t csr_base, mem_base; unsigned long csr_len, mem_len; struct denali_nand_info *denali; @@ - 3. ENOMEM; - ret = pci_enable_device(dev); + ret = pcim_enable_device(dev); if (ret) {pr_err("Spectra: pci_enable_device failed. DENALI_NAND_NAME); if (ret) {pr_err("Spectra: Unable to request memory regionsn"); - goto failed_enable_dev; + return ret; }denali- > flash_reg = ioremap_nocache(csr_base, csr_len); if (! Spectra: Unable to remap memory regionn"); - ret = - ENOMEM; - goto failed_req_regions; + return - ENOMEM; }denali- > flash_mem = ioremap_nocache(mem_base, mem_len); @@ - 9. К сожалению избавиться от ioremap_nocache() не представляется возможным, нет соответствующего устройства под рукой (да и я вообще не уверен, что такое существует в мире сегодня) чтобы проверить, какая информация хранится в соответствующих PCI BAR'ах. Объединяем полученное в этой главе, и делай три!
Дополнительный рефакторинг. Для наведения полной красоты заменяем pr_err() на dev_err(): -- - a/drivers/mtd/nand/denali_pci. Spectra: pci_enable_device failed. Spectra: pci_enable_device failed. DENALI_NAND_NAME); if (ret) {- pr_err("Spectra: Unable to request memory regionsn"); + dev_err(& dev- > dev, "Spectra: Unable to request memory regionsn"); return ret; }denali- > flash_reg = ioremap_nocache(csr_base, csr_len); if (! Spectra: Unable to remap memory regionn"); + dev_err(& dev- > dev, "Spectra: Unable to remap memory regionn"); return - ENOMEM; }denali- > flash_mem = ioremap_nocache(mem_base, mem_len); if (! Spectra: ioremap_nocache failed!"); + dev_err(& dev- > dev, "Spectra: ioremap_nocache failed!"); ret = - ENOMEM; goto failed_remap_reg; }Делай четыре!
Подведём итоги: drivers/mtd/nand/Kconfig 1. Очевидная польза. Не забываем использовать доступные API в новом коде! Original source: habrahabr.