linux驱动开发之字符设备与总线设备驱动模型的区别与联系

Linux驱动开发核心概念解析

1. 字符设备(Character Device)
  • 定义与特点

    • 字节流形式进行数据交换,适用于顺序访问的设备(如键盘、鼠标、串口)。

    • 用户空间通过设备文件(如/dev/xxx)访问,依赖主/次设备号标识驱动与实例。

  • 驱动开发关键步骤

    1. 实现文件操作接口:通过file_operations结构体定义openreadwriterelease等函数。

    2. 注册设备号

      • 动态分配:alloc_chrdev_region获取主设备号。

      • 静态注册:register_chrdev_region(需确保未被占用)。

    3. 创建设备

      • 初始化cdev结构体(cdev_init),关联file_operations

      • 添加设备到内核:cdev_add

    4. 生成设备节点

      • 自动创建:通过class_createdevice_create,触发udev生成/dev/xxx

      • 手动创建:mknod命令。

  • 示例代码片段

    c

    复制

    static struct file_operations fops = {
        .owner = THIS_MODULE,
        .open = my_open,
        .read = my_read,
        .write = my_write,
        .release = my_release,
    };
    
    static int __init my_init(void) {
        alloc_chrdev_region(&dev_num, 0, 1, "mydev");
        cdev_init(&my_cdev, &fops);
        cdev_add(&my_cdev, dev_num, 1);
        my_class = class_create(THIS_MODULE, "myclass");
        device_create(my_class, NULL, dev_num, NULL, "mydev");
        return 0;
    }

2. 总线设备驱动模型(Bus-Device-Driver Model)
  • 核心组件

    • 总线(Bus):管理设备与驱动的匹配(如PCI、USB、虚拟总线如platform)。

    • 设备(Device):描述硬件信息(资源、中断等),可通过设备树(Device Tree)动态配置。

    • 驱动(Driver):实现设备操作逻辑,包含初始化、资源获取(如probe)和释放(remove)。

  • 工作流程

    1. 设备注册:向总线注册设备信息(如platform_device_register)。

    2. 驱动注册:向总线注册驱动(如platform_driver_register),提供proberemove函数。

    3. 匹配过程:总线根据设备ID表或设备树的compatible属性匹配设备与驱动。

    4. 初始化与销毁:匹配成功时调用probe,失败或卸载时调用remove

  • 设备树(Device Tree)的作用

    • 替代硬编码,描述硬件资源(如寄存器地址、中断号)。

    • 驱动通过of_match_table匹配设备树节点,使用of_系列API获取资源(如of_get_property)。

  • Platform总线示例

    c

    复制

    // 设备树节点
    mydevice {
        compatible = "mycompany,mydevice";
        reg = <0x10000000 0x1000>;
        interrupts = <0 1>;
    };
    
    // 驱动匹配与初始化
    static const struct of_device_id my_of_ids[] = {
        { .compatible = "mycompany,mydevice" },
        { }
    };
    
    static int my_probe(struct platform_device *pdev) {
        struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        // 初始化字符设备...
        return 0;
    }
    
    static struct platform_driver my_driver = {
        .probe = my_probe,
        .remove = my_remove,
        .driver = {
            .name = "mydrv",
            .of_match_table = my_of_ids,
        },
    };
    module_platform_driver(my_driver);

3. 字符设备与总线模型的整合
  • 场景:基于总线(如I2C)的字符设备(如传感器)。

    1. 总线驱动:处理总线协议(如I2C读写),在probe中注册字符设备。

    2. 字符设备驱动:通过file_operations暴露用户接口,调用总线驱动提供的底层操作。

  • 优势

    • 解耦硬件与接口:总线驱动处理硬件细节,字符设备驱动处理用户交互。

    • 复用性:同一总线驱动支持多种设备,同一字符设备驱动适配不同总线。


4. 关键工具与调试
  • sysfs:在/sys/bus/sys/devices查看设备层次结构。

  • 调试技术printkdmesgdevtmpfs自动创建设备节点。

  • 动态加载insmod/rmmod加载驱动模块。


总结
  • 字符设备:关注用户空间接口,实现字节流操作。

  • 总线模型:分离设备与驱动,提升灵活性和可维护性。

  • 设备树:动态配置硬件资源,增强代码可移植性。

学习建议:通过实际项目(如LED控制、传感器驱动)结合代码实践,深入理解设备树配置、总线匹配机制及字符设备接口的实现。

首先,字符设备,我记得它们是用来处理按字节流进行数据交换的设备,比如键盘、鼠标、串口这些。和块设备不同,块设备是按块来操作的,比如硬盘。字符设备驱动需要实现哪些东西呢?应该是要实现file_operations结构体里的那些函数,比如open、read、write、release之类的。用户空间通过设备文件来访问这些设备,比如/dev下面的那些节点,主设备号用来标识驱动,次设备号区分不同实例。那创建字符设备的时候,是不是要用register_chrdev或者更新的方法,比如alloc_chrdev_region加上cdev_init和cdev_add?可能还有设备类相关的操作,比如class_create和device_create,这样udev会自动创建设备节点。

然后是总线设备驱动模型,这部分我有点模糊。总线模型应该是指设备如何连接到总线,比如PCI、USB、I2C这些总线类型。总线设备驱动模型分为总线、设备、驱动三个部分,对吧?总线负责匹配设备和驱动,当设备插入时,总线会寻找对应的驱动,或者驱动加载时寻找对应的设备。这样的话,设备和驱动是分开注册的,通过总线进行匹配。设备结构体platform_device,驱动结构体platform_driver,可能属于平台设备,不依赖于物理总线的那种虚拟总线?比如SOC上的各种控制器。那platform_driver里面应该有probe和remove函数,当设备匹配时,probe会被调用,进行初始化,remove则是清理资源。匹配的依据是什么呢?可能是通过名字,或者是设备树中的兼容性字符串。

设备树在总线模型中起什么作用呢?设备树用来描述硬件配置,代替原来的硬编码。驱动可以通过设备树获取资源,比如内存地址、中断号,而不需要在内核中写死。这样同一个驱动可以支持不同的硬件配置,只要设备树描述正确。比如,platform设备可能从设备树中获取资源,驱动使用of_match_table来匹配设备树中的节点。

那总线模型中的匹配过程是怎样的呢?当设备注册时,总线会检查是否有对应的驱动已经注册,如果有的话,调用驱动的probe函数。同样,当驱动注册时,总线会检查是否有对应的设备存在,有的话也会调用probe。匹配通常基于设备ID表或者设备树中的compatible属性。对于platform设备,可能用platform_device_id或者设备树中的compatible字符串来匹配。

字符设备和总线模型之间的关系是什么呢?比如,一个字符设备驱动可能基于某个总线模型。例如,一个I2C设备驱动,属于总线模型中的驱动部分,同时它提供的设备可能作为字符设备被用户空间访问。这时候,驱动需要同时处理总线的匹配和字符设备的操作函数。

可能还有一些例子,比如编写一个简单的字符设备驱动,需要注册字符设备,实现file_operations。而如果是总线模型的设备,比如platform驱动,则需要注册platform_driver,并在probe函数中注册字符设备,这样当platform设备匹配时,probe被调用,进而创建设备节点。

还有,sysfs的作用是什么?总线、设备、驱动都会在sysfs中有对应的条目,用户空间可以通过sysfs查看设备和驱动的信息,进行一些配置或者状态查询。例如,/sys/bus/下面有各种总线的目录,里面包含了注册的设备和驱动。

我是不是漏掉了什么重要的概念?比如,设备模型中的kobject、kset、ktype这些底层结构?可能总线模型是基于kobject的sysfs表示的,每个设备、驱动都是kobject的子对象,通过层次结构组织起来。这样sysfs就能展示出设备树的层次结构。

另外,模块的加载和卸载过程,字符设备驱动模块在加载时需要注册设备,卸载时注销。而对于总线模型中的驱动模块,加载时会注册驱动,卸载时注销驱动,并调用remove函数释放资源。

还有设备号的申请,动态分配还是静态注册?现在更推荐动态分配,使用alloc_chrdev_region,这样可以避免冲突。静态的话需要知道哪些主设备号未被占用,可能不太方便。

总结一下,字符设备驱动关注的是用户空间的接口,通过file_operations提供操作函数。而总线设备驱动模型关注的是设备与驱动的匹配和管理,利用总线作为中介,分离设备和驱动的代码,提高可重用性和可维护性。设备树在此模型中用于硬件描述,使得驱动代码更独立于具体硬件配置。

现在可能存在的疑问点:总线模型中platform总线和实际物理总线(如I2C)的区别;设备树如何具体在驱动中被解析和使用;probe函数的具体作用和调用时机;sysfs与设备模型的关系;以及如何将字符设备驱动整合到总线模型中。需要进一步查阅资料或例子来验证这些理解是否正确。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/964888.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

java Fx进阶操作

1.java Fx基本介绍 JavaFX是用于构建富互联网应用程序的Java库。 使用此库编写的应用程序可以跨多个平台一致运行。 使用JavaFX开发的应用程序可以在各种设备上运行&#xff0c;如台式计算机&#xff0c;手机&#xff0c;电视&#xff0c;平板电脑等。 要使用Java编程语言开…

java-重载与重写

介绍 在 Java 中&#xff0c;重载&#xff08;Overloading&#xff09; 和 重写&#xff08;Overriding&#xff09; 是两个重要的概念&#xff0c;它们都与方法有关&#xff0c;但它们的应用场景和行为完全不同。 通过理解重载和重写的区别&#xff0c;可以更好地设计类的继承…

数据库系统概念第六版记录 一

1.关系型数据库 关系型数据库&#xff08;Relational Database&#xff0c;简称 RDB&#xff09;是基于关系模型的一种数据库&#xff0c;它通过表格的形式来组织和存储数据。每个表由若干行&#xff08;记录&#xff09;和列&#xff08;字段&#xff09;组成&#xff0c;数据…

嵌入式工程师必学(143):模拟信号链基础

概述: 我们每天使用的许多电子设备,以及我们赖以生存的电子设备,如果不使用电子工程师设计的实际输入信号,就无法运行。 模拟信号链由四个主要元件组成:传感器、放大器、滤波器和模数转换器 (ADC)。这些传感器用于检测、调节模拟信号并将其转换为适合由微控制器或其他数…

2.5学习

misc buuctf-假如给我三天光明 下载附件后得到了一个压缩包和一个图片&#xff0c;压缩包为加密压缩包&#xff0c;需要解出密码&#xff0c;然后注意到这个图片并非简单的一个封面&#xff0c;在下方还有诸多点&#xff0c;有黑有灰。经过搜索&#xff0c;发现这是盲文通过与…

嵌入式八股文面试题(一)C语言部分

1. 变量/函数的声明和定义的区别&#xff1f; &#xff08;1&#xff09;变量 定义不仅告知编译器变量的类型和名字&#xff0c;还会分配内存空间。 int x 10; // 定义并初始化x int x; //同样是定义 声明只是告诉编译器变量的名字和类型&#xff0c;但并不为它分配内存空间…

设备通过国标GB28181接入EasyCVR,显示在线但视频无法播放的原因排查

安防监控EasyCVR平台支持多种视频源接入&#xff0c;包括但不限于IP摄像头、NVR、编码器、流媒体服务器等。平台采用高效的视频流接入技术&#xff0c;支持大规模视频流的并发接入&#xff0c;确保视频流的稳定性和流畅性。 有用户反馈&#xff0c;项目现场使用国标GB28181接入…

Electricity Market Optimization 探索系列(三)

本文参考链接link 电网容量规划是一个寻求最优发电容量的过程&#xff0c;找到的最优发电容量能够可靠地满足未来电网的需求 发电机的容量和发电成本呈正相关关系&#xff0c;一台发电机的发电量不能超过其额定发电容量&#xff0c;结合我之前的博客所说的内容&#xff0c;可…

深入理解和使用定时线程池ScheduledThreadPoolExecutor

文章目录 前言认识定时线程池什么是定时线程池&#xff1f;定时线程池基本API使用定时线程池的应用场景1、定时任务调度2、缓存过期清理3、心跳检测4、延迟任务执行 定时线程池scheduleAtFixedRate与scheduleWithFixedDelay区别scheduleAtFixedRate案例demo&#xff08;period&…

在Mac mini M4上部署DeepSeek R1本地大模型

在Mac mini M4上部署DeepSeek R1本地大模型 安装ollama 本地部署&#xff0c;我们可以通过Ollama来进行安装 Ollama 官方版&#xff1a;【点击前往】 Web UI 控制端【点击安装】 如何在MacOS上更换Ollama的模型位置 默认安装时&#xff0c;OLLAMA_MODELS 位置在"~/.o…

动态规划练习九(完全背包问题)

一、问题介绍与解题心得 完全背包问题与01背包问题很相似&#xff0c;不同点就是每个物品数量有多个&#xff0c;每个物品可以取多个或不取&#xff0c;来达到收益最大&#xff0c;或者收益在某个值。 限制条件&#xff1a;背包容量有限 解决问题&#xff1a;从价值入手&…

百亿大表的实时分析:华安基金 HTAP 数据库的选型历程与 TiDB 使用体验

导读 在金融科技迅猛发展的今天&#xff0c;华安基金作为行业的先行者&#xff0c;面临着数据管理和分析的全新挑战。随着业务的不断扩展和数据量的激增&#xff0c;传统的数据库架构已难以满足系统对实时性、灵活性和分析能力的需求。在这样的背景下&#xff0c;HTAP&#xf…

低代码系统-产品架构案例介绍、蓝凌(十三)

蓝凌低代码系统&#xff0c;依旧是从下到上&#xff0c;从左至右的顺序。 技术平台h/iPaas 指低层使用了哪些技术&#xff0c;例如&#xff1a;微服务架构&#xff0c;MySql数据库。个人认为&#xff0c;如果是市场的主流&#xff0c;就没必要赘述了。 新一代门户 门户设计器&a…

DeepSeek研究员在线爆料:R1训练仅用两到三周,春节期间观察到R1 zero强大进化

内容提要 刚刚我注意到DeepSeek研究员Daya Guo回复了网友有关DeepSeek R1的一些问题&#xff0c;以及接下来的公司的计划&#xff0c;只能说DeepSeek的R1仅仅只是开始&#xff0c;内部研究还在快速推进&#xff0c;DeepSeek 的研究员过年都没歇&#xff0c;一直在爆肝推进研究…

【Rust自学】20.1. 最后的项目:单线程Web服务器

喜欢的话别忘了点赞、收藏加关注哦&#xff08;加关注即可阅读全文&#xff09;&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 20.1.1. 什么是TCP和HTTP Web 服务器涉及的两个主要协议是超文本传输​​协议(Hypertext T…

19.[前端开发]Day19-王者荣项目耀实战(二)

01_(掌握)王者荣耀-main-banner展示实现 完整代码 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewpor…

Java 基于微信小程序的高校失物招领平台小程序(附源码,文档)

博主介绍&#xff1a;✌程序员徐师兄、8年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战*✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447…

题解:洛谷 P5837 [USACO19DEC] Milk Pumping G

题目https://www.luogu.com.cn/problem/P5837 温馨提示&#xff1a;鉴于数据范围小的可怜&#xff0c;我们可以用暴力一些的想法去做&#xff0c;别看到是普及/提高就被吓退了。 枚举最小流量 &#xff0c;然后跑一遍最短路&#xff0c;求出带限制的 到 的最短路的长度&#…

动态规划——斐波那契数列模型问题

文章目录 1137. 第 N 个泰波那契数算法原理代码实现 面试题 08.01. 三步问题算法原理代码实现 746. 使用最小花费爬楼梯算法原理代码实现 91. 解码方法算法原理代码实现 1137. 第 N 个泰波那契数 题目链接&#xff1a;1137. 第 N 个泰波那契数 算法原理 状态表示&#xff1a;…

LabVIEW涡轮诊断系统

一、项目背景与行业痛点 涡轮机械是发电厂、航空发动机、石油化工等领域的核心动力设备&#xff0c;其运行状态直接关系到生产安全与经济效益。据统计&#xff0c;涡轮故障导致的非计划停机可造成每小时数十万元的经济损失&#xff0c;且突发故障可能引发严重安全事故。传统人…