Linux内核-驱动
文章平均质量分 63
由于Linux具有对各种设备的广泛支持性
生活需要深度
这个作者很懒,什么都没留下…
展开
-
Linux驱动基础-request_firmware升级
request_firmware():将固件以二进制文件形式存储于文件系统之中,在内核启动后再从用户空间将固件传递至内核空间,内核空间解析固件获得文件数据,最后加载至硬件设备。实际上这些固件会存放在一个指定的目录下,需要指定的位置在目录/drivers/base/firmware_class.c下。固件放置在vendor/firmware下,在fw_path中添加,固件名字fw.cfg,将其push到vendor/firmware下。其中size为解析出来的固件的大小,data为解析出来的固件数据首地址,原创 2024-02-18 20:49:00 · 475 阅读 · 0 评论 -
使用cat读取和echo写内核文件节点的一些问题
在写驱动的时候,我们经常会向用户空间导出一些文件,然后用户空间使用cat命令去读取该节点,从而完成kernel跟user的通信。但是有时会发现,如果节点对应的read回调函数写的有问题的话,使用cat命令后,节点对应的read函数会被频繁调用,log直接刷屏,而我们只希望read被调用一次,echo也是一样的道理。背后的原因是什么呢?如何解决呢?下面我们以debugfs下的节点读写为例说明一下。回到顶部(go to top)原创 2024-01-23 19:14:53 · 842 阅读 · 0 评论 -
内核模块管理:lsmod、insmod、rmmod、modinfo、modprobe、depmod命令
modprobe会查看模块目录/lib/modules/'uname -r'里面的所有模块和文件,除了可选的/etc/modprobe.conf配置文件和/etc/modprobe.d目录外。你的内核也不一定支持模块的卸载。-i --ignore-install --ignore-remove 该选项会使得modprobe忽略配置文件中的,在命令行上输入的install和remove命令。-f --force 和同时使用--force-vermagic ,--force-modversion一样。原创 2024-01-18 14:05:05 · 627 阅读 · 0 评论 -
I/O资源读写接口 writel/readl/memcpy_toio
但是CPU通常并没有为这些已知的外设I/O内存资源的物理地址预定义虚拟地址范围,因为它们是在系统启动后才已知的(某种意义上讲是动态的),所以驱动程序并不能直接通过物理地址访问I/O内存资源,而必须将它们映射到核心虚地址空间内(通过页表),然后才能根据映射所得到的核心虚地址范围,通过访内指令访问这些I/O内存资源。但是,由于在某些平台上,对I/O内存和系统内存有不同的访问处理,因此为了确保跨平台的兼容性,Linux实现了一系列读写I/O内存资源的函数,这些函数在不同的平台上有不同的实现。原创 2023-02-20 09:24:19 · 963 阅读 · 0 评论 -
Zynq设备树教程(四)
of_iomap()函数是of_address_to_resource()和ioremap()的组合,本质上等效于ioremap(re.start, resource_size(&res)).确保物理段已经映射到虚拟内存中,函数返回内存段的虚拟地址空间起始地址。resource_size()是个内联函数,返回segment的大小(此处是0x1000)。irq_of_parse_and_map()在设备树里查找中断的描述项,然后返回中断号,request_irq()将使用这个中断号来注册。原创 2023-01-17 14:26:47 · 686 阅读 · 0 评论 -
Linux设备树详解(四)kernel的解析
分析以上代码,在unflatten_device_tree()中,调用函数__unflatten_device_tree(),参数initial_boot_params指向Device Tree在内存中的首地址,of_root在经过该函数处理之后,会指向根节点,early_init_dt_alloc_memory_arch是一个函数指针,为struct device_node和struct property结构体分配内存的回调函数(callback)。和传统的方法类似,也是静态定义的。原创 2022-12-31 20:38:25 · 1886 阅读 · 0 评论 -
Linux设备树详解(三)u-boot设备树的传递
以前没有使用设备树时,需要bootloader传一个machine id给内核,内核启动的时候会根据这个machine_id来比较内核machine_desc(机器描述结构体)中的.nr,如果相等,就选中了对应的machine_desc(机器描述结构体)),然后调用machine_desc(机器描述结构体)中的.init(初始化函数)。// 1. 当使用CONFIG_OF_EMBED的方式时,也就是dtb集成到uboot的bin文件中时,通过__dtb_dt_begin符号来获取dtb地址。原创 2022-12-31 20:37:37 · 1784 阅读 · 0 评论 -
Linux设备树详解(二)文件构成
Device Tree文件的格式为dts,包含的头文件格式为dtsi,dts文件是一种人可以看懂的编码格式。在Linux的scripts/dtc目录下除了提供dtc工具外,也可以自己安装dtc工具,linux下执行:sudo apt-get install device-tree-compiler安装dtc工具。fdtdump工具的输出信息即是以上结构中每一个成员的值,struct fdt_header结构体包含了Device Tree的私有信息,并且Device Tree的文件是以大端模式储存。原创 2022-12-31 20:36:11 · 376 阅读 · 0 评论 -
Linux设备树详解(一) 基础知识
每个字段的大小都由获取的子地址的#address-cells值,母地址的#address-cell值和子地址的#size-cells值而定。它基本就是一棵电路板上的CPU、总线、设备组成的树,Bootloader会将这棵树传递给内核,然后内核来识别这棵树,并根据它展开出Linux内核中的platform_device、i2c_client、spi_device等设备,而这些设备用到的内存、IRQ等资源,也被传递给内核,内核会将这些资源绑定给展开的相应设备。在此情况下,这两个cpu分配到的地址为0和1。原创 2022-12-31 20:21:19 · 998 阅读 · 0 评论 -
Linux设备数教程
这样针对同种或者类似的芯片只需要做简单的设备树文件配置修改,不需要对驱动加载和工作代码做修改或者极少部分修改就可以完成某种设备的加载工作。之前在公司中开发的一款芯片就是这种形式,在芯片开发前期已经很有远见的开发了一套完整的驱动流程和配置Excel配置文件模板,在新的类似芯片出现以后或者不同需求的PCB单板出现以后,只需要针对性的出对应的配置文件以后,对应的芯片和PCB单板就可以很快的加载工作起来,而不需要做太多复杂的代码修改,极大的简化了开发工作,提高了商品推向市场的时间。原创 2022-04-17 08:08:47 · 649 阅读 · 0 评论 -
linux设备树
仅自己可见原创 2022-03-26 12:18:32 · 50 阅读 · 0 评论 -
第六课:在LCD驱动中使用设备树
按照计划,本课会讲解修改uboot和内核让JZ2440支持设备树。但前面修改uboot已经讲解完了,修改内核也没必要单独讲,可以直接看内核补丁,修改的方法也并不复杂。内核补丁路径:doc_and_sources_for_device_tree/source_and_images/第5,6课的源码及映像文件(使用了完全版的设备树)/第5课第4节_内核补丁及设备树/linux-4.19-rc3_device_tree_for_irq_jz2440.patch对内核的修改并不多,里面大部分是移植原创 2022-03-25 18:36:22 · 317 阅读 · 0 评论 -
第四课:u-boot对设备树的支持
第01节_传递dtb给内核先把设备树文件读到内存,在启动内核时把设备树的地址写到r2寄存器中 a. u-boot中内核启动命令: bootm <uImage_addr> // 无设备树,bootm 0x30007FC0 bootm <uImage_addr> <initrd_addr> <dtb_addr> // 有设备树 比如: nand read.jffs2 0x.原创 2022-03-25 18:34:26 · 476 阅读 · 0 评论 -
第三课:内核对设备树的处理
这一课是设备树中最重要的一课。前面我们从内核文档了解到,对于设备树,它里面描述的信息可以分为这三部分:Linux uses DT data for three major purposes:1) platform identification,2) runtime configuration, and3) device population.事实上,内核对设备树的处理,也会分为与其对应的三部分:对于platform identification,将在第02节_对设备树中平台信原创 2022-03-25 18:33:26 · 165 阅读 · 0 评论 -
第二课:设备树的规范(dts和dtb)
第01节_DTS格式dts文件通过编译生成dtb格式文件属性的定义value取值类型 属性名=值只有三种取值第一种 <1 0x3 0x123> (一个或多个32位数据) arrays of cells 第二种 “字符串” (用双引号括起来的值) 第三种 [ 00 11 22] (byte string 是16进制表示的一个或者多个字节)一个 byte string必须用2位16进制数表示 byte之间的空格可以省略,可组合多种类型的值,之间用逗号分开示例内容 示例:原创 2022-03-25 18:30:45 · 292 阅读 · 0 评论 -
第一课:设备树的引入与体验
本套视频面向如下三类学员:有Linux驱动开发基础的人, 可以挑感兴趣的章节观看; 没有Linux驱动开发基础但是愿意学习的人,请按顺序全部观看,我会以比较简单的LED驱动为例讲解; 完全没有Linux驱动知识,又不想深入学习的人, 比如应用开发人员,不得已要改改驱动, 等全部录完后,我会更新本文档,那时再列出您需要观看的章节。目录收起展开[−]1第01节_字符设备的三种写法 1怎么写驱动? 2如何写驱动程序? 3在驱动中如何指定LED引脚? 2第02节_字...原创 2022-03-25 18:28:56 · 107 阅读 · 0 评论 -
第五课. 中断系统中的设备树
这节课讲解如何在中断系统中使用设备树,也就是用设备树如何描述中断。中断体系在4.x内核中变化很大,中断体系又跟pinctrl系统密切相关,pinctrl中又涉及GPIO子系统,这样讲下去的话,设备树课程就变成驱动专题了,所以我打算只讲中断体系统,对于pinctrl、gpio等系统留待以后在驱动课程中扩展。这一课的参考资料如下:基于设备树的TQ2440的中断(1) 基于设备树的TQ2440的中断(2) 基於tiny4412的Linux內核移植 --- 实例学习中断背后的知识(1) Linux原创 2022-03-25 18:26:24 · 187 阅读 · 0 评论 -
linux字符设备open系统调用流程
紧接着,又调用了do_filp_open函数,该函数通过调用函数get_empty_filp得到一个新的file结构体,之后的代码做了许多复杂的工作,如解析文件路径,查找该文件的文件节点inode等,直接来到了函do_dentry_open函数,如下所示。最终,会执行def_chr_fops中的open函数,也就是chrdev_open函数,可以理解为一个字符设备的通用初始化函数,根据字符设备的设备号,找到相应的字符设备,从而得到操作该设备的方法,代码实现如下。原创 2022-09-02 10:44:41 · 2167 阅读 · 0 评论 -
Linux 系统调用的来龙去脉 (下)
cmpl $(nr_syscalls), %eax 指令语句则是用来判断从用户态传入的系统调用号是否大于系统中所实现的最大的系统调用编号,判断传入的系统调用编号是否合法,如果不合法程序就跳转到 syscall_badsys 处执行相应的出错处理程序。linux系统调用的第一部分是调用请求,调用请求作为系统调用提供给应用程序的接口,在linux系统调用的3部分中,应用程序只有使用调用请求的权限(其它两部分应用程序无法接触到),系统调用号和系统调用服务程序是一一对应关系,一个系统调用对应一个系统调用服务程序。原创 2022-09-02 13:43:27 · 2074 阅读 · 0 评论 -
Linux 系统调用的来龙去脉 (上)
处理器捕获到该命令后,便将处理器的状态从用户态转换为内核态(特权模式),然后操作系统在特权模式下执行相应的程序,执行完成后,系统又将处理器状态从内核态转换到用户态,继续执行应用程序。策略2使用一个软中断,这种方式在触发软中断时向软中断函数传入一个调用号,在中断中函数中根据调用号执行指定的功能函数,由于多进行了一些操作,系统响应速度会慢一点,但是优势也非常明显,系统调用的个数几乎不受限制,对处理器硬件要求低,由于linux系统调用比较复杂,因此我们先讲述系统调用的模型,然后再讲述linux的系统调用实现。原创 2022-09-02 11:13:29 · 218 阅读 · 0 评论 -
基于read函数分析linux系统调用流程
这里名称变掉了,但是我们理解还是sys_read其实在老版本的linux内核里面,确实还是sys_read,但是由于在09年,随着大批量的64位处理器的出现,很多用户在调用的时候,无法填充64位的系统调用,就会被黑客利用,导致系统奔溃和权限升级,所以linux大牛们相处了一套通用的方法,开发出了这一套宏来避免这个bug,这个宏会对参数和系统调用名进行展开解析,从而变成我们需要的sys_read,具体如何做到的,网上有帖子,可以去参看。这里面也包含了各个系统调用的系统调用号,和calls.S是一致的。...原创 2022-08-31 20:12:35 · 2299 阅读 · 0 评论 -
linux驱动开发(四):ioctl()函数
2)type,即device type,表示设备类型,也可翻译成“幻数”或“魔数”,可以是任意一个char型字符,如’a’、‘b’、‘c’等,其主要作用是使ioctl命令具有唯一的设备标识。也就是request或cmd,本质上就是一个32位数字,理论上可以是任何一个数,但为了保证命令码的唯一性,linux定义了一套严格的规定,通过计算得到这个命令吗数字。在驱动程序的ioctl函数体中,实现了一个switch-case结构,每一个case对应一个命令码,case内部是驱动程序实现该命令的相关操作。原创 2022-09-07 16:28:21 · 1136 阅读 · 0 评论 -
PCI/PCIE概述
相比较与经典的地址访问,比方说DDR访问或者是内存控制器的访问,地址就是地址。但是,当某个设备比方说emcu类型这种通过emcu控制器来访问其控制器挂在的设备空间,也就是说这两个地址空间是隔离的。那么有没有好的方式将这两种地址直接进行隔离呢?PCI/PCIE就是这种类型的设备驱动类型。CPU发送的地址到PCI/PCIE控制器,控制器可以直接将数据进行一个转换。...原创 2022-02-22 08:54:40 · 1197 阅读 · 0 评论 -
DDR ECC驱动开发
系列文章目录第一章 DDR驱动开发提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加例如:第一章 Python 机器学习入门之pandas的使用提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录系列文章目录 前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结前言DDR驱动开发嵌入式必备的一项基本技能,常用的基本开发提示:这里可以添加本文要记录的大概内容:例如:随着人工智能的不断发展,机原创 2021-11-01 14:28:48 · 703 阅读 · 0 评论 -
Linux driver oops异常的处理
如果Linux驱动里面出现了oops异常,这种情况如何快速定位到底什么原因引起的呢,需要对驱动debug。例如:#include <linux/init.h>#include <linux/module.h>static int __init hello_init(void){ int *p = NULL; *p = 0; return 0;}static void __exit hello_exit(void){}modul...原创 2021-12-19 15:49:28 · 1064 阅读 · 0 评论 -
Linux coredump定位
基本概念 当程序运行的过程中异常终止或崩溃,操作系统会将程序当时的内存状态记录下来,保存在一个文件中,这种行为就叫做Core Dump(中文有的翻译成“核心转储”)。我们可以认为 core dump 是“内存快照”,但实际上,除了内存信息之外,还有些关键的程序运行状态也会同时 dump 下来,例如寄存器信息(包括程序指针、栈指针等)、内存管理信息、其他处理器和操作系统状态和信息。core dump 对于编程人员诊断和调试程序是非常有帮助的,因为对于有些程序错误是很难重现的,例如指针异常,而 core原创 2021-12-19 15:23:21 · 635 阅读 · 0 评论 -
Linux系统日志 -
syslogd专门记录非内核的其他设备所产生的日志,当系统的控制权由系统交给init的时候,日志信息的记录由syslogd负责记录。Logrotate是一个日志文件管理工具,用来把旧的日志文件删除,并创建新的日志文件,即日志的转储。syslog工具由一个守护程序组成,接受访问系统的日志信息并且根据/etc/syslog.conf配置文件中的指令处理日志信息。指向信息的指针,一般为程序名,ident所表示的字符串将固定地加在每行日志的前面以标识这个日志,通常就写成当前程序的名称以作标记。.........原创 2022-08-12 14:13:30 · 6289 阅读 · 0 评论 -
SPI Flash/Nor Flash/Nand Flash
目前嵌入式系统中常用的Flash有Nor和Nand两种,SPI Flash是两者中的一种,只是对外接口使用SPI串行接口而已。SPI Flash默认情况下我们指定的是Nor Flash。早起的Nor Flash使用parallel形式把数据线和地址线并排与IC的管脚连接。但是后来发现不同容量的NorFlash不能硬件上兼容(数据线和地址线数量不一样),并且封装比较大,占用较大的PCB板位置。如果使用SPI接口形式进行管脚封装,可以很好的解决这个问题,后来至于现在很多人说道NorFlash直接指代SPI Fl原创 2021-11-06 16:24:48 · 1997 阅读 · 0 评论 -
JZ2440 - 系统产品
前面从IP和讲到了产品的整个过程,现在通过一个网卡和一个系统级JZ2440两个产品说明整个产品的工作流程和开发流程。原创 2021-11-14 17:09:18 · 254 阅读 · 0 评论 -
网卡 - 功能产品
前面从IP和讲到了产品的整个过程,现在通过一个网卡和一个系统级JZ2440两个产品说明整个产品的工作流程和开发流程。网络适配器又称网卡或网络接口卡(NIC),英文名Network Interface Card。它是使计算机联网的设备,平常所说的网卡就是将PC机和LAN连接的网络适配器。网卡(NIC)插在计算机主板插槽中,负责将用户要传递的数据转换为网络上其它设备能够识别的格式。通过网络介质传输数据在计算机总线中传输是并行方式即数据是肩并肩传输的,而在网络的物理缆线中说数据以串行的比特流方...原创 2021-11-14 17:08:03 · 976 阅读 · 0 评论 -
linux netlink实现机制:通信 - 驱动与应用层数据交互(三)
具体链接。原创 2022-08-23 14:07:39 · 240 阅读 · 0 评论 -
Linux驱动实践:中断处理函数如何【发送信号】给应用层?- 驱动与应用层数据交互(二)
因为它是共享的中断,因此当键盘被按下的时候,操作系统就会依次调用所有的中断处理函数,当然就包括我们的驱动程序所注册的这个函数。一步一步的发展历史,甚至有些人还会专门去研究 Linux 0.11 版本的内核源码,因为很多基本思想都是一样的。在中断处理函数中,目标是发送信号 SIGUSR1 到应用层,因此驱动程序需要知道应用程序的进程号(PID)。只有明白了这些最基础的知识点之后,再去看那些进化出来的高级玩意,才会有一步一个脚印的获得感。如果缺少了这些基础的环节,很多深层次的东西,学起来就有点空中楼阁的感觉。原创 2022-08-23 13:57:38 · 2005 阅读 · 0 评论 -
linux 驱动copy_to_user() - 驱动与应用层数据交互(一)
实现驱动层将数据拷贝到用户态。原创 2022-08-23 14:11:28 · 372 阅读 · 0 评论 -
驱动数据反馈APP几种方式
妈妈怎么知道卧室里小孩醒了?:查询方式 简单,但是累:休眠-唤醒 不累,但是妈妈干不了活了:poll 方式 要浪费点时间,但是可以继续干活。妈妈要么是被小孩吵醒,要么是被闹钟吵醒。:异步通知 妈妈、小孩互不耽误。这 4 种方法没有优劣之分,在不同的场合使用不同的方法。...原创 2022-08-26 19:40:33 · 197 阅读 · 0 评论 -
linux kernel 同步机制 -- completion完成量
init_completion()会将done字段初始化为0,wait字段的自旋锁为未锁,等待队列为空。这说明调用该完成量的进程必须等待某事件完成(即另外一进程必须先调用completiom()唤醒该完成量)。原文链接https//blog.csdn.net/cherylchenyajun/article/details/107784434。这个函数的返回值如果>0,......原创 2022-07-31 17:07:34 · 494 阅读 · 0 评论 -
complete完成量
通过完成量实现内核驱动开发工作,完成量底层分装了等待队列内容,实现了驱动多进程之间消息互通。实际在裸机驱动开发过程中,如果一个中断信号过来,我们通过将一个标识位置为来实现。原创 2022-08-23 13:54:52 · 327 阅读 · 0 评论 -
waitqueue等待队列实现阻塞数据访问 - Linux等待队列
第五十二章Linux阻塞和非阻塞IO实验阻塞和非阻塞IO是Linux驱动开发里面很常见的两种设备访问模式,在编写驱动的时候一定要考虑到阻塞和非阻塞。本章我们就来学习一下阻塞和非阻塞IO,以及如何在驱动程序中处理阻塞与非阻塞,如何在驱动程序使用等待队列和poll机制。52.1 阻塞和非阻塞IO52.1.1 阻塞和非阻塞简介这里的“IO”并不是我们学习STM32或者其他单片机的时候所说的“GPIO”(也就是引脚)。这里的IO指的是Input/Output,也就是输入/输出,是应用程序对驱动设备的输入/输出操作。原创 2022-08-09 16:28:09 · 732 阅读 · 0 评论 -
异步通知 - 访问方式(四)
异步IO:读进程去设备中读数据,设备没有数据可读,那么当前进程阻塞,若内核检测到设备有数据可读时,会给读进程发送通知信号,读进程会执行该信号对应的处理动作去读数据。5 设置文件描述符标志 fcntl(fd,F_SETFL,flags|FASYNC)->异步通知标志。3 设置文件描述符的宿主 fcntl(fd,F_SETOWN,getpid());SIGIO-->fasync-->fd(读)--》getpid()==A。2 write-->helloWrite-->给读进程发信号。2 初使化异步通知结构体。.原创 2022-08-29 15:10:49 · 249 阅读 · 0 评论 -
epoll机制 - 访问方式(三)
mask:是一个32bits的整数,它的没每一个bit位代表了设备的一种操作状态(每一个BIT位都可以用一个宏来表示)实现:1 将监控文件描述符的进程放入监控队列--》poll_wait(pFile,&q,ptable)2 系统对监控队列中的修眠进程监控,若休眠进程的文件描述符上有IO数据发生,系统会将该进程激活。将当前操作文件的进程加入到休眠等待队列中,将该队列加入到ptable.mask:用来描述操作是否可以立即无阻塞执行的位掩码。POLLRDNORM:有普通数据可读。POLLIN:有数据可读。....原创 2022-08-29 15:10:44 · 116 阅读 · 0 评论 -
epoll API接口 - 访问方式(三)
有显卡驱动调用,判断当前事件(建立连接、断开连接、读写数据)对应的 socket 是否已经在红黑树中挂号,如果是,则将新的事件保存到对应的红黑树节点中并更新到双向链表中。等待双向链表中是否有节点,若有节点则取得不大于 maxevents 数量的节点并放入 events 中,最后返回。向 epoll 对象里面的红黑树中增加、删除、修改指定的节点。红黑树的功能是保存待监控的 socket 以及其事件的信息。双向链表的功能是保存就绪的 socket 以及其事件的信息。原创 2022-09-13 16:27:17 · 129 阅读 · 0 评论