Linux设备驱动模型,主要函数分析

整个驱动模型中,最核心的三个函数分别是

__bus_register、driver_register、device_register

int __bus_register(struct bus_type *bus, struct lock_class_key *key)

retval = kobject_set_name(&priv->subsys.kobj, "%s", bus->name);//设置总线的名字

retval = kset_register(&priv->subsys);//注册总线容器

priv->devices_kset = kset_create_and_add("devices", NULL,&priv->subsys.kobj);//创建一个在总线目录下的devices目录

priv->drivers_kset = kset_create_and_add("drivers", NULL,&priv->subsys.kobj);//创建一个在总线目录下的drivers目录

klist_init(&priv->klist_devices, klist_devices_get, klist_devices_put);//初始化设备链表

klist_init(&priv->klist_drivers, NULL, NULL);//初始化驱动程序链表

int driver_register(struct device_driver *drv)//注册driver到总线bus上

other = driver_find(drv->name, drv->bus);//查找是否已注册进总线

ret = bus_add_driver(drv);//此时总线上没注册该driver,开始注册driver

klist_init(&priv->klist_devices, NULL, NULL);//初始化设备链表

error = kobject_init_and_add(&priv->kobj, &driver_ktype, NULL,"%s", drv->name);//在driver目录中建立一个drv->name目录

error = driver_attach(drv);//进行driver和device的连接

bus_for_each_dev(drv->bus, NULL, drv, __driver_attach);//遍历每个device并且调用__driver_attach

__driver_attach

driver_match_device(drv, dev)//匹配driver和device的名字

driver_probe_device(drv, dev);//匹配成功则调用探测函数probe

klist_add_tail(&priv->knode_bus, &bus->p->klist_drivers);//将driver放进总线klist_drivers中

int device_register(struct device *dev)//注册device到总线上

device_initialize(dev);//初始化设备

device_add(dev);//添加device到bus中

bus_probe_device(dev);//进行driver和device的连接

device_attach(dev);

bus_for_each_drv(dev->bus, NULL, dev, __device_attach);//遍历每个driver并且调用__device_attach

__device_attach

driver_match_device(drv, dev)//匹配driver和device的名字

driver_probe_device(drv, dev);//匹配成功则调用探测函数probe

klist_add_tail(&dev->p->knode_parent,&parent->p->klist_children);

klist_add_tail(&dev->knode_class,&dev->class->p->klist_devices);//将device添加进总线klist_devices中

linux设备驱动模型及其他,Linux设备驱动模型相关推荐

  1. linux内核部件分析(十)——设备驱动模型之class,linux内核部件分析(十)——设备驱动模型之class...

    前面看过了设备驱动模型中的bus.device.driver,这三种都是有迹可循的.其中bus代表实际的总线,device代表实际的设备和接口,而driver则对应存在的驱动.但本节要介绍的class ...

  2. 【嵌入式Linux】嵌入式Linux驱动开发基础知识之设备树模型

    文章目录 前言 1.设备树的作用 2.设备树的语法 2.1.设备树的逻辑图和dts文件.dtb文件 2.1.1.1Devicetree格式 1DTS文件的格式 node的格式 properties的格 ...

  3. Linux驱动——驱动分离思想和总线设备驱动模型

    驱动分离思想: 在传统的字符设备驱动思想中一个驱动程序对应一个硬件资源,在驱动入口函数中对资源进行配置,在file_operation中对各个硬件资源进行操作.这种思想使得内核中驱动代码变得庞大,为了 ...

  4. linux一个spi总线挂多个设备,Linux SPI总线设备驱动模型详解

    随着技术不断进步,系统的拓扑结构越来越复杂,对热插拔.跨平台移植性的要求越来越高,早期的内核难以满足这些要求,从linux2.6内核开始,引入了总线设备驱动模型.其实在linux2.4总线的概念就已经 ...

  5. linux 设备模型 不上,Linux设备模型--驱动

    linux中每个设备驱动由一个structdevice_driver描述: structdevice_driver { constchar*name;//设备驱动程序的名称 structbus_typ ...

  6. Linux设备驱动模型2——总线式设备驱动组织方式

    以下内容源于朱有鹏嵌入式课程的学习,如有侵权,请告知删除. 更深入理解资料:http://blog.csdn.net/oqqhutu12345678/article/details/78933386 ...

  7. 嵌入式Linux设备驱动程序:在运行时读取驱动程序状态

    嵌入式Linux设备驱动程序:在运行时读取驱动程序状态 Embedded Linux device drivers: Reading driver state at runtime 在运行时了解驱动程 ...

  8. Linux SPI总线和设备驱动架构之三:SPI控制器驱动

    通过第一篇文章,我们已经知道,整个SPI驱动架构可以分为协议驱动.通用接口层和控制器驱动三大部分.其中,控制器驱动负责最底层的数据收发工作,为了完成数据的收发工作,控制器驱动需要完成以下这些功能: 1 ...

  9. Linux设备驱动程序学习-Linux设备模型(总线、设备、驱动程序和类)

    文章的例子和实验使用<LDD3>所配的lddbus模块(稍作修改). 总线 总线是处理器和一个或多个设备之间的通道,在设备模型中, 所有的设备都通过总线相连, 甚至是内部的虚拟" ...

  10. Linux USB设备驱动程序设计 和 USB下载线驱动设计

    Linux USB设备驱动程序设计 和 USB下载线驱动设计 USB设备驱动模型 USB设备包括配置(configuration).接口(interface)和端点(endpoint),一个USB设备 ...

最新文章

  1. Linux服务器上监控网络带宽的18个常用命令
  2. 服务器负载均衡(1)
  3. 华为鸿蒙智慧屏评价,华为智慧屏 S真实感受曝光评测,不看后悔死了!
  4. 【J2ME 2D 游戏开发系列】◣HIMI游戏开发启蒙教程◢JAVA零基础学习J2ME游戏开发全过程!...
  5. 语音通话框架_普通话考试得高分的方法
  6. Python安装pyinstaller模块的错误:NO module name “setuptools“
  7. linux下echo与time服务的程序实现
  8. (Ajax)axios源码简析(三)——请求与取消请求
  9. 一文看懂响应率模型开发内容
  10. 均匀三次b样条曲线_西门子数控曲线加工进给速度优化指令
  11. 树(2)-----leetcode(层、深度、节点)
  12. VisualStudio2017专业版和企业版激活密钥
  13. C语言实验源程序保存,c语言实验1程序开发环境.doc
  14. 计算机二级vf查询,计算机二级《VFP》知识点讲解:查询和视图
  15. java脚本引擎Rhino 入门
  16. U盘安装Windows10系统报错无法打开文件install.wim原因及解决办法
  17. android百度地图行政区填充颜色
  18. :6W2H八何分析法
  19. 出资人与借款人管理系统,功能需求说明文档
  20. AE基础教程第一阶段——01影视后期专业导论

热门文章

  1. internetreadfile读取数据长度为0_Go发起HTTP2.0请求流程分析(后篇)——标头压缩
  2. IOS证书/私钥/代码签名/描述文件
  3. 使用Qunit对JavaScript进行单元测试
  4. Windows Mobile 开发系列文章收藏 - Windows Mobile 6.x
  5. mybatis11--多对多关联查询
  6. 实际操作更改Linux启动模式
  7. Exchange server 2003迁移到2010无路由组连接器
  8. ExtJs五(ExtJs Mvc登录优化)
  9. 浅谈Android binder原理与设计 (1)
  10. adb interface找不到驱动程序_Windows 10现支持更多设备的驱动程序更新