山高疑日近,海阔觉天低

platform驱动开发

一.驱动分离

对于 Linux 这样一个成熟、庞大、复杂的操作系统,代码的重用性非常重要,否则的话就会在 Linux 内核中存在大量无意义的重复代码。尤其是驱动程序,因为驱动程序占用了 Linux内核代码量的大头,如果不对驱动程序加以管理,任由重复的代码肆意增加,那么用不了多久Linux 内核的文件数量就庞大到无法接受的地步

前面我们讲了设备驱动的分离,并且引出了总线(bus)、驱动(driver)和设备(device)模型,比如 I2C、SPI、USB 等总线。但是在 SOC 中有些外设是没有总线这个概念的,但是又要使用总线、驱动和设备模型该怎么办呢?为了解决此问题,Linux 提出了 platform 这个虚拟总线,相应的就有 platform_driver 和 platform_device

二.platform 总线定义

Linux系统内核使用bus_type 结构体表示总线,此结构体定义在文件 include/linux/device.h,bus_type 结构体内容如下:

struct bus_type platform_bus_type = {
  .name = "platform",
  .dev_groups = platform_dev_groups,
  .match = platform_match,
  .uevent = platform_uevent,
  .pm = &platform_dev_pm_ops,
};

三.platform 总线匹配方式

比较重要的是platform_match函数,用来匹配设备与设备驱动:

static int platform_match(struct device *dev,struct device_driver *drv)
{
  struct platform_device *pdev = to_platform_device(dev);
  struct platform_driver *pdrv = to_platform_driver(drv);
  /*When driver_override is set,only bind to the matching driver*/
  if (pdev->driver_override)
    return !strcmp(pdev->driver_override, drv->name);
  /* Attempt an OF style match first */
  if (of_driver_match_device(dev, drv))
    return 1;
  /* Then try ACPI style match */
  if (acpi_driver_match_device(dev, drv))
    return 1;
  /* Then try to match against the id table */
  if (pdrv->id_table)
    return platform_match_id(pdrv->id_table, pdev) != NULL;
  /* fall-back to driver name match */
   return (strcmp(pdev->name, drv->name) == 0);
}

四.结构体

赞(0) 打赏
未经允许不得转载:Mr.Zhang » platform驱动开发

相关推荐

  • 暂无文章

你的打赏是我的动力

登录

找回密码

注册