打印

[转载]Linux内核中的platform机制

[复制链接]
1764|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
杜_U_ME|  楼主 | 2011-11-30 08:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
从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_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机制。
转自:http://www.dzsc.com/data/html/2009-12-31/81251.html

相关帖子

沙发
加班加点| | 2011-11-30 19:10 | 只看该作者
linux离我太远,搞不定

使用特权

评论回复
板凳
五谷道场| | 2011-11-30 19:13 | 只看该作者
有个问题就是我在有的驱动里面只看到了平台设备驱动的注册程序,而没有见到平台设备注册函数,这又是什么原因呢?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

640

帖子

1

粉丝