总线设备驱动模型---platform篇

本文深入探讨Linux操作系统中的平台驱动模型,阐述其在总线设备驱动中的作用和实现机制,帮助读者理解Linux内核如何管理与硬件交互的底层细节。
摘要由CSDN通过智能技术生成
2012-09-02 10:57:50

分类: LINUX

    linux从2.6起就加入了一套新的驱动管理和注册的机制platform平台总线,是一条虚拟的总线,设备用platform_device表示,驱 动用platform_driver进行注册。于传统的bus/device/driver机制相比,platform由内核进行统一管理,在驱动中使用 资源,提高了代码的安全性和可移植性。
下面来看看内核时怎么注册platform总线的过程

点击(此处)折叠或打开

  1. int __init platform_bus_init(void)
  2. {
  3.     int error;

  4.     early_platform_cleanup();

  5.     error = device_register(&platform_bus);//注册了platform的设备
  6.     if (error)
  7.         return error;
  8.     error = bus_register(&platform_bus_type);//注册了platform总线
  9.     if (error)
  10.         device_unregister(&platform_bus);
  11.     return error;
  12. }

点击(此处)折叠或打开

  1. struct device platform_bus = {
  2.     .init_name    = "platform",
  3. };

点击(此处)折叠或打开

  1. struct bus_type platform_bus_type = {
  2.     .name        = "platform",
  3.     .dev_attrs    = platform_dev_attrs,
  4.     .match        = platform_match,
  5.     .uevent        = platform_uevent,
  6.     .pm        = &platform_dev_pm_ops,
  7. };
其过程和总线的注册过程差不多,驱动和设备匹配后,调用platform的match函数。由传统的机制,也不难总结出platform的开发流程为
1、定义一个platform_device,并注册
2、定义一个platform_driver,并注册
定义platform_device过程

点击(此处)折叠或打开

  1. struct platform_device *platform_device_alloc(const char *name, int id)
  2. {
  3.     struct platform_object *pa;

  4.     pa = kzalloc(sizeof(struct platform_object) + strlen(name), GFP_KERNEL);
  5.     if (pa) {
  6.         strcpy(pa->name, name);
  7.         pa->pdev.name = pa->name;
  8.         pa->pdev.id = id;
  9.         device_initialize(&pa->pdev.dev);
  10.         pa->pdev.dev.release = platform_device_release;
  11.         arch_setup_pdev_archdata(&pa->pdev);
  12.     }

  13.     return pa ? &pa->pdev : NULL;
  14. }
下面首先来看看platform_device的注册过程

点击(此处)折叠或打开

  1. struct platform_device {
  2.     const char    * name;                  //设备名
  3.     int        id;                         //设备ID
  4.     struct device    dev;
  5.     u32        num_resources;              //设备使用的资源的数目
  6.     struct resource    * resource;         //设备使用的资源

  7.     const struct platform_device_id    *id_entry;

  8.     /* MFD cell pointer */
  9.     struct mfd_cell *mfd_cell;

  10.     /* arch specific additions */
  11.     struct pdev_archdata    archdata;
  12. };

点击(此处)折叠或打开

  1. struct resource {
  2.     resource_size_t start;
  3.     resource_size_t end;
  4.     const char *name;
  5.     unsigned long flags;
  6.     struct resource *parent, *sibling, *child;
  7. };
在struct resource结构中我们通常只关心start、end和flags这3个字段,分别表示资源的开始值、结束值和类型,flags可以用内存资源,IO资源,中断资源等。

点击(此处)折叠或打开

  1. int platform_device_register(struct platform_device *pdev)
  2. {
  3.     device_initialize(&pdev->dev);//dev初始化
  4.     arch_setup_pdev_archdata(pdev);
  5.     return platform_device_add(pdev);//加入到dev链表
  6. }

点击(此处)折叠或打开

  1. int platform_device_add(struct platform_device *pdev)
  2. {
  3.     int i, ret = 0;

  4.     if (!pdev)
  5.         return -EINVAL;

  6.     if
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值