Linux内核中的platform机制

出处:mohanwei 发布于:2009-12-31 14:14:47

  从Linux 2.6起引入了一套新的驱动管理和注册机制:platform_device和platform_driver。Linux中大部分的设备驱动,都可以使用这套机制,设备用platform_device表示,驱动用platform_driver进行注册。

  Linux platform. driver机制和传统的device driver 机制(通过driver_register函数进行注册)相比,一个十分明显的优势在于platform机制将设备本身的资源注册进内核,由内核统一管理,在驱动程序中使用这些资源时通过platform. device提供的标准接口进行申请并使用。这样提高了驱动和资源管理的独立性,并且拥有较好的可移植性和安全性(这些标准接口是安全的)。platform机制的本身使用并不复杂,由两部分组成:platform_device和platfrom_driver。通过platform机制开发底层设备驱动的大致流程如图所示。

  图 platform机制开发驱动流程

  platform_device结构体用来描述设备的名称、资源信息等。该结构被定义在include/linux/platform_device.h中,定义原型如下:

  struct platform_device {

  const char * name;    //定义平台设备的名称

  int id;

  struct device dev;

  u32 num_resources;

  struct resource * resource; //定义平台设备的资源。

  };

  下面来看一下platform_device结构体中重要的一个成员struct resource * resource。struct resource被定义在include/linux/ioport.h中,定义原型如下:

  struct resource {

  resource_size_t start;  //定义资源的起始地址

  resource_size_t end;  //定义资源的结束地址

  const char *name;    //定义资源的名称

  unsigned long flags; //定义资源的类型,比如MEM,IO,IRQ,DMA类型

  struct resource *parent, *sibling, *child;  //资源链表指针

  };

  通过调用函数platform_add_devices()向系统中添加该设备了,该函数内部调用platform_device_register( )进行设备注册。要注意的是,这里的platform_device设备的注册过程必须在相应设备驱动加载之前被调用,即执行platform_driver_register()之前,原因是驱动注册时需要匹配内核中所有已注册的设备名。

  接下来来看platform_driver结构体的原型定义,在include/linux/platform_device.h中,代码如下:

  struct platform_driver {

  int (*probe)(struct platform_device *);

  int (*remove)(struct platform_device *);

  void (*shutdown)(struct platform_device *);

  int (*suspend)(struct platform_device *, pm_message_t state);

  int (*suspend_late)(struct platform_device *, pm_message_t state);

  int (*resume_early)(struct platform_device *);

  int (*resume)(struct platform_device *);

  struct device_driver driver;

  };

  内核提供的platform_driver结构体的注册函数为platform_driver_register(),其原型定义在driver/base/platform.c文件中,具体实现代码如下:

  int platform_driver_register(struct platform_driver *drv)

  {

  drv->driver.bus = &platform_bus_type;

  if (drv->probe)

  drv->driver.probe = platform_drv_probe;

  if (drv->remove)

  drv->driver.remove = platform_drv_remove;

  if (drv->shutdown)

  drv->driver.shutdown = platform_drv_shutdown;

  if (drv->suspend)

  drv->driver.suspend = platform_drv_suspend;

  if (drv->resume)

  drv->driver.resume = platform_drv_resume;

  return driver_register(&drv->driver);

  }

  总结,通常情况下只要和内核本身运行依赖性不大的外围设备,相对独立的,拥有各自独自的资源(地址总线和IRQs),都可以用platform_driver实现。如:LCD网卡、USB、UART等,都可以用platfrom_driver写,而timer,irq等小系统之内的设备则不用platfrom_driver机制。


  

版权与免责声明

凡本网注明“出处:维库电子市场网”的所有作品,版权均属于维库电子市场网,转载请必须注明维库电子市场网,https://www.dzsc.com,违反者本网将追究相关法律责任。

本网转载并注明自其它出处的作品,目的在于传递更多信息,并不代表本网赞同其观点或证实其内容的真实性,不承担此类作品侵权行为的直接责任及连带责任。其他媒体、网站或个人从本网转载时,必须保留本网注明的作品出处,并自负版权等法律责任。

如涉及作品内容、版权等问题,请在作品发表之日起一周内与本网联系,否则视为放弃相关权利。

上传BOM文件: BOM文件
*公司名:
*联系人:
*手机号码:
QQ:
应用领域:

有效期:
OEM清单文件: OEM清单文件
*公司名:
*联系人:
*手机号码:
QQ:
有效期:

扫码下载APP,
一键连接广大的电子世界。

在线人工客服

买家服务:
卖家服务:

0571-85317607

客服在线时间周一至周五
9:00-17:30

关注官方微信号,
第一时间获取资讯。

建议反馈

联系人:

联系方式:

按住滑块,拖拽到最右边
>>
感谢您向阿库提出的宝贵意见,您的参与是维库提升服务的动力!意见一经采纳,将有感恩红包奉上哦!