linux设备管理源码,Linux设备管理(三)_总线设备的挂接

扒完了Linux字符设备,我们来看看平台总线设备,平台总线是Linux中的一种虚拟总线,我们知道,总线+设备+驱动是Linux驱动模型的三大组件,设计这样的模型就是将驱动代码和设备信息相分离,对于稍微复杂一点的驱动,都要使用这种结构,我在"Linux设备管理(一)_kobject, kset,kobj_type分析"一文中提到过将一个设备或驱动挂载到总线就是将这个设备或驱动的kobject挂接到相应的总线kset下的设备kset或驱动kset中,本文就扒一扒内核中注册一个平台设备的源码,验证一下这个说法。整体的调用关系是:platform_device_register()->platform_device_add()->device_add()->kobject_add()

platform_device_register()

在平台设备编程模型中,我们将我们数据封装到一个platform_device结构中后,就可以将设备对象注册到平台总线上

platform_device_register()

--461--> device_initialize()初始化平台设备的父类device结构

--463--> platform_device_add(pdev)将设备挂接到总线设备链表,即注册

//drivers/base/platform.c

37 struct device platform_bus = {

38 .init_name = "platform",

39 };

459 int platform_device_register(struct platform_device *pdev)

460{

461 device_initialize(&pdev->dev);

462 arch_setup_pdev_archdata(pdev);

463 return platform_device_add(pdev);

464 }

device_initialize()主要是对平台设备的父类device结构进行一些初始化工作

device_initialize()

--702-->dev->kobj.kset = devices_kset;使用全局的devices_kset对象初始化设备的kset中

--703-->kobject_init(&dev->kobj, &device_ktype);使用全局的device_ktype对象初始化设备的kobj对应的kobj_type

--704-->INIT_LIST_HEAD(&dev->dma_pools);初始化设备list_head结构,用于后序的链接

//drivers/base/core.c

700 void device_initialize(struct device *dev)

701{

702 dev->kobj.kset = devices_kset;

703 kobject_init(&dev->kobj, &device_ktype);

704 INIT_LIST_HEAD(&dev->dma_pools);

...

714 }

platform_device_add()

这个函数才开始真正把平台设备对象挂接到平台总线上

platform_device_add()

--353-->使新的设备的kobject->parent指向全局的平台设备kobject对象

--355-->使设备的总线类型指针指向平台总线对象

--403-->将设备挂接到相应的总线

//drivers/base/platform.c

345 int platform_device_add(struct platform_device *pdev)

346 {

347 int i, ret;

...

352 if (!pdev->dev.parent)

353 pdev->dev.parent = &platform_bus; //挂到平台总线

354

355 pdev->dev.bus = &platform_bus_type;

...

403 ret = device_add(&pdev->dev);

404 if (ret == 0)

405 return ret;

...

421 }

device_add()

之前的工作已经准备好了一个平台设备对象,接下来的工作就是将这个设备挂接到总线上,注册任务就算完成了。

device_add()

--1074-->将设备的kobj挂接到之前填充好的parent的链表中,即平台总线的链表。

//drivers/base/platform.c

1025 int device_add(struct device *dev)

1026{

1027 struct device *parent = NULL;

1028 struct kobject *kobj;

1029 struct class_interface *class_intf;

1030 int error = -EINVAL;

1031

1032 dev = get_device(dev);

...

1071

1072 /* first, register with generic layer. */

1073 /* we require the name to be set before, and pass NULL */

1074 error = kobject_add(&dev->kobj, dev->kobj.parent, NULL);

...

1138 done:

1139 put_device(dev);

1140 return error;

0b1331709591d260c1c78e86d0c51c18.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在前一个版本的设备在线管理系统上,修正了页数显示不正确,首页java树状分类导航连接错误、分页面导航栏导航错误等严重bug,优化了调用较多的class3.asp页面,添加了“系统初始化”功能。相信能使您的使用更加愉快。**********************************************************************设备参数说明在线管理系统前台介绍: 具备友好的前台操作界面,实现方便轻松的网上工作环境:分类浏览设备,具有级树状分类,java动态显示,多种导航方式,范围更加精确使用搜索工具精确查找设备,可按设备名称、设备分类、设备简介等单条件或组合条件,结合关键字模糊搜索关键字自动动态更新显示设备照片,更加形象可打印设备的详细信息提供用户注册,注册后的用户可以将选定的设备加入自己的收藏,便于再次查询具有多个设备的分类展示区查阅设备详细信息,可以对设备发表评论,从而获知设备的使用情况反馈投票模块便于调查和信息反馈 完善的留言系统,便于各种意见的反映java时钟**********************************************************************设备参数说明在线管理系统后台介绍: 可进行全系统整体颜色修改,背景图片的修改添加、删除、修改,移动设备个级别的分类在线添加、(批量)删除、修改设备,集成了eWebEditor使得设备的添加、删除、修改更加便利且功能强大集成设备属性管理;可以查看、删除、修改用户资料可以发布系统消息给每名用户管理员分个不同的权限等级, 使系统管理更加灵活安全统计所有分类中设备数,并在前台显示添加修改首页新闻,首页公告 可以编辑删除设备评论以及用户留言 首页显示图片均可由后台管理 可完成关键词添加、说明添加,LOGO大小图片添加 管理系统文字友情链接和图片友情链接在线设定多种辅助信息,如使用帮助等系统初始化可方便删除系统数据库中所有数据探测远程服务器,空间查看,便于远程了解服务器的工作状况 。。。。。。还有很多其他功能,希望使用愉快!**********************************************************************后台登陆:/admin/index.asp超级管理员 admin 密码 admin

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值