
Linux 驱动开发学习
文章平均质量分 61
详细整理之前学习的驱动开发笔记及思路
<( ̄︶ ̄)Okay.
<( ̄︶ ̄)↗[GO!]
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
驱动开发学习目录
驱动开发学习目录字符设备驱动开发原创 2021-07-02 17:25:10 · 205 阅读 · 0 评论 -
文件锁学习
强制性锁是由内核执行的锁,当一个文件被上锁,进入写操作的时候,内核将阻止其他任何程序对该文件进行读写操作。每个相关程序在访问文件之前检查是否有锁存在,并且尊重已有的锁。若要加锁整个文件,可以将l_start设置为0,l_whence设置为SEEK_SET,l_len设置为0。在文件已经共享的情况下如何操作,也就是多个程序共同操作一个文件的情况,linux中通常采用的方法时给。具有阻塞当前进程的锁,其持有的进程号存放在l_pid中,仅有F_GETLK返回。F_SETLK设置lock描述的文件锁。...原创 2022-07-28 15:53:59 · 326 阅读 · 0 评论 -
linux移植memtester工具
memtester下载地址1.下载下来之后解压2.修改下面两个文件3.换成自己的交叉编译工具4.make原创 2022-04-12 19:38:46 · 296 阅读 · 0 评论 -
iperf linux移植
1.iperf的git地址git clone https://github.com/esnet/iperf.git2.下载到ubuntu上3.找到交叉工具包的位置/opt/arm-ca9-linux-gnueabihf-6.5/bin4.在iperf下创建一个install目录5../configure --host=arm-ca9-linux-gnueabihf --prefix=/home/lcl/test/iperf_test/install6.make7.make ins原创 2022-02-15 10:10:59 · 786 阅读 · 0 评论 -
Linux高精度定时器的使用
高精度定时器使用场景使用高精度定时器,控制gpio脚的上下电模拟PWM控制风扇转速。应用程序思路编写一个测试程序,传入gpio引脚,周期和高电平时间,程序中用IOCTL函数将参数传入到驱动中进行配置。为此定义一个结构体:typedef struct yw_gpio_pwm_out_t{ int gpio_id; int pwm_period;//ns int pwm_duty_cycle;//high lever last times :ns}yw_gpio_pmw_ou原创 2021-12-05 10:46:34 · 1135 阅读 · 0 评论 -
linux资料
linux资料转载 2021-11-08 12:09:49 · 77 阅读 · 0 评论 -
busybox源码下载地址
busybox转载 2021-11-02 12:43:47 · 1088 阅读 · 0 评论 -
buildroot使用手册
The Buildroot user manual转载 2021-11-01 09:59:43 · 187 阅读 · 0 评论 -
利用linux内核将多个文件编译成一个ko文件
利用linux内核将多个文件编译成一个ko文件1.如果一个驱动直接编译进内核,直接按照以下方式书写:obj-y += generic_serial.o vme_scc.oobj-y += a.o2.如果一个驱动要编译成模块,且一个模块由1个源文件编译而成:obj-m += a.o3.如果一个驱动要编译成模块,且一个模块由多个源文件编译而成, 其编译过程为:obj-m += ab.oab-objs := a.o b.o编译过程:a.c -> a.ob.c -> b.o转载 2021-09-21 18:42:14 · 1132 阅读 · 0 评论 -
IOCRL用户与驱动之间的协议
用户空间的ioctl#include <sys/ioctl.h> int ioctl(int fd, int cmd, ...) ;内核中的ioctllong (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);long (*compat_ioctl) (struct file *, unsigned int, unsigned long);ioctl用户与驱动之间的协议参数含义di原创 2021-08-21 20:09:20 · 212 阅读 · 0 评论 -
#define相关语法
跨行的宏定义跨行宏定义使用反斜杠\连接#define YW_GPIO_ERR(...) do{\ printk("[yw_gpio][err] [%d] ", __LINE__);\ printk(__VA_ARGS__);\}while(0)"#"使用功能:用来把参数转化成字符串示例代码#define P(A) printf("%s:%d\n",#A,A);int main(int argc, char **argv){ int a = 1;原创 2021-08-21 19:48:39 · 230 阅读 · 0 评论 -
Proc文件系统学习
参考文章Proc文件系统概述Proc File System是一个虚拟的文件系统,可以理解为内核对用户开放的接口,让内核和用户进程进行数据交换(读取内核进程的数据,修改内核参数等)。例如:cat /proc/cpuinfoCreating a new Proc file要创建一个Proc file需要实现file_operation结构体,主要实现read和write就可以了。然后通过proc_create来注册,将模块注册到内核后,就能在/proc/目录找到我们的文件了。对该文件进行读写原创 2021-08-21 16:38:38 · 139 阅读 · 0 评论 -
LCD显示的一些基本概念
参考文章LCD的一些基本概念添加链接描述知识点水平消隐(Hblank):电子枪从左到右画出像素,他每次只能画一条扫描线,画之前要先回到左边并做好画下一条扫面线的准备,这之间有一段时间叫做水平消隐。垂直消隐(VBlank):在画完全部的的256条扫描线之后,他又回到屏幕左上角准备下一次画屏幕(下一帧)。这之间的一段时间就是垂直消隐。电子枪就是在不断的走“Z”字形。行同步(HSYNC):行同步就是让电子枪控制器知道下面要开始新的一行像素。场同步(vsync):场同步就是告诉电子枪控制器下面要原创 2021-08-02 16:40:14 · 4983 阅读 · 0 评论 -
yuv图解(YUV444,YUV422,YUV420,YV12,NV12,NV21)
图解YUV转载 2021-08-02 11:22:24 · 19082 阅读 · 0 评论 -
rockchip — display-timing dts配置
rockchip — display-timing dts配置转载 2021-07-22 14:18:20 · 416 阅读 · 0 评论 -
linux内核新版gpio配置
新版gpio操作转载 2021-07-22 11:40:39 · 195 阅读 · 0 评论 -
linux内核新版gpio配置
新版gpio操作转载 2021-07-22 11:40:39 · 296 阅读 · 0 评论 -
Linux DRM框架详解
Linux DRM框架详解转载 2021-07-20 16:24:08 · 1499 阅读 · 0 评论 -
DRM概述
概述DRM全称是Direct Rendering Manager,管理进行显示输出的, buffer分配, 帧缓冲。libdrm库提供了一系列友好的控制封装, 使用户可以方便的进行显示的控制, 但并不是 只能通过libdrm库来 控制drm, 用户可以直接操作drm的ioctl或者是使用framebuffer的 接口实现显示操作. 后面重点介绍kernel态 drm的机制.框架设备节点DRM 的设备节点为 “/dev/dri/cardX”, X为0-15的数值.默认使用的是/dev/dri/c原创 2021-07-20 09:14:15 · 1890 阅读 · 0 评论 -
19.CPU温度获取
cpu温度获取转载 2021-07-16 10:13:06 · 752 阅读 · 0 评论 -
19.RV1126_RV1109编写并移植nvp6021驱动
文章目录前言确定硬件前言nvp6021是一个i2C器件,因此,应该编写I2C设备驱动。既然是I2C设备驱动,应该确定的有:使用的是哪一路I2C,I2C设备地址是多少等。确定硬件使用的是哪一路I2C从上面可以看出使用的I2C3_M0.该器件的设备地址是多少SA0 = 0;SA1 = 1;从这里可以得出I2C设备地址。复位脚使用的是GPIO2_C4。...原创 2021-07-15 11:18:30 · 2034 阅读 · 0 评论 -
17.ioctl命令
ioctl转载 2021-07-14 16:39:28 · 221 阅读 · 0 评论 -
18.class_create(),device_create详细说明
class_create(),device_create自动创建设备文件结点转载 2021-07-14 15:31:23 · 529 阅读 · 0 评论 -
16.Linux SPI驱动
文章目录SPI 简介SPI 简介上一章我们讲到I2C,I2C是串行通信的一种,只需要两根线就可以完成主机和从机之间的通信,但是I2C的速度最高只能到400KHZ,如果对于访问速度要求比较高的话I2C就不适合了,本章我们来学习一下另一个和I2C一样广泛的串行通信:SPI,SPI的特点是:高速、全双工的同步通信总线。SPI时钟频率相比与I2C要高很多,最高可以工作在上百MHz。SPI以主从方式工作,通常是有一个主设备和一个或多个从设备,一般SPI需要4根线,但是也可以使用三根线(单向传输),本章我们讲解标准原创 2021-07-13 11:41:46 · 379 阅读 · 0 评论 -
15.Linux I2C驱动实验
文章目录I2C协议linux I2C驱动框架简介I2C总线I2C协议I2C使用两条线在主控制器和从控制器之间进行数据通信。一条是SCL(串行时钟线),另一种是SDA(串行数据线),这两条数据线需要接上拉电阻,总线空闲时SCL和SDA处于高电平。I2C是支持多从机的,就是说一个I2C控制器下可以挂载多个I2C从设备,这些不同的I2C从设备有不同的器件地址,这样I2C控制器就可以通过I2C设备的器件地址访问指定的I2C设备了。上图中SDA和SCL这两根线必须要接一个上拉电阻,一般是4.7K,其余的I2原创 2021-07-12 10:11:17 · 448 阅读 · 0 评论 -
14.分配内存
文章目录Kmalloc函数的内幕flags参数Kmalloc函数的内幕kmalloc内存分配引擎是一个功能强大的工具,由于和malloc相似,所以学习它也很容易。除非被阻塞,否则这个函数可能运行的很快,而且不对所获取的内存空间清零,也就是说,分配给他的内存空间任然保持着原有的数据。它分配的内存空间在物理内存中也是连续的。flags参数kmalloc的原型是:#include <linux/slab.h>void *kmalloc(size_t size,int flags);km原创 2021-07-11 09:49:02 · 220 阅读 · 0 评论 -
13.busybox配置rfkill命令,在控制台使用
文章目录配置交叉编译器配置为静态编译选择rfkillmake测试配置交叉编译器Busybox Settings ---> (arm-linux-gnueabihf-) Cross Compiler prefix 配置为静态编译Busybox Settings ---> [*] Build BusyBox as a static binary (no shared libs)选择rfkillMiscellaneous Utilities --->原创 2021-07-07 20:50:11 · 592 阅读 · 0 评论 -
12.rtl8188驱动移植
问题最开始用的rtl8188驱动支持的linux内核版本太低了,编译会出现一些错误,这些错误我尝试去解决,但是并没有成功,上网查找了大量的资料最后才知道是内核版本的问题,我的内核版本是4.19,比较高了,所以开始用的驱动是没法支持的,随着内核版本的升高,内核中的一些函数会发生改变,比如init_timer,还有其他的地方也会改变的。下面是我编译出现的错误,这些错误,我手动改了一些,但有的没法改。我的解决办法我从github上面下载了一个支持到内核版本5.1.x的rtl8188驱动,rtl8188原创 2021-07-07 15:33:28 · 1071 阅读 · 0 评论 -
11.异步通知实验
文章目录前言异步通知异步通知简介信号Linux 所支持的所有信号信号处理函数信号处理简单示例驱动中信号处理fasync_struct 结构体fasync 函数驱动程序中fasync函数参考示例kill_fasync 函数应用程序对异步通知的处理前言在前面使用阻塞或者非阻塞的方式来读取驱动中按键值都是应用程序主动读取的,对于非阻塞方式来说还需要应用程序通过 poll 函数不断的轮询。最好的方式就是驱动程序能主动向应用程序发出通知,报告自己可以访问,然后应用程序在从驱动程序中读取或写入数据,类似于我们在裸机原创 2021-07-06 20:08:32 · 148 阅读 · 0 评论 -
10.阻塞与非阻塞IO
文章目录前言阻塞与非阻塞简介阻塞时访问应用程序阻塞时读取数据代码非阻塞式访问非阻塞式时读取代码等待队列等待队列头等待队列头将队列添加到等待队列头前言阻塞和非阻塞 IO 是 Linux 驱动开发里面很常见的两种设备访问模式,在编写驱动的时候一定要考虑到阻塞和非阻塞。本章我们就来学习一下阻塞和非阻塞 IO,以及如何在驱动程序中处理阻塞与非阻塞,如何在驱动程序使用等待队列和 poll 机制。阻塞与非阻塞简介这里的“IO”并不是我们学习 STM32 或者其他单片机的时候所说的“GPIO”(也就是引脚)。这里原创 2021-07-06 11:17:07 · 286 阅读 · 0 评论 -
9 platform设备驱动
文章目录前言Linux驱动的分离与分层驱动的分割与分离驱动的分层platform平台驱动模型简介platform总线驱动和设备的匹配前言我们在前面几章编写的设备驱动都非常的简单,都是对IO进行最简单的读写操作。像I2C、 SPI、LCD 等这些复杂外设的驱动就不能这么去写了,Linux 系统要考虑到驱动的可重用性,因此提出了驱动的分离与分层这样的软件思路,在这个思路下诞生了我们将来最常打交道的platform 设备驱动,也叫做平台设备驱动。Linux驱动的分离与分层驱动的分割与分离对于 Linux原创 2021-07-05 15:12:44 · 313 阅读 · 0 评论 -
8 Linux中断
文章目录前言Linux 中断中断号request_irq函数中断标志free_irq函数中断处理函数中断使能与中断禁止函数中断上半部与下半部下半部机制tasklet机制工作队列机制前言不管是裸机实验还是 Linux 下的驱动实验,中断都是频繁使用的功能,在裸机中使用中断我们需要做一大堆的工作,比如配置寄存器,使能 IRQ 等等。Linux 内核提供了完善的中断框架,我们只需要申请中断,然后注册中断处理函数即可,使用非常方便,不需要一系列复杂的寄存器配置。Linux 中断中断号每个中断都有一个中断号原创 2021-07-05 11:04:30 · 148 阅读 · 0 评论 -
6.4互斥体
文章目录互斥体互斥体注意事项互斥体API函数互斥体使用互斥体将信号量的值设置为 1 就可以使用信号量进行互斥访问了,虽然可以通过信号量实现互斥,但是 Linux 提供了一个比信号量更专业的机制来进行互斥,它就是互斥体—mutex。互斥访问表示一次只有一个线程可以访问共享资源,不能递归申请互斥体。在我们编写 Linux 驱动的时候遇到需要互斥访问的地方建议使用 mutex。Linux 内核使用 mutex 结构体表示互斥体,定义如下。struct mutex { /* 1: unlocked, 0:原创 2021-07-05 10:31:21 · 194 阅读 · 0 评论 -
6.3信号量
信号量信号量是同步的一种方式。Linux 内核也提供了信号量机制,信号量常常用于控制对共享资源的访问。举一个很常见的例子,某个停车场有 100 个停车位,这 100 个停车位大家都可以用,对于大家来说这100 个停车位就是共享资源。假设现在这个停车场正常运行,你要把车停到这个这个停车场肯定要先看一下现在停了多少车了?还有没有停车位?当前停车数量就是一个信号量,具体的停车数量就是这个信号量值,当这个值到 100 的时候说明停车场满了。停车场满的时你可以等一会看看有没有其他的车开出停车场,当有车开出停车场的原创 2021-07-05 10:25:33 · 370 阅读 · 0 评论 -
7 linux EC20 4G模块移植
4G网络连接简介大部分4G模块实际的通信接口都是USB,所以4G模块的驱动就转换为了USB的驱动,而这些4G模块厂家都提供了详细的文档讲解如何在Linux下使用4G模块,以及修改Linux内核加入4G模块驱动。EC20 4G模块实验EC20 4G模块驱动修改添加USB设备信息我们需要在Linux内核中添加EC20的USB设备信息,因为EC20 4G模块使用的是USB接口。打开 Linux 源码的 drivers/usb/serial/option.c 文件,首先定义 EC20 的 ID 宏。.原创 2021-07-05 09:10:38 · 1019 阅读 · 0 评论 -
6.2自旋锁
文章目录自旋锁自旋锁API函数死锁两种情况被自旋锁保护的临界区调用引起睡眠和阻塞的API 函数中断造成的死锁下半部竞争处理函数自旋锁使用的注意事项自旋锁原子操作只能对整形变量或者位进行保护,但是,在实际的使用环境中怎么可能只有整形变量或位这么简单的临界区。举个最简单的例子,设备结构体变量就不是整型变量,我们对于结构体中成员变量的操作也要保证原子性,在线程 A 对结构体变量使用期间,应该禁止其他的线程来访问此结构体变量,这些工作原子操作都不能胜任,需要本节要讲的锁机制,在 Linux内核中就是自旋锁。当原创 2021-07-04 16:18:00 · 949 阅读 · 0 评论 -
6.1原子操作
文章目录原子操作原子整形操作API函数原子位操作API函数原子操作首先看一下原子操作,原子操作就是指不能再进一步分割的操作,一般原子操作用于变量或者位操作。假如现在要对无符号整形变量 a 赋值,值为 3,对于 C 语言来讲很简单,直接就是:a = 3但是 C 语言要先编译为成汇编指令,ARM 架构不支持直接对寄存器进行读写操作,比如要借助寄存器 R0、R1 等来完成赋值操作。假设变量 a 的地址为 0X3000000,“a=3”这一行 C语言可能会被编译为如下所示的汇编代码:1 ldr r0,原创 2021-07-04 15:32:34 · 271 阅读 · 0 评论 -
5.linux块设备驱动开发
什么是块设备?块设备是针对存储设备的,比如 SD 卡、EMMC、NAND Flash、Nor Flash、SPI Flash、机械硬盘、固态硬盘等。因此块设备驱动其实就是这些存储设备驱动,块设备驱动相比字符设备驱动的主要区别如下:①、块设备只能以块为单位进行读写访问,块是 linux 虚拟文件系统(VFS)基本的数据传输单位。字符设备是以字节为单位进行数据传输的,不需要缓冲。②、块设备在结构上是可以进行随机访问的,对于这些设备的读写都是按块进行的,块设备使用缓冲区来暂时存放数据,等到条件成熟以后在一次原创 2021-07-04 10:18:35 · 288 阅读 · 0 评论 -
4.设备树
什么是设备树?设备树(Device Tree),将这个词分开就是“设备”和“树”,描述设备树的文件叫做 DTS(Device Tree Source),这个 DTS 文件采用树形结构描述板级设备,也就是开发板上的设备信息,比如CPU 数量、 内存基地址、IIC 接口上接了哪些设备、SPI 接口上接了哪些设备等等,如图 43.1.1所示:树的主干就是系统总线,IIC 控制器、GPIO 控制器、SPI 控制器等都是接到系统主线上的分支。IIC 控制器有分为 IIC1 和 IIC2 两种,其中 IIC1 上原创 2021-07-02 21:10:14 · 694 阅读 · 0 评论 -
3.新字符设备驱动实验
前言经过前两章实验的实战操作,我们已经掌握了 Linux 字符设备驱动开发的基本步骤,字符设备驱动开发重点是使用 register_chrdev 函数注册字符设备,当不再使用设备的时候就使用unregister_chrdev 函数注销字符设备,驱动模块加载成功以后还需要手动使用 mknod 命令创建设备节点。register_chrdev 和 unregister_chrdev 这两个函数是老版本驱动使用的函数,现在新的字符设备驱动已经不再使用这两个函数,而是使用Linux内核推荐的新字符设备驱动API原创 2021-07-02 19:45:39 · 311 阅读 · 0 评论