Linux驱动开发
文章平均质量分 79
凛冬将至__
嵌入式软件开发(驱动开发),文章内容主要为个人学习整理,偏向于实际应用
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
【Linux】Linux下默认的include,include的默认搜索路径
目录中的头文件主要用于嵌入式平台或者特定硬件架构,定义了与特定机器相关的接口和实现。:这些头文件与 Linux 内核的视频子系统相关,定义了图形和显示设备的接口,包括 framebuffer 驱动程序等。目录中的头文件包含了大量的内核接口、数据结构和宏定义,用于编写与内核交互的代码,如驱动程序、内核模块等。:这些头文件与内核的跟踪和调试子系统相关,定义了跟踪点、事件和跟踪控制接口,用于内核性能分析和调试。目录中的头文件是与架构相关的接口定义,提供了特定处理器架构的低级接口和汇编相关的宏或函数。原创 2024-08-18 18:07:37 · 2159 阅读 · 0 评论 -
【Linux】详细解析Linux内核链表
LIST_POISON1 和 LIST_POISON2 是 Linux 内核用来标记已删除链表节点的特殊值。这是内核开发者采用的一种巧妙的防御性编程技术,有助于编写更安全、更健壮的内核代码。list_entry 利用了 C 语言的一个特性:结构体成员的偏移量是固定的。它计算出 struct list_head 成员在整个结构体中的偏移,然后从这个 list_head 指针反推出整个结构体的起始地址。在上面的函数原型中,有这两行代码,他们的含义是什么呢。原创 2024-08-18 17:39:39 · 1907 阅读 · 0 评论 -
【Linux】统一设备模型(kobject、kset、kobj_type)
在之前学习设备驱动的时候,即字符设备驱动的注册与注销这篇文章的时候,在cdev_alloc()和cdev_init()中均出现了kobject_init()这个函数,在当时并不清楚是什么东西,因为当时在乎的是把设备驱动这个框架给学会,在昨天看到文章的时候,又想起来还有这么一个东西没有去搞懂,于是稍微学习了一下,做一个笔记在此。原创 2023-08-03 01:15:00 · 975 阅读 · 0 评论 -
【小知识】深入理解阻塞与非阻塞、同步与异步
阻塞与非阻塞、同步与异步,这几个概念虽然每次看都能看的懂,但是过一段时间又会忘掉,所以系统的整理一下他们的区别,也方便自己后面忘掉的时候快速记忆,虽然网上有很多的说明这些概念的帖子,但是每次去找到能让自己明白的帖子也是一件不容易的事。原创 2023-07-18 23:06:27 · 295 阅读 · 0 评论 -
【Linux】Linux内核内存分配函数kmalloc()、kzalloc()、vmalloc()与__get_free_page()
作为内存管理的基本单位,尽管处理器的最小寻址单位通常为字(或者为字节),但是MMU(内存管理单元)通常以页为单位进行处理。从虚拟内存的角度看,页就是最小单位。等类似函数,申请的内存位于DMA和常规区域的映射区,而且在。申请内存的过程中可以睡眠,因此不能用于中断上下文中。标志来申请内存,若不存在空闲页,直接返回。标志申请内存时,若暂时不能满足,则进程会。等待页,即会引起阻塞,因此。原创 2023-07-08 12:00:29 · 1155 阅读 · 0 评论 -
【Linux】mmap与ioremap
4、如果要操作设备的物理地址,有两种办法,一种是使用ioreamap(),然后用户调用read,write,ioctrl系统调用去访问那块物理地址,这里涉及到了。2、ioreamap()使用在内核里,将设备所在的物理地址映射到内核虚拟地址上,以后访问那个物理地址直接操作映射的虚拟地址就好。3、mmap()用在用户空间,将将设备所在的物理地址映射到用户虚拟地址上,以后访问那个物理地址直接操作映射的虚拟地址就好。,一次是用户空间到内核空间的拷贝,一次是内核空间到物理地址的拷贝;1、两者都是内存映射的函数。原创 2023-07-22 10:11:51 · 2253 阅读 · 0 评论 -
【Linux】Linux驱动开发:并发与竞态(原子操作、自旋锁、信号量、互斥体)
/配合 atomic_dec_and_test 使用//定义并初始化原子变量//配合 atomic_inc_and_test 使用//定义并初始化原子变量。原创 2023-05-14 15:29:12 · 1790 阅读 · 0 评论 -
【Linux】Linux驱动开发:块设备驱动
1、系统中能够随机访问固定大小(1block 512byte)数据片的设备被称之为块设备。块设备文件一般都是以安装文件系统的方式使用,这也是块设备通常的访问方式。块设备的方式访问方式是随机的。2、块设备中小的可寻址单位是扇区,扇区大小一般是2的整数倍。常见的大小是512字节。扇区的大小是块设备的物理属性,扇区是所有块设备的基本单元,块设备无法对比扇区更小的单位进行寻址和操作。3、块是文件系统的一种抽象,只能基于块来访问文件系统。原创 2023-05-13 23:57:59 · 1736 阅读 · 0 评论 -
【Linux】Linux驱动开发:SPI子系统
SPI 驱动框架和 I2C 很类似,都分为主机控制器驱动和设备驱动,主机控制器也就是 SOC 的 SPI 控制器接口。样。和 I2C适配器驱动一样,SPI主机驱动一般都是 SOC 厂商去编写的,所以我们作为 SOC的使用者,这一部分的驱动就不用操心了。原创 2023-05-07 11:58:53 · 3423 阅读 · 2 评论 -
【Linux】Linux驱动开发:I2C子系统
I2C总线只有两根双向信号线。一根是数据线SDA,另一根是时钟线SCL。在Linux 内核中 I2C 的体系结构分为3 个部分:1、I2C 核心:I2C 核心提供了I2C 总线驱动和设备驱动的注册、注销方法等。2、I2C 总线驱动:I2C 总线驱动是对I2C 硬件体系结构中适配器端的实现,适配器可由 CPU 控制,甚至可以直接集成在CPU 内部。一般SOC 的 I2C 总线驱动都是由半导体厂商编写的,不需要用户去编写。原创 2023-05-06 22:41:39 · 2377 阅读 · 0 评论 -
【Linux】Linux驱动开发 IO模型:非阻塞IO
当应用程序发起读取数据(read)的时候,不管数据有没有准备好,read函数都应该立即返回。如果数据准备好了,立即返回数据,如果没有准备好,返回错误码。原创 2023-04-16 10:35:29 · 371 阅读 · 0 评论 -
【Linux】Linux驱动开发:gpio子系统
在设备树中,“GPIO组”就是一个GPIO Controller,这通常都由芯片厂家设置好。我们要做的是找到它名字,比如“gpio1”,然后指定要用它里面的哪个引脚,比如。如果要操作GPIO引脚的话,需要先将所用引脚配置为GPIO功能,这需要通过Pinctrl子系统来实现。在Pinctrl子系统将引脚配置为GPIO功能后,就可以使用GPIO子系统来设置GPIO的方向等。表示这个节点是一个GPIO Controller,它下面有很多引脚。在根节点下写自己的节点。在根节点下写自己的节点。原创 2023-05-05 13:29:31 · 3507 阅读 · 0 评论 -
【Linux】Linux驱动开发:中断子系统
参考文档内核目录如果中断控制器有级联关系,下级的中断控制器还需要表明它的“interrupt-parent”是谁,用了interrupt-parent”中的哪一个“interrupts”你要用哪一个中断控制器里的中断?interrupts你要用哪一个中断?Interrupts里要用几个cell,由 interrupt-parent 对应的中断控制器决定。在中断控制器里有“#interrupt-cells”属性,它指明了要用几个cell来描述中断。原创 2023-05-05 21:37:39 · 1934 阅读 · 0 评论 -
【Linux】Linux驱动开发:platform总线驱动
/定义在linux/module.h中使用时,参数如下:of:总线类型match_table:idtable数组首地址。原创 2023-05-06 14:20:42 · 2645 阅读 · 0 评论 -
【Linux】Linux内核定时器(标准定时器)
其中expires的单位是节拍数,节拍数等于 1 / HZ,而HZ是内核中定义好的,比如说内核中定义的HZ为100, jiffies(jiffies记录了系统启动后的滴答数)就会增加100。原创 2023-04-19 20:23:19 · 392 阅读 · 0 评论 -
【Linux】Linux驱动开发:设备树节点与属性
目录1、设备节点(node)2、属性(property)3、节点的一些特性4、节点的一些标准属性4.1 compatible属性4.2 model属性4.3 status属性4.4 reg属性4.5 #address-cells和 #size-cells属性5、device_node结构体6、property结构体7、 找到节点(device_node)的API7.1 定义节点7.2 of_find_node_by_path7.3 of_find_node_by_name7.4 of_find_compat原创 2023-04-19 14:35:29 · 3313 阅读 · 0 评论 -
【Linux】Linux驱动开发 IO模型:异步通知IO(signal、fasync)
在进程中注册一个信号处理函数,如果硬件的数据准备好的时候,会产生中断,在中断处理函数中给这个进程发送信号即可。如果内核没有发出信号应用程序,不需要阻塞,运行自己特有的代码即可。本来也要在中断处理函数中发送,此处同样的也是在write函数中发信号。2、通过fcntl调用到底层的fasync函数。3、将当前进程号告诉内核。1、注册信号处理函数。原创 2023-04-18 11:42:46 · 804 阅读 · 0 评论 -
【Linux】Linux驱动开发 IO模型:阻塞IO
当应用程序发起读取数据(read)的时候,如果数据没有准备好,就会阻塞等待(进程休眠),如果与硬件的数据准备好了,就会产生硬件中断,在中断处理函数中唤醒休眠的进程,然后将准备好的数据拷贝至用户空间。原创 2023-04-16 13:26:50 · 638 阅读 · 0 评论 -
【Linux】Linux驱动开发 IO模型:多路复用(select/poll/epoll)
在同一个APP应用程序同时监听多个硬件的数据,此时就需要使用I0多路复用机制中的select/poll/epoll来完成多个文件描述符的监听的过程,如果所有的文件描述符对应的数据都没有准备好,进程休眠。3. epoll当在休眠的时候,如果有驱动的数据准备好,epoll能 直接拿到准备好的文件描述符,不需要遍历,效率高。3.当有文件描述符的对应驱动的数据准备好的时候,需要再次遍历找到准备好的文件描述符,效率低。3.当有文件描述符的对应驱动的数据准备好的时候,需要再次遍历找到准备好的文件描述符,效率低。原创 2023-04-17 18:12:46 · 1500 阅读 · 0 评论 -
【Linux】Linux设备驱动开发:字符设备驱动的注册与注销
解析一下各个参数major:主设备号,如果写0可以动态申请name:申请设备的设备名fops:file_operations结构体返回值:返回申请到的设备号。原创 2023-03-30 14:50:18 · 1719 阅读 · 0 评论
分享