当前位置: 首页 > news >正文

Linux驱动学习笔记

驱动学习笔记

1、字符设备驱动

Linux 驱动有两种运行方式

第一种就是将驱动编译进 Linux 内核中,这样当 Linux 内核启 动的时候就会自动运行驱动程序。

第二种就是将驱动编译成模块(Linux 下模块扩展名为.ko),在 Linux 内核启动以后使用“insmod”命令加载驱动模块。

 

2、Linux 并发与竞争

3、Linux 内核定时器

高节拍率会提高系统时间精度,如果采用 100Hz 的节拍率,时间精度就是 10ms

高节拍率会导致中断的产生更加频繁,频繁的中断会加剧系统的负担。但是现在的处理器性能都很强大,所以采用 1000Hz 的系统节拍率并不会增加太大的负载压力。

  • init_timer
  • add_timer 向内核注册定时器以后, 定时器就会开始运行
  • del_timer
  • del_timer_sync 会等待其他处理器使用完定时器再删除
  • mod_timer 修改定时值,如果定时器还没有激活的话,会激活

4、中断上下部

上半部与下半部

上半部:上半部就是中断处理函数,那些处理过程比较快,不会占用很长时间的处理就可以放在上半部完成。

下半部:如果中断处理过程比较耗时,那么就将这些比较耗时的代码提出来,交给下半部去执行,这样中断处理函数就会快进快出。

使用参考:

①、如果要处理的内容不希望被其他中断打断,那么可以放到上半部。

②、如果要处理的任务对时间敏感,可以放到上半部。

③、如果要处理的任务与硬件有关,可以放到上半部

④、除了上述三点以外的其他任务,优先考虑放到下半部。

上半部机制

request_irq 申请中断的时候注册的中断服务函数属于中断处理的上半部

  • request_irq 可能会导致睡眠,因此不能在中断上下文或者其他禁止睡眠的代码段中使用
  • free_irq
  • 中断处理函数 irqreturn_t (*irq_handler_t) (int, void *)
  • 中断使能与禁止函数 enable_irq disable_irq
    • disable_irq_nosync 函数调用以后立即返回,不会等待当前中断处理程序执行完毕
    • local_irq_enable 用于使能当前处理器中断系统,local_irq_disable 用于禁止当前处理器中断系统

下半部机制

获取中断号和获取字符设备号的函数不一样!!!

5、阻塞和非阻塞 IO

阻塞式 IO 就会将应用程序对应的线程挂起(休眠),直到设备资源可以获取为止。

非阻塞 IO,应用程序对应的线程不会挂起,它要么一直轮询等待,直到设备资源可以使用,要么就直接放弃。

 

6、异步通知

7、platform 设备驱动

驱动分离与分层

8、MISC 驱动

  • misc 的意思是混合、杂项的。当我们板子上的某 些外设无法进行分类的时候就可以使用 MISC 驱动
  • MISC 驱动其实就是最简单的字符设备驱动,通常嵌套在 platform 总线驱动中,实现复杂的驱动
  • 所有的 MISC 设备驱动的主设备号都为 10

9、INPUT 子系统

输入设备本质上还是字符设备,只是在此基础上套上了 input 框架,用户只需要负责上报输入事件,比如按键值、坐标等信息,input 核心层负责处理这些事件

驱动层:输入设备的具体驱动程序,比如按键驱动程序,向内核层报告输入内容。

核心层:承上启下,为驱动层提供输入设备注册和操作接口。通知事件层对输入事件进行处理。

事件层:主要和用户空间进行交互。

代码编写

  1. 使用 input_allocate_device 函数申请一个 input_dev。
  2. 初始化 input_dev 的事件类型以及事件值。
  3. 使用 input_register_device 函数向 Linux 系统注册前面初始化好的 input_dev。
  4. 卸载input驱动的时候需要先使用input_unregister_device函数注销掉注册的input_dev, 然后使用 input_free_device 函数释放掉前面申请的 input_dev。
  5. 上报输入事件 input_event

10、LCD驱动

Linux 内核将所有的 Framebuffer 抽象为一个叫做 fb_info 的结构体,fb_info 结构体包含了 Framebuffer 设备的完整属性和操作集合,因此每一个 Framebuffer 设备都必须有一个 fb_info

换言之就是,LCD 的驱动就是构建 fb_info,并且向系统注册 fb_info的过程

11、RTC驱动

RTC 设备驱动是一个标准的字符设备驱动

Linux 内核将 RTC 设备抽象为 rtc_device 结构体,因此 RTC 设备驱动就是申请并初始化rtc_device,准备好RTC设备驱动函数集 rtc_class_ops 。最后将 rtc_device 注册到 Linux 内核里面

12、I2C 驱动

I2C 总线驱动

与platform不同的是,platform 是虚拟出来的一条总线,目的是为了实现总线、设备、驱动框架。对于 I2C 而言,不需要虚拟出一条总线,直接使用 I2C 总线即可。

  • I2C 总线驱动,或者说 I2C 适配器驱动的主要工作就是初始化 i2c_adapter 结构体变量,然后设置 i2c_algorithm 中的 master_xfer 函数
  • 完成以后通过 i2c_add_numbered_adapter 或 i2c_add_adapter 这两个函数向系统注册设置好的 i2c_adapter

一般 SOC 的 I2C 总线驱动都是由半导体厂商编写的。因此 I2C 总线驱动对我们这些 SOC 使用者来说是被屏蔽掉的,我们只要专注于 I2C 设备驱动即可

I2C 设备驱动

i2c_client 就是描述设备信息的,i2c_driver 描述驱动内容,类似于 platform_driver。

  • 一个设备对应一个 i2c_client,每检测到一个 I2C 设备就会给这个 I2C 设备分配一个 i2c_client。
  • 重点工作就是构建 i2c_driver,构建完成以后需要向 Linux 内核注册这个 i2c_driver。i2c_driver 注册函数为 int i2c_register_driver
  • I2C 设备和驱动的匹配过程是由 I2C 核心来完成的

13、SPI 驱动

SPI 驱动框架和 I2C 很类似,都分为主机控制器驱动和设备驱动

主机控制器驱动

transfer 函数,和 i2c_algorithm 中的 master_xfer 函数一样,控制器数据传输函数。

SPI 主机驱动的核心就是申请 spi_master,然后初始化 spi_master,最后向 Linux 内核注册spi_master。

和 I2C 适配器驱动一样,SPI 主机驱动一般都是 SOC 厂商去编写的,所以我们作为 SOC 的使用者,这一部分的驱动就不用操心了

SPI 设备驱动

  • 我们在编写 SPI 设备驱动的时候需要实现 spi_driver
  • spi_driver 和 i2c_driver、platform_driver 基本一样,当 SPI 设备和驱动匹配成功以后 probe 函数就会执行。
  • spi_driver 初始化完成以后需要向 Linux 内核注册,spi_driver 注册函数为 spi_register_driver

14、RS232/485/GPS 驱动

串口分为 TTL 和 RS232。不管是什么样的接口电平,其驱动程序都是一样的

串口驱动没有什么主机端和设备端之分,就只有一个串口驱动,而且这个驱动也已经由 NXP 官方已经编写好了,我们真正要做的就是在设备树中添加所要使用的串口节点信息。当系统启动以后串口驱动和设备匹配成功,相应的串口就会被驱动起来,生成 /dev/ttymxcX(X=0….n)文件。

15、电容触摸屏驱动

  

老版本的 linux 内核是不支持多点电容触摸的(Multi-touch,简称 MT)。

TypeA时序

TypeB时序

使用“devm_”前缀的函数申请到的资源可以由系统自动释放,不需要我们手动处理。

16、音频驱动

音频编解码芯片,英文名字就是 Audio CODEC

采样率和采样位数就是衡量一款音频 CODEC 最重要的指标

I2S 总线接口

  • I2S 接口需要 3 根信号线(如果需要实现收和发,那么就要 4 根信号线,收和发分别使用一根信号线)

随着技术的发展,在统一的 I2S 接口下,出现了不同的数据格式,根据 DATA 数据相对于 LRCK 和 SCLK 位置的不同,出现了 LeftJustified(左对齐)和 RightJustified(右对齐)两种格式

17、CAN 驱动

CAN 的全称为 Controller Area Network,也就是控制局域网络

  1. 每个单元都是独立的 CAN 节点

同一个 CAN 网络中所有单元的通信速度必须一致

1.CAN 的特点主要有一下几点:

①、多主控制: 根据标识符(Identifier 以下称为 ID)决定优先级,仲裁失利的单元则立刻停止发送而进行接收工作

②、系统的柔软性: 没有类似于“地址”的信息。因此增加单元时其他单元不需要改变
③、通信速度快,距离远
④、具有错误检测、错误通知和错误恢复功能
⑤、故障封闭功能
⑥、连接节点多

2.CAN 电气属性

CAN 总线上没有节点传输数据的时候一直处于隐性状态

3.CAN协议

CAN 协议提供了 5 种帧格式来传输数据

18、USB驱动

1.usb接口类型

USB A

方口usb B

mini usb

micro usb

usb TypeC

2.USB 电气特性

3.USB 拓扑结构

USB 是主从结构,分为 HOST(主机)和从机(DEVICE)
USB OTG:既可以做 HOST 又可以做 DEVICE
支持 OTG 模式的 USB 接口一般都是 Mini USB Micro USB 等这些带有 ID 线的接口
ID 线的高低电平表示 USB 口工作在 HOST 还是 DEVICE 模式:
ID=1OTG 设备工作在从机模式。
ID=0OTG 设备工作在主机模式。

19、Linux 块设备驱动

前面我们都是在学习字符设备驱动

块设备驱动要远比字符设备驱动复杂得多,不同类型的存储设备又对应不同的驱动子系统
块设备驱动相比字符设备驱动的主要区别如下:
①、块设备只能以块为单位进行读写访问,块是 linux 虚拟文件系统(VFS)基本的数据传输单位。字符设备是以字节为单位进行数据传输的,不需要缓冲。
②、块设备在结构上是可以进行随机访问的,对于这些设备的读写都是按块进行的,块设备使用缓冲区来暂时存放数据,等到条件成熟以后在一次性将缓冲区中的数据写入块设备中。这么做的目的为了提高块设备寿命。
块设备结构的不同其 I/O 算法也会不同,比如对于 EMMCSD 卡、NAND Flash 这类没有任何机械设备的存储设备就可以任意读写任何的扇区(块设备物理存储单元)
块设备中最小的可寻址单元是扇区,一个扇区一般是 512 字节,有些设备的物理扇区可能不是 512 字节。不管物理扇区是多少,内核和块设备驱动之间的扇区都是 512 字节。

1.块设备 I/O 请求过程

内核将对块设备的读写都发送到请求队列 request_queue 中,request_queue 中是大量request(请求结构体),而 request 又包含了 biobio 保存了读写相关数据,比如从块设备的哪个地址开始读取、读取的数据长度,读取到哪里,如果是写的话还包括要写入的数据等。

 

 

20、Linux 网络驱动

1.嵌入式下的网络硬件接口

本章节讨论的都是有线网络!
网卡是独立的硬件,如果电脑要上网就得买个网卡插上去,类似现在的显卡一样。
随着技术的不断发展,现在只需要一个芯片就可以实现有线网卡功能
嵌入式网络硬件分为两部分:MAC PHY
==================================================================
先不学网络驱动,学不进去- -

相关文章:

Linux驱动学习笔记

驱动学习笔记 1、字符设备驱动 Linux 驱动有两种运行方式 第一种就是将驱动编译进 Linux 内核中,这样当 Linux 内核启 动的时候就会自动运行驱动程序。 第二种就是将驱动编译成模块(Linux 下模块扩展名为.ko),在 Linux 内核启动以后使用“insmod”命…...

tarfile — 访问 Tar 压缩文件

tarfile — 访问 Tar 压缩文件 1.概述 tarfile 模块提供对 Unix tar 存档的读写访问,包括压缩文件。除了 POSIX 标准之外,还支持几种 GNU tar 扩展。还提供处理 Unix 特殊文件类型,如硬链接和软链接,以及设备节点. 虽然 tarfile…...

C++14深度探索之C++基础-共享指针与弱指针使用

shared_ptr : 共享指针 管理多个客户使用的内存,多客户都拥有该内存块, 当共享指针不再拥有该内存时,内存会自动释放, 多用于并发领域,当所有访问该内存的线程都退出时,释放该内存 共享指针可被随意复制,与独占指针相反,独占指针不能被复制 在内存与时间上有一定的开销…...

【React全家桶】reac组件通信

🎞️🎞️🎞️ 博主主页: 糖 -O- 👉👉👉 react专栏:react全家桶 🌹🌹🌹希望各位博主多多支持!!&a…...

2023,再转行去做软件测试还有前途吗?

近年来,以云计算、移动互联网、物联网、工业互联网、人工智能、大数据及区块链等新一代信息技术构建的智能化应用和产品出现爆发式增长,突破了传统对于软件形态的认知,软件形态正以各种展现方式诠释着对新型智能软件的定义。这也使得软件的质…...

Java程序API数据接口

API:应用程序接口(API:Application Program Interface) 一、使用数据接口的作用 1、封装逻辑 数据接口从数据库查询出数据,并组织成json格式,这个逻辑如果在每个终端都写一遍,那样将编写大量…...

剑指offer 7 数组中和为0的三个数

此问题属于nsum问题,题目链接:力扣 要求在数组中找到不重复的三元组,三个数加起来为0,且每个下标只能用一次。而且需要返回所有这样的不重复数组。 1. 排序 双指针 1. 「不重复」的本质是什么?我们保持三重循环的大…...

DockerFile

大家想想,Nginx,tomcat,mysql 这些镜像都是哪里来的?官方能写,我们不能写吗? 我们要研究自己如何做一个镜像,而且我们写的微服务项目以及springboot打包上云部署,Docker就是最方便的…...

Vue-Router 介绍及路由原理分析

文章目录Vue-Router 路由模式单页面与传统页面跳转的区别Hash 模式History 模式abstract 模式原理解析Hash 模式原理History 模式原理路由使用引入 Vue-Router获取全局路由跳转参数的变化获取路由中带的参数重定向页面Vue-Router 路由模式 单页面与传统页面跳转的区别 单页面…...

git代码提交后jenkins构建和自动部署

利用jenkins和gitlab的webhook结合,实现提交代码之后,自动触发jenkins的构建。顺带介绍一下通过触发器构建,比如直接通过url去触发的方式。 一、jenkins结合webhook 1、jenkins配置 a、首先jenkins得需要安装两个gitlab的插件:(…...

2023面试题目总结

项目遇到的问题难点? 老项目版本过低(angular4),相关框架太少,需要升级成新框架。 1.single-spa 2.qiankun 3.iframe 样式环境隔离/js隔离/公共依赖的加载 JS 原型,原型链,new 原型是存放公共属性地方,所有实例都…...

Vue常用指令及声明周期

文章目录知识点前端开发环境配置v-text && v-htmlv-if、v-else && v-showv-forv-onv-modelv-bind、v-cloak、v-pre&&v-once全局 API 是什么Vue.directive 自定义组件Vue.directive 是什么自定义组件回调函数参数自定义组件的生命周期Vue.set 全局操作为…...

MariaDB 成功敲钟上市 | 它与 Navciat 缘起 10 年前

MariaDB 敲钟上市2022 年底,云数据库公司 MariaDB 与 Angel Pond Holdings 公司完成合并,并在纽交所上市。新公司更名为 MariaDB,MySQL 之父奋斗了13年终敲钟。这标志着 MariaDB 开启新篇章。无论从开源还是商业之路,都将成为业内…...

LESS模型与随机森林

模型学习 1 随机森林 https://blog.csdn.net/weixin_35770067/article/details/107346591? 森林就是建立了很多决策树,把很多决策树组合到一起就是森林。 这些决策树都是为了解决同一任务建立的,最终的目标也都是一致的,最后将其结果来平均…...

如何利用Power Virtual Agents机器人实现成绩查询服务

今天我们继续介绍如何利用Power Virtual Agents来实现成绩查询服务。设计思路是在PVA聊天机器人的对话框中输入学生的姓名和学号来进行成绩的查询。首先,在Microsoft 365的OneDrive中制作一个Excel格式的成绩单。 可以将学生的学号、姓名、各学科成绩进行添加。 在P…...

flavor 配置

文章目录1. flavorDimensions1.1 单维度1.2 多维度2. BuildConfig3. sourceSets4. 参考资料1. flavorDimensions 与 productFlavors 配合使用使用 flavorDimensions 定义风味维度,维度越多,能打出的渠道包越丰富 1.1 单维度 defaultConfig {...flavor…...

《第一行代码》 第五章:详解广播机制

如果你了解网络通信原理应该会知道,在一个 IP 网络范围中最大的IP 地址是被保留作为广播地址来使用的。比如某个网络的 IP 范围是 192.168.0XXX,子网掩码是255.255.255.0那么这个网络的广播地址就是 192.168.0255广播数据包会被发送到同-网络上的所有端口…...

Leetcode(每日一题)——1139. 最大的以 1 为边界的正方形

摘要 1139. 最大的以 1 为边界的正方形 一、以1为边界的最大正方形 1.1 动态规划 第530题需要正方形所有网格中的数字都是1,只要搞懂动态规划的原理,代码就非常简洁。而这题只要正方形4条边的网格都是1即可,中间是什么数字不用管。 这题…...

YOLOv5:GitHub两万八Star项目

来源:投稿 作者:王同学 编辑:学姐 Yolov5详解 官方源码仓库:https://github.com/ultralytics/yolov5 相关论文:未发表(改进点都被你们抢先发了) 0 前言 截止到2022年7月,Yolov5项…...

袋鼠云产品功能更新报告04期丨2023年首次,产品升级“狂飙”

新的一年我们加紧了更新迭代的速度,增加了数据湖平台EasyLake和大数据基础平台EasyMR,超40项功能升级优化。我们将继续保持产品升级节奏,满足不同行业用户的更多需求,为用户带来极致的产品使用体验。 以下为袋鼠云产品功能更新报…...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...

synchronized 学习

学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

C++八股 —— 单例模式

文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性&#xf…...

【分享】推荐一些办公小工具

1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)

安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...

从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践

作者:吴岐诗,杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言:融合数据湖与数仓的创新之路 在数字金融时代,数据已成为金融机构的核心竞争力。杭银消费金…...

TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?

在工业自动化持续演进的今天,通信网络的角色正变得愈发关键。 2025年6月6日,为期三天的华南国际工业博览会在深圳国际会展中心(宝安)圆满落幕。作为国内工业通信领域的技术型企业,光路科技(Fiberroad&…...

【Post-process】【VBA】ETABS VBA FrameObj.GetNameList and write to EXCEL

ETABS API实战:导出框架元素数据到Excel 在结构工程师的日常工作中,经常需要从ETABS模型中提取框架元素信息进行后续分析。手动复制粘贴不仅耗时,还容易出错。今天我们来用简单的VBA代码实现自动化导出。 🎯 我们要实现什么? 一键点击,就能将ETABS中所有框架元素的基…...

软件工程 期末复习

瀑布模型:计划 螺旋模型:风险低 原型模型: 用户反馈 喷泉模型:代码复用 高内聚 低耦合:模块内部功能紧密 模块之间依赖程度小 高内聚:指的是一个模块内部的功能应该紧密相关。换句话说,一个模块应当只实现单一的功能…...