platform_device_add()函数分析
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()函数分析相关推荐
- linux C函数之strdup函数分析【转】
本文转载自:http://blog.csdn.net/tigerjibo/article/details/12784823 linux C函数之strdup函数分析 一.函数分析 1.函数原型: [c ...
- 【Android 逆向】Dalvik 函数抽取加壳 ( 类加载流程分析 | Class.cpp#findClassNoInit 函数 | DexFile.cpp#dexFindClass 函数分析 )
文章目录 前言 一.Class.cpp#dvmDefineClass 函数分析 二.Class.cpp#findClassNoInit 函数分析 三.DexFile.cpp#dexFindClass ...
- 【Android 逆向】Dalvik 函数抽取加壳 ( 类加载流程分析 | DexPathList#findClass 函数分析 | DexFile#loadClassBinaryName 函数 )
文章目录 前言 一.DexPathList.java#findClass 类加载函数源码分析 二.DexFile.java#loadClassBinaryName 函数源码分析 前言 上一篇博客 [A ...
- 【Android 逆向】整体加固脱壳 ( DexClassLoader 加载 dex 流程分析 | DexPathList 构造函数分析 | makeDexElements 函数分析 )
文章目录 前言 一.DexPathList 构造函数分析 二.DexPathList.makeDexElements 函数分析 三.Element 类分析 前言 上一篇博客 [Android 逆向]整 ...
- 【Android 逆向】Android 逆向通用工具开发 ( adb forward 网络端口重定向命令 | PC 端逆向程序主函数分析 )
文章目录 前言 一.adb forward 网络端口重定向命令 二.PC 端逆向程序主函数分析 前言 本篇博客重点分析 PC 端 hacktool 模块 ; 一.adb forward 网络端口重定向 ...
- 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 注入工具的 main 函数分析 )
文章目录 一.注入流程 二.注入工具的 main 函数分析 一.注入流程 开始分析 [Android 逆向]Android 进程注入工具开发 ( 编译注入工具 | 编译结果文件说明 | 注入过程说明 ...
- 继承关系中的拷贝构造函数和赋值操作重载函数分析
文章目录 1 继承关系中的拷贝构造函数和赋值操作重载函数分析 1 继承关系中的拷贝构造函数和赋值操作重载函数分析 在继承关系中,如果子类未实现拷贝构造函数,那么在子类进行拷贝构造操作时,会直接调用父类 ...
- Windows事件等待学习笔记(三)—— WaitForSingleObject函数分析
Windows事件等待学习笔记(三)-- WaitForSingleObject函数分析 要点回顾 WaitForSingleObject NtWaitForSingleObject KeWaitFo ...
- fprintf/fscanf函数分析
fprintf/fscanf函数分析 宗旨:技术的学习是有限的,分享的精神是无限的. fprintf/fscanf函数与printf/scanf区别:printf/scanf专门针对标准输入输出流,f ...
最新文章
- IIS监控--自动重启脚本工具
- 架构师之路 — API 经济 — Web、HTTP Server、API Service、Application
- CentOS6.5 升级 Python 2.7 版本
- 取得select框的text
- android 绘制5格电量,Android 如何把状态栏信号格改为5格
- 2019 DDCTF 部分writeup
- python显示小数点后几位数_Python编程从入门到实践-连载1(变量和简单数据类型)...
- mysql中varbinary、binary、char、varchar异同
- paip.android APK安装方法大总结系统应用的安装
- 使用Android制作视频播放器
- 关系抽取(分类)总结【转载】
- linux下thinkpad X1 carbon 2018 电源管理
- Python利用模糊查询两个excel文件数据 导出新表格
- LM75AD温度传感器读写
- tof摄像头手势识别_全面解析深度摄像头(TOF Camera)的原理
- 云计算、大数据和人工智能之间的关系
- 优秀!95后程序员月薪2万背电脑送外卖,送单途中修bug!
- 关于Eclipse的使用入门
- 图像增强——伽马变换
- Webots平台下NAO机器人仿真环境的搭建
热门文章
- python怎么弄成白色背景_使用PIL python将白色背景转换为透明背景
- php gdb strace抓包,gdb,strace那些不常用的功能
- python将数组传入mysql_通过python将文件中的数据传输到MySQL,传到,mysql
- mysql相关知识点_mysql相关知识点整理
- 在STM8单片机中自己实现 printf()函数功能
- 铁路系统的在线检测系统讲座
- C++ 动态申请数组
- 【Qt】QTableView中嵌入复选框CheckBox 的四种方法总结
- QTextEdit设置最大可输入字符
- 在ASP.NET中面向对象的编程思想