6. 5.5: Документация по взаимодействию с оборудованием
6.1. Обзор уровней описания аппаратуры в Linux
Linux использует многоуровневую модель представления оборудования, начиная от описания в Device Tree до структуры struct device в драйвере.
Основные уровни:
Аппаратный уровень (SoC) - Физические устройства: GPIO, UART, I2C, SPI, таймеры и пр. - Представлены в ядре как «узлы» Device Tree (
&gpio,&uart0,&i2c1и т.д.)Device Tree (DT) - Текстовый .dts описывает структуру оборудования. - Свойства:
compatible,reg,gpios,status,label,phandle. - Пример:
hellokeys@0 {
compatible = "arrow,hellokeys";
gpios = <&gpio 17 0>, <&gpio 27 0>;
status = "okay";
}
Шины и драйверы (bus + driver) - Linux определяет устройство через шину:
platform,i2c,spiи др. - Регистрация драйвера черезplatform_driver,i2c_driver,spi_driver. - Поиск соответствий осуществляется черезof_match_table.`struct device` и `struct driver` - Когда вызывается
probe(), ядро передаётstruct platform_device, включающийstruct device. - Через него можно получить доступ к DT-свойствам:pdev->dev.of_node.SysFS — представление устройств в userspace - Каталоги:
/sys/class,/sys/bus,/sys/devices- Показывают связи между устройствами, драйверами и их DT-описанием.
6.2. Примеры путей в sysfs:
/sys/bus/platform/devices/hellokeys@0
/sys/bus/platform/drivers/hellokeys
/sys/class/misc/mydev
/proc/device-tree/soc/hellokeys@0
6.3. Назначение поля compatible и связь с драйвером
В драйвере:
static const struct of_device_id hellokeys_of_match[] = {
{ .compatible = "arrow,hellokeys" },
{},
};
MODULE_DEVICE_TABLE(of, hellokeys_of_match);
static struct platform_driver hellokeys_driver = {
.probe = hellokeys_probe,
.remove = hellokeys_remove,
.driver = {
.name = "hellokeys",
.of_match_table = hellokeys_of_match,
},
};
Таким образом, если compatible = "arrow,hellokeys" в DT, то ядро автоматически вызывает probe() при загрузке модуля.
6.4. Названия и идентификация устройств
label— имя, отображаемое в user space или логахname— системное имя (например, в/sys/class/misc/mydev→ mydev)unit address— часть DT-имени после@(например, hellokeys@0), нужна для уникальности, но не влияет на поиск.
6.5. Итог
Linux строит связку: Device Tree → Bus (platform) → Driver → Device → SysFS
Это позволяет драйверам и ядру динамически определять оборудование и связывать его с нужным кодом.
Следующий шаг: изучим работу с class, uevent, ioctl, sysfs и UIO в следующих разделах главы 5.