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);

platform_device_add()函数分析相关推荐

  1. linux C函数之strdup函数分析【转】

    本文转载自:http://blog.csdn.net/tigerjibo/article/details/12784823 linux C函数之strdup函数分析 一.函数分析 1.函数原型: [c ...

  2. 【Android 逆向】Dalvik 函数抽取加壳 ( 类加载流程分析 | Class.cpp#findClassNoInit 函数 | DexFile.cpp#dexFindClass 函数分析 )

    文章目录 前言 一.Class.cpp#dvmDefineClass 函数分析 二.Class.cpp#findClassNoInit 函数分析 三.DexFile.cpp#dexFindClass ...

  3. 【Android 逆向】Dalvik 函数抽取加壳 ( 类加载流程分析 | DexPathList#findClass 函数分析 | DexFile#loadClassBinaryName 函数 )

    文章目录 前言 一.DexPathList.java#findClass 类加载函数源码分析 二.DexFile.java#loadClassBinaryName 函数源码分析 前言 上一篇博客 [A ...

  4. 【Android 逆向】整体加固脱壳 ( DexClassLoader 加载 dex 流程分析 | DexPathList 构造函数分析 | makeDexElements 函数分析 )

    文章目录 前言 一.DexPathList 构造函数分析 二.DexPathList.makeDexElements 函数分析 三.Element 类分析 前言 上一篇博客 [Android 逆向]整 ...

  5. 【Android 逆向】Android 逆向通用工具开发 ( adb forward 网络端口重定向命令 | PC 端逆向程序主函数分析 )

    文章目录 前言 一.adb forward 网络端口重定向命令 二.PC 端逆向程序主函数分析 前言 本篇博客重点分析 PC 端 hacktool 模块 ; 一.adb forward 网络端口重定向 ...

  6. 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 注入工具的 main 函数分析 )

    文章目录 一.注入流程 二.注入工具的 main 函数分析 一.注入流程 开始分析 [Android 逆向]Android 进程注入工具开发 ( 编译注入工具 | 编译结果文件说明 | 注入过程说明 ...

  7. 继承关系中的拷贝构造函数和赋值操作重载函数分析

    文章目录 1 继承关系中的拷贝构造函数和赋值操作重载函数分析 1 继承关系中的拷贝构造函数和赋值操作重载函数分析 在继承关系中,如果子类未实现拷贝构造函数,那么在子类进行拷贝构造操作时,会直接调用父类 ...

  8. Windows事件等待学习笔记(三)—— WaitForSingleObject函数分析

    Windows事件等待学习笔记(三)-- WaitForSingleObject函数分析 要点回顾 WaitForSingleObject NtWaitForSingleObject KeWaitFo ...

  9. fprintf/fscanf函数分析

    fprintf/fscanf函数分析 宗旨:技术的学习是有限的,分享的精神是无限的. fprintf/fscanf函数与printf/scanf区别:printf/scanf专门针对标准输入输出流,f ...

最新文章

  1. IIS监控--自动重启脚本工具
  2. 架构师之路 — API 经济 — Web、HTTP Server、API Service、Application
  3. CentOS6.5 升级 Python 2.7 版本
  4. 取得select框的text
  5. android 绘制5格电量,Android 如何把状态栏信号格改为5格
  6. 2019 DDCTF 部分writeup
  7. python显示小数点后几位数_Python编程从入门到实践-连载1(变量和简单数据类型)...
  8. mysql中varbinary、binary、char、varchar异同
  9. paip.android APK安装方法大总结系统应用的安装
  10. 使用Android制作视频播放器
  11. 关系抽取(分类)总结【转载】
  12. linux下thinkpad X1 carbon 2018 电源管理
  13. Python利用模糊查询两个excel文件数据 导出新表格
  14. LM75AD温度传感器读写
  15. tof摄像头手势识别_全面解析深度摄像头(TOF Camera)的原理
  16. 云计算、大数据和人工智能之间的关系
  17. 优秀!95后程序员月薪2万背电脑送外卖,送单途中修bug!
  18. 关于Eclipse的使用入门
  19. 图像增强——伽马变换
  20. Webots平台下NAO机器人仿真环境的搭建

热门文章

  1. python怎么弄成白色背景_使用PIL python将白色背景转换为透明背景
  2. php gdb strace抓包,gdb,strace那些不常用的功能
  3. python将数组传入mysql_通过python将文件中的数据传输到MySQL,传到,mysql
  4. mysql相关知识点_mysql相关知识点整理
  5. 在STM8单片机中自己实现 printf()函数功能
  6. 铁路系统的在线检测系统讲座
  7. C++ 动态申请数组
  8. 【Qt】QTableView中嵌入复选框CheckBox 的四种方法总结
  9. QTextEdit设置最大可输入字符
  10. 在ASP.NET中面向对象的编程思想