Linux总线驱动-01: 一个简单的示例

《Linux驱动:USB设备驱动看这一篇就够了》 这一篇学习分析USB设备驱动程序,主要涉及到USB驱动基本概念,USB版本对比、USB主从结构、USB设备的传输类型、USB设备描述符关系、USB的数据传输对象;详细分析了USB总线驱动框架,USB Core、USB HCD、USB总线-设备-驱动模型;最后总结了USB驱动开发中的一般流程并模拟实现一个USB设备驱动程序。USB core注册了一个USB总线,并向USB总线中注册了三个驱动,分别是USB接口驱动、HUB驱动、USB设备驱动。...... 阅读详情

本文测试系统为:Ubuntu 10.10 x86_64 2.6.35-24-generic

 

总线是处理器与外设之间通信的通道。在当前版本的Linux设备模型(Linux Device Model, LDM)中,所有的设备都是通过总线相连的,甚至是通过虚拟的”platform”总线。总线之间可以互相插入,比如一个SCSI控制器(适配器)一般是一个PCI-E设备,而一个USB控制器一般是一个PCI设备。
在设备模型中,每类总线都有一个设备链表和驱动链表。每当有新的设备插入(必定会插入到某总线),驱动核心遍历新设备所在总线的驱动链表,给设备匹配驱动;每当有新的驱动插入(也必定插入到某总线),驱动核心遍历驱动所在总线的设备链表,对于没有关联上驱动的设备,会尝试匹配。驱动移除时,驱动核心通知相关驱动,驱动移除时,驱动核心通知所有该驱动关联的设备。这就是驱动核心实现的热插拔机制。LDD3的第十四章Linux设备模型对此有详细描述。

 

在新的驱动核心支持下,实现一个什么都不做的总线驱动是很简单的。如下,拷贝代码并保存为ycbus.c:

提供一个简单的Makefile文件完成编译。如下,拷贝内容并保存为Makefile,和ycbus.c置于同一目录):

注意,$(MAKE)和rm两行前面是TAB而不是空格。键入空格Makefile是不会工作的。

 

执行编译/加载命令:

 

在/sys/bus/ycbus下查看ycbus的信息:

如果tree命令不存在,安装tree即可:

 

在/proc/kallsyms下也可看到ycbus驱动的符号:

没有看到ycbus_driver_init,是因为在这个函数前加了__init,在驱动加载完毕后,内核会扔掉这部分代码以节省空间。尝试去掉ycbus_driver_init前面的__init,再次查看,会发现这个函数也在符号表中出现了:

符号表的第一列是符号所在内存地址,我使用的是64位机,如果在32位机上测试,则这些地址是32位的。第二列是符号属性,其中d表示符号数据段,t表示符号在文本段(text,又称代码段),想要知道符号属性等的详细信息,执行命令 man nm。第三列是符号名称。第四列是符号所在模块。

 

在目录/sys/module/ycbus下,以及文件 /proc/modules内部,都可以查找到ycbus的相关信息。执行lsmod | grep ycbus也可以得到一些信息:

其中第一列是模块名称,第二列是模块占用内存大小,第三列是引用计数。针对ycbus,其名称是ycbus,占用内存为1193字节,引用计数为0(没有人用它)。

 

事实上,对于上述的ycbus总线驱动,除了在上述文件/文件夹,或者命令可以看到部分相关信息以外,这个驱动什么都做不了。事实上,除了通过驱动核心注册代码,我们没有编写任何其他代码。

 

理解本节所描述的内容,对于实现一个实用的总线驱动是有帮助的。

 

MDIO总线驱动开发实战:基于Linux内核4.19的PHY寄存器读写与调试 本文详细介绍了基于Linux内核4.19的MDIO总线驱动开发实战,涵盖PHY寄存器读写与调试技巧。通过构建MDIO总线驱动框架、实现Clause 22和Clause 45访问模式,以及提供调试方法和高级功能实现,帮助开发者高效完成网络设备底层驱动开发。 阅读详情

相关推荐

国内外主流嵌入式GUI汇总

随着MCU资源增多,处理能力也强了,同时市场需求也增多了GUI功能也越来越丰富了,很多的嵌入式图形库都可以做出绚丽的界面。

m0_69914734的博客 3290

Linux驱动开发--平台总线

​ driver模块中,struct platform_driver成员driver的name成员必须指定,但与device模块中name可以不相同。2.2 id匹配(可想象成八字匹配):一个驱动可以对应多个设备 ------优先级次低。2.3 设备树匹配:内核启动时根据设备树自动产生的设备 ------ 优先级最高。2.1 名称匹配:一个驱动只对应一个设备 ----- 优先级最低。​ 带来的问题-------怎样将二者进行关联(匹配)?总线:匹配设备和驱动——婚介所:提供沟通机制,完成拉郎配。

xinqi_1的博客 793

【RDMA】13. RDMA之用户态与内核态交互

原文:https://zhuanlan.zhihu.com/p/346708569 在“RDMA之Verbs”一文中我们说道,Verbs API分为用户态和内核态,分别以ibv_和ib_作为前缀。RDMA技术的最大的优势就在于用户态可以绕过内核,直接控制硬件收发数据,减少了系统调用和内存拷贝次数,所以大部分的RDMA应用都是用户态应用,即使用以ibv_为前缀的用户态Verbs API。 但是并非所有的用户态Verbs API都可以完全绕开内核,本文中我来讲解一下哪些API依赖于内核RDMA子系统(包括驱

我的笔记本 4285

STM32MP157驱动开发——Linux下的单总线驱动

Linux下的单总线驱动,介绍了相关的原理,并以DS18B20和DHT11为例进行了驱动开发。

weixin_45682654的博客 1930

从防御者视角复盘:用WinArpAttacker和Wireshark在Windows上模拟并检测ARP欺骗攻击

本文详细解析了Windows平台下的ARP欺骗攻击与防御策略,通过WinArpAttacker和Wireshark工具模拟攻击并检测异常流量。文章涵盖实验环境搭建、攻击原理深度解析、流量特征分析及企业级防御方案,帮助安全运维人员全面掌握ARP攻击检测与防护技术。

weixin_30918633的博客 121

探究Linux的总线、设备、驱动模型

理解Linux的总线、设备、驱动模型是理解Linux驱动框架的关键,也是破解Linux为什么极易移植到不同的平台,以及被如此多广泛领域使用根源的关键。我的优快云直播将以浅显易懂地语言,深入地把这一模型剖析清楚,道出这样的设计的好处。

3D高斯泼溅实战:如何用自采数据集训练出高质量3D模型(附COLMAP避坑指南)

本文详细介绍了使用自采数据集训练高质量3D高斯泼溅模型的完整实战流程。从数据采集规范、COLMAP稀疏重建的深度配置与避坑指南,到数据格式转换及3DGS训练调优策略,提供了针对自采数据的关键参数调整与问题排查方案,帮助读者高效构建专属3D场景。

g9h0i1的博客 975

Linux驱动开发(速记版)--单总线

讯为 RK3568

荒野 1184

YOLOv8【第一章:基础入门篇·第2节】一文搞定,数据集制作与标注完全指南!

🏆 本文收录于 《YOLOv8实战:从入门到深度优化》 专栏,该专栏专注于分享我在YOLOv8目标检测模型中的实战经验,涵盖从入门基础到深度优化的全方位解决方案。无论你是计算机视觉的新手,还是具有多年深度学习经验的专家,本专栏都将为你提供高效、可复现的技术方案,助你掌握YOLOv8的核心技术,提升目标检测性能,突破瓶颈,优化模型,并加速项目开发🚀!

**My Coding Family** 1505

RH850从0搭建Autosar开发环境系列讲解 - 总目录

Davinci Autosar实战开发从0构建开发能力。OS,COM,DCM,BSWMM,ECUM,VLINK,XCP,MEMMAP等模块配置,带你熟悉运行的autosar代码,包括MICROSAR的启动运行,使用GreenHills生成运行的hex。

weixin_42412049的博客 1万+

【分析笔记】Linux 4.9 单总线驱动框架分析

本文主要是基于 T507 Android 10 Linux 4.9 的源代码,对 Linux W1 总线框架的分析记录,便于了解整个框架的基本实现机制。

lovemengx的博客 1211

RN8209C单相电量计量芯片调试记录

芯片数据手册-简化版 调试功能是读取直流电池电压,出于这个需求,也就是要读取芯片的3路AD值,因为有效值是针对交流的,这点可以查看手册。 前提知道: 通信: 本次调试采用uart通信,rn8209c只有uart接口,采用9位数据(8位数据+偶校验),读寄存器只需要发送对应寄存器值就行,,波特率是4800,写的话需要保证最高为是1。没仔细读手册,这里吃了很大的亏。 复位: RN8209C支持两只复位方式,一种是发送复位命令复位,另一种是拉低复位引脚25ms以上,复位引脚复用它的串口接收(RX)口,所以拉低ST

wang 恒 的博客 6578

Linux驱动简单例子,Linux总线驱动-01: 一个简单的示例

本文测试系统为:Ubuntu 10.10 x86_64 2.6.35-24-generic总线是处理器与外设之间通信的通道。在当前版本的Linux设备模型(Linux Device Model, LDM)中,所有的设备都是通过总线相连的,甚至是通过虚拟的”platform”总线。总线之间可以互相插入,比如一个SCSI控制器(适配器)一般是一个PCI-E设备,而一个USB控制器一般是一个PCI设备。...

weixin_39984201的博客 232

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Linux下的USB总线驱动(01)——USB理论

原文链接地址:http://www.linuxidc.com/Linux/2012-12/76197.htm 1.      USB概念概述 USB1.0版本速度1.5Mbps(低速USB) USB1.1版本速度12Mbps(全速USB) USB2.0版本速度480Mbps(高速USB) USB驱动由USB主机控制器驱动和USB设备驱动组成。USB主机控制器是用来控制USB设备和CPU之

Incanus's Blog 1175

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

linux I2C 驱动

原文地址: http://hello2mao.github.io/2015/12/02/Linux_I2C_driver.html 目录 一、LinuxI2C驱动--概述 1.1 写在前面 1.2 I2C 1.3 硬件 1.4 软件 1.5 参考二、LinuxI2C驱动--I2C总线 2.1 I2C总线物理结构 2.2 I2C总线特性 2.3 开始和停止条件 2.

dragon_cdut的博客 927

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

arm linux i2c 总线驱动,I2C总线及EEPROM的Linux驱动程序的 - 嵌入式操作系统 - 电子发烧友网...

1、引言笔者在开发基于MPC8250的嵌入式Linux系统的过程中发现I2C总线在嵌入式系统中应用广泛,I2C总线控制器的类型比较多,对系统提供的操作接口差别也很大。与I2C总线相连的从设备主要有微控制器、EEPROM、实时时钟、A/D转换器等.MPC8250处理器正是通过内部的I2C总线控制器来和这些连接在I2C总线上的设备进行数据交换的。由于I2C总线的特性,Linux的I2C总线设备驱动程序...

weixin_34221599的博客 250

详解Linux-I2C驱动

目录 一、LinuxI2C驱动--概述 1.1 写在前面 1.2 I2C 1.3 硬件 1.4 软件 1.5 参考二、LinuxI2C驱动--I2C总线 2.1 I2C总线物理结构 2.2 I2C总线特性 2.3 开始和停止条件 2.4 数据传输格式 2.5 响应 2.6 总线仲裁三、LinuxI2C驱动--解析EEPROM的读写 3.1 概述 3.2 设备地址

omnispace的博客 7216

Linux总线驱动-02: struct bus_type 结构体

http://blog.youkuaiyun.com/cppgp/article/details/6333359 本文测试系统为:Ubuntu 10.10 x86_64 2.6.35-24-generic   上节中,除了简单的框架,我们还看到了一个和总线驱动相关的结构体bus_type。这个结构体的定义在include/Linux/device.h中。本节先简单介绍结构体中的成员,再对每个成员作详

liu0808的专栏 441

Linux内核驱动——ioctl 控制与 Platform 总线驱动

本文详细介绍了Linux内核中的ioctl系统调用和Platform总线驱动模型。ioctl通过32位命令参数实现设备控制,包含设备类型、命令编号、数据流向和大小四个字段。Platform总线为嵌入式设备提供通用管理框架,通过设备-驱动匹配机制简化资源管理。文章以LED驱动为例,展示了设备端资源声明、驱动端硬件映射和ioctl命令处理的全过程,包括物理地址到虚拟地址转换、GPIO寄存器操作等关键步骤。这种架构实现了设备与驱动解耦,提高了代码可移植性和维护性,是嵌入式外设驱动开发的典型模式。

lufrednow_的博客 793

spi总线 上层调用_全志R16_SPI总线驱动的使用文档

全志R16_SPI总线驱动的使用文档(2019-08-15 09:29:47)标签:全志r16介绍Linux 内核中SPI 子系统的接口及使用方法,为SPI设备驱动的开发提供参考。适用于基于Linux3.4内核的全志R16硬件平台。2. 2. 模块介绍2.1.模块功能介绍Linux 中 SPI 体系结构图 2.1 所示,图中用分割线分成了三个层次:1. 用户空间,包括所有使用 SPI 设备的应用...

weixin_33517544的博客 576

Jetson Nano B01 实战:I2C总线驱动MPU6050陀螺仪

本文提供了在Jetson Nano B01开发板上通过I2C总线驱动MPU6050陀螺仪加速度计的完整实战指南。内容涵盖硬件连接、系统工具调试、Python编程读取数据等全流程,重点解析了I2C通信原理、常见问题排查及数据滤波方法,帮助开发者快速实现运动数据采集,为嵌入式AI项目奠定基础。

p5l2m9n4o6q的博客 484

基于Linux PCI总线驱动模型的网卡驱动分析

基于Linux PCI总线驱动模型的网卡驱动分析 总线概念: 总线是一种传输信号的信道;总线是连接一个或多个导体的电气连线。总线 由电气接口和编程接口组成,我们重点关注编程接口。 PCI(Peripheral Component Interconnect)外围设备互联的简称,是在桌面及更大型的计算机上普遍使用的外设总线。(驱动程序移植) PCI总线具有三个非常显著的优点:

ConceptCon 1181

嵌入式Linux驱动开发 03:平台(platform)总线驱动模型

前面文章 《嵌入式Linux驱动开发 01:基础开发与使用》 和 《嵌入式Linux驱动开发 02:将驱动程序添加到内核中》 介绍了驱动开发最基础的内容,这篇文章将在前面基础上更进一步,引入平台(platform)总线驱动模型。

Naisu的各种笔记 2306

全志R16_SPI总线驱动的使用文档,全志R16开发资料

介绍Linux 内核中SPI 子系统的接口及使用方法,为SPI设备驱动的开发提供参考。适用于基于Linux 3.4内核的全志R16硬件平台。 2. 2. 模块介绍 2.1. 模块功能介绍 Linux 中 SPI 体系结构图 2.1 所示,图中用分割线分成了三个层次: 1. 用户空间,包括所有使用 SPI 设备的应用程序; 2. 内核,也就是驱动部分; 3. 硬件,指实际物理设备,包括了 SPI ...

szx940213的博客 1146
上一篇: C Reference Manual Reading Notes: 010 Definition and Replacement
下一篇: Linux总线驱动-02: struct bus_type 结构体
cppgp
博客等级 码龄20年 47粉丝 46原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值