какая польза от «of_match_ptr ()» в драйверах устройств

#c #linux #linux-device-driver #device #device-tree

#c #linux #linux-device-driver #устройство #дерево устройств

Вопрос:

Во время моей работы с драйверами устройств я узнал, что of_match_table() это указывает на кортеж строк совместимости.

Однако я не смог найти важность of_match_ptr() .

Комментарии:

1. Это не важно. Я мог бы дать ответ на это позже, но в 99% случаев это не требуется.

Ответ №1:

of_match_ptr() является ли макрос препроцессора определенным в include/linux/ of.h:

 #ifdef CONFIG_OF
#define of_match_ptr(_ptr)    (_ptr)
#else /* CONFIG_OF */
#define of_match_ptr(_ptr)    NULL
#endif /* CONFIG_OF */
 

Когда ядро скомпилировано с деревом устройств и открытой поддержкой прошивки, т.Е. CONFIG_OF=y Это приведет к переданному указателю. В противном случае это приведет к НУЛЮ.

Использование макроса вместо прямой передачи указателя заключается в защите of_match_table элемента. Существуют драйверы шин, которые проверяют of_match_table значение NULL, чтобы не разыменовывать недопустимый указатель.

Однако многие драйверы компилируются в дереве с помощью переключателя компиляции, определенного в их соответствующем Kconfig, от которого уже зависит CONFIG_OF . Например, переключатель компиляции драйвера для видеодекодера analog device ADV748X имеет такую зависимость:

 config VIDEO_ADV748X
    tristate "Analog Devices ADV748x decoder"
    depends on VIDEO_V4L2 amp;amp; I2C
    depends on OF
    select MEDIA_CONTROLLER
    select VIDEO_V4L2_SUBDEV_API
    select REGMAP_I2C
    select V4L2_FWNODE
    help
      V4L2 subdevice driver for the Analog Devices
      ADV7481 and ADV7482 HDMI/Analog video decoders.

      To compile this driver as a module, choose M here: the
      module will be called adv748x.
 

и опускает макрос в drivers/media/i2c/ adv748x /adv748x-core.c:

 static struct i2c_driver adv748x_driver = {
    .driver = {
        .name = "adv748x",
        .of_match_table = adv748x_of_table,
        .pm = amp;adv748x_pm_ops,
    },
    .probe_new = adv748x_probe,
    .remove = adv748x_remove,
};