linux驱动学习
文章平均质量分 80
那肯定是很多年以后!
做一份喜欢的工作,上班的8小时会开心度过;
找一个喜欢的人,下班后的16小时会开心度过。
展开
-
linux 工作队列之schedule_delayed_work用法
linux 工作队列之schedule_delayed_work用法原创 2022-07-26 18:37:22 · 4223 阅读 · 1 评论 -
linux驱动DEVICE_ATTR使用、热插拔上报uevent及驱动启动一个c语言用语(touch)
linux驱动热插拔上报uevent及驱动启动一个c语言用语(touch)原创 2022-07-11 21:17:08 · 1568 阅读 · 1 评论 -
Linux的input子系统
按键、鼠标、键盘、触摸屏等都属于输入(input)设备,Linux 内核为此专门做了一个叫做 input子系统的框架来处理输入事件。输入设备本质上还是字符设备,只是在此基础上套上了 input框架,用户只需要负责上报输入事件,比如按键值、坐标等信息,input 核心层负责处理这些事件。1.1 input 子系统简介input 就是输入的意思,因此 input 子系统就是管理输入的子系统,和 pinctrl 和 gpio 子系统一样,都是Linux 内核针对某一类设备而创建的框架。比如按键输入、键盘、.原创 2021-02-18 10:55:39 · 206 阅读 · 0 评论 -
Linux MISC 驱动
1 MISC 设备驱动简介所有的 MISC 设备驱动的主设备号都为 10,不同的设备使用不同的从设备号。随着 Linux字符设备驱动的不断增加,设备号变得越来越紧张,尤其是主设备号MISC 设备驱动就用于解决此问题。MISC 设备会自动创建 cdev,不需要像我们以前那样手动创建,因此采用 MISC 设备驱动可以简化字符设备驱动的编写。我们需要向 Linux 注册一个 miscdevice 设备,miscdevice是一个结构体,定义在文件include/linux/miscdevice.h 中,内容如下原创 2021-02-10 11:01:37 · 233 阅读 · 0 评论 -
Linux 自带的 LED 灯驱动
1 Linux 内核自带 LED 驱动使能Linux 内核已经自带了 LED 灯驱动,要使用 Linux 内核自带的 LED 灯驱动首先得先配置 Linux 内核,使能自带的 LED 灯驱动,输入如下命令打开 Linux 配置菜单:make menuconfig按照如下路径打开 LED 驱动配置项:按照上述路径,选择“LED Support for GPIO connected LEDs”,将其编译进 Linux 内核,也即是在此选项上按下“Y”键,使此选项前面变为“<*>”,如图所原创 2021-02-09 17:19:22 · 561 阅读 · 0 评论 -
platform 设备驱动2(有设备树)
** 设备树下的 platform 驱动简介**platform 驱动框架分为总线、设备和驱动,其中总线不需要我们这些驱动程序员去管理,这个是 Linux 内核提供的,我们在编写驱动的时候只要关注于设备和驱动的具体实现即可。在没 有设备树的 Linux 内核下,我们需要分别编写并注册 platform_device 和 platform_driver,分别代表设备和驱动。在使用设备树的时候,设备的描述被放到了设备树中,因此 platform_device 就不需要我们去编写了,我们只需要实现 platfo原创 2021-02-08 15:30:41 · 333 阅读 · 0 评论 -
platform 设备驱动1(无设备树)
1 Linux 驱动的分离与分层1.1 驱动的分隔与分离对于 Linux 这样一个成熟、庞大、复杂的操作系统,代码的重用性非常重要,否则的话就会在 Linux 内核中存在大量无意义的重复代码。尤其是驱动程序,因为驱动程序占用了 Linux内核代码量的大头,如果不对驱动程序加以管理,任由重复的代码肆意增加,那么用不了多久Linux 内核的文件数量就庞大到无法接受的地步。假如现在有三个平台 A、B 和 C,这三个平台(这里的平台说的是 SOC)上都有 MPU6050 这 个 I2C 接口的六轴传感器,按照我原创 2021-02-04 14:23:47 · 1140 阅读 · 2 评论 -
linux异步通知
在前面使用阻塞或者非阻塞的方式来读取驱动中按键值都是应用程序主动读取的,对于非阻塞方式来说还需要应用程序通过 poll函数不断的轮询。最好的方式就是驱动程序能主动向应用程序发出通知,报告自己可以访问,然后应用程序在从驱动程序中读取或写入数据,类似于我们在裸机例程中讲解的中断。Linux 提供了异步通知这个机制来完成此功能,本章我们就来学习一下异步通知以及如何在驱动中添加异步通知相关处理代码。1 、异步通知简介Linux应用程序可以通过阻塞或者非阻塞这两种方式来访问驱动设备,通过阻塞方式访问的话应用.原创 2021-01-27 11:10:12 · 161 阅读 · 0 评论 -
linux阻塞和非阻塞 IO
1、 阻塞和非阻塞简介IO 指的是 Input/Output,也就是输入/输出,是应用程序对驱动设备的输入/输出操作。当应用程序对设备驱动进行操作的时候,如果不能获取到设备资源,那么阻塞式 IO 就会将应用程序对应的线程挂起,直到设备资源可以获取为止。对于非阻塞 IO,应用程序对应的线程不会挂起,它要么一直轮询等待,直到设备资源可以使用,要么就直接放弃。阻塞式 IO 如图所示:图中应用程序调用 read 函数从设备中读取数据,当设备不可用或数据未准备好的时候就会进入到休眠态。等设备可用的时候就会从休眠原创 2021-01-25 16:21:53 · 147 阅读 · 0 评论 -
Android下linux中断
Linux 内核提供了完善的中断框架,我们只需要申请中断,然后注册中断处理函数即可,使用非常方便,不需要一系列复杂的寄存器配置。本次我们就来学习一下如何在Linux 下使用中断。在 Linux 内核中也提供了大量的中断相关的 API 函数,我们来看一下这些跟中断有关的API 函数:1、request_irq 函数在 Linux 内核中要想使用某个中断是需要申请的,request_irq函数用于申请中断,request_irq函数可能会导致睡眠,因此不能在中断上下文或者其他禁止睡眠的代码段中使用.原创 2020-10-23 09:35:36 · 960 阅读 · 0 评论 -
Android下Linux内核定时器
本次我们就来学习一下这些和时间有关的功能。1、内核时间管理简介Linux内核中有大量的函数需要时间管理,比如周期性的调度程序、延时程序、对于我们驱动编写者来说最常用的定时器。硬件定时器提供时钟源,时钟源的频率可以设置,设置好以后就周期性的产生定时中断,系统使用定时中断来计时。中断周期性产生的频率就是系统频率,也叫做节拍率(tickrate)(有的资料也叫系统频率),比如 1000Hz,100Hz 等等说的就是系统节拍率。系统节拍率是可以设置的,单位是 Hz,我们在编译Linux 内核的时候可以通过图形原创 2020-10-20 15:23:46 · 499 阅读 · 0 评论 -
linux驱动file_operations结构体的ioctl函数
最近太忙了,一直没有更新博客,虽然是个搬运工,但是写博客是督促自己学习的一个过程,当然了也希望能够帮助到更多的人。话不多说了下面讲一下file_operations结构体的ioctl函数的坑。顺便写file_operations结构体的ioctl函数的一些分析。...原创 2020-09-18 11:02:09 · 990 阅读 · 0 评论 -
字符设备驱动-按键读入
此博客主要学习目标:第1点:学会字符设备的注册第2点:原子操作的实际应用第3点:file_operations结构体的实际应用1、在dts的根节点上添加:key { status = "okay"; compatible = "rockchip,key"; //pinctrl-names = "default"; //pinctrl-0 = <&key_pinctrl_gpio>; key-gpio = <&gpio1 RK_PB原创 2020-09-09 16:07:17 · 195 阅读 · 0 评论 -
解决竞态问题之互斥体
1、互斥体简介将信号量的值设置为 1 就可以使用信号量进行互斥访问了,虽然可以通过信号量实现互斥,但是 Linux 提供了一个比信号量更专业的机制来进行互斥,它就是互斥体—mutex。互斥访问表示一次只有一个线程可以访问共享资源,不能递归申请互斥体。在编写 Linux 驱动的时候遇到需要互斥访问的地方建议使用 mutex。Linux 内核使用 mutex 结构体表示互斥体,定义如下(省略条件编译部分):struct mutex { /* 1: unlocked, 0: locked, negative原创 2020-09-07 10:58:30 · 189 阅读 · 0 评论 -
解决竞态问题之信号量
1、信号量简介:信号量是同步的一种方式,Linux 内核也提供了信号量机制,信号量常常用于控制对共享资源的访问。 举一个很常见的例子,某个停车场有 100个停车位,这 100 个停车位大家都可以用,对于大家来说这100 个停车位就是共享资源。假设现在这个停车场正常运行,你要把车停到这个这个停车场肯定要先看一下现在停了多少车了?还有没有停车位?当前停车数量就是一个信号量,具体的停车数量就是这个信号量值,当这个值到 100 的时候说明停车场满了。停车场满的时你可以等一会看看有没有其他的车开出停车场,当有车开原创 2020-09-07 10:47:40 · 201 阅读 · 0 评论 -
解决竞态问题之自旋锁
1、 自旋锁简介原子操作只能对整形变量或者位进行保护,但是,在实际的使用环境中怎么可能只有整形变量或位这么简单的临界区。举个最简单的例子,设备结构体变量就不是整型变量,我们对于 结构体中成员变量的操作也要保证原子性,在线程 A对结构体变量使用期间,应该禁止其他的 线程来访问此结构体变量,这些工作原子操作都不能胜任,需要本节要讲的锁机制,在 Linux 内核中就是自旋锁。当一个线程要访问某个共享资源的时候首先要先获取相应的锁,锁只能被一个线程持有,只要此线程不释放持有的锁,那么其他的线程就不能获取此原创 2020-09-07 10:13:32 · 475 阅读 · 0 评论 -
linux驱动第二课: 设备的分类
Linux设备的分类:(1)字符设备按字节流访问绝大多数的设备都是字符设备。比如LED,按键,键盘,串口...字符设备驱动通过字符设备文件来访问(2)块设备按数据块访问比如内存,磁盘, SD卡,U盘块设备驱动通过块设备文件来访问(3)网络设备一般只代表网卡设备,驱动实现要结合网络协议栈(TCP/IP)通过套接字(网络通信地址)访问...原创 2020-09-03 15:33:22 · 150 阅读 · 0 评论 -
解决竞态问题之原子操作
原子操作简介:首先看一下原子操作,原子操作就是指不能再进一步分割的操作,一般原子操作用于变量 或者位操作。假如现在要对无符号整形变量 a 赋值,值为3,对于 C 语言来讲很简单,直接就 是:a = 3但是 C 语言要先编译为成汇编指令,ARM 架构不支持直接对寄存器进行读写操作,比如 要借助寄存器 R0、R1 等来完成赋值操作。假设变量 a 的地址为 0X3000000,“a=3”这一行 C 语言可能会被编译为如下所示的汇编代码:ldr r0, =0X30000000 /* 变量 a 地址 /原创 2020-09-03 15:30:27 · 290 阅读 · 0 评论 -
解决竞态问题之中断屏屏蔽
中断屏屏蔽:在单CPU范围内避免竞态的一种简单而有效的方法是在进入临界区之前屏蔽系统的中断,但是在驱动编程中不值得推荐,驱动通常需要考虑跨平台特点而不假定自己在单核上运行。CPU一般都具备屏蔽中断和打开中断的功能,这项功能可以保证正在执行的内核执行路径不被中断处理程序所抢占,防止某些竞态条件的发生。具体而言,中断屏蔽将使得中断与进程之间的并发不再发生,而且,由于Linux内核的进程调度等操作都依赖中断来实现,内核抢占进程之间的并发也得以避免了,其底层的实现原理是让CPU本身不响应中断。中断屏蔽的使用原创 2020-09-02 17:28:31 · 335 阅读 · 0 评论 -
并发与竞态
并发指的是:多个执行单元同时、并行被执行竞态指的是:并发的执行单元对共享资源(硬件资源和软件上的全局变量、静态变量等)的访问则很容易导致竞态中断(硬中断、软中断、Tasklet、 底半部)与进程之间也会存在竞态:中断可以打断正在执行的进程,如果中断服务程序访问进程正在访问的资源,则竞态也会发生。中断也有可能被新的更高优先级的中断打断,因此,多个中断之间本身也可能引起并发而导致竞态。如何解决这个问题?? 解决竞态问题的途径是保证对共享资源的互斥访问所谓互斥访问是指一个执行单元在访问原创 2020-09-02 10:58:47 · 361 阅读 · 0 评论 -
Linux中断上半部和下半部概念
前言cpu在执行程序时,如果有外部中断触发时,如定时器中断、串行总线中断等,cpu停止当前任务从而转去响应中断处理。对于中断函数的处理,原则是尽快处理完事务并退出中断,这一点也比较好理解,尽快处理中断并返回,保证正常任务的执行,并且能否响应其他事务的中断,保证实时性和并发性。其实,在单片机逻辑编程中已经使用过Linux中断“上下部分”的思维,或者说,Linux中断“上下半部”设计者灵感即源自最初的裸机编程。例如,在单片机裸机编程中,需要通过串口(UART)进行数据通信,对于接收数据情况下,在采用转载 2020-08-28 15:03:26 · 756 阅读 · 0 评论 -
linux驱动第一课-helloword
Linux驱动属于内核的一部分,开发时可设计成模块,内核模块在linux系统运行时可以加载和卸载模块1、驱动编写的注意事项:(1)不能使用C库和C标准头文件 (2)使用GNU-C (3)没有内存保护机制(4)不能处理浮点运算(5)注意并发互斥性和可移植性2、内核模块如何编写需要包含头文件#include <linux/init.h> #include <linux/module.h.h>要实现加载函数和卸载函数加载函数模板:(函数返回0表示加载成功) i原创 2020-07-15 08:51:28 · 211 阅读 · 0 评论