linux设备驱动

七种Linux设备驱动模型之——Device 同时为了统一方便管理又将设备分为block和char设备,生成的内核对象分别为sysfs_dev_block_kobj和sysfs_dev_char_kobj。如果此设备不属于任何总线,直接就返回,否则添加设备属性,创建链接文件,将此bus下的设备添加到klist_devices链表中。主要是设置设备所属的kset,设置设备所属kset的ktype,初始化设备资源管理的链表,以及设备电源管理初始化。groups: 代码设备的属性,在添加设备的属性的时候,如果存在设备类型,也会添加设备类型的属性。 阅读详情

 原文出自(http://wsqhs.spaces.live.com/blog/cns!94F639580F58209C!561.entry)

 

关于这一部分 的blog,所有的内容均摘自自己的工作总结笔记,在很多网站都发现了自己写的技术总结的转载感到很高兴,虽然我还是个菜鸟,但是我会继续努力。另外关于 wlan驱动这方面的资料真的很少,我基本上是靠自己读代码来理解那些繁琐的寄存器读写、802.11/e/h/d等标准的,真的比较辛苦。不过好在算是 慢慢的搞清楚了这个流程,在此之前我们仍然要补习一下关于在2.6版本内核中写驱动的知识。
    有关linux设备模型这一块比较复杂,我不敢断定自己理解的肯定正确,但是我会在做这个驱动的过程中回过头来修改自己的笔记并且纠正自己在blog上贴 的并不正确的地方。另外,我的无线网卡是挂接在SDIO总线上的,所以呢,我们之前会先介绍一点SDIO的驱动,当然并不在这篇blog上,这篇blog 会是总领性的关于基础知识的介绍。下面是笔记:
    在进入正式的驱动代码之前,我们不得不补充一点基础知识,也就是在 2.6 版本内核的现在,内核是如何管理总线,驱动,设备之间的关系的,关于 bus_type 、 device_driver 、 device 这三个内核结构在内核代码中可以找到。由于这三个结构的重要性,我们在这里先将它们贴出来,我会用红色的注释标注。我在笔记中将会提到的一些结构成员以其代表的意义,这样便于对照。(我不得不承认,这三个结构的代码枯燥复杂,但我可以保证,在看完我总结的笔记之后,你会对这三个结构中重要的数据成员有个非常不错的了解,当然你得对内核和驱动有基本的了解。如果我误导了你,请指正我,所以我的建议是不妨先看完了笔记再来看这些结构)
  1、设备结构的定义:
struct device {
 struct klist  klist_children;        
 struct klist_node knode_parent;  /* node in sibling list */
 struct klist_node knode_driver;
 struct klist_node knode_bus;
 struct device  *parent;        
 struct kobject kobj;            //kobject结构,关于这个结构与kset结构以及subsystem结构,笔记中会有描述。
 char  bus_id[BUS_ID_SIZE ]; /* position on parent bus */
 struct device_type *type;
 unsigned   is_registered:1;
 unsigned   uevent_suppress:1;
 struct semaphore sem; /* semaphore to synchronize calls to
      * its driver.
      */
 struct bus_type * bus;  /* type of bus device is on */                   //这个设备挂接的总线的类型
 struct device_driver *driver; /* which driver has allocated this device */      //这个设备挂接的驱动
 void   *driver_data; /* data private to the driver */
 void   *platform_data; /* Platform specific data, device core doesn't touch it */
 struct dev_pm_info power;
#ifdef CONFIG_NUMA
 int   numa_node; /* NUMA node this device is close to */
#endif
 u64   *dma_mask; /* dma mask (if dma'able device) */
 u64   coherent_dma_mask;/ * Like dma_mask, but for
          alloc_coherent mappings as
          not all hardware supports
          64 bit addresses for consistent
          allocations such descriptors. */
 struct list_head dma_pools; /* dma pools (if dma'ble) */
 struct dma_coherent_mem *dma_mem; /* internal for coherent mem override */
 /* arch specific additions */
 struct dev_archdata archdata;
 spinlock_t  devres_lock;
 struct list_head devres_head;
 /* class_device migration path */
 struct list_head node;
 struct class  *class;
 dev_t    devt;  /* dev_t, creates the sysfs "dev" */
 struct attribute_group **groups; /* optional groups */
 void  (*release)(struct device * dev);
};
  2、设备驱动的结构:
struct device_driver {
 const char   * name;                                        //设备驱动的名字
 struct bus_type  * bus;                                    //设备驱动挂接的总线的类型
 struct kobject  kobj;                                      //kobject结构
 struct klist  klist_devices;                               //这个驱动对应的设备的链表
 struct klist_node knode_bus;
 struct module  * owner;
 const char   * mod_name; /* used for built-in modules */
 struct module_kobject * mkobj;
 int  (*probe) (struct device * dev);
 int  (*remove) (struct device * dev);
 void  (*shutdown) (struct device * dev);
 int  (*suspend) (struct device * dev, pm_message_t state);
 int  (*resume) (struct device * dev);
};
 
  3、总线结构:
struct bus_type {
 const char   * name;                                 //总线的名字
 struct module  * owner;
 struct kset  subsys;                                //与该总线相关的subsystem
 struct kset  drivers;                               //挂接在该总线上的驱动的集合
 struct kset  devices;                               //挂接在该总线上的设备的集合
 struct klist  klist_devices;                        
 struct klist  klist_drivers;
 struct blocking_notifier_head bus_notifier;
 struct bus_attribute * bus_attrs;                  //总线属性
 struct device_attribute * dev_attrs;               //设备属性
 struct driver_attribute * drv_attrs;               //驱动属性
 int   (*match)(struct device * dev, struct device_driver * drv);
 int   (*uevent)(struct device *dev, struct kobj_uevent_env *env);
 int   (*probe)(struct device * dev);
 int   (*remove)(struct device * dev);
 void   (*shutdown)(struct device * dev);
 int (*suspend)(struct device * dev, pm_message_t state);
 int (*suspend_late)(struct device * dev, pm_message_t state);
 int (*resume_early)(struct device * dev);
 int (*resume)(struct device * dev);
 unsigned int drivers_autoprobe:1;
};
   我们注意到只有在 bus_type 结构中有 kset 结构,其他两个结构中则没有,我们知道 kset 结构是用于存放相同类型的 kobject 的,这究竟是个什么意思呢? kset 又是为什么而存在的呢?为什么不能就是 kobject 呢?(关于kobject结构,我们很难抽象的形容,尽管它就是一个抽象的概念,我们将留待看代码的时候介绍,这里可以将kobject看成一个基类,kset就是容器了),下面我会按照自己的理解来回答这个问题(建议通读一下《 linux 设备驱动第三版》的 linux 设备模型章节)
   首先不管是设备还是驱动,都是挂接在某条总线上的,也就是说我们根据总线类型的不同来区分各种设备和驱动。(但是我们也要注意到,一个设备和驱动是可以挂接在不同的总线上的,比如网卡可以挂接在 pci 和 sdio 总线上,但这并不是说在 linux 设备模型中就可以同时挂接在两个总线上,我们只能选择其中的一种挂接)。
   在内核代码中我们找到了 bus_type 结构,我们发现了它使用了三个 kset 结构,分别是:        struct kset  subsys  、 struct kset   drivers 、 struct kset devices 。我们先抛开 subsys 因为它是用来向上挂接的。这里我们先看 drivers 与 devices 两个 kset 结构的意义。我们从发现一个设备或者驱动说起吧,一个设备或者驱动向内核注册的时候(对于设备来说就是被插入了;对于驱动来说就是 .ko 模块被加载了),对于每一次设备注册或者驱动注册,我们都得分配一个 device 结构或者 device_drive 结构,每一次我们都需要将 device 结构挂入 drivers 或 devices(kset 结构 ) 链表中,这样我们能通过总线找到挂接在这个总线上的所有设备和驱动。但是这里我们注意到仅仅将设备们和驱动们挂接在总线上并不能表明设备和驱动之间的关系,这样的处理仅仅表明了驱动、设备与总线的关系,它们申明了我现在挂接在这条总线下,以后操作我就请通过这条总线。
   那么设备如何认出驱动,或者驱动如何认出设备呢?是的,我们是使用的 probe 函数。 那么需要完成哪些过程了?在这些结构总是如何关联的?这才是我们关心的问题。所以这里我们将不得不在说明一下 klist 结构的作用。在内核代码中我们再次找到了 device 结构和 device_drive 结构。我们注意到在 device 结构中存在一个 struct device_driver *driver 这样的声明,而在 device_drive 中却并没有同样的包含 device 结构。我们这样想就明白了:对于一个设备来说,我们只能绑定一个驱动;而对于一个驱动来说,我们是可以对应于多个设备的。 也就是说这里 device 中的 driver 指针将会指向其绑定的驱动。那么回到 probe 探测函数,在我们对一个设备驱动进行注册的过程中,我们会在其相应的总线(也就是其挂接的总线)上发出一个探测,这个探测会搜寻所有挂接在这个总线上的尚未被绑定的设备(也就是 driver 指针为 NULL ),然后将 driver 指针指向这个驱动的结构,同时将这个设备的 device 结构挂接在 device_driver 结构中的 klist 链表中。 另外要提及一点就是我居然发现在 device 结构中也发现了一个这样的结构 struct klist_node    knode_driver ,它看起来跟 klist 有关,但是我得说我确实不认为 device 需要一个 klist 来挂上它能使用的 driver 。同样,当一个设备被注册时,它也会去寻找挂接在同一条总线上的驱动,并将自己与这个驱动联系起来。
 
   关于基础知识大致就这么些,如果需要知道的更细,可以查看《linux设备驱动第三版》,后面的我们会结合代码叙述注册设备,发现设备(对于驱动来说这里的工作其实很少,如果想知道内核做了些什么,就请跟着我一起看看内核的奥秘),以及数据传输的驱动代码
五.linux设备驱动模型 站在设备驱动这个角度分析,设备驱动模型是如何构建出来,起到什么作用,认识它并在写驱动的时候去利用设备驱动模型 目录 一.linux 设备驱动模型简介 1.1、 什么是设备驱动模型 1.2、 为什么需要设备驱动模型 1.3、 驱动开发的2个点 二.设备驱动模型的底层架构 2.1、kobject结构体 2.2、kobj_type结构体 2.3、kset结构体 三.总线式设备驱... 阅读详情

相关推荐

linux设备驱动的模型详解

一、什么是设备驱动模型 (1)类class、总线bus、设备device、驱动driver 四个结构体 (2)kobject和对象生命周期 (3)sysfs cat 查看属性信息 、 echo 往里面写东西 (4)udev 同步信息2、设备模型解决了一些什么问题? (1)设备驱动模型负责统一实现和维护一些特性,诸如:电源管理、热插拔、对象生命周期、用

huangliangben的博客 1696

Linux驱动开发实战(一)——设备驱动模型

在早期的Linux内核中并没有为设备驱动提供统一的设备模型。随着内核的不断扩大及系统更加复杂,编写一个驱动程序越来越困难,所以在Linux2.6内核中添加了一个统一的设备模型。这样,写设备驱动程序就稍微容易一些了。本章将对设备模型进行详细的介绍。设备驱动模型比较复杂,Linux系统将设备和驱动归一到设备驱动模型中来管理。设备驱动模型的提出,解决了以前编写驱动程序没有统一方法的局面。设备驱动模型给各种驱动程序提供了很多辅助性的函数,这些函数经过严格测试,可以很大程度上地提高驱动开发人员的工作效率。

m0_56145255的博客 3358

手把手教你玩转CPU微架构专栏--​​​​第二章:流水线——微架构的“效率引擎”​​​​2.4 超标量与超线程:如何突破“单指令流”的限制?

例如,Intel酷睿i5-13600K拥有6个性能核(P核,支持超线程,共12线程)和8个能效核(E核,无超线程,共8线程),兼顾多线程性能与能效比。通过引入“物理寄存器”替代“逻辑寄存器”(如x86的RAX、RBX),消除数据冒险中的“假依赖”(False Dependency)。引入“混合架构”(Performance Core+Efficient Core),大核(P核)专注高性能任务,小核(E核)处理后台任务;​:6发射超标量,IPC≈3.5(通过3D V-Cache优化缓存,进一步提升效率)。

xiaoheshang_123的博客 955

Linux设备驱动

Linux设备驱动最通俗的解释就是“驱使硬件设备行动”。驱动与底层硬件直接打交道,按照硬件设备的具体工作方式,读写设备的寄存器,完成设备的轮询、中断处理、DMA通信,进行物理内存向虚拟内存的映射等,最终让通信设备能收发数据,让显示设备能显示文字和画面,让存储设备能记录文件和数据。......

生活需要深度 976

2016域控服务器迁移,WIN Server2016 域服务器迁移出错

各位大神: 这几天刚安装了一台windows server 2016做域迁移时出现错误:1、默认SYSLOG、NETLOGON共享文件重启后自动取消共享,即使手动打开后依然会出现自动取消2、组策略中编辑策略时出现以下报错 policys.png (19.29 KB)2017-2-7 13:52操作此动作之前可以访问本机的共享(NETLOGON)3、使用DCDIAG检测多个报错:C:\Use...

weixin_31833039的博客 3314

kaggle——信用卡欺诈检测项目实战

笔记第一步:了解题目,确定任务第二步:场景分析第三步:数据预处理看是否有缺失值查看样本类别分布数据不均衡解决办法数据值标准化/归一化第四步:特征工程1)查看特征分布情况,把不同类别下特征分布相差不大的特征删除掉2)特征缩放第五步:模型训练处理不平衡样本交叉验证求取最好的模型参数第六步:模型评估使用下采样数据训练与测试使用下采样数据训练与测试(不同的阈值对结果的影响)使用下采样数据训练,原始数据进行测试原始数据进行K折交叉验证使用原始数据进行训练和测试查看ROC曲线逻辑回归阈值选择过采样总结 第一步:了解题目

weixin_45942265的博客 1万+

Linux设备驱动程序(一)——设备驱动简介

这一部分主要是用来介绍 Linux 设备驱动程序的一些基本概念,包括:Linux 设备驱动程序的作用、内核功能的划分、设备和模块的分类以及版本编号。

明天你好的博客 2285

基于YOLO系列的安全帽检测系统:从理论到实现的完整指南

安全帽检测作为计算机视觉在工业安全领域的重要应用,近年来得到了广泛关注。本文详细介绍了基于YOLOv5、YOLOv6、YOLOv7和YOLOv8的安全帽检测系统的完整实现方案,包括算法原理、数据集构建、模型训练、性能优化以及完整的UI界面设计。通过对比分析不同YOLO版本的性能差异,本文为工业安全检测系统的开发提供了全面的技术参考和实践指导。

YOLO 364

Linux驱动——字符设备驱动

1.使用什么工具来写驱动代码:安装source insight工具(1)找到软件提示把工具安装激活(2)把Linux内核代码解压到windows目录中(3)打开工具添加查看的项目第一个对话框:第一个文本框:输入工程名字第二个文本框:路径(默认)第二个对话框: 在项目源码位置,选择 Linux内核代码位置 点击OK 第三个对话框: 选择需要查看的Linux内核代码的包含的源码文件(要查看的内核目录)需要添加的目录:driver/iicinclude。

Linux驱动开发工程师,熟悉Linux/Android底层驱动、TP、显示、IIC、网络等通用外设调试适配,Linux上层应用开发。常用平台瑞芯微、全志、恩智浦等。 3439

RK3568平台开发系列讲解:内核启动流程

第 493 行的 ENTRY 指明了了 Linux 内核入口,入口为stext,stext 定义在文件arch/arm/kernel/head.S 中 , 因此要分析Linux 内核的启动流程,就得先从文件arch/arm/kernel/head.S 的 stext 处开始分析。_mmap_switched 定义在文件 arch/arm/kernel/head-common.S,__mmap_switched 最终会调用 start_kernel 函数。⑥、r2=atags 或者设备树(dtb)首地址。

内核笔记 217

你知道吗?其实这些都是AI——农作物监控AI

随着全球人口的不断增长,粮食需求日益增加。为了应对这一挑战,现代农业正在迅速转型,引入了许多先进技术来提高生产效率和作物产量。在这些技术中,人工智能(AI)在农作物监控方面的应用显得尤为重要。通过利用AI技术,农民和农业专家可以更好地管理农作物的生长,预防病虫害,并优化灌溉和施肥方案,从而实现农业生产的智能化和精准化。

AI科研社 367

Linux设备驱动开发详解

设备驱动提供了硬件和应用软件之间的纽带应用软件时只需 调用系统软件的应用编程接口(API) 就可让硬件去完成要求的工作。

实力派,无需多言! 2303

RK平台PCIE-Ethernet扩展:Intel I210移植与性能飞升之路

本文详细介绍了Intel I210千兆以太网控制器在瑞芯微RK平台的移植与优化过程。通过硬件适配、内核配置、驱动开发及性能调优四个关键环节,实现了RK平台的网络性能提升。硬件方面,重点说明了PCIE接口的规范连接与供电检查;软件方面,系统阐述了内核配置、设备树修改和驱动编译流程。在性能优化环节,详细介绍了中断优化、缓冲区设置和TCP/IP协议栈调优策略,并采用Iperf和Netperf工具进行量化测试验证。测试结果显示,优化后的网络吞吐量提升20%以上,延迟降低40%,为工业控制、智能安防等场景提供了可靠的

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 352

linux设备驱动开发详解_Linux设备驱动概述

本篇文章将介绍Linux设备驱动开发的基本知识,带你快速拨开Linux驱动这团迷雾。文章分为如下3个小节进行讲解:1、设备驱动的概念和作用;2、在无操作系统和有操作系统的情况下设备驱动的设计开发;3、Linux设备驱动的重点、难点和学习方法。文章最后会给出一个简单的LED驱动在无操作系统和Linux操作系统下的实现示例。好,Let's go1、设备驱动的概念和作用大家都知道在Linux开发中是一个...

weixin_39785524的博客 1942

【python数据挖掘课程】二十八.基于LDA和pyLDAvis的主题挖掘及可视化分析

这是《Python数据挖掘课程》系列文章,前面很多文章都讲解了数据挖掘、机器学习,这篇文章主要讲解LDA和pyLDAvis算法,同时讲解如何读取CSV文本内容进行主题挖掘及可视化展示。文章比较基础,希望对你有所帮助,提供些思路,也是自己教学的内容。推荐大家购买作者新书《Python网络数据爬取及分析从入门到精通(分析篇)》,如果文章中存在错误或不足之处,还请海涵。 目录: 一.显示结果及安装 二.LDA主题挖掘 三.pyLDAvis可视化分析 四.小结

杨秀璋的专栏 1万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Linux设备驱动开发详解笔记

设备驱动提供了硬件和应用软件之间的纽带应用软件时只需 调用系统软件的应用编程接口(API) 就可让硬件去完成要求的工作。

实力派,无需多言! 1558

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Linux-设备驱动概述

文章目录Linux设备驱动概述1. 设备驱动的作用2. 无操作系统的设备驱动3. 有操作系统时的设备驱动4. Linux设备驱动4.1 设备的分类及特点4.2 Linux设备驱动与整个软硬件系统的关系4.3 Linux设备驱动的重难点5. 源代码阅读6. 设备驱动:LED驱动6.1 无操作系统的LED驱动6.2 Linux下的LED驱动 Linux设备驱动概述 1. 设备驱动的作用   对设备驱动的最通俗解释就是驱动硬件设备行动,驱动和底层硬件设备直接打交道,按照硬件设备的具体工作方式,读写设备的寄存器,完

李木子的博客 2956

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Linux设备驱动模型

文章目录前言1.linux设备驱动模型简介2.设备驱动模型的底层架构3.总线式设备驱动组织方式4.platform平台总线工作原理4.平台总线实践环节 前言 1.linux设备驱动模型简介 1、什么是设备驱动模型 (1)类class、总线bus、设备device、驱动driver(内核代码中有4个结构体) (2)kobject和对象生命周期(自动管理生命周期) (3)sysfs(虚拟文件系统,在内核空间和用户空间间建立关系,把内核的结构体变量的一些值以文件的形式展现出来,通过echo、cat操作属性节点

weixin_44705391的博客 4320

linux设备驱动程序作用,Linux设备驱动概述

【【嵌入式在左C语言在右】Linux设备驱动概述】https://toutiao.com/group/6796560795137212942/?app=explore_article&timestamp=1582561723&req_id=202002250028430100100631491E64E97D&group_id=6796560795137212942&...

weixin_28930803的博客 817

linux设备驱动归纳总结

【转自diytvgy的日志:http://apple.chinaunix.com/space.php?uid=25014876&do=blog&id=59420】前言:我的总结是根据学习时的笔记(李杨老师授课)、《linux内核设计与实现》第三版、《linux设备驱动程序》第三版和《linux设备驱动开发详解》第一版来归纳的。·linux设备驱动归纳总结(一):内核的相关基础概念||---------1.1、linux设备驱动的作用|         1.2、内核代码树介绍|         1.3、内核补

草莽农夫 2508

【亲测免费】 深入Linux设备驱动的世界:《Linux设备驱动详解第二版》推荐

深入Linux设备驱动的世界:《Linux设备驱动详解第二版》推荐 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 在Linux开发领域,设备驱动程序是连接硬件与操作系统的桥梁,掌握设备驱动的开发技术对于嵌入式工程师和Linux开发人员来说至关重要。《Linux设备驱动详解第二版》是由资深Linux内核开发者宋宝华老师精心编写的一本全面介绍Linux设备驱动开发的权威书...

gitblog_09803的博客 1166

Linux 设备驱动模型

本质:描述硬件特性的数据结构职责声明硬件资源(内存地址、中断号、寄存器映射等)描述设备唯一标识(如 PCI 厂商/设备 ID)提供设备树(Device Tree)兼容性标识本质:操作硬件的软件接口职责实现设备操作方法(probe()remove()注册字符/块/网络设备接口处理中断和数据传输管理电源状态组件角色生命周期依赖关系设备硬件描述符内核启动/热插拔时创建不依赖特定驱动驱动硬件操作器模块加载时注册依赖设备存在总线匹配中介内核初始化时建立。

X 1053
上一篇: 线程笔记
下一篇: linux设备驱动2
WeekyHuang
博客等级 码龄21年 5粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值