Контроллеры шин
Примечание
Эта глава является частью книги The Linux Driver Development Guide for Raspberry Pi 3 и предназначена для русскоязычной аудитории. В ней мы рассмотрим роль контроллеров шин, их реализацию в ядре Linux и приведём примеры.
Что такое контроллер шины?
Контроллер шины это часть драйвера, которая отвечает за:
Обнаружение устройств на определённой шине.
Регистрацию этих устройств в подсистеме устройства.
Связывание с драйверами устройств через механизм сопоставления (matching).
Контроллер шины реализует и вызывает функции device_register() или device_add() для каждого устройства, которое он обнаруживает.
Пример: контроллер платформенной шины
Контроллер платформенной шины (platform bus) является встроенным инициализатором устройств, которые не находятся на какой-либо внешней шине (например, I2C или PCI), а жёстко заданы в платформе (часто в DTB или ACPI).
Рассмотрим код инициализации:
int __init platform_bus_init(void)
{
int error;
early_platform_cleanup();
error = device_register(&platform_bus);
if (error)
return error;
error = bus_register(&platform_bus_type);
if (error)
device_unregister(&platform_bus);
return error;
}
Здесь:
device_register(&platform_bus) регистрирует корневое устройство шины.
bus_register(&platform_bus_type) регистрирует саму шину как bus_type.
Связь с драйверами
После регистрации устройств контроллер должен гарантировать, что они будут сопоставлены с подходящими драйверами.
Это достигается с помощью поля match() структуры bus_type, которое вызывается автоматически для определения, подходит ли данный драйвер данному устройству.
Полезные ссылки
Elixir интерактивный браузер исходного кода ядра Linux:
platform_bus_init() в Elixir: https://elixir.bootlin.com/linux/latest/source/drivers/base/platform.c#L964
Структура platform_device: https://elixir.bootlin.com/linux/latest/source/include/linux/platform_device.h
Регистрация устройства: https://elixir.bootlin.com/linux/latest/source/drivers/base/core.c#L2420
Пример добавления устройства: https://elixir.bootlin.com/linux/latest/source/arch/arm/mach-omap2/board-generic.c#L118
Примеры: регистрация виртуального устройства
Минимальный пример регистрации устройства с помощью платформенного контроллера:
static struct platform_device my_device = {
.name = "my_platform_device",
.id = -1,
};
static int __init my_init(void)
{
return platform_device_register(&my_device);
}
static void __exit my_exit(void)
{
platform_device_unregister(&my_device);
}
module_init(my_init);
module_exit(my_exit);
MODULE_LICENSE("GPL");
Что происходит: - Мы создаём структуру platform_device. - Регистрируем её при инициализации модуля. - Ядро создаёт устройство /sys/devices/platform/my_platform_device.
Дополнительно
Контроллеры важны для автоматического обнаружения устройств.
Особенно актуальны для систем с динамически подключаемыми устройствами (например, USB, PCI).
Итог
Контроллер шины это та часть системы, которая «оживляет» устройства на шине и позволяет связать их с соответствующими драйверами.
Следующая тема регистрация самих драйверов устройств и их связывание с зарегистрированными устройствами.
Смотри также
Видео по этой главе с живым кодом и разбором ты найдешь на нашем YouTube-канале!