platform_device_add()函数分析

转载 2012年03月31日 11:00:26

int platform_device_add(struct platform_device *pdev)
{
int i, ret = 0;

if (!pdev)    /*验证指针的有效性 */
   return -EINVAL;

if (!pdev->dev.parent)/*都说总线有两个链表,一个是设备链表(通过device 内嵌)一个是驱动链表(通过device_driver内嵌)这里如果pdev->dev.parent为0,说明设备链表还没有设备,因此处理办法是将platform_bus作为设备链表的开始,一直感觉platform_bus和platform_bus_type很难区分,不过在这里清楚了platform_bus是一个设备,platform_bus_type才是真正的总线*/
   pdev->dev.parent = &platform_bus;/*device 的父结点*/

pdev->dev.bus = &platform_bus_type;/*device 要挂接在platform_bus_type这个总线上拉,看到了,设备和总线是这么勾搭上滴,很直接,很干脆*/

if (pdev->id != -1)
   snprintf(pdev->dev.bus_id, BUS_ID_SIZE, "%s.%d", pdev->name,
    pdev->id);/*这个如果看不懂,可以参考LINUX的格式化输出的相关资料*/
else
   strlcpy(pdev->dev.bus_id, pdev->name, BUS_ID_SIZE);

for (i = 0; i < pdev->num_resources; i++) {
   struct resource *p, *r = &pdev->resource[i];

   if (r->name == NULL) /*name一般为NULL*/
    r->name = pdev->dev.bus_id; /*资源的名称赋值为pdev->dev.bus_id,如果一个platform_device有多个resource 则出现同名现象*/

   p = r->parent;
   if (!p) {   /*父资源为0,说明不是从一个大的资源里面切割出来的*/
    if (r->flags & IORESOURCE_MEM)
     p = &iomem_resource;
    else if (r->flags & IORESOURCE_IO)
     p = &ioport_resource;
   }

   if (p && insert_resource(p, r)) { /*如果从父资源里面切割失败,则进行如下处理*/
    printk(KERN_ERR
          "%s: failed to claim resource %d/n",
          pdev->dev.bus_id, i);
    ret = -EBUSY;
    goto failed;
   }
}

pr_debug("Registering platform device '%s'. Parent at %s/n",
   pdev->dev.bus_id, pdev->dev.parent->bus_id);

ret = device_add(&pdev->dev);/*资源也分配好了,准备工作也做足,终于可以把设备添加到设备链表里面了*/
if (ret == 0)
   return ret;

failed: /*失败处理*/
while (--i >= 0)
   if (pdev->resource[i].flags & (IORESOURCE_MEM|IORESOURCE_IO))
    release_resource(&pdev->resource[i]);
return ret;
}
EXPORT_SYMBOL_GPL(platform_device_add);


Linux设备模型之device_add

前言 linux设备模型是学习linux驱动的很重要的内容。了解这些
  • hongwazi_2010
  • hongwazi_2010
  • 2014年10月25日 23:24
  • 4717

Oracle所有分析函数

Oracle分析函数   Oracle分析函数——函数列表   SUM        :该函数计算组中表达式的累积和 MIN        :在一个组中的数据窗口中查找表达式的最小值 MA...
  • fujiakai
  • fujiakai
  • 2016年04月05日 17:20
  • 12163

Oracle 分析函数(11G)语法详解(转)

一、Oracle分析函数简介 1、分析函数,最早是从ORACLE8.1.6开始出现的,它的设计目的是为了解决诸如“累计计算”,“找出分组内百分比”,“前-N条查询”,“移动平均数计算”"...
  • yuanqingyu0123
  • yuanqingyu0123
  • 2013年04月12日 17:39
  • 5950

platform_device和platform_driver的注册过程,及probe函数何时调用的分析

转载来自: http://blog.chinaunix.net/uid-7828352-id-3833188.html add  platform_device之后,需要注意的一个地方是这里...
  • qq_20678703
  • qq_20678703
  • 2016年07月19日 15:12
  • 624

platform_device_系列函数及其设备注册的作用

platform_device_系列函数,实际上是注册了一个叫platform的虚拟总线。使用约定是如果一个不属于任何总线的设备,例如蓝牙,串口等设备,都需要挂在这个虚拟总线上。 driver/...
  • zhoujiaxq
  • zhoujiaxq
  • 2012年08月02日 10:15
  • 649

步步为营,分析平台设备初始化platform_device_register()

linux2.6.30外设等设备,会在上电的时候,整体初始化;然后,设备驱动初始化;再然后,系统运行的时候,设备的热插拔才会被系统识别。。。。 那么,系统上电时的设备初始化,如何进行。如何管理。 ...
  • linglongqiongge
  • linglongqiongge
  • 2015年06月09日 15:33
  • 1720

platform_device的注册详情分析

分类: 驱动分析 ================================ Author: taoyuetao Email: tao_yuetao@yahoo.com...
  • wbgxx
  • wbgxx
  • 2011年08月30日 16:03
  • 359

platform_device_add() VS platform_add_devices

platform_device_add() VS platform_add_devices() 均在kerne/drivers/base/platform.c中, platform_devic...
  • hengkong_horse
  • hengkong_horse
  • 2013年06月22日 11:24
  • 1690

Linux 2.6下的platform_driver和platform_device(结合G870加密磁头驱动分析)

首先介绍一下注册一个驱动的步骤: 1、定义一个platform_driver结构 2、初始化这个结构,指定其probe、remove等函数,并初始化其中的driver变量 3、实现其prob...
  • coolkids_2008
  • coolkids_2008
  • 2011年11月17日 17:26
  • 726

设备模型、设备与驱动关联的全过程分析 platform_device platform_driver driver bus关系

[cpp] view plaincopy 1.     平台驱动注册过程          具体的目录如下:      关于设备模型、设备与驱动关...
  • u011831651
  • u011831651
  • 2013年09月05日 10:58
  • 591
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:platform_device_add()函数分析
举报原因:
原因补充:

(最多只允许输入30个字)