Linux驱动
文章平均质量分 96
crystal_266
这个作者很懒,什么都没留下…
展开
-
RTL系列WIFI模组Linux驱动移植
文章目录1 驱动源码下载2 驱动移植2.1 源码的拷贝2.2 源代码的修改2.2.1 修改源码顶层目录的Makefile2.3 将wifi 驱动添加到内核中3 编译出错解决3.1 _seqdump 错误3.2 __DATE__ 和 __TIME__ 错误3.3 file_path相关错误1 驱动源码下载 驱动源码的下载链接为 https://https://github.com/lwfinger,根据自己实际使用的芯片型号选择合适的驱动代码进行下载克隆。笔者本次使用的芯片型号为 RTL8723BU,因原创 2021-12-05 21:18:54 · 3133 阅读 · 0 评论 -
14-使用平台设备的LED驱动
文章目录1. 示例代码1.1 led_drv.c1.2 led_dev.c1.3 led.h1.4 test.c1.5 测试结果 上一节讲了平台驱动简单实例,但是并没有添加实际的硬件信息,本节以LED灯为例,讲解平台驱动1. 示例代码1.1 led_drv.c 在 led_drv.c 中使用了 led——dev.c 中的资源,本例中使用的是库函数对LED进行操作,并没有直接映射 LED管脚...原创 2019-12-03 15:27:14 · 1033 阅读 · 4 评论 -
13-驱动设备分离之平台驱动简单实例
文章目录1. 平台驱动1.1 平台驱动相关结构体1.2 平台驱动相关函数2. 平台设备2.1 平台设备相关结构体2.2 平台设备相关函数3. 示例代码3.1 drv.c3.2 dev.c3.3 makefile3.4 测试结果 在前面的学习中,例如LED的驱动中都是直接把LED相关的硬件部分写入到驱动的代码中,如果硬件有改动的时候就要重新修改驱动的代码,这样的驱动通用性很差。为此,接下来我们学习...原创 2019-12-02 15:38:48 · 1312 阅读 · 4 评论 -
21-异步IO
文章目录1. 异步IO简介2. 信号的处理操作2.1 应用层的信号处理 2.1.1 注册信号处理函数 2.1.2 将本应用程序的进程号告诉给内核 2.1.3 开启异步通知2.2 驱动中的信号处理 2.2.1 .fasync函数 2.2.2 fasync_helper 函数 2.2.3 kill_fasync 函数3. 示例代码3.1 demo.c3.2 test.c3.3 Makefile3.4...原创 2019-11-19 17:17:48 · 937 阅读 · 0 评论 -
20-IO多路复用 epoll
文章目录1. epoll简介2. epoll接口函数2.1 应用层接口函数2.2 驱动中接口函数1. epoll简介 阻塞型IO相对于非阻塞型IO来说,最大的优点是资源不可用是进程主动放弃CPU让其他的进程运行,而不用不停的轮询,提高系统的效率,但是缺点也是比较明显的就是进程阻塞之后不能做其他的事情,这在一个进程要同时对多个设备进行操作时非常不便。解决这个问题的方法有很多,比如多进程、多线程和...原创 2019-11-19 16:50:26 · 1386 阅读 · 1 评论 -
19-IO多路复用 poll
文章目录原创 2019-11-19 14:45:31 · 735 阅读 · 1 评论 -
18-IO多路复用 select
文章目录1.1.原创 2019-11-19 13:29:59 · 979 阅读 · 0 评论 -
17-阻塞型IO
文章目录1. 阻塞型IO简介2. 阻塞型IO的定义及相关函数2.1 结构体定义2.2 初始化函数2.3 添加/删除队列节点函数2.4 唤醒操作2.5 等待事件2.6 其他函数1. 阻塞型IO简介 上一篇讲解了非阻塞型的IO,当以非阻塞的方式打开设备时如果资源不可用,则会立即返回并尝试重新获取资源,阻塞性IO会定期尝试查看资源是否可以获取,这种方式效率较低。本文来讲述另外一种IO操作——阻塞性I...原创 2019-11-14 13:32:51 · 876 阅读 · 0 评论 -
16-非阻塞型IO
文章目录1. 非阻塞型IO简介2. 示例代码2.1 demo.c2.2 test.c2.3 Makefile2.4 测试结果1. 非阻塞型IO简介 设备不一定随时都能给用户提供服务,这就有了资源可用和不可用两种状态,程序默认打开设备是以阻塞方式打开的,当以非阻塞打开设备时需要在open时加上O_NONBLOCK标志,非阻塞的访问如下图所示: 应用程序使用非阻塞访问方式从设备读取数据,当设备...原创 2019-11-14 09:44:33 · 440 阅读 · 0 评论 -
15-SPI Linux驱动代码实现
文章目录1 spi_drv.c2 user_lib.c3 test.c4 user.h5 pdebug.h6 Makefile上一节主要讲述了SPI协议和驱动中所用的结构体和函数接口SPI协议和驱动分析,本节将具体实现SPI驱动的代码。1 spi_drv.c 主要包含了spi驱动的注册、注销、probe、ioctl和读写函数#include <linux/module.h>#...原创 2019-10-31 15:19:14 · 2388 阅读 · 1 评论 -
14-SPI协议及驱动讲解
文章目录1. SPI协议简介1.1 SPI典型连接1.2 SPI时序1.3 SPI的四种工作模式2. Linux SPI驱动2.1 spi_device2.2 设备树2.3 spi_driver2.4 SPI驱动注册和注销函数2.5 驱动中SPI数据的传输2.6 SPI中的ioctl命令3 总结1. SPI协议简介1.1 SPI典型连接 SPI是串行外设接口(Serial Periphera...原创 2019-10-31 14:25:03 · 4758 阅读 · 3 评论 -
12-虚拟串口驱动
文章目录1.示例代码1.1 demo.c1.2 test.c1.3 Makefile1.4 测试结果 虚拟串口设备是驱动代码虚拟出来的,不能实现真正的串口数据收发,但是它能 够接收用户想要发送的数据,并且将该数据原封不动的环回给串口的收端,使用户 也能从该串口接受数据。也就是说,该虚拟串口设备是一个功能弱化之后的只具备内环回作用的串口,如下图所示。 内核层 用户层————————|...原创 2019-10-18 17:34:04 · 3020 阅读 · 1 评论 -
内核的锁机制
文章目录1. 原子变量2. 自旋锁3. 读写锁 (读共享,写独占)4. 顺序锁5. 信号量1. 原子变量 如果一个变量的操作是原子性的,即不能再被分割,类似于在汇编代码也只要一条指令就能完成那么对于这样的变量就根本不需要考虑并发带来的影响。typedef struct { int counter;} atomic_t; 由上可知,原子变量其实是一个整型变量。需要说明的是对于非整型变量...翻译 2020-01-14 14:57:39 · 976 阅读 · 1 评论 -
11-四个cdev控制四个LED设备
文章目录1 示例代码1.1 demo.c1.2 test.c1.3 chrdev.h1.4 Makefile1.5 测试结果 上一节描述了一个cdev控制4个led灯的示例10-一个cdev实现对多个设备的支持&emsp;本节将讲述四个cdev控制四个LED设备。1 示例代码1.1 demo.c#include <linux/module.h>#include &...原创 2019-09-29 16:57:42 · 758 阅读 · 1 评论 -
02-注册字符设备驱动
前面介绍了模块的入口和出口函数,接着介绍一下字符设备的注册方法,02-09将采用字符设备简单的注册函数 register_chrdev,09往后将采用另一种注册方法。示例代码demo.c#include <linux/module.h>#include <linux/fs.h>const char *name = "demoname";int major;...原创 2019-09-06 16:03:04 · 1111 阅读 · 1 评论 -
03-open & close
文章目录示例代码Makefile测试结果上一节提到了文件操作方法描述集,但是里面什么内容都没有填充,本节开始将逐步对其进行填充。文件操作方法描述集结构体如下所示,从中可以看出,结构体中有很多函数指针,驱动的编写就是实现这些接口,一个驱动对下面的接口实现的越多,它对用户实现的功能就越多。本节从简单的open close接口开始进行实现struct file_operations { stru...原创 2019-09-06 16:33:23 · 1522 阅读 · 1 评论 -
04-read & write
文章目录示例代码demo.ctest.cMakefile测试结果上一节说到了open和close函数,这一节将描述read和write接口的使用示例代码demo.c#include <linux/module.h>#include <linux/fs.h>#include <linux/device.h>#include <linux/uac...原创 2019-09-06 16:50:55 · 1361 阅读 · 1 评论 -
13-I2C驱动
文章目录示例代码设备树驱动 drv.ctest.c自定义头文件 mpu6050.hMakefile文章以MPU6050三轴加速度计为例,描述I2C驱动的编写示例代码设备树参考文档 Documentation/i2c/instantiating-devices 对设备树进行添加,修改文件 arch/arm/boot/dts/am335x-evmsk.dts,添加以下代码。mpu6050: ...原创 2019-09-25 17:33:37 · 930 阅读 · 1 评论 -
am335x-evmsk设备树解析
文章目录相关名词am335x-evmsk.dts解析相关名词节点名称 是一个“<名称>[@<设备地址>]”形式的名字,[]中的名字不是必需的。如果节点描述的设备有一个地址就应该加上单元地址,并且该地址在reg属性中列出。同级节点的名称必须是唯一的,但只要地址不同多个节点也可以使用一样的名称。例如:memory@80000000vbat: fixedregulato...原创 2019-09-26 16:12:18 · 2965 阅读 · 1 评论 -
05-ioctl
文章目录预备知识1. 应用层ioctl函数2. 驱动层ioctl函数3. 命令格式定义命令格式的解析示例代码demo.ctest.cchrdev.hMakefile测试结果上两节说到了文件操作方法描述集中的open、release、read、write函数,这一节对文件操作方法描述集中的另外一个接口ioct进行描述。对于一些并不是所有字符设备都需要的函数操作,在文件操作方法描述集中统一的归类到i...原创 2019-09-29 12:14:59 · 1815 阅读 · 1 评论 -
06-ioctl LED灯硬件分析
文章目录原理图和芯片手册分析1. 文档下载2. 原理图分析3. 芯片手册分析3.1. GPIO寄存器3.2. 引脚复用3.3. GPIO控制器输出使能4. 总结上一节讲到了应用层和内核层ioctl的实现,主要描述了ioctl的实现及命令的格式定义和解析,但是上一节的代码只是模拟了使用ioctl控制led灯,并未对实际的硬件进行控制,本节将加上对实际硬件的操作。上一节的链接如下:05-ioctl...原创 2019-09-29 14:58:52 · 1892 阅读 · 1 评论 -
07-ioctl控制LED软件实现(寄存器操作)
文章目录1. 预备知识1.1 ioremap1.2 readl1.3 writel1.4 iounmap2. 代码实现2.1 demo.c2.2 test.c2.3 chrdev.h2.5 输出结果&emsp:上一节讲到了LED的硬件分析,得到了LED控制的流程,详见ioctl LED硬件分析这一节将接着上一节的分析,对LED控制的软件部分进行实现,本节实现依据的是直接对相关的寄存器...原创 2019-09-29 15:50:20 · 2404 阅读 · 1 评论 -
08-ioctl控制LED软件实现(库函数操作)
文章目录1. 预备知识2. 代码实现2.1 demo.c2.2 test.c2.3 chrdev.h2.4 Makefile2.5 测试结果 前面讲到了LED的硬件分析,得到了LED控制的流程,详见ioctl LED硬件分析 上一节通过对寄存器的操作实现了LED灯的控制07-ioctl控制LED软件实现(寄存器操作) 这节将通过调用库函数对LED灯进行控制。1. 预备知识 在实现代码之前...原创 2019-09-29 16:16:47 · 2604 阅读 · 5 评论 -
09-注册字符设备的另一种方法(常用)
文章目录1. 定义字符设备结构体2 实例化一个字符设备体,为cdev分配内存3. 向内核申请设备号4. 将设备体与设备号绑定,并向内核添加一个字符设备 前面一直使用register_chrdev来注册字符设备,方法简单但是无法指定次设备号,并且会在内核中连续注册了256(分析内核代码中可知),也就是所以的此设备号都会被占用,而在大多数情况下都不会用到这么多次设备号,所以会造成极大的资源浪费。本节...原创 2019-09-29 16:38:06 · 1339 阅读 · 1 评论 -
10-一个cdev实现对多个设备的支持
文章目录1. 前言2. 代码实现2.1 demo.c2.2 test.c2.3 chrdev.h2.4 Makefile2.5 测试结果1. 前言 如果一个设备有多个个体(比如系统上有两个串口),那么我们就应该写一个驱动来支持这几个设备,而不是每一个设备都写一个驱动。 我们可以向内核注册多个设备号,在添加cdev对象时指名该cdev对象管理了多少个设备;或者添加多个cdev对象,每个cdev...原创 2019-09-29 16:43:03 · 1896 阅读 · 1 评论 -
01-第一个内核模块程序
01-第一个内核模块程序代码实现Makefile代码实现demo.c#include <linux/module.h>/* 函数名可以任意指定又带来了一个新的问题,那就是有可能和内核中的已有函数重 名,为了避免重名而带来的重复定义问题,在函数名前加static关键字修饰,经static 修饰的函数链接属性为内部,从而解决了上述问题。这就是几乎所有的驱动函数都要...原创 2019-09-06 15:33:34 · 1639 阅读 · 1 评论