
Linux驱动
文章平均质量分 94
本专栏将会为大家分享一些有关Linux字符设备、块设备、网络设备驱动的一些知识
小嵌同学
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
PCI设备的访问方法
如何访问到某个PCI设备?上图中有PCI0 和 PCI1两个PCI总线,这两个总线通过PCI-to-PCI Bridge桥设备进行连接,属于同一个PCI总线树。1)CPU地址空间与PCI设备访问2)PCI设备地址分配与响应3)配置PCI设备的过程 疑问一:一开始的时候PCI总线连接了多个设备,设备都还没有地址空间。设备如何知道cpu在总线上传输的地址是用来访问他的,还是访问其他设备的? 疑问二:那么一开始我们想去配置它的时候,我们怎样才能够选中这个设备? 疑问三:在PCI总线上有那么多设备,我原创 2025-07-27 18:49:17 · 628 阅读 · 0 评论 -
简单了解PCI 和 PCIE
总线结构共享并行总线:所有设备挂载在同一总线上,通过仲裁器竞争访问权限。带宽限制:32位/33 MHz 版本带宽仅133 MB/s(64位/66 MHz 提升至 533 MB/s)。物理接口:使用多根数据线(32/64位)和边带信号(如中断请求线)。拓扑结构fill:#333;color:#333;color:#333;fill:none;CPUPCI桥设备1设备2设备3菊花链拓扑:设备串联连接,总线扩展需通过PCI桥芯片。局限性带宽瓶颈:多设备共享带宽,高速设备(如显卡)性能受限。原创 2025-07-26 17:27:34 · 704 阅读 · 0 评论 -
Linux内核启动时处理启动参数
这些宏和函数主要用于在 Linux 内核初始化过程中解析和处理启动参数。通过宏,可以方便地注册启动参数及其处理函数,并将这些参数分类为早期处理或非早期处理。宏则提供了一种便捷的方式来处理启用和禁用的启动参数。和函数则在内核初始化过程中调用,解析这些参数。首先,我们定义一个全局变量my_value,用于存储my_option// 默认值为 0。原创 2025-01-12 20:19:02 · 1228 阅读 · 0 评论 -
修饰Linux驱动初始化以及逆初始化函数的宏定义详解
阅读Linux驱动源码时,我们发现驱动的初始化函数和逆初始化函数总会被一个宏进行修饰,__section__section__initcall;__exitcall;这段代码是 Linux 内核模块加载和卸载机制的一部分。它使用了一些宏和属性来确保模块在特定的阶段被正确加载和卸载。这个宏定义了,它实际上调用了宏,传入了平台驱动的注册和注销函数。.init.text.previous.exit.text通过这些机制,Linux 内核模块可以优雅地管理和加载/卸载平台驱动程序。原创 2025-01-12 19:56:57 · 494 阅读 · 0 评论 -
Linux RTC 驱动框架
实时时钟(Real-Time Clock,简称 RTC)是一种能够持续记录时间的电子设备。它通常用于计算机、嵌入式系统和其他需要准确时间记录的设备中。RTC 可以在系统关机或断电的情况下继续运行,因此即使在系统重启后也能保持准确的时间。class.c:为底层驱动提供 register 与 unregister 接口用于 RTC 设备的注册/注销。初始化 RTC设备结构、sysfs、proc;:提供用户程序与 RTC 的接口函数;dev.c:将 RTC设备抽象为通用的字符设备,提供文件操作函数(原创 2024-12-24 23:57:24 · 1286 阅读 · 2 评论 -
UART驱动学习三(TTY驱动部分源码解析)
定义了与TTY设备相关的所有信:用于存储终端线的配置信息,如输入输出标志、控制标志等。:定义了行规程的操作集,包括打开、关闭、读取、写入等操作。tty_ldisc:表示一个行规程实例,包含指向其操作的指针。原创 2024-10-07 20:07:00 · 1248 阅读 · 0 评论 -
UART驱动学习二(TTY体系)
本文主要介绍了 Linux 系统中的 TTY 体系,包括 TTY 体系中各种设备节点的差别以及 TTY 驱动框架。提供了多篇必读的参考资料,包括对 TTY 的解密文章、关于 Linux 各种终端类型和概念的文章、Linux 终端和 Line discipline 图解文章以及关于电传机的介绍文章等。原创 2024-10-06 23:52:48 · 1572 阅读 · 0 评论 -
UART驱动学习一(UART硬件介绍)
以上不同的UART芯片代表了串口通信技术从早期8250到现代NS16850的演变过程,随着技术的发展,它们在数据处理能力、缓冲区大小和支持的波特率等方面逐步得到了增强。这使得现代的串口通信能够在更高的速度和更复杂的环境中工作。例如,现代操作系统和硬件往往使用NS16550A或NS16850,因为它们提供了优良的性能和功能。如果需要在特定应用中选择合适的串口芯片,可以根据上述特性进行参考。本文章参考了韦东山老师驱动大全部分笔记,其余内容为自己整理总结而来。水平有限,欢迎各位在评论区指导交流!!!😁😁😁。原创 2024-09-29 00:15:50 · 2257 阅读 · 0 评论 -
SPI驱动学习七(SPI_Slave_Mode驱动程序框架)
使用SPI传输时,最小的传输单位是"spi_transfer",对于一个设备,可以发起多个spi_transfer,这些spi_transfer,会放入一个spi_message里。从spi_master的队列里取出每一个spi_message从spi_message的队列里取出一个spi_transfer处理spi_transfer。原创 2024-09-28 20:05:07 · 2564 阅读 · 0 评论 -
SPI驱动学习六(SPI_Master驱动程序)
SPI 是“串行外设接口”的缩写,它在嵌入式系统中广泛使用,因为它是一个简单且高效的接口:基本上是一个多路复用的移位寄存器。它的三个信号线分别为时钟线(SCK,通常在 1-20 MHz 范围内)一个“主机输出从机输入”(MOSI)数据线和一个“主机输入从机输出”(MISO)数据线。SPI 是一种全双工协议;每在MOSI线上移出一位(每时钟一位),MISO线上就会移入一位。这些位在去往和从系统内存传送的过程中会被组装成各种大小的字。一个额外的芯片选择线通常是低电平有效的(nCS);原创 2024-09-23 00:06:13 · 1677 阅读 · 0 评论 -
SPI驱动学习五(如何编写SPI设备驱动程序)
SPI Master(或者说控制器) 通过platform总线设备驱动模型进行实现,SPI Device通过SPI driver驱动模型来实现。SPI设备的设备树节点,会被转换为一个spi_device结构体。在SPI子系统中,用spi_transfer结构体描述一个传输,用spi_message管理多个传输。DAC模块接在这个插座上,那么要在设备树里spi1的节点下创建子节点。在这个节点下,创建子节点,用来表示SPI设备。将该部分内容添加到主控板的设备树文件中。在设备树里,找到SPI控制器的节点。原创 2024-09-08 23:31:34 · 3504 阅读 · 0 评论 -
SPI驱动学习四(通过SPI操作外设模块)
首先要确定内核中已经含有spidev。要操作OLED,只需使用SPI接口发送数据,并不需要使用SPI接口读取数据。整体过程与SPI DAC模块类似,将该设备树内容添加到主控板设备树文件,重新编译内核,烧录到主控板重启即可;显存被分为8页、127列,要写某个字节时,需要先指定地址,然后写入1字节的数据。DAC模块接在这个插座上,那么要在设备树里spi1的节点下创建子节点。OLED上有128*64个像素,每个像素只有2种状态:亮、灭。让DC引脚为高,发起SPI写操作即可。对于OLED的初始化,在参考手册。原创 2024-09-08 19:27:01 · 1162 阅读 · 0 评论 -
SPI驱动学习三(spidev的使用)
1. 驱动框架 设备树示例:下图请双击放大查看!!! 设备树里某个spi设备节点的compatible属性等于下列值,就会跟spidev驱动匹配: 匹配之后,spidev.c的会被调用,它会: spidev.c通过file_operations向APP提供接口,上层通过这些接口操作SPI设备 为了便于大家深入学习,我借助阿里的对整个文件代码进行了注释,在这里分享给大家:二、SPI应用程序分析 内核提供的测试程序:,这里不提供源码,大家自己打开内核源码这个文件,学习驱动源码应该都有。原创 2024-09-01 22:53:37 · 3832 阅读 · 3 评论 -
SPI驱动学习二(驱动框架)
在SPI Master对应的设备树节点下,每一个子节点都对应一个SPI设备,这个SPI设备连接在该SPI Master下面。在设备树里,会有一个节点用来表示SPI控制器。会在设备树里使用子节点来描述SPI设备。这通常意味着该节点的资源大小是隐含的,或者不需要明确地在设备树中指定资源的大小。考虑一个设备树的片段,其中定义了一个总线节点,并且包含两个子节点:一个内存节点和一个设备节点。, Linux中使用spi_master结构体描述SPI控制器,里面最重要的成员就是。在设备树中,对于SPI Master,原创 2024-09-01 21:09:00 · 2397 阅读 · 0 评论 -
SPI驱动学习一(协议原理)
SPI(Serial Peripheral Interface)协议是一种用于微控制器与外部设备之间串行数据通信的标准接口协议。SPI协议由摩托罗拉公司最初开发,广泛应用于各种电子设备中,如传感器、存储设备、显示器等。SPI是一种同步串行通信协议,允许多个外部设备与主设备(通常是微控制器)进行数据交换。SPI协议的基本通信方式是全双工,即可以同时进行数据的发送和接收。也可以是单向的,数据传输的长度通常以字节为单位。SPI协议没有定义速度限制,读写操作由主设备发起,且外设的写操作和读操作是同步完成的.原创 2024-08-19 23:27:42 · 1403 阅读 · 0 评论 -
解析中断引起的调度延迟问题
硬件中断和软件中断都有可能导致调度延迟,但两者的影响方式略有不同。 硬件中断:当硬件设备发送中断请求时,CPU 会立即响应中断并执行对应的中断处理程序。在处理硬件中断时,CPU 会暂时中断当前任务的执行,切换到中断处理程序,处理完中断后再切换回原任务。硬件中断有可能打断正在执行的任务,引起调度延迟。 软件中断:软件中断是由软件程序触发的中断,通常是通过系统调用或软中断指令来实现。软件中断不像硬件中断那样突然而来,一般在优先级比较低,不会立即打断正在执行的任务。但是,软件中断也需要处理,其处理过程可能原创 2024-06-10 23:21:01 · 1737 阅读 · 0 评论 -
深入了解 Linux 中的 MTD 设备:/dev/mtd* 与 /dev/mtdblock*
在嵌入式Linux系统的世界里,非易失性存储技术扮演着至关重要的角色。MTD(Memory Technology Device)子系统是Linux内核的一个组成部分,它为各种类型的闪存和EEPROM设备提供了一个统一的接口。/dev/mtd*和,它们的用途、区别以及如何在实际场景中应用这些知识。MTD(Memory Technology Device)子系统是 Linux 内核中的一个子系统,用于管理非易失性存储器设备,如闪存芯片(NAND、NOR 等)。原创 2024-03-26 00:04:40 · 12188 阅读 · 2 评论 -
V4L2系列 之 V4L2驱动框架
本篇文章主要介绍Linux内核中的V4L2框架,本篇文章所用内核版本:linux-4.19v4L2 (Video for Linux 2),是linux的一套视频框架,共主体位于内核,可以理解为是整个linux系统上面的视频源捕获驱动框架。其广泛应用在嵌入式设备、移动端以及个人电脑设备上面,市而上使用视频图像采集的设备如:手机、IPC、行车记录仪都会用到这个框架来进行视频采集。v4L2允许 应用程序 控制图像传感器以及传输格式,应用程序 借此完成拍照、预览、视频记录等图像传感器数据应用。原创 2023-04-23 00:28:06 · 4975 阅读 · 0 评论 -
V4L2系列 之 初识V4L2
由于进行linux音视频开发,通常会涉及到音频以及摄像头视频驱动,所以对V4L2以及ALSA驱动框架进行学习,并整理相关的笔记和大家分享!原创 2023-04-10 00:03:41 · 1173 阅读 · 0 评论 -
中断系统中的设备树
一、中断概念的引入与处理流程1、何为中断? 中断是为单片机具有对外部或内部随机发生的事件实时处理而设置的。为了便于大家理解中断概念,给大家举一个例子: 至于能看这篇文章,各位应该都是单片机和嵌入式老手了,中断应该都懂,给大家简要回忆下就行了。(1)中断的发明是用来解决宏观上的并行需要的。宏观就是从整体上来看,并行就是多件事情都完成了。(2)微观上的并行,就是指的真正的并行,就是精确到每一秒甚至每一刻,多个事情都是在同时进行的。宏观上面的并行并不等于微观上的并行,有时候宏观上是并行的,微观上是串行原创 2022-09-22 00:24:52 · 1633 阅读 · 0 评论 -
内核对设备树的处理(2)
目录一、dtb转换为device_node(unflatten)二、device_node转换为platform_device三、platform_device跟platform_driver的匹配四、内核中设备树的操作函数五、在根文件系统中查看设备树(有助于调试)一、dtb转换为device_node(unflatten)二、device_node转换为platform_device三、platform_device跟platform_driver的匹配四、内核中设备树的操作函数五、在根文件系统原创 2022-05-22 17:44:14 · 340 阅读 · 0 评论 -
字符设备驱动的三种实现方法
目录一、驱动程序编写的三种方法二、字符设备驱动的传统写法三、总线设备驱动模型四、使用设备树时对应的驱动编程五、只想使用设备树而不想深入研究该如何?一、驱动程序编写的三种方法a. 驱动程序编写有3种方法:传统方法、使用总线设备驱动模型、使用设备树b. 这3种方法也核心都是一样的: 分配、设置、注册 file_operations结构体 这个结构体中有.open, .read, .write, .ioctl等成员 驱动程序要实现这些成员,在这些成员函数中操作硬件c. 这3种方法的差别在于:如何指定硬原创 2022-05-09 22:21:50 · 2116 阅读 · 2 评论 -
网络设备驱动介绍(浅析)
目录一、网络设备驱动概述1、什么是网络设备2、网络设备接口3、学习方法二、虚拟网卡驱动分析1、虚拟网卡安装、卸载、打开、关闭、设置IP地址等实践2、虚拟网卡驱动分析3、DM9000驱动源码分析一、网络设备驱动概述1、什么是网络设备(1)网络设备(指的是软件),驱动框架中使用结构体虚拟出一个个设备,而驱动程序本身也是软件(2)物理网卡: 真正的硬件网卡设备2、网络设备接口(1)/dev下没有设备文件,也不通过/sys下的属性文件访问。直观看来,应用层都是通过一些特殊的命令(如ifconfig、pi原创 2021-10-20 17:31:51 · 2794 阅读 · 0 评论 -
块设备驱动介绍(浅析)
目录一、正确理解块设备驱动的概念1、块设备和字符设备的差异2、块设备驱动的特点3、块设备相关的几个单位二、块设备驱动框架简介1、块设备驱动框图2、重点结构体三、块设备驱动案例分析1、块设备驱动案例演示2、块设备驱动简单分析3、源码分析一、正确理解块设备驱动的概念1、块设备和字符设备的差异(1)块和字符是两种不同的访问设备的策略,而非指具体的设备(2)同一个设备可以同时支持块和字符两种访问策略(3)设备本身的物理特性决定了哪一种访问策略更适合(4)块设备本身驱动层支持缓冲区,而字符设备驱动层没有缓原创 2021-10-19 20:16:57 · 3092 阅读 · 0 评论 -
触摸屏驱动学习并移植
目录一、触摸屏驱动概览1、常用的2种触摸屏2、本专栏文章开发板:朱老师X210使用的触摸屏3、学习触摸屏驱动的关键点二、gslX680驱动的移植实践1、初步移植实验2、在内核配置中添加CONFIG项三、gslX680驱动源码分析1、kernel/drivers/input/touchscreen/gslX680.c四、ft5x06驱动移植及源码分析1、驱动移植2、ft5x06驱动源码分析一、触摸屏驱动概览1、常用的2种触摸屏(1)电阻触摸屏。驱动一般分2种:一种是SoC内置触摸屏控制器,一种是外置的专原创 2021-10-18 19:54:11 · 3154 阅读 · 0 评论 -
linux驱动之I2C子系统
目录一、I2C基本原理二、linux内核的I2C子系统详解1、linux内核的I2C驱动框架总览2、I2C子系统的4个关键结构体(kernel/include/linux/i2c.h)3、关键文件4、i2c-core.c初步分析(从后向前看)5、I2C总线的匹配机制(i2c-core.c)6、核心层开放给其他部分的注册接口7、adapter模块的注册8、s3c24xx_i2c_probe函数分析9、i2c_algorithm10、i2c_driver的注册一、I2C基本原理(1)三根通信线:SCL、SD原创 2021-10-17 21:41:37 · 2234 阅读 · 0 评论 -
内核中的竞争、互斥、中断上、下半部
目录一、内核中的竞争状态和互斥1、一些概念2、解决竟态的方法3、自旋锁和信号量的使用要点二、中断的上下半部1、中断处理的注意点2、中断下半部2种解决方案详解3、tasklet使用实战4、workqueue实战演示5、中断上下半部处理原则一、内核中的竞争状态和互斥浅谈可重入函数与不可重入函数:https://blog.youkuaiyun.com/chenyefei/article/details/826822411、一些概念(1)竞争状态(简称竟态)并发:多CPU、多任务、多中断操作一块相同的代码,在未运行完原创 2021-10-16 17:34:19 · 1165 阅读 · 0 评论 -
Linux驱动input子系统基础之按键
目录一、什么是input子系统1、何为输入设备2、linux中输入设备的编程模型3、input子系统简介二、input设备应用层编程实践1、确定设备文件名2、标准接口打开并读取文件3、解析struct input_event4、解析键盘事件数据5、解析鼠标事件数据三、input子系统架构总览1、input子系统分为三层2、input类设备驱动开发方法四、输入核心层源码分析1、核心模块注册input_init2、设备驱动层的接口函数3、handler和device的匹配4、事件驱动层的接口函数五、输入事件驱动原创 2021-10-12 22:28:45 · 2024 阅读 · 0 评论 -
framebuffer驱动详解
目录一、framebuffer介绍1、什么是framebuffer2、framebuffer的使用二、framebuffer应用编程实践1、打开设备2、获取设备信息3、mmap做映射4、fb显示之刷背景5、设置分辨率6、写字、画线、图片显示等三、framebuffer驱动框架总览1、驱动框架部分(kernel/drivers/video/fbmem.c)2、驱动部分3、如何分析四、framebuffer驱动框架分析1、fbmem_init函数2、fb_fops结构体3、register_framebuffe原创 2021-10-08 21:10:59 · 5489 阅读 · 8 评论 -
misc类设备与蜂鸣器驱动
目录一、板载蜂鸣器驱动测试1、驱动部分2、应用部分二、misc类设备介绍1、何为misc2、misc类设备驱动架构3、本部分学习方法三、misc驱动框架源码分析11、misc源码框架基础2、misc类设备的注册3、open函数分析4、内核互斥锁四、蜂鸣器驱动源码分析1、dev_init2、ioctl(input output control,输入输出控制)3、硬件操作有关的代码一、板载蜂鸣器驱动测试1、驱动部分kernel\drivers\char\buzzer\x210-buzzer.c(1)九鼎原创 2021-09-30 21:46:08 · 422 阅读 · 0 评论 -
Linux设备驱动模型
目录一、linux设备驱动模型简介1、什么是设备驱动模型2、为什么需要设备驱动模型3、驱动开发的2个点二、设备驱动模型的底层架构1、kobject2、kobj_type3、kset三、总线式设备驱动组织方式1、总线2、设备3、驱动4、类5、总结四、platform平台总线工作原理1、何为平台总线2、平台总线下管理的2员大将3、平台总线体系的工作流程4、代码分析:platform本身注册5、以leds-s3c24xx.c为例来分析platform设备和驱动的注册过程6、platdata怎么玩7、match函数原创 2021-09-23 17:09:34 · 2126 阅读 · 0 评论 -
驱动框架入门之LED
目录一、何谓驱动框架二、内核驱动框架中LED的基本情况三、初步分析led驱动框架源码1、涉及到的文件2、subsys_initcall3、led_class_attrs4、led_classdev_register四、在内核中添加或去除某个驱动五、基于驱动框架写led驱动六、linux内核的gpiolib学习1、gpiolib学习重点2、gpiolib的学习方法3、主线1:gpiolib的建立4、struct s3c_gpio_chip5、s5pv210_gpio_4bit6、S5PV210_GPA0宏7、原创 2021-09-14 22:25:27 · 1595 阅读 · 0 评论 -
字符设备驱动高级
目录一、注册字符设备驱动新接口https://blog.youkuaiyun.com/huhuandk/article/details/988457051、新接口与老接口(1)老接口:register_chrdev注册的关键是主次设备号(2)新接口:register_chrdev_region/alloc_chrdev_region + cdevint register_chrdev_region(dev_t from, unsigned count, const char *name)First:要分原创 2021-09-09 10:22:05 · 335 阅读 · 0 评论 -
字符设备驱动基础
目录一、开启驱动开发之路二、最简单的模块源码分析三、用开发板来调试模块四、字符设备驱动工作原理1、系统整体工作原理2、file_operations结构体(和文件操作有关)3、注册字符设备驱动4、register_chrdev详解(#include 一、开启驱动开发之路1、驱动开发的准备工作(1)正常运行linux系统的开发板。要求开发板中的linux的zImage必须是自己编译的,不能是别人编译的。因为需要一个内核源码树。(2)内核源码树,其实就是一个经过了配置编译之后的内核源码。编译驱动时,需要用原创 2021-08-21 16:42:27 · 1078 阅读 · 2 评论 -
驱动应该怎么学
前言本篇文章主要为大家简要地介绍一下Linux驱动以及学习Linux驱动的基本方法。一、什么是驱动1、理解驱动的概念(1)驱动一词的字面意思:用动力推动,施加外力,使动起来(2)物理上的驱动(3)硬件中的驱动:电源类设备,比如电源就是一个驱动,驱动led照明,供电(4)linux内核驱动。软件层面的驱动广义上就是指:这一段代码操作了硬件去动,所以这一段代码就叫硬件的驱动程序。(本质上是电力提供了动力,而驱动程序提供了操作逻辑方法)狭义上驱动程序就是专指操作系统中用来操控硬件的逻辑方法部分代码。原创 2021-08-11 00:54:05 · 957 阅读 · 0 评论