
Linux驱动基础
文章平均质量分 68
记录日常学习驱动
SwDengpeixun
这个作者很懒,什么都没留下…
展开
-
[驱动程序] 中断的实现(中断下半部)
上半部和下半部。上半部:上半部就是中断处理函数,那些处理过程比较快,不会占用很长时间的处理就可以放在上半部完成。下半部:如果中断处理过程比较耗时,那么就将这些比较耗时的代码提出来,交给下半部去执行,这样中断处理函数就会快进快出。中断上半部是关中断的状态,也就是CPU不接收其他中断,因此中断上半部要快,不然会丢中断。中断下半部是开中断的状态,CPU可以接收其他中断。原创 2024-08-30 09:46:19 · 1604 阅读 · 0 评论 -
[驱动程序] 中断的实现(中断上半部)
如果使用request_threaded_irq,大都是使用第三种组合,irq_default_primary_harder返回IRQ_WAKE_THREAD,将工作交给thread_fn进行处理。第一种组合比较复杂,在handler中根据实际情况返回IRQ_WAKE_THREAD(唤醒内核中断线程)或者IRQ_HANDLED(中断已经处理完毕,不需要唤醒中断内核线程)。常见用法:中断服务函数调用disable_irq_nosync关闭中断,中断下半部调用enable_irq打开中断。原创 2024-08-30 09:45:22 · 1005 阅读 · 0 评论 -
[驱动程序] 设备树语法
第 19 行,子节点 dcp: dcp@02280000 的 reg 属性值为<0x02280000 0x4000>,因为父节点设置了#address-cells = <1>,#size-cells = <1>,address= 0x02280000,length= 0x4000,相当于设置了起始地址为 0x02280000,地址长度为 0x40000。第一行,“/”是根节点,每个设备树文件只有一个根节点,而dts和dtsi的都会有一个根节点,这两个“/”或多个根节点的内容会合并成一个根节点的内容。原创 2024-08-30 09:44:26 · 1124 阅读 · 0 评论 -
[驱动程序] 平台设备驱动程序示例
其中name 属性用于传统的驱动与设备匹配,也就是检查驱动和设备的 name 字段是不是相同。第 41~47 行,xxx_remove 函数,platform_driver 结构体中的 remove 成员变量,当关闭 platfor备驱动的时候此函数就会执行,以前在驱动卸载 exit 函数里面要做的事情就放到此函数中来。总体来说,platform 驱动还是传统的字符设备驱动、块设备驱动或网络设备驱动,只是套上了一张“platform”的皮,目的是为了使用总线、驱动和设备这个驱动模型来实现驱动的分离与分层。原创 2024-08-29 11:38:09 · 933 阅读 · 0 评论 -
平台设备驱动
device_driver 结构体(表示设备驱动)中有个名为of_match_table的成员变量,此成员变量保存着驱动的compatible匹配表,设备树中的每个设备节点的 compatible 属性会和of_match_table 表中的所有成员比较,查看是否有相同的条目,如果有的话就表示设备和此驱动匹配,设备和驱动匹配成功以后 probe 函数就会执行。第 1~4 行,of_device_id 表,也就是驱动的兼容表,是一个数组,每个数组元素为 of_device_id类型。原创 2024-08-29 11:29:49 · 1029 阅读 · 0 评论 -
[驱动程序] 内核GPIO相关函数
都推荐使用gpiod开头的接口,因为gpiod开头的接口传进去的是gpio_desc结构体,方便做资源管理,使用 gpiod 的好处是我们申请后不进行 free 也没有什么问题;传统的gpio接口传进去的是GPIO number,需要手动释放资源,不好做资源管理。函数返回一个 GPIO 描述符,或一个错误编码,可以使用 IS_ERR() 进行检查。#include //linux自带的。gpio,引脚的编号,依赖于芯片厂商提供的源代码,没有唯一的。gpio,引脚的编号。原创 2024-08-29 11:09:57 · 700 阅读 · 0 评论 -
[驱动模块] 驱动程序的调试
6)查看class和device。1)加载、查看、卸载驱动模块。3)查看主设备号和设备名称。2)手动创建设备节点。原创 2024-08-29 10:59:07 · 253 阅读 · 0 评论 -
[驱动程序] 内核内存分配
由于 vmalloc() 没有保证申请到的是连续的物理内存,因此对申请的内存大小可以比较大,关于申请内存的大小要根据/proc/meminfo文件中的“VmallocChunk”剩余多少空间可以申请。kzalloc() 函数与 kmalloc() 非常相似,参数及返回值是一样的,可以说是前者是后者的一个变种,因为 kzalloc() 实际上只是额外附加了 __GFP_ZERO 标志。kmalloc() 申请的内存虚拟地址是连续的,对应的物理地址上是连续的,即线性的。原创 2024-08-29 10:45:13 · 731 阅读 · 0 评论 -
[驱动程序] 内核延时函数
忙等待延时,对于长时间的忙等待意味这无谓的耗费着cpu的资源,就是独占CPU,常用于短延时。睡眠延时,会形成阻塞,导致进程调度(常用于长延时)。优点:优点不占用CPU资源。缺点:占用CPU资源。原创 2024-08-29 10:38:20 · 235 阅读 · 0 评论 -
[驱动程序] 用户空间和内核空间交互数据
失败返回:非0值,不能被拷贝的字节数,也就是有多少个字节没有被成功拷贝。from --> 内核空间数据的地址。失败返回:非0值,不能被复制的字节数。from --> 用户空间数据的地址。to --> 用户空间数据的地址。to --> 内核空间数据的地址。原创 2024-08-29 10:33:49 · 231 阅读 · 0 评论 -
[驱动程序] 内核常见的错误码
【代码】[驱动模块] 内核常见的错误码。原创 2024-08-29 10:30:27 · 196 阅读 · 0 评论 -
[驱动程序] 申请物理内存区、映射和使用
分析原理图–>找到控制硬件的GPIO–>找GPIO的寄存器—>分析寄存器—>理解寄存器的控制顺序—>通过寄存器的地址来访问该寄存器裸机使用的是物理地址,所以直接使用CPU手册查到的地址可以编程。linux驱动使用的虚拟地址,不能直接使用物理地址。想办法,如果通过CPU手册查到的物理地址找到其对应虚拟地址?申请物理地址区作为一个资源----->将物理内存区做内存的动态映射,得到虚拟地址。资源—有限的,一旦一个物理内存区已经申请了,后面就不能再次申请。原创 2024-08-29 10:12:44 · 336 阅读 · 0 评论 -
字符设备驱动
dev_t dev;在linux内核中,使用cdev来描述一个字符设备,每个字符设备都有一个自己的cdev。设计字符设备首先定义一个cdev。每个设备文件(字符设备 or 块设备)都已一个设备号,相当于设备文件ID。设备号有主设备号和次设备号组成的。设备号是一个32bits的无符号整型值。原创 2024-08-29 09:52:56 · 620 阅读 · 0 评论 -
linux设备驱动的分类
数据交互的时候,是按照固定的顺序传输的;数据是实时传输的,是没有缓存的。应用程序和驱动程序之间进行数据读写的时候,数据是以“块”为单位,1block=1024KB。块设备是有缓存的,块设备是有文件系统的。绝大部分设备驱动是字符设备:LED、BEEP、按键、键盘、触摸屏、摄像头、液晶屏、声卡、IIC、SPI、…大容量的存储设备一般都是块设备:nand flash、eMMC、SD、U盘、硬盘、…标准IO函数:fopen()/fread()/fwrite()/fclose()网卡类的设备:有线网卡、无线网卡、…原创 2024-08-29 09:19:00 · 407 阅读 · 0 评论