列出绑定到驱动程序的所有设备
List all devices bound to a driver
假设我在 Linux 内核 space 中有驱动程序 A 和 B,并绑定了设备。我想将驱动程序 A 中的 API 导出到 B 以提供绑定到驱动程序 A 的设备列表。驱动程序 A 是否有可能了解当前检测到并绑定到该驱动程序的所有设备?
是的,只需在 driver B 加载时向 A 注册函数,并在需要设备列表时调用相同的函数。
例如
Driver <<< register_func(func_ptr_list);导出 register_func
Driver B <<< 使用函数列表调用 register_func。
多个 driver 使用相似的功能元素相互交谈。例如查看 module_int 的 cxgb4 和 cxgb4i
如果你的驱动是pci驱动,那么:
void get_all_devices_of_driver(const char *driver_name)
{
bool found = false;
struct pci_dev *pdev = NULL;
for_each_pci_dev (pdev) {
if (!strcmp(dev_driver_string(&pdev->dev),
driver_name)) {
// do what you want
}
}
}
或者使用内核的通用辅助函数:
/**
* driver_for_each_device - Iterator for devices bound to a driver.
* @drv: Driver we're iterating.
* @start: Device to begin with
* @data: Data to pass to the callback.
* @fn: Function to call for each device.
*
* Iterate over the @drv's list of devices calling @fn for each one.
*/
int driver_for_each_device(struct device_driver *drv, struct device *start,
void *data, int (*fn)(struct device *, void *))
{
struct klist_iter i;
struct device *dev;
int error = 0;
if (!drv)
return -EINVAL;
klist_iter_init_node(&drv->p->klist_devices, &i,
start ? &start->p->knode_driver : NULL);
while (!error && (dev = next_device(&i)))
error = fn(dev, data);
klist_iter_exit(&i);
return error;
}
假设我在 Linux 内核 space 中有驱动程序 A 和 B,并绑定了设备。我想将驱动程序 A 中的 API 导出到 B 以提供绑定到驱动程序 A 的设备列表。驱动程序 A 是否有可能了解当前检测到并绑定到该驱动程序的所有设备?
是的,只需在 driver B 加载时向 A 注册函数,并在需要设备列表时调用相同的函数。 例如
Driver <<< register_func(func_ptr_list);导出 register_func Driver B <<< 使用函数列表调用 register_func。
多个 driver 使用相似的功能元素相互交谈。例如查看 module_int 的 cxgb4 和 cxgb4i
如果你的驱动是pci驱动,那么:
void get_all_devices_of_driver(const char *driver_name)
{
bool found = false;
struct pci_dev *pdev = NULL;
for_each_pci_dev (pdev) {
if (!strcmp(dev_driver_string(&pdev->dev),
driver_name)) {
// do what you want
}
}
}
或者使用内核的通用辅助函数:
/**
* driver_for_each_device - Iterator for devices bound to a driver.
* @drv: Driver we're iterating.
* @start: Device to begin with
* @data: Data to pass to the callback.
* @fn: Function to call for each device.
*
* Iterate over the @drv's list of devices calling @fn for each one.
*/
int driver_for_each_device(struct device_driver *drv, struct device *start,
void *data, int (*fn)(struct device *, void *))
{
struct klist_iter i;
struct device *dev;
int error = 0;
if (!drv)
return -EINVAL;
klist_iter_init_node(&drv->p->klist_devices, &i,
start ? &start->p->knode_driver : NULL);
while (!error && (dev = next_device(&i)))
error = fn(dev, data);
klist_iter_exit(&i);
return error;
}