自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(42)
  • 收藏
  • 关注

原创 rk3568_总线设备模型匹配机制_注册dev

1、首先将dev放入核的device链表中(platform_device_register)2、将dev和内核中的驱动进行表较,若匹配则不进行后续比较,若不匹配,则一直比较直到遍历完所有的drv3、匹配成功进入对应驱动的probe函数。

2026-04-19 13:26:37 27

原创 rk3568_总线设备模型匹配机制_注册driver

平台总线下有.match函数负责驱动和设备的匹配。当使用platformer_driver_register函数时会在内核中注册一个名为hello_drv的驱动,调用platformer_devices_register函数会在内核中注册一个名为hello_dev的设备。platformer_driver_register结构体中有.probe函数,.remove函数,.driver函数等。同样的,platformer_devices结构体中也有.name函数,.dev结构体等。

2026-04-17 19:33:34 59

原创 rk3568_总线设备模型

在32单片机中,对于一个驱动函数(以LED驱动为例),HAL_GPIO_Write_Pin为驱动函数,其传入的GPIOx是用来控制引脚的。我们可以理解为,HAL_GPIO_Write_Pin确定设备,是固定的代码,对于不同的设备,比如led0,led1等,传入不同的引脚仍然能够正常使用,可移植性较强,将其定义为驱动代码。对于传入的引脚编号GPIOx,其余设备相关,不同的设备引脚号不同,将其理解为device。由此可以将驱动函数分离为:1、左边,驱动相关,代码固定2、右边 ,设备相关,容易改变的代码。

2026-04-13 17:25:08 184

原创 杂项知识点1

linux启动流程:上电后会根据设置启动bootloader,设置好之后会从flash上读取内核,内核启动会初始化异常向量,作内存管理,文件系统初始化,调度器初始化,驱动程序加载等操作。执行完成后会运行第一个应用程序。对于arm架构存在几种模式:svc:内核态、最高权限usr:用户态,最低权限irq:中断模式swi:软中断cpu中有个状态寄存器CPSR(current program status reg),该寄存器中的一些位可以用来设置cpu处于哪个模式。

2026-04-09 19:16:53 234

原创 rk3568驱动-驱动编译进内核

如果我想把一个驱动编译进内核应该怎么做?首先看一下内核的结构内核下有很多文件夹,进入驱动文件夹driver下:其中char文件夹下都是字符文件驱动:打开该目录下的Makefile:其中,对于而言,如果$(CONFIG_TTY_PRINTK):是y,则编译进内核是M,则编译为ko文件。

2026-04-09 15:47:31 66

原创 rk3568-新字符设备(自动创建设备节点)

4、创建设备文件:在 /dev 目录下使用 mknod 命令或通过驱动代码自动创建(使用 device_create)一个设备文件,并将其与你的设备号关联。代码意义为:在内核中创建一个设备类,在该模块下创建一个 hello_class,即创建了:/sys/class/hello_class/目录,使用 copy_to_user() 和 copy_from_user() 在内核空间(驱动程序)和用户空间之间安全地传递数据。在该类下创建一个设备,即创建了/dev/my_hello字符设备。

2026-04-09 11:54:12 57

原创 rk3568驱动-虚拟地址

字符设备驱动开发流程:1、先确定一个字符设备的主设备号,通过命令可以查看内核中的空设备号2、linux内核提供了一个结构体file_operations,可以使用该结构体注册驱动的open,read,write等函数,注册方法如下图所示:3、内核中存在一个chrdev[]数组,将该file_operations结构体放入该数组中,数组的编号即为设备号4、注册字符设备:register_chrdev(主设备号,名字,&file_operations)5、入口函数。

2026-04-08 19:44:39 187

原创 rk3568-字符设备调用关系dbug

原始代码为正常的输出应该是1,但是此处输出是-1,究其原因是因为:驱动 read /write 函数原型与内核不匹配RK3568 内核要求:1、read:不能带 const:hello_read(struct file *file, char __user *buf, …)2、write:必须带 const:hello_write(struct file *file, const char __user *buf, …)

2026-04-08 17:00:20 42

原创 rk3568-Linux应用程序和驱动程序接口

当驱动加载后会产生一个设备文件,也会有一个唯一对应的innode结构体。当应用层调用open函数时,会进入内核发生一次软中断,从用户空间进入到内核空间。open会调用内核中的sys_open函数,该函数会根据open函数传入的文件名确定该文件是一个字符设备还是其他设备文件。如果是字符设备文件,则会通过字符设备的主设备号和次设备号在chrdevs结构体中找到对应的一项。该项中会有file_operation结构体,file_operation结构体中会有.open等函数。

2026-04-07 21:34:34 236

原创 RK3588系统烧录后扩容

笔者首次使用RK3588,对烧录流程不熟悉,按照正点原子官方的教程整理如下我在烧录使用一段时间后出现问题,想重新烧录,出现flash内存不足,不够烧写,因此我将整个emmc擦除,通过以下方法(正点原子提供的RKdevTool工具)首先点上面标签中的高级功能,然后选择擦除所有,这样我猜啥都没有了,读者也可以选择擦除部分。擦除之后重新进行烧录。

2026-01-14 17:57:41 299

原创 cam2部署到rk3588踩坑记录

python环境配置:cd sam2在 PyCharm 右上角,点击运行脚本的名字(demo_cam2),选择 Edit Configurations…。找到 Working directory 这一栏。将其修改为你的 家目录 或其他无关目录。例如:改为:/home/ps取消勾选 “Add content roots to PYTHONPATH”(如果有这一项的话,这能防止 PyCharm 强制把当前项目路径塞进搜索列表)。点击 OK 重新运行。cd …

2026-01-12 17:32:24 786 1

原创 camera驱动系列1-csi总体概述

camera serial interface(csi)是摄像机串行接口的翻译。以mipi_cai-2_2-1-2018的mipi文档为准,以整点原子imx6ull mini为例子,在开发板上进行支配。物理层可以提供更高的数据速率,因为他们是串行接口,并行接口功耗比较大,不好扩展。C-PHY:一个或者多个单向3线串行数据通道组成,每个通道都有自己的嵌入式时钟。D-PHY:单向差分接口,包含一个2线时钟通道和一个2线数据通道。

2025-12-14 18:02:11 245

原创 Linux系统裁剪移植:Busybox

类比windows的启动流程,linux系统的启动流程如下:系统上电后会加载bootloader,由bootloader去启动linux内核,内核会加载根文件系统,通过跟文件系统运行APP。那么bootloader如何找到内核,首先学习一下EMMC的存储布局。

2025-12-04 16:06:59 745

原创 Linux驱动开发——SPI

SPI全称是serial peripheral interface,叫串行外设接口,是一种同步串行传输规范。

2025-11-27 16:03:52 523

原创 应用层实现I2C通信

Linux中的I2C也是按照平台总线模型设计的。也分为一个device和一个driver,但是I2C的device叫client。platform是虚拟出来的一条总线,目的是为了实现总线、设备、驱动框架。对于I2C来说,不需要虚拟出一条总线,直接使用I2C总线即可。//I2C设备名字,必须设置//标志//i2c器件地址,必须设置int irq;API作用:获得一个I2C适配器函数参数:要获得的I2C适配器编号返回值:失败返回NULL作用:释放I2C适配器。

2025-08-28 20:34:11 899

原创 LCD 上显示字符

对于linux系统,在/usr/share/fonts 目录下有很多已经被编码的字体,我们只需要解析字体文件、访问字体文件,从字体文件中读取出字符的位图数据即可!在终端激活交叉编译环境,配置include/freetype/config/ftoption.h文件。LIBPNG_CFLAGS 选项用于指定 libpng 的头文件路径和库文件路径,根据实际安装路径填写;ZLIB_CFLAGS 选项用于指定 zlib 的头文件路径和库文件路径,根据实际安装路径填写;所谓子模,其实就是一个二维数组,用于表示字符。

2025-08-27 20:20:43 381

原创 输入子系统

我们上报的数据按照具体的格式上报给输入子系统的核心层,我们的应用就可以通过设备节点来获得按照具体格式上报来的数据了。封装数据是输入子系统核心层来帮我们完成的,我们只需要按照指定的类型和这个类型对应的数据来上报给输入子系统的核心层即可。输入子系统是Linux专门作的一套框架来处理输入事件的,像鼠标,键盘,触摸屏这些都是输入设备,但是这些输入设备的类型又都不一样,因此为了统一这些设备驱动标准应运而生。在/dev/input下面则是输入设备节点,这些节点对应的则是我们当前系统的输入设备,可以通过。

2025-08-27 20:13:38 1825

原创 按键定时器消抖

在单片机开发中,实现消抖是通过延时函数mdelay实现的。但是在linux中要求中断上文越快越好,因此不推荐使用延迟函数实现。推荐使用内核定时器代替延迟函数。

2025-08-26 11:04:30 309

原创 Linux内核定时器

Linux内核定时器是一种基于未来时间点的计时机制,不同于单片机的定时器。其特点包括:1) 精度不高,不适合高精度计时;2) 非周期性运行,超时后自动关闭,需手动重启才能实现周期定时。内核使用timer_list结构体表示定时器,包含超时时间(expires)、处理函数(function)等成员。关键API包括:时间转换函数(msecs_to_jiffies等)、定时器定义(DEFINE_TIMER)、添加(add_timer)、删除(del_timer)和修改(mod_timer)函数。示例代码展示了如何

2025-08-26 09:32:57 813

原创 中断下文-------工作队列

工作队列是实现中断下文的机制之一,是一种将工作推后执行的形式。tasklet和工作队列的主要区别是:tasklet不能休眠,而工作队列是可以休眠的。所以,tasklet可以用来处理比较消耗事件的事情,而工作队列可以处理非常复杂并且更耗时间的事情。

2025-08-25 22:47:10 378

原创 中断下文---linux驱动开发

1、什么是tasklettasklet是中断处理中断下文常用的一种方法,tasklet是一种特殊的软中断。处理中断下文的机制还有工作队列和软中断。2、怎么使用tasklet来设计中断下文框图:linux把中断分成两个部分,一个是上半部分,一个是下半部分。上半部分我们值处理紧急的事情;同时调用tasklet来启动中断下文,比较消耗事件的就要放到下文来处理。调用tasklet以后,tasklet绑定的函数并不会立马执行,而是出中断以后,经过一个很短的不确定时间在来执行。

2025-08-25 22:10:21 392

原创 中断基础概念以及设备树中的中断节点以及相关函数

1、什么是中断?CPU正常运行期间,由外部或者内部引起的事件,让cpu亭下当前正在运行的程序,转而去执行触发他的中断所对应的程序 ,这就是中断。2、什么是中断上下文,为什么会有中断上下文?为了保证中断服务程序的是实性,中断服务程序必须足够简短,但是在实际情况中,某些中断发生时需要处理大量的事件,如果都在服务程序中完成,则会严重降低中断的实时性,因此,linux提出将中断服务程序分为两部分,中断上文和中断下文。中断上文:完成尽可能少但是比较急的事情,中断上文的特点就是响应速度快。

2025-08-21 17:03:14 368

原创 ioctl接口介绍

unlocked_ioctl接口实际上就是ioctl接口。与read/write一样,都可以往内核中写数据,不同点在于,read只能完成读的功能,write只能完成写的功能,对于大数据处理时效率高。ioctl既可以读也可以写,但是读取大数据时效率不高。

2025-08-21 10:53:05 203

原创 pinctl和gpio子系统

pinctl:引脚控制gpio:通用输入输出都是linux内核提供的进行GPIO开发的框架pinctl:(1)管理系统中所有的可以控制的pin,在系统初始化的时候,枚举所有可以控制的pin,并标识这些pin(2)管理这些pin的复用(Multiplexing)。对于SOC而言,其引脚处理配置成普通的GPIO之外,若干个引脚还可以组成一个pin group,形成特定的功能。(3)配置这些pin的特性。例如是能或者关闭引脚上的pull-up,pull-down电阻,配置引脚的driver streng

2025-08-20 20:14:49 1949

原创 在设备树中添加自定义节点

本文介绍了Linux设备树操作的关键方法。主要内容包括:1)查看设备树节点的两种路径(/proc/device-tree和/sys/firmware/devicetree/base);2)详细说明如何添加自定义节点(修改dts文件、编译内核、重新烧录);3)重点讲解设备树常用操作函数,包括of_find_node_by_path、of_get_parent等节点查找函数,以及属性读取函数如of_property_read_u32_array;4)给出了设备树驱动的完整示例代码,演示如何获取节点属性值。文章通

2025-08-20 14:33:24 501

原创 设备树的介绍

设备树是一种描述硬件资源的数据结构。通过bootloader将硬件资源传给内核,使的内核和硬件资源描述相对独立。

2025-08-19 16:40:31 300

原创 平台总线模型介绍

也叫platform总线模型。总线是linux内核虚拟出来的一条总线,并不是真实的线。平台总线模型就是把原来的驱动C文件分为两个c文件,一个是device.c和driver.c稳定不变的放在driver.c变化的放在device.c字符设备和杂项设备都把驱动和设备都在一个.c文件里面。使用平台总线模型,(1)可以提高代码重用性(2)减少代码重复性结构:设备 <----> 总线 <-----> 驱动device.c driver.c分别注册device.c 和drive

2025-08-18 16:32:27 335

原创 字符设备和驱动设备总结

2025-08-18 11:14:58 260

原创 注册字符类设备

注册杂项设备cdev结构体:描述字符设备的一个结构体步骤:1、定义一个cdev结构体2、使用cdev_init函数初始化cdev结构体成员变量3、使用cdev_add函数注册到内核4、使用cdev_del函数注销字符类设备字符设备注册完以后不会自动生成设备节点,需要使用mknod命令创建一个设备节点10加载驱动之后通过命令查看分配的设备号,然后通过mknod创建设备节点,创建设备节点时传入的设备号一定要是新分配的设备号,否则会出现打开设备节点错误。

2025-08-18 10:29:44 418

原创 驱动模块传参数

给驱动传进一个字符串,如果对的话就成功运行,如果不正确就报错。驱动传参:传递参数给驱动。在使用insmod时传参。(1)设置驱动相关参数,比如缓冲区大小。(2)设置安全校验,防止驱动被别人盗用。

2025-08-17 21:29:20 223

原创 申请字符类设备号

dev_t:用来保存设备号,是一个32位数,高12位是用来保存主设备号,低12位用来保存次设备号。杂项设备的主设备号是固定的,固定为10;字符类设备的主设备号不固定。杂项设备可以自动生成设备节点;字符设备需要自己生成设备节点。建议使用动态申请,多人使用的情况下不会冲突。

2025-08-17 20:18:30 317

原创 第一个相对完整的驱动编写

GPIO 控制器 的寄存器命名中,DR 通常代表 Data Register(数据寄存器)。我们需要让蜂鸣器工作就要给蜂鸣器发送数据,因此需要数据寄存器。首先在底板原理图中找到BEEP的管脚名称:SNVS_TAMPER1。最后,查看蜂鸣器工作电路,确定蜂鸣器使能情况(底板原理图)再在数据手册中找到该管教名称对应的GPIO–>GPIO5。要求:上层应用传入参数1,打开蜂鸣器,0关闭。给蜂鸣器发送数据0,蜂鸣器工作,1不工作。在查看GPIO5的DR寄存器对应的地址。1、使用杂项设备完成一个蜂鸣器的驱动。

2025-08-17 10:15:05 287

原创 物理地址到虚拟地址的映射

在单片机或者裸机中,但是在linux上,由于不能直接对寄存器的物理地址操作(因为使能了MMU),因此需要先将物理地址转换成虚拟地址。使能MMU的好处1、让虚拟地址成为可能2、系统更加安全,使用MMU后,上层应用看到的内存都是虚拟内存。

2025-08-16 22:20:02 289

原创 应用层和内核层数据传输

Linux一切皆文件,设备节点也是文件,也可以进行打开,关闭,读写操作。

2025-08-16 22:07:07 244

原创 杂项设备驱动

Linux三大设备驱动:字符设备:IO传输过程是以字符为单位的,没有缓冲,常见的IIC,SPI都是字符设备块设备:IO传输以块为单位。与存储相关都是块设备,比如TF卡网络设备:以socket套接字来访问。杂项设备驱动是字符设备驱动的一种,可以自动生成设备节点.系统里面有很多的杂项设备,在/proc/misc 目录下杂项设备:比字符设备代码简单,可以自动生成设备节点,主设备好是相同的,均为10,次设备号不同。主设备号相同可以节省内核资源。

2025-08-15 18:02:08 335

原创 6ull驱动编译成模块,编译进内核

字符设备是 Linux 驱动中最基本的一类设备驱动,字符设备就是一个一个字节,按照字节流进行读写操作的设备,读写数据是分先后顺序的。应用程序运行在用户空间,而 Linux 驱动属于内核的一部分,因此驱动运行于内核空间。。Linux 驱动有两种运行方式:(1)将驱动编译进 Linux 内核中,这样当 Linux 内核启动的时候就会自动运行驱动程序(2)将驱动编译成模块(Linux 下模块扩展名为.ko),在Linux 内核启动以后使用“insmod”命令加载驱动模块。

2025-08-15 11:22:14 718

原创 IMX6Ull-LCD编程

获取按键状态,判断按键当前是按下、松开或长按状态。

2025-08-07 22:58:19 251

原创 V4L2 摄像头应用编程

V4L2 是 Video for linux two 的简称,是 Linux 内核中视频类设备的一套驱动框架,为视频类设备驱动开发和应用层提供了一套统一的接口规范。使用 V4L2 设备驱动框架注册的设备会在 Linux 系统/dev/目录下生成对应的设备节点文件,设备节点的名称通常为 videoX。

2025-08-06 15:31:14 2087 2

原创 PWM 应用编程

period:用于配置 PWM 周期,可读可写;写入一个字符串数字值,以 ns(纳秒)为单位,duty_cycle:用于配置 PWM 的占空比,可读可写;npwm:这是一个只读属性,读取该文件可以得知该 PWM 控制器下共有几路 PWM 输出。enable:可读可写,写入"0"表示禁止 PWM;重点关注的是 export、npwm 以及 unexport 这三个属性文件。export:与 GPIO 控制一样,在使用 PWM 之前,也需要将其导出,unexport:将导出的 PWM 删除。

2025-08-06 11:09:19 413

原创 LCD显示png图片

当 libpng 工作发生错误时,它就会执行这个错误处理函数,如果调用者并未指定自定义的错误处理函数,那么 libpng 将会使用默认的错误处理函数,其实默认的错误处理函数会执行一个跳转动作,跳转到程序中的某一个位置,我们把这个位置称为错误返回点。

2025-08-05 11:42:52 349

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除