linux驱动
文章平均质量分 76
anieoo
这个作者很懒,什么都没留下…
展开
-
嵌入式ARM-Linux使能USB转串口驱动
在ARM板子上开启pl2303驱动原创 2023-01-06 20:42:27 · 1143 阅读 · 0 评论 -
Linux驱动_网络驱动简介
参考:Linux设备驱动开发详解(宋宝华) 网络设备完成用户数据包在网络媒介上的发送和接收的设备,它讲上层协议的传递的数据包以媒介访问的方式进行发送,并将接收到的数据传递给上层协议。 ① 网络协议接口层:该层的存在使设备独立于上层协议,即不管上层网络采用什么协议都通过dev_queue_xmit()发送数据,netif_rx()接收数据。 ② 网络设备接口层:net_device是描述具体的网络属性和操作的结构体,并且是设备驱动功能层中各函数的容器。原创 2022-06-03 22:49:49 · 492 阅读 · 0 评论 -
Linux驱动_块设备驱动
块设备是Linux驱动三大设备之一。与字符设备有很大的区别。块设备是针对存储设备的,比如 SD 卡、 EMMC、 NAND Flash、 Nor Flash、 SPI Flash、机械硬盘、固态硬盘等。因此块设备驱动其实就是这些存储设备驱动。一、块设备和字符设备的区别摘自Linux驱动设备开发详解(宋宝华)二、块设备驱动结构1、block_device_operations block_device_operations是和file_operation...原创 2022-05-31 17:04:44 · 1273 阅读 · 0 评论 -
12.2.3 platform设备资源和数据
Linux系统发明了一种虚拟的总线,称为platform总线,相应的设备名称称为platform_device,而驱动则成为platform_driver。 platform总线实现的功能是:在系统注册一个platform_device设备的时候,会寻找与之匹配的驱动。相反,在向系统注册一个platform_driver驱动的时候,会寻找与之匹配的设备。关于platform总线详细的介绍:Linux驱动_Platform平台驱动_anieoo的博客-CSDN博客_驱动pla...原创 2022-05-22 16:52:41 · 274 阅读 · 0 评论 -
10.5 内核定时器编程
和Linux中断一样,内核定时器的编程只需要调用内核提供的API函数。内核在时钟中断发生以后会检查各定时器是否到期,到期后将会把其绑定的定时器处理函数放到底半部执行。 内核定时器本质上还是依赖硬件定时器实现。一、定时器API函数1、timer_list结构体在Linux内核中,如果需要使用一个定时器,则必须先定义一个timer_list结构体,结构体对应如下:struct timer_list { /* * All fields that change...原创 2022-05-21 19:09:46 · 485 阅读 · 1 评论 -
10.3 Linux中断编程
一、Linux中断处理机制中断会打破内核进程正常运行的程序的调度,因此对于系统来说中断中执行的程序需要尽量短小。在Linux系统中,为了在中断执行时间和中断处理程序量之间找到一个平衡,引入了Top Half和Bottom Half.即顶半部和底半部。 顶半部:主要完成尽量少的紧急功能,比如紧急处理寄存器的中断状态位 底半部:执行剩余中断中需要完成的事情。二、Linux中断编程Linux中的中断编程和MCU不一样,不需要你一个个去配置相关的寄存器,只需要使用L...原创 2022-05-21 16:43:12 · 873 阅读 · 0 评论 -
9.3 支持异步通知的globalfifo驱动
本节学习再驱动中添加异步通知的功能。其实步骤很简单只需要添加一个结构体和使用2个新函数即可。 数据结构是 fasync_struct 两个函数分别是: ① fasync_helper ② kill_fasync先附上完整代码:/* * a simple char device driver: globalfifo * * Copyright (C) 2014 Barry Song (baohua@kerne...原创 2022-05-17 18:47:29 · 209 阅读 · 0 评论 -
9.2 Linux异步通知编程
一、Linux信号信号可以在进程间进行传递,Linux的异步通知就是基于信号进行实现的。在Linux中可以使用的信号如下所示:除了SIGSTOP和SIGKILL信号外,其余信号均能被进程忽略或捕获。信号的接收:在用户进程中可以使用signal()函数设置相应的信号处理处理函数。类似于MCU中的中断,当满足触发中断条件的时候,就会去执行相对应的中断处理函数。signal()函数原型如下:void (*signal(int si............原创 2022-05-17 17:53:51 · 383 阅读 · 0 评论 -
8.2.3设备驱动中的轮询编程
非阻塞I/O的应用程序通常会使用poll()、select()甚至是epoll()系统调用进行设备的非阻塞访问。无论是哪一种系统调用对应的都是设备驱动中的poll()函数。驱动中poll函数原型:unsigned int (*poll) (struct file *filp, struct poll_table_struct *wait)第一个参数是file结构体指针。第二个参数为轮询表指针。驱动中的poll函数通常需要完成两件事情: ① 将可能会引起设...原创 2022-05-16 18:46:58 · 404 阅读 · 0 评论 -
8.1.2 支持阻塞操作的globalfifo驱动学习
在本节学习带有阻塞操作和互斥访问的驱动,在用一时间内只有一个应用访问设备驱动,同时只有设备定义的内存有数据的时候(非空)才能进行读取,并且读取完成后,才能进行写操作。 附上代码:/* * a simple char device driver: globalfifo * * Copyright (C) 2014 Barry Song (baohua@kernel.org) * * Licensed under GPLv2 or later. */#i...原创 2022-05-15 20:59:31 · 189 阅读 · 0 评论 -
使用自旋锁实现驱动设备的互斥访问
代码来源: Linux设备驱动开发详解(宋宝华) p172int xxx_count = 0; //定义文件打开次数static int xxx_open(struct inode *inode,struct file *filp){ ... spinlock(&xxx_lock); if(xxx_count) { spin_unlock(&xxx_lock); return -EBUSY; } xxx_原创 2022-05-12 20:23:28 · 294 阅读 · 0 评论 -
使用原子变量实现应用对驱动的互斥访问
代码来源: Linux设备驱动开发详解(宋宝华) p169static atomic_t xxx_available = ATOMIC_INIT(1);static int xxx_open (struct inode *inode, struct file *filp){ ... if(!atomic_dec_and_test(&xxx_available)) { atomic_inc(&xxx_available); retur原创 2022-05-12 16:13:03 · 276 阅读 · 0 评论 -
6.2 globalmem虚拟设备实例学习
在本节中介绍了关于globalmem字符设备驱动,其功能对应:分配一个4KB大小的内存空间,并提供函数接口给应用程序用来针对该内存的读写、控制核定位函数。 首先贴上,驱动代码:#include <linux/module.h>#include <linux/fs.h>#include <linux/init.h>#include <linux/cdev.h>#include <linux/slab.h>...原创 2022-05-11 16:56:21 · 498 阅读 · 0 评论 -
关于__init、__initdata和__exit、__exitdata
对于__init、__initdata和__exit、__exitdata的定义位于 <linux/init.h>,这些宏定义的作用是告诉编译器将这些函数或者数据放入相应的section中,而在模块加载的阶段,.ko文件中的代码和数据的加载区域是根据section来加载的。 比如:如果函数的定义中带有__init,那么这个函数的所有代码会被放入.init.text的section中。 &nb...转载 2022-05-04 20:56:01 · 496 阅读 · 0 评论 -
Linux驱动_多点电容触摸
一丶Linux下多点电容触摸驱动框架① 电容触摸屏IC是FT5426,为IIC协议芯片,因此需要编写IIC驱动② 触摸IC会发出中断信号,并在中断服务函数中上报信息,因此需要编写中断框架③ 触摸屏向Linux内核上报的信息都属于Input子系统,因此需要编写Input子系统框架④ 上报的信息需要满足Input子系统的多点电容触摸协议二、多点电容触摸协议在Documentation/input/multitouch-protocol.txt。 MT...原创 2022-04-21 18:06:02 · 978 阅读 · 1 评论 -
模块加载命令modprobe和insmod区别
在Linux中,modprobe和insmod都可以用来加载module,不过现在一般都推荐使用modprobe而不是insmod了。modprobe和insmod的区别是什么呢?1.modprobe可以解决load module时的依赖关系,比如load moudleA就必须先load mouduleB之类的,它是通过/lib/modules/<kernel-version>/modules.dep文件来查找依赖关系的。而insmod不能解决依赖问题。 ...转载 2022-04-01 21:53:59 · 636 阅读 · 0 评论 -
Linux驱动_互斥体
上节回顾:Linux驱动_并发与竞争_anieoo的博客-CSDN博客上节回顾:Linux驱动_信号量_anieoo的博客-CSDN博客将信号量的值设置为 1 就可以使用信号量进行互斥访问了,虽然可以通过信号量实现互斥,但是 Linux 提供了一个比信号量更专业的机制来进行互斥,它就是互斥体—mutex。互斥访问表示一次只有一个线程可以访问共享资源,不能递归申请互斥体。完整实验代码:#include <linux/kernel.h>#include <...原创 2022-03-27 21:30:19 · 900 阅读 · 0 评论 -
Linux驱动_信号量
上节回顾:Linux驱动_并发与竞争_anieoo的博客-CSDN博客信号量的特点:①、因为信号量可以使等待资源线程进入休眠状态,因此适用于那些占用资源比较久的场合。②、因此信号量不能用于中断中,因为信号量会引起休眠,中断不能休眠。③、如果共享资源的持有时间比较短,那就不适合使用信号量了,因为频繁的休眠、切换线程引起的开销要远大于信号量带来的那点优势。实验步骤: ①在驱动的入口函数中初始化信号量为1。 ②应...原创 2022-03-27 21:13:32 · 1033 阅读 · 0 评论 -
Linux驱动_按键输入
一、修改设备树文件 (1)添加pinctrl节点打开imx6ull-alientek-emmc.dts文件,在 iomuxc 节点的 imx6ul-evk 子节点下创建一个名为“pinctrl_key”的子节点,节点内容如下所示: ##该节点的作用是设置电气属性(2)添加Key设备节点在根节点“/”下创建 Key按键节点,节点内容如下:(3)启动系统Linux系...原创 2022-03-22 20:29:39 · 288 阅读 · 0 评论 -
Linux驱动_自旋锁
上节回顾:Linux驱动_并发与竞争_anieoo的博客-CSDN博客上节回顾:Linux驱动_原子操作_anieoo的博客-CSDN博客 为什么需要使用自旋锁:原子操作只能对整形变量或者位进行保护,但是,在实际的使用环境中怎么可能只有整形变量或位这么简单的临界区。例如结构体的保护,就无法使用原子操作进行保护,因此就需要使用自旋锁!!实验步骤:在原子操作实验中实现了一次只能有一个应用程序访问 LED 灯,本节我们使用自旋锁来实现此功能。在使用自旋锁之前,先...原创 2022-03-22 17:28:14 · 554 阅读 · 0 评论 -
Linux驱动_原子操作
上节回顾:Linux驱动_并发与竞争_anieoo的博客-CSDN博客之前学习了原子操作指的是由多步操作组成的一个操作。如果该操作不能原子地执行,则要么执行完所有步骤,要么一步也不执行,不可能只执行所有步骤的一个子集。本节实验我们利用原子变量模拟原子操作,通过此实验可以实现在一个驱动被应用占用的过程中,如果另一个驱动再次访问就会返回错误。步骤如下: ①在驱动的入口函数中中定义一个原子变量:atomic_set(&gpioled.l...原创 2022-03-22 16:41:51 · 2039 阅读 · 0 评论 -
Linux驱动_spi驱动(ICM20608)
参考:Linux SPI 驱动分析(1)— 结构框架_StephenZhou-CSDN博客_linux spi驱动Linux SPI 驱动分析(2)— 框架层源码分析_StephenZhou-CSDN博客_spi_message_initSPI驱动的框架和源码分析,可以在参考博客中查看。驱动编写测试 : 原理图如下所示: LINUX下的SPI主机驱动已经由SOC厂商编写好了,比如I.MX6ULL的SPI主机驱动由NXP官方编写好了,我们编写设备驱动的...原创 2022-03-13 12:01:14 · 5588 阅读 · 0 评论 -
Linux驱动_i2c驱动(ap3216c)
三、驱动编写测试1、修改设备树从原理图中可以看出,UART4_RXD作为I2C1_SDA,UART4_TXD作为I2C1_SCL。因此需要修改对应的pinctrl节点信息,使管脚复用为I2C1功能 。修改后结果如下:随后在设备树i2c1接口上添加AP3216C设备节点信息,添加结束后如下:其中@后面的“1e”是 ap3216c 的器件地址,compatible属性用于驱动和设备的匹配,reg属性也用来保存ap3216c的器件地址。 ...原创 2022-02-27 11:23:21 · 4240 阅读 · 2 评论 -
Linux驱动_INPUT子系统
按键、鼠标、键盘、触摸屏等都属于输入设备, Linux 内核为此专门做了一个叫做 input子系统的框架来处理输入事件。输入设备本质上还是字符设备,只是在此基础上套上了 input 框架,用户只需要负责上报输入事件,比如按键值、坐标等信息, input 核心层负责处理这些事件。 input子系统框架如图所示:这三个层的分工如下:驱动层:输入设备的具体驱动程序,比如按键驱动程序,向内核层报告输入内容。核心层:承上启下...原创 2022-02-24 12:55:03 · 1101 阅读 · 2 评论 -
Linux驱动_Misc杂项驱动
MISC 驱动其实就是最简单的字符设备驱动,通常嵌套在 platform 总线驱动中,实现复杂的驱动,他的作用就是解决Linux系统设备号紧缺的问题。所有的MISC设备驱动的主设备号都为10,不同的设备使用不同的从设备号!一、为什么使用MISCMISC 设备会自动创建 cdev,不需要像我们以前那样手动创建,因此采用 MISC 设备驱动可以简化字符设备驱动的编写,可以省去以下函数:alloc_chrdev_region() /*申请设备号*/cdev_ini...原创 2022-02-20 19:51:28 · 974 阅读 · 0 评论 -
Linux驱动_Platform平台驱动
在Linux操作系统中,驱动程序占用了Linux内核代码量的大头,如果不进行管理,将会造成数量庞大的结果。因此引入了驱动的分离。 上图所示就是驱动的分离,相当于驱动使用标准方法去获取到设备信息(比如从设备树中获取到设备信息),然后根据获取到的设备信息来初始化设备。 这样就相当于驱动只负责驱动,设备只负责设备,想办法将两者进行匹配即可。这个就是 Linux 中的总线(bus)、驱动(driver)和设备(device)模型,也就是常说的驱动分离。总线就是驱动和设备信息的月老...原创 2022-02-19 22:26:56 · 4487 阅读 · 0 评论 -
Linux驱动_异步通知
Linux应用通常有三种方式查询设备驱动是否可以访问,分别是:阻塞式、非阻塞式和异步通知。异步通知: “信号”为此应运而生,信号类似于我们硬件上使用的“中断”,只不过信号是软件层次上的。算是在软件层次上对中断的一种模拟,驱动可以通过主动向应用程序发送信号的方式来报告自己可以访问了,应用程序获取到信号以后就可以从驱动设备中读取或者写入数据了。整个过程就相当于应用程序收到了驱动发送过来了的一个中断,然后应用程序去响应这个中断,在整个处理过程中应用程序并没有去查询驱动设备是否可以访问,一切都是由驱动设.原创 2022-02-16 11:38:41 · 667 阅读 · 0 评论 -
Linux驱动_非阻塞式IO
上一节学习了阻塞式IO驱动的编写,而应用程序对驱动设备的输入/输出操作还有另一种方式。即非阻塞式IO。一、非阻塞式IO应用程序使用非阻塞访问方式从设备读取数据,当设备不可用或数据未准备好的时候会立即向内核返回一个错误码,表示数据读取失败。应用程序会再次重新读取数据,这样一直往复循环,直到数据读取成功。二、轮询如果用户应用程序以非阻塞的方式访问设备,设备驱动程序就要提供非阻塞的处理方式,也就是轮询。 poll、 epoll 和 select 可以用于处理轮询...原创 2022-02-13 00:06:12 · 338 阅读 · 0 评论 -
Linux驱动_阻塞式IO实验
在上一章 Linux 中断实验中,我们直接在应用程序中通过 read 函数不断的读取按键状态,当按键有效的时候就打印出按键值。这种方法有个缺点,那就是 imx6uirqApp 这个测试应用程序拥有很高的 CPU 占用率。一、pandas是什么?示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。二、使用步骤1.引入库代码如下(示例):import numpy as np import pandas as pd i...原创 2022-02-12 22:18:10 · 666 阅读 · 0 评论 -
Linux驱动_中断
裸机实验里面中断的处理方法:①、使能中断,初始化相应的寄存器。②、注册中断服务函数,也就是向 irqTable 数组的指定标号处写入中断服务函数②、中断发生以后进入 IRQ 中断服务函数,在 IRQ 中断服务函数在数组 irqTable 里面查找具体的中断处理函数,找到以后执行相应的中断处理函数。Linux 内核提供了完善的中断框架,我们只需要申请中断,然后注册中断处理函数即可,使用非常方便,不需要一系列复杂的寄存器配置。一、中...原创 2022-02-02 20:04:37 · 3070 阅读 · 0 评论 -
Linux内核定时器
Linux 内核中有大量的函数需要时间管理,比如周期性的调度程序、延时程序、对于驱动编写者来说最常用的就是定时器。硬件定时器提供时钟源,时钟源的频率可以设置, 设置好以后就周期性的产生定时中断,系统使用定时中断来计时。中断周期性产生的频率就是系统频率,也叫做节拍率(tick rate)(有的资料也叫系统频率)。 Liunx系统的节拍率可以在编译Linux内核的时候通过图形化界面设置。路径如下:通过make configuration命令可以进行图形化配置。-> ...原创 2022-02-02 18:57:49 · 4931 阅读 · 0 评论 -
Linux驱动_并发与竞争
前言Linux是一个多任务操作系统,肯定会存在多个任务共同操作同一段内存或者设备的情况,多个任务甚至中断都能访问的资源叫做共享资源。在驱动开发中要注意对共享资源的保护,也就是要处理对共享资源的并发访问。这些任务可能会相互覆盖这段内存中的数据,造成内存数据混乱。针对这个问题必须要做处理,严重的话可能会导致系统崩溃。 Linux产生并发的原因主要由一下几种: ① 多线程并发访问, Linux 是多任务(线程)的系统,所以多线程访问是最基本的原因。...原创 2022-01-28 20:49:36 · 1708 阅读 · 0 评论 -
Linux驱动_Beep蜂鸣器
目录前言一、修改设备树文件 (1)添加pinctrl节点(2)添加led设备节点(3)检查Beep对应pin脚是否被使用(4)启动系统二、详细驱动程序三、详细应用程序四、测试总结前言 Beep蜂鸣器驱动和Led驱动类似,并无区别,当做是对引入pinctrl子系统和gpio子系统的复习。一、修改设备树文件 (1)添加pinctrl节点打开imx...原创 2022-01-25 17:13:43 · 2084 阅读 · 0 评论 -
Linux驱动_pinctrl子系统和gpio子系统(LED)
目录前言一、修改设备树文件 (1)添加pinctrl节点(2)添加led设备节点 (3)检查LED对应pin脚是否被使用 (4)启动系统二、详细驱动程序三、测试前言inctrl子系统和gpio子系统_anieoo的博客-CSDN博客一、修改设备树文件 (1)添加pinctrl节点 打开imx6ull-alientek-emmc.dts文件,在 iomuxc 节点的...原创 2022-01-25 15:01:07 · 1519 阅读 · 0 评论 -
pinctrl子系统和gpio子系统
前言 前几节引入了设备数下的led驱动,但它本质上还是配置led驱动的寄存器,与裸机开发并无区别。本节引入了pinctrl子系统和gpio子系统来简化led驱动的配置。一、pinctrl子系统(1)pinctrl子系统简介大多数SOC的PIN都是支持复用的,所以在配置时要考虑复用的设置,此外还要配置PIN的电气特性,比如上下拉、速度、驱动等。pinctrl子系统的主要工作内容:获取设备树中pin信息根据获得到的pin信息来设置pin...原创 2022-01-24 19:32:08 · 631 阅读 · 0 评论 -
Linux驱动_设备树下LED驱动
前言 学习完设备树基础知识后,完成设备树下LED驱动实验一、修改设备树文件 在设备书根/节点下添加子节点led信息: alphaled { #address-cells = <1>; #size-cells = <1>; status = "okay"; reg = < 0X020C406C 0X04 /*CCM_CCGR1_BASE*/ 0X020E0068 0X04 /*SW_MUX_GPIO......原创 2022-01-20 22:39:36 · 619 阅读 · 0 评论 -
设备树下的属性和特殊节点
在设备树中一般节点命名格式如下:node-name@unit-address其中“node-name”是节点名字,为 ASCII 字符串,节点名字应该能够清晰的描述出节点的功能,比如“uart1”就表示这个节点是 UART1 外设。“unit-address”一般表示设备的地址或寄存器首地址,如果某个节点没有地址或者寄存器的话“unit-address”可以不要,比如“cpu@0”。一、 compatible 属性compatible 属性用于将设备和驱...原创 2022-01-20 00:05:04 · 1567 阅读 · 0 评论 -
Linux驱动_LED驱动
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结一、地址映射 1、在裸机实验的时候操作LED等外设实际上是操作相应外设的寄存器。 2、linux下驱动开发最终要操作的也是寄存器,然而在Linux环境下不能直接对寄存器的物理地址进行操作。比如LED寄存器的地址为0x01010101,在裸机开发环境下可以直接对该地址进行赋值,而Lin......原创 2022-01-16 22:49:45 · 1546 阅读 · 0 评论 -
Linux驱动_字符型驱动框架流程分析
文章目录前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结前言学习掌握字符型驱动框架搭建一、字符设备驱动简介字符设备是 Linux 驱动中最基本的一类设备驱动,字符设备就是一个一个字节,按照字节流进行读写操作的设备,例如LED、按键、IIC、SPI等。 字符型驱动通常加载在/dev/xxx下形成一个文件,例如/dev/led是led的驱动文件。 用户处于用户空间,驱动处于内核空............原创 2022-01-14 10:28:52 · 958 阅读 · 2 评论 -
Linux驱动_新LED驱动
一、新字符驱动原理 1、以前的字符驱动使用register_chedev注册字符设备,需要手动指定主设备号 2、新版字符型驱动有两种方式注册字符设备:alloc_chrdev_region(自动申请设备号)和register_chrdev_region(手动申请主设备号)。两种申请方式的...原创 2022-01-18 20:09:23 · 1297 阅读 · 0 评论