Linux驱动
文章平均质量分 87
沧海一笑-dj
这个作者很懒,什么都没留下…
展开
-
【RK3399】MobaXterm串口连接开发板
Win10系统一般会默认安装,如果默认没有安装就安装对应的驱动即可。2.2 选择对应的串口设备,然后点击高级串口设置。2.4 书签设置RK3399,方便记忆。2.3 波特率设置为115200。原创 2024-04-15 17:40:17 · 2087 阅读 · 0 评论 -
【Linux驱动】GPIO子系统
GPIO 子系统在之前的内核中也是存在的,但是 pinctrl 子系统的加入 GPIO 子系统也是有很大的改变。之前我们控制一个 GPIO 可以直接来操作我们的寄存器,还有一种方法是使用 SOC 厂家实现的配置函数,例如三星的配置函数为 s3c_gpio_cfgpin 等,这样带来的问题就是各家有各家的接口函数与实现方式,不但内核的代码复用率低而且开发者很难记住这么多的函数,如果要使用多种平台的话背函数都是很麻烦的,所以在引入设备树后对 GPIO 子系统进行了大的改造,使用设备树来实现并提供统一的接口。原创 2024-05-20 18:03:50 · 819 阅读 · 0 评论 -
【Linux驱动】pinctrl子系统
在前面章节,我们有过使用寄存器去编写字符设备的经历了。这种直接在驱动代码中, 通过寄存器映射来对外设进行使用的编程方式,从驱动开发者的角度可以说是灾难。因为每当芯片的寄存器发生了改动,那么底层的驱动几乎得重写。那么在这个问题上,我们更进了一步,学会了使用设备树来描述外设的各种信息(比如寄存器地址), 而不是将寄存器的这些内容放在驱动代码里。这样即使设备信息修改了,我们还是可以通过设备树的接口函数,去灵活的获取设备的信息。极大得提高了驱动的复用能力。原创 2024-05-17 15:12:25 · 1000 阅读 · 0 评论 -
【Linux驱动】设备树下的 platform驱动
Linux3.x以后的版本才引入了设备树,设备树用于描述一个硬件平台的板级细节。在早些的linux内核,这些“硬件平台的板级细节”保存在linux内核目录“/arch”, 以ARM平台为例“硬件平台的板级细节”保存在“/arch/arm/plat-xxx”和“/arch/arm/mach-xxx”目录下。随着处理器数量的增多用于描述“硬件平台板级细节”的文件越来越多导致Linux内核非常臃肿, Linux之父发现这个问题之后决定使用设备树解决这个问题。原创 2024-05-17 09:43:11 · 987 阅读 · 0 评论 -
【Linux驱动】设备树常用of函数
Linux3.x以后的版本才引入了设备树,设备树用于描述一个硬件平台的板级细节。在早些的linux内核,这些“硬件平台的板级细节”保存在linux内核目录“/arch”, 以ARM平台为例“硬件平台的板级细节”保存在“/arch/arm/plat-xxx”和“/arch/arm/mach-xxx”目录下。随着处理器数量的增多用于描述“硬件平台板级细节”的文件越来越多导致Linux内核非常臃肿, Linux之父发现这个问题之后决定使用设备树解决这个问题。原创 2024-05-16 14:15:17 · 487 阅读 · 0 评论 -
【Linux驱动】添加设备树节点
Linux3.x以后的版本才引入了设备树,设备树用于描述一个硬件平台的板级细节。在早些的linux内核,这些“硬件平台的板级细节”保存在linux内核目录“/arch”, 以ARM平台为例“硬件平台的板级细节”保存在“/arch/arm/plat-xxx”和“/arch/arm/mach-xxx”目录下。随着处理器数量的增多用于描述“硬件平台板级细节”的文件越来越多导致Linux内核非常臃肿, Linux之父发现这个问题之后决定使用设备树解决这个问题。原创 2024-05-16 10:39:33 · 1326 阅读 · 0 评论 -
【Linux驱动】字符设备和杂项设备总结
Linux内核中将字符设备抽象成一个具体的数据结构(struct cdev),我们可以理解为字符设备对象, cdev记录了字符设备的相关信息(设备号、内核对象),字符设备的打开、读写、关闭等操作接口(file_operations), 在我们想要添加一个字符设备时,就是将这个对象注册到内核中,通过创建一个文件(设备节点)绑定对象的cdev, 当我们对这个文件进行读写操作时,就可以通过虚拟文件系统,在内核中找到这个对象及其操作接口,从而控制设备。那当然是用杂项设备了,因为他们的功能是一样的,杂项设备更简单。原创 2024-05-06 17:20:17 · 916 阅读 · 0 评论 -
【Linux驱动】设备类
Linux 驱动实验中,当我们通过 insmod 命令加载模块后,还需要通过 mknod 命令来手动创建设备节点,这样使用起来太麻烦了,并且不可能每个设备都去这样操作,Linux 系统的存在就是为了方便使用,所以我们来看一下如何实现自动创建设备节点,当加载模块时,在/dev 目录下自动创建相应的设备文件。怎么自动创建一个设备节点呢?在嵌入式 Linux 中使用 mdev 来实现设备节点文件的自动创建和删除。udev 是一种工具,它能够根据系统中的硬件设备的状态动态更新设备文件,包括设备文件的创建,删除等。原创 2024-05-06 17:15:48 · 912 阅读 · 0 评论 -
【Linux驱动】字符类设备注册
Linux内核中将字符设备抽象成一个具体的数据结构(struct cdev),我们可以理解为字符设备对象, cdev记录了字符设备的相关信息(设备号、内核对象),字符设备的打开、读写、关闭等操作接口(file_operations), 在我们想要添加一个字符设备时,就是将这个对象注册到内核中,通过创建一个文件(设备节点)绑定对象的cdev, 当我们对这个文件进行读写操作时,就可以通过虚拟文件系统,在内核中找到这个对象及其操作接口,从而控制设备。一个设备节点其实就是一个文件, Linux中称为设备文件。原创 2024-04-30 10:55:07 · 969 阅读 · 0 评论 -
【Linux驱动】字符设备号注册和注销
Linux内核中将字符设备抽象成一个具体的数据结构(struct cdev),我们可以理解为字符设备对象, cdev记录了字符设备的相关信息(设备号、内核对象),字符设备的打开、读写、关闭等操作接口(file_operations), 在我们想要添加一个字符设备时,就是将这个对象注册到内核中,通过创建一个文件(设备节点)绑定对象的cdev, 当我们对这个文件进行读写操作时,就可以通过虚拟文件系统,在内核中找到这个对象及其操作接口,从而控制设备。其中,每一行表示一个设备,每一行的第一个字符表示设备的类型。原创 2024-04-30 10:50:32 · 549 阅读 · 0 评论 -
【Linux驱动】Linux杂项设备之蜂鸣器驱动
Linux内核中将字符设备抽象成一个具体的数据结构(struct cdev),我们可以理解为字符设备对象, cdev记录了字符设备的相关信息(设备号、内核对象),字符设备的打开、读写、关闭等操作接口(file_operations), 在我们想要添加一个字符设备时,就是将这个对象注册到内核中,通过创建一个文件(设备节点)绑定对象的cdev, 当我们对这个文件进行读写操作时,就可以通过虚拟文件系统,在内核中找到这个对象及其操作接口,从而控制设备。字符型是流形式,逐一存储。它们是顺序的,先返回c,最后是s。原创 2024-04-29 15:18:02 · 978 阅读 · 0 评论 -
【Linux驱动】内核地址和物理地址
直接操作寄存器点亮LED和通过驱动程序点亮LED最本质的区别就是有无使用操作系统。有操作系统的存在则大大降低了应用软件与硬件平台的耦合度,它充当了我们硬件与应用软件之间的纽带, 使得应用软件只需要调用驱动程序接口API就可以让硬件去完成要求的开发,而应用软件则不需要关心硬件到底是如何工作的。这将大大提高我们应用程序的可移植性和开发效率。原创 2024-04-29 10:25:53 · 916 阅读 · 0 评论 -
【Linux驱动】Linux用户层和内核层
Linux内核中将字符设备抽象成一个具体的数据结构(struct cdev),我们可以理解为字符设备对象, cdev记录了字符设备的相关信息(设备号、内核对象),字符设备的打开、读写、关闭等操作接口(file_operations), 在我们想要添加一个字符设备时,就是将这个对象注册到内核中,通过创建一个文件(设备节点)绑定对象的cdev, 当我们对这个文件进行读写操作时,就可以通过虚拟文件系统,在内核中找到这个对象及其操作接口,从而控制设备。这是通过设备号实现的,包括主设备号和次设备号。原创 2024-04-28 16:56:49 · 801 阅读 · 0 评论 -
【Linux驱动】Linux杂项设备驱动
杂项设备是字符设备的一种,杂项设备可以自动生成设备节点。Linux内核中将字符设备抽象成一个具体的数据结构(struct cdev),我们可以理解为字符设备对象, cdev记录了字符设备的相关信息(设备号、内核对象),字符设备的打开、读写、关闭等操作接口(file_operations), 在我们想要添加一个字符设备时,就是将这个对象注册到内核中,通过创建一个文件(设备节点)绑定对象的cdev, 当我们对这个文件进行读写操作时,就可以通过虚拟文件系统,在内核中找到这个对象及其操作接口,从而控制设备。原创 2024-04-28 14:42:24 · 1149 阅读 · 0 评论 -
【Linux驱动】 Linux内核模块
在Linux系统中,设备驱动会以内核模块的形式出现,学习Linux内核模块编程是驱动开发的先决条件。第一次接触Linux内核模块,我们将围绕着“Linux内核模块是什么”,“Linux内核模块的工作原理”以及 “我们该怎么使用Linux内核模块”这样的思路一起走进Linux内核世界。内核模块的概念:内核模块是什么东西?为什么引入内核模块这一机制?内核模块的原理:内核模块在内核中的加载、卸载过程,深入剖析内核模块如何导出符号。原创 2024-04-26 16:16:24 · 1799 阅读 · 0 评论 -
【Linux驱动】Linux输入子系统
输入设备总类繁杂,包括按键,键盘,触摸屏,鼠标,摇杆等等,它们本身都是字符设备,不过内核为了能将这些设备的共性抽象出来,简化驱动的开发,建立了一个 Input 子系统。用户只需要根据内核提供的 input 子系统下提供的 API 函数接口,完成设备的注册即可。Input 子系统就是管理输入的子系统,和 pinctrl 和 gpio 子系统一样,都是 Linux 内核针对某一类设备而创建的框架。原创 2024-04-26 10:23:27 · 1130 阅读 · 0 评论 -
【Linux驱动】Linux平台驱动示例
在之前的字符设备程序中驱动程序,我们只要调用open()函数打开了相应的设备文件,就可以使用read()/write()函数, 通过file_operations这个文件操作接口来进行硬件的控制。这种驱动开发方式简单直观,但是从软件设计的角度看,却是一种十分糟糕的方式。它有一个严重的问题,就是设备信息和驱动代码杂糅在一起,在我们驱动程序中各种硬件寄存器地址随处可见。本质上,这种驱动开发方式与单片机的驱动开发并没有太大的区别,一旦硬件信息发生变化甚至设备已经不在了,就必须要修改驱动源码。原创 2024-04-24 15:47:59 · 444 阅读 · 0 评论 -
【Linux驱动】平台设备驱动
在之前的字符设备程序中驱动程序,我们只要调用open()函数打开了相应的设备文件,就可以使用read()/write()函数, 通过file_operations这个文件操作接口来进行硬件的控制。这种驱动开发方式简单直观,但是从软件设计的角度看,却是一种十分糟糕的方式。它有一个严重的问题,就是设备信息和驱动代码杂糅在一起,在我们驱动程序中各种硬件寄存器地址随处可见。本质上,这种驱动开发方式与单片机的驱动开发并没有太大的区别,一旦硬件信息发生变化甚至设备已经不在了,就必须要修改驱动源码。原创 2024-04-24 09:38:04 · 964 阅读 · 0 评论 -
【Linux驱动】Linux设备模型示例
设备(device):挂载在某个总线的物理设备;驱动(driver):与特定设备相关的软件,负责初始化该设备以及提供一些操作该设备的操作方式;总线(bus):负责管理挂载对应总线的设备以及驱动;类(class):对于具有相同功能的设备,归结到一种类别,进行分类管理;我们知道在Linux中一切皆“文件”,在根文件系统中有个/sys文件目录,里面记录各个设备之间的关系。下面介绍/sys下几个较为重要目录的作用。/sys/bus目录下的每个子目录都是注册好了的总线类型。原创 2024-04-23 15:45:38 · 1009 阅读 · 0 评论 -
【Linux驱动】Linux设备模型
实现入口函数xxx_init()和卸载函数xxx_exit()申请设备号 register_chrdev_region()初始化字符设备,cdev_init函数、cdev_add函数硬件初始化,如时钟寄存器配置使能,GPIO设置为输入输出模式等。构建file_operation结构体内容,实现硬件各个相关的操作在终端上使用mknod根据设备号来进行创建设备文件(节点) (也可以在驱动使用class_create创建设备类、在类的下面device_create创建设备节点)原创 2024-04-23 11:20:56 · 984 阅读 · 0 评论 -
【RK3399】交叉编译器下载和安装
既然我们想向开发板处理器中烧录程序,交叉编译工具是必不可少的。选择交叉编译工具这一步需要慎重,我们首先要知道我们自己使用的开发板采用的ARM架构是哪一个?ARM目前总共发布了8种架构:ARMv1、ARMv2、ARMv3、ARMv4、ARMv5、ARMv6、ARMv7、ARMv8。确认了ARM架构之后,选择支持该架构的交叉编译环境。可以参考GNU Arm Embedded Toolchain官网中的文档和说明来确定march支持的版本。原创 2024-04-17 10:53:49 · 1181 阅读 · 0 评论 -
【RK3399】RK3399启动引导流程分析
主控芯片是,big.LITTLE大小核架构,双Cortex-A72大核(up to 2.0GHz) + 四Cortex-A53小核结构(up to 1.5GHz);Cortex-A72处理器是Armv8-A架构下的一款高性能、低功耗的处理器。主要特性HDR10/HLGUSB Type-C详细参数一般来说,SoC厂家都会做一个ROM在SoC的内部,这个ROM很小,里面固化了上电启动的代码(一经固化,永不能改,是芯片做的时候,做进去的);原创 2024-04-16 16:03:23 · 2164 阅读 · 0 评论 -
【内核驱动】Linux驱动博客汇总
【内核驱动】Linux概述【内核驱动】内核编译【内核驱动】内核中添加驱动模块【内核驱动】编译和加载内核驱动模块【内核驱动】设备树编译和加载【内核驱动】第一个内核模块【内核驱动】内核模块命令【内核驱动】内核模块传参与符号共享【Linux驱动】设备树概述【Linux驱动】设备树(上)【Linux驱动】设备树(下)【RK3399】RK3399开发板概述【RK3399】I3399烧写Android系统详解【RK3399】I3399烧写Linux Qt系统详解【RK3399】I3399烧写Ubuntu系统详解【RK3原创 2023-12-28 19:33:31 · 796 阅读 · 1 评论 -
【Linux驱动】设备树(下)
Linux3.x以后的版本才引入了设备树,设备树用于描述一个硬件平台的板级细节。在早些的linux内核,这些“硬件平台的板级细节”保存在linux内核目录“/arch”, 以ARM平台为例“硬件平台的板级细节”保存在“/arch/arm/plat-xxx”和“/arch/arm/mach-xxx”目录下。随着处理器数量的增多用于描述“硬件平台板级细节”的文件越来越多导致Linux内核非常臃肿, Linux之父发现这个问题之后决定使用设备树解决这个问题。原创 2023-11-16 11:14:02 · 292 阅读 · 0 评论 -
【Linux驱动】设备树(上)
Linux3.x以后的版本才引入了设备树,设备树用于描述一个硬件平台的板级细节。在早些的linux内核,这些“硬件平台的板级细节”保存在linux内核目录“/arch”, 以ARM平台为例“硬件平台的板级细节”保存在“/arch/arm/plat-xxx”和“/arch/arm/mach-xxx”目录下。随着处理器数量的增多用于描述“硬件平台板级细节”的文件越来越多导致Linux内核非常臃肿, Linux之父发现这个问题之后决定使用设备树解决这个问题。原创 2023-11-16 09:56:21 · 373 阅读 · 0 评论 -
【Linux驱动】设备树概述
设备树的作用就是描述一个硬件平台的硬件资源。这个“设备树”可以被bootloader(uboot)传递到内核, 内核可以从设备树中获取硬件信息。原创 2023-11-15 17:19:55 · 273 阅读 · 0 评论 -
【RK3399】XShell串口连接开发板
Win10系统一般会默认安装,如果默认没有安装就安装对应的驱动即可。如果能够看到log信息,表示连接OK。原创 2023-11-06 10:23:36 · 635 阅读 · 0 评论 -
【内核驱动】内核模块传参与符号共享
内核模块作为一个可拓展的动态模块,为Linux内核提供了灵活性,但是有时我们需要根据不同的应用场景给内核传递不同的参数, 例如在程序中开启调试模式、设置详细输出模式以及制定与具体模块相关的选项,都可以通过参数的形式来改变模块的行为。原创 2023-09-14 16:52:32 · 281 阅读 · 0 评论 -
【内核驱动】内核模块命令
我们如愿编译了自己的内核模块,接下来就该了解如何使用这个内核模块了。将test.ko通过scp或NFS拷贝到开发板中,我们来逐一讲解这些内核模块相关工具。原创 2023-09-14 15:23:03 · 384 阅读 · 0 评论 -
【内核驱动】第一个内核模块
在Linux系统中,设备驱动会以内核模块的形式出现,学习Linux内核模块编程是驱动开发的先决条件。Linux是一个跨平台的操作系统,支持众多的设备,在Linux内核源码中有超过50%的代码都与设备驱动相关。Linux为宏内核架构,如果开启所有的功能,内核就会变得十分臃肿。内核模块就是实现了某个功能的一段内核代码,在内核运行过程,可以加载这部分代码到内核中, 从而动态地增加了内核的功能。原创 2023-09-14 14:59:00 · 341 阅读 · 0 评论 -
【内核驱动】设备树编译和加载
Linux3.x以后的版本才引入了设备树,设备树用于描述一个硬件平台的板级细节。后面我们写的驱动需要依赖设备树,所以在这里先演示如何编译设备树、加载设备树。具体原理请参考Linux设备树相关博客。原创 2023-09-14 12:03:53 · 2676 阅读 · 0 评论 -
【内核驱动】编译和加载内核驱动模块
1、将内核模块编译成内核模块文件,在内核启动后由用户手动动态加载,2、将模块直接编译到内核中去,内核启动时自动加载。原创 2023-09-14 10:47:30 · 921 阅读 · 0 评论 -
【内核驱动】内核中添加驱动模块
大部分有修改内核需求的用户基本上都是对于驱动的修改或者是对于设备树的修改, 其中设备树目录在 arch/arm/boot/dts 目录下,设备树插件目录在 arch/arm/boot/dts/overlays 目录下, 驱动目录在kernel/drivers下, 每个不同的驱动占用一个子目录,如char、block、 net、 mtd、 i2c等。原创 2023-09-10 22:12:23 · 518 阅读 · 0 评论 -
【内核驱动】内核编译
我们的kernel是根据长厂家官方提供的kernel定制的,厂家的kernel是根据kernel官方某一版本进行芯片适配的。:lib是库的意思,lib目录下存放的都是一些公用的有用的库函数,注意这里的库函数和C语言的库函数不一样的,因为在内核编程中是不能用C语言标准库函数的,所以需要使用lib中的库函数,除此之外与处理器结构相关的库函数代码被放在。make menuconfig是一个基于文本选择的配置界面, 推荐在字符终端下使用,可以通过键盘的”上”、”下”、”左”、”右”、”回车”、”空格”、”?原创 2023-09-10 21:48:06 · 265 阅读 · 1 评论 -
【内核驱动】Linux概述
UNIX系统是一个分时系统。最早的UNIX系统于1970年问世。此前,只有面向批处理作业的操作系统,这样的系统对于需要立即得到响应的用户来说是太慢了。在60年代末,Kenneth Thompson和Dennis Ritchie都曾参加过交互方式分时系统Multics的设计,而开发该系统所使用的工具是CTSS。这两个系统在操作系统的发展过程中都产生过重大影响。在此基础上,在对当时现有的技术进行精选提炼和发展的过程中,K.Thompson于1969年在小型计算机上开发UNIX系统,后于1970年投入运行。原创 2023-09-10 21:16:22 · 181 阅读 · 0 评论 -
【RK3399】I3399编译Linux+QT环境搭建详解
2.1 更新软件源2.2 安装依赖包# Notice或者。原创 2023-09-03 19:34:16 · 327 阅读 · 1 评论 -
【RK3399】XShell通过串口连接I3399开发板详解
Xshell 是一款功能强大的终端模拟器,支持SSh2,SSh3,SFTP,TELNET,RLOGIN和SERIAL。通过提供业界先进的性能,Xshell 包含了其他SSH客户端无法发现的功能和优势。Xshell 是更常用的安全终端模拟器,人们可以使用它远程登录其他系统服务器,达到远程控制终端的目的。原创 2023-09-03 10:24:59 · 709 阅读 · 0 评论 -
【RK3399】I3399烧写Debian系统详解
工具配置好后,插上开发板的 TypeC 线、串口线以及 5V DC 电源线,按下复位键,松开后,再按下音量键。2.5 按下复位键,松开后,再按下音量键,直到烧写工具出现"发现一个 LOADER 设备"如果提示发现一个 ADB 设备,点击切换按钮切换成 LOADER 设备即可。烧录固件后,如果屏幕出现闪烁的现象,是因为没有获取到xsign签名导致。2.6 选择升级固件,然后点击固件,选择对应需要烧写的镜像文件。2.4 按下复位键,松开后,再按下音量键。4.2 Android开发工具。原创 2023-09-02 21:37:13 · 770 阅读 · 0 评论 -
【RK3399】I3399烧写Ubuntu系统详解
工具配置好后,插上开发板的 TypeC 线、串口线以及 5V DC 电源线,按下复位键,松开后,再按下音量键。2.5 按下复位键,松开后,再按下音量键,直到烧写工具出现"发现一个 LOADER 设备"如果提示发现一个 ADB 设备,点击切换按钮切换成 LOADER 设备即可。烧录固件后,如果屏幕出现闪烁的现象,是因为没有获取到xsign签名导致。2.6 选择升级固件,然后点击固件,选择对应需要烧写的镜像文件。2.4 按下复位键,松开后,再按下音量键。4.2 Android开发工具。原创 2023-09-02 21:23:19 · 1350 阅读 · 0 评论 -
【RK3399】I3399烧写Linux Qt系统详解
工具配置好后,插上开发板的 TypeC 线、串口线以及 5V DC 电源线,按下复位键,松开后,再按下音量键。2.5 按下复位键,松开后,再按下音量键,直到烧写工具出现"发现一个 LOADER 设备"如果提示发现一个 ADB 设备,点击切换按钮切换成 LOADER 设备即可。烧录固件后,如果屏幕出现闪烁的现象,是因为没有获取到xsign签名导致。2.6 选择升级固件,然后点击固件,选择对应需要烧写的镜像文件。2.4 按下复位键,松开后,再按下音量键。4.2 Android开发工具。原创 2023-09-02 21:08:36 · 1529 阅读 · 0 评论