自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 35、Firefly_rk3399 同步互斥

​ 假设程序A要访问临界资源,可能会有中断也来访问临界资源,可能会有程序B也来访问临界资源,那么使用spin_lock_irq()来保护临界资源:先禁止中断防止中断来抢,再禁止preempt防止其他进程来抢。​ ② 对于单CPU而言:自旋锁的“自旋”功能就去掉了:只剩下禁止抢占、禁止中断,用完锁再使能系统抢占(preempt_enable),这样别人就可以来抢资源了。但是对于SMP系统,你只能关闭当前CPU核的中断,别的CPU核还可以运行程序,它们也可以来执行这个函数,同样导致问题。

2024-12-14 17:19:07 875

原创 34、Firefly_rk3399 mmap内存管理

​ 一级页表中每一个表项用来设置 1M 的空间,对于 32 位的系统,虚拟地址空间有 4G,4G/1M=4096。所以一级页表要映射整个 4G 空间的话,需要 4096 个页表项。第 0 个页表项用来表示虚拟地址第 0 个 1M(虚拟地址为 0~0x0FFFFF)对应哪一块物理内存,并且有一些权限设置;第 1 个页表项用来表示虚拟地址第 1 个 1M(虚拟地址为 0x100000~0x1FFFFF)对应哪一块物理内存,并且有一些权限设置;

2024-12-06 16:47:13 783

原创 33、Firefly-rk3399中断线程化处理

2、如果上半部函数的返回值是:IRQ_WAKE_THREAD(重要)3、唤醒中断对应的内核线程。3、唤醒等待线程函数的线程。1、调用上半部处理函数。2、执行线程处理函数。

2024-11-27 16:55:01 170

原创 32、基于Firefly-rk3399 work queue处理中断底半部

工作队列是另外一种下半部执行方式,工作队列在进程上下文执行,工作队列将要推后的工作交给一个内核线程去执行,因为工作队列工作在进程上下文,因此工作队列允许睡眠或重新调度。,工作者线程处理自己工作队列中的所有工作。在实际的驱动开发中,我们只需要定义工作(work_struct)即可,关于工作队列和工作者线程我们基本不用去管。_work 表示要初始化的工作,_func 是工作对应的处理函数。n 表示定义的工作(work_struct),f 表示工作对应的处理函数。:0 成功,其他值 失败。

2024-11-27 16:25:59 375

原创 31、基于Firefly-rk3399 tasklet处理中断底半部

其中 name 为要定义的 tasklet 名字,其实就是 tasklet_struct 类型的变量名,func 就是 tasklet的处理函数,data 是传递给 func 函数的参数。在上半部,也就是中断处理函数中调用 tasklet_schedule 函数就能使 tasklet 在合适的时间运行,tasklet_schedule 函数原型如下。:要初始化的tasklet,即struct tasklet_struct定义的值。: tasklet 的处理函数。**返回值:**没有返回值。

2024-11-27 16:24:32 269

原创 30、Firefly-rk3399定时器

​ 定时器:顾名思义就是用来定时的,分为三个阶段:定时开始->定时中->定时结束。三个阶段依托于内核中的jiffies,它记录定时器计数个数,上电就开始计数依次递增,所以我们只需要知道一个定时器周期时间是多少HZ即可自由设置定时器。/* 记录定时器超时时间 *//* 记录定时器超时处理函数 *//* 上面函数的参数 */// 未使用// 未使用。

2024-11-24 18:39:09 383

原创 29、基于Firefly-rk3399阻塞和非阻塞用法

​ 和 是两种提供给用户空间程序与内核交互的系统调用,二者常用于对文件描述符或设备文件执行控制操作,但它们在设计目的和使用场景上存在显著区别。全称:Input/Output Control功能:提供一种通用的接口,通过设备专用的命令和参数控制设备的行为。适用场景:参数说明:设置串口波特率:2. 简介全称:File Control功能:用于操作文件描述符的属性和行为。适用场景:参数说明:设置文件为非阻塞模式:3. 和 的主要区别特性操作对象主要针对

2024-11-24 16:05:32 750

原创 29、基于Firefly-Rk3399信号signal异步通知

1、概述:应用层启用signal功能->将PID传递给驱动层->获取FASYNC状态并使能它 驱动层文件操作结构体创建fasync函数并通过fasync_helper监测FASYNC状态变化绑定到PID上,中断来临后kill_fasync将signal发送到绑定的PID上。​ (4)获取文件标记位,设置flag(FASYNC),驱动调用 kill_fasync(PID, SIGIO)​ (6)按键按下–>调用了按键中断程序–>记录KEY值, 将信号发出。的指针,用于存储异步通知相关的信息。

2024-11-24 14:00:16 478

原创 28、基于Firefly-rk3399 poll使用

drv_poll 要把自己这个线程挂入等待队列 wq 中。

2024-11-21 19:58:26 539

原创 27、基于Firefly-rk3399中断休眠唤醒实验(按键中断)

等待队列(wait queue)是 Linux 内核中的一种同步机制,主要用于进程在某些条件未满足时进行睡眠,等待某种事件发生再被唤醒。④ 当有数据时,比如当按下按键时,驱动程序的中断服务程序被调用,它会记录数据、唤醒 APP。典型场景包括设备驱动中,当某些硬件事件尚未发生时,让进程进入睡眠,直到事件发生后将其唤醒。② APP 进入内核态,也就是调用驱动中的对应函数,发现有数据则复制到用户空间并马上返回。⑤ APP 继续运行它的内核态代码,也就是驱动程序中的函数,复制数据到用户空间并马上返回。

2024-11-20 11:06:36 1096

原创 26、基于Firefly-rk3399,读取按键上升下降沿中断

softirq_action 结构体中的 action 成员变量就是软中断的服务函数,数组 softirq_vec 是个全局数组,全局数组softirq_vec 传入action ,因此所有的 CPU(对于 SMP 系统而言)都可以访问到,每个 CPU 都有自己的触发和控制机制,并且只执行自己所触发的软中断。其中 name 为要定义的 tasklet 名字,其实就是 tasklet_struct 类型的变量名,func 就是 tasklet的处理函数,data 是传递给 func 函数的参数。

2024-11-18 15:37:13 864

原创 25、基于firefly-rk3399使用pinctrl子系统进行led操作(无需寄存器配置)

开发人员:bsp工程师使用人员:驱动工程师目标:使用pinctrl子系统。

2024-11-08 11:16:51 959

原创 24、基于Firefly-rk3399 platform总线控制按键驱动

开发平台:Firefly-Rk3399 2+16按键引脚:GPIO0_B4电路设计:rk3399-firefly 要求输入电压为1.8v,所以我从开发板引出一个3.3V,之后搭建电压转换电路使其输出1.8V电压到GPIO。以下电路可以看出:开关打开电压为1.8V,开关闭合电压为0。

2024-11-02 11:48:51 304

原创 23、基于Firefly-rk3399 设备树加字符设备驱动驱动控制LED

在传统 Linux 内核中,ARM 架构的板极硬件细节过多地被硬编码在 arch/arm/plat-xxx 和arch/arm/mach-xxx,比如板上的 platform 设备、resource、i2c_board_info、spi_board_info 以及各种硬件的 platform_data,这些板级细节代码对内核来讲只不过是垃圾代码。而采用Device Tree 后,许多硬件的细节可以直接透过它传递给 Linux,而不再需要在 kernel 中进行大量的冗余编码。

2024-10-29 20:18:46 877

原创 22、基于Firefly-rk3399 总线设备驱动控制LED

​ platform是内核抽象出来的一个总线驱动,并没有真实的 硬件存在。platform总线遵从内核的device,bus,driver的 总线模型。platform的本质含义就是将设备信息和设备驱动分离。

2024-10-25 15:00:15 1005

原创 21、基于Firefly-rk3399字符设备驱动寄存器控制LED

GPIO 共有5组,GPIO0-GPIO4,分组信息如上。每一组又分为八个一组A B C D。对于GPIO的描述如:GPIO0_A6是指第一组的第6个引脚data寄存器, 对于输出引脚有用, 共32位,对应一组里面的4组(ABCD)引脚。方向寄存器,控制输入输出,0输入, 1输出, 共32位,对应一组里面的4组引脚。外部寄存器, 输入模式时,读取寄存器对应位的值获取当前引脚的电平。共32位,对应一组里面的4组引脚。为了便于后续驱动编写,整理表格如下模块基地址寄存器偏移地址备注GPIO0。

2024-10-16 21:33:51 1139

原创 20、字符设备驱动(模拟)

代表当前终端设备;:串行端口设备,常用于 RS-232 串口通信;:伪终端设备,用于终端模拟,例如远程登录的终端(SSH);​ 应用程序:open()、read()、write()、close()等系统调用API​ ||​ 设备文件: 设备文件作为二者之间的桥梁​ ||​ 内核: 系统调用进入内核​ ||​ 驱动程序: 驱动程序中的open()close()read()release()等​ ||

2024-10-11 21:16:41 687

原创 19、RK3399 内核移植

测试开发板:Firefly-RK3399 2+16。

2024-10-10 11:24:03 1387

原创 18、ext3ext4对比

EXT3:稳定且适用于小型系统,主要优点是数据安全性高。EXT4:在 EXT3 的基础上引入了更多特性,特别是在性能和可扩展性方面有显著提升,适用于现代大规模存储设备。因此,EXT4 是更先进的选择,通常情况下推荐使用 EXT4。

2024-09-30 17:45:43 884

原创 17、交叉编译工具链安装

arm-gnu-toolchain-12.2.rel1-x86_64-aarch64-none-linux-gnu.tar.xz,该文件名称意为:在x86平台的linux主机进行编译,生成的文件为aarch64平台可运行的文件,这里宿主机和目标平台都是64位机器。使用如下命令进行解压:tar -xvf arm-gnu-toolchain-12.2.rel1-x86_64-aarch64-none-linux-gnu.tar.xz -C /usr/local/arm。

2024-09-30 17:44:47 683 1

原创 16、RK3399 qemu仿真环境配置ubuntu制作文件系统

这对于嵌入式系统、容器化应用或其他定制化环境非常有用,用户可以在此基础上添加所需的包和功能,构建适合自己需求的操作系统。同样具备文书处理、上网和影音,更特别的是,它已经内建了几乎所有播放需要使用到的解码器,可直接播放。它主要的诉求是教育使用,所以里面有很多精心挑选的教育相关套件,和一些小游戏等。重启开发板的时候,如果有进程没有结束,系统就会等待,默认等待时间很长,导致重启速度慢。,这是一个特殊的设备文件,它会无限输出零值。新增用户,这个根据具体的情况,嵌入式的环境下,我们可以不用新增,直接使用。

2024-09-30 17:42:04 2779

原创 15、rk3399-firefly busybox制作根文件系统

的目的就是将编译生成的可执行程序及其依赖的库文件、配置文件、头文件安装到当前系统中指定(一般都可以自己指定安装到哪个目录下,如果不指定一般都有个默认目录)的目录下,默认被安装到。注意:一般你使用什么版本的交叉编译器来编译linux内核时,文件系统中的所有程序也要使用同样的交叉编译器来编译。里面是库文件,这还不足以构成 一个可用的根文件系统,必须进行其它完善工作,才能构建一个可用的根文件系统。进程解析的配置文件,通过这个配置文件决定执行哪个进程,何时执行。以上内容定义了系统启动时,关机时,重启时,按下。

2024-09-30 17:34:09 853

原创 14、RK3399-u-boot移植

左侧为rockchip官方方式,右侧为TPL/SPL方式加载。左侧的需要生成trust.img。设置bl31路径:export BL31=…/rk3399_bl31_v1.36.elf。应该是Firefly官方提交的,因此,选择这个。瑞芯微官方软件烧录即可(建议V2.84)查看3399相关的defconfig。至此,我们已经获取到了所需的。

2024-09-30 17:30:58 552

原创 13、STM32MP157A-HDMI移植

​ STM32MP157A 系列 SoC 中默认没有 HDMI 相关控制器, FS-MP1A 使用 SiI9022 芯片将RGB 信号转化为 HDMI 信号。STM32MP157A 集成 LTDC(LCD-TFT Display Controller),提供一个 24bit RGB 并行接口用于连接到各种 LCD 和 TFT 面板​ SiI9022A 是一款 HDMI 传输芯片,适用于高清便携相机、数字相机和个人移动设备,可以灵活的将其他音视频接口转换为 HDMI 或者 DVI 格式。

2024-08-31 17:54:00 3214

原创 12、STM32MP157A-有线网卡驱动移植

由于在原内核中并没有 maxio.c 文件的编译选项,这里我们需要在内核中添加对应的编译选项。主要涉及 drivers/net/phy/目录下的 Kconfig 和 Makefile 两个配置文件。在 drivers/net/phy/Kconfig 文件中添加 MAE0621A 驱动的配置项。将phy_device.c 和 maxio.c 文件复制到内核源码下的 drivers/net/phy/目录下。在 drivers/net/phy/Makefile 文件中添加 MAE0621A 驱动的编译项。

2024-08-31 17:19:31 1730

原创 11、STM32MP157A-EMMC移植

在内核中 STM32MP1 默认管脚定义在文件 arch/arm/dts/stm32mp15-pinctrl.dtsi 中,查看文件中是否有需要的管脚定义:pins1 {pins2 {pins1 {pins2 {pins3 {pins {pins1 {pins2 {pins1 {pins2 {pins3 {pins {pins {

2024-08-17 18:51:38 748

原创 10、STM32MP157ALinux内核配置与

由于添加了新文件需修改 Makefile 才能编译,修改 arch/arm/boot/dts/Makefile,添加stm32mp157a-fsmp1a.dts 的编译选项。将编译好的设备树文件与内核的 uImage 文件,复制到 ubuntu 主机的/tftpboot 文件夹下,当使用 tftp 方式下载内核与设备树文件时会用到。编译完成后会在 arch/arm/boot/dts/目录下生成 stm32mp157a-fsmp1a.dtb 文件。若未安装请看uboot移植文章中安装工具链步骤。

2024-08-17 18:31:21 488

原创 9、Linux源码目录

顶层目录的 Makefile 是整个内核配置编译的核心文件,负责组织目录树中子目录的编译管理,还可以设置体系结构和版本号等。

2024-08-17 17:42:40 581

原创 8、uboot源码目录概述

​ 此文件夹为 uboot 配置文件夹,uboot 是可配置的,但是你要是自己从头开始一个一个项目的配置,那就太麻烦了,因此一般半导体或者开发板厂商都会制作好一个配置文件。我们可以在这个做好的配置文件基础上来添加自己想要的功能,这些半导体厂商或者开发板厂商制作好的配置文件统一命名为“xxx_defconfig”,xxx 表示开发板名字,这些 defconfig 文件都存放在configs 文件夹,因此,ST 官方开发板配置文件肯定也在这个文件夹中。另外“cpu”这个文件夹也是和 cpu架构有关的。

2024-08-17 17:13:01 346

原创 7、STM32MP157a-u-boot移植(TrustMode-Trusted Firmware-A)

​ 在 U-Boot 引导程序中,“安全模式”(Secure Boot)和"非安全模式"(Non-Secure Boot)是两种不同的启动模式,它们主要涉及系统启动的安全性和可信度。安全模式通过引入数字签名和可信根来确保启动过程的安全性,适用于需要高度安全性的设备。非安全模式则跳过了这些验证步骤,提供了更大的灵活性和简便性,但也面临更高的安全风险。

2024-08-17 16:41:46 994 2

原创 6、STM32MP157a-u-boot移植(BaseMode)

点击此链接直接下载:https://developer.arm.com/-/media/Files/downloads/gnu-a/10.3-2021.07/binrel/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf.tar.xz?修改 arch/arm/dts/stm32mp157a-fsmp1a-u-boot.dtsi 文件,调整启动通道。修改 arch/arm/dts/stm32mp15xx-fsmp1x.dtsi 文件。

2024-08-17 14:38:58 1077

原创 5、ctags配置与taglist插件安装

经过以上配置后,用vim打开一个文件然后输入:TlistOpen即可。最后一行添加:(路径为 tags所在的绝对路径)完成之后可以在此目录下看到文件:tags。

2024-08-17 13:53:52 356

原创 4、设备树(DT)

​ 在传统 Linux 内核中,ARM 架构的板极硬件细节过多地被硬编码在 arch/arm/plat-xxx 和arch/arm/mach-xxx,比如板上的 platform 设备、resource、i2c_board_info、spi_board_info 以及各种硬件的 platform_data,这些板级细节代码对内核来讲只不过是垃圾代码。而采用Device Tree 后,许多硬件的细节可以直接透过它传递给 Linux,而不再需要在 kernel 中进行大量的冗余编码。

2024-08-14 19:39:20 1096

原创 3、uboot启动概述

因为STM32MP1在片内的ROM中有自己的专有ROM代码,所以可以删除这一部分,然后BL2是要执行的第一个TF-A二进制文件,BL2(受信任的引导固件)负责加载下一阶段的映像(安全和非安全)。STM32MP157是判断是否在第一个核上运行、是否启动M核、是否RMA、是否ENGI,这些对我们来说都不太重要,默认它一路绿灯就好了,重点要关注红框中的。,复位后STM32MP157内部的两个A核执行相同的程序,由于ROM Code中进行了判断,所以ROM Code只在Core0上运行。BL2 跳转到BL32。

2024-08-14 19:33:29 931

原创 2、ST 固件烧写(uboot 内核 文件系统)

​ 当我们编译了自己的一些镜像后,需要将其下载到开发板中运行的时候,可以使用此方式将开发板上的分区通过 USB 使用 ums 工具映射到虚拟机中的 ubuntu 系统中。首先需要使用 MobaXterm 连接上调试串口,在系统的启动过程中会出现 1 秒的倒计时,在倒计时结束之前按下键盘任意键即可将程序停留在 bootloader 的控制终端。在控制台使用 ums 0 mmc 0 命令可以将开发板上的 sdcard 分区映射到 PC 上,然后再由PC 将设备连接到虚拟机当中的 ubuntu 系统。

2024-08-14 19:31:14 513

原创 1、Linux嵌入式开发环境搭建

这里的磁盘大小尽量大一些,以后对Ubuntu进行一些配置会占比较多的空间,我一般选择200GB,这里选200GB,并不会占你主机太多空间(说实话,和你默认选20GB也差不多),然后选择"将虚拟磁盘拆分成多个文件(M)",点击下一步。选择第一个"Erase disk and install Ubuntu" ,这里的"擦除磁盘并安装Ubuntu"并不会影响到你的宿主机,不用担心会清空的你磁盘,然后点击"Install Now"12)、compareit,比较插件,可以用于比较两个文件的差异。

2024-08-14 19:25:30 1651 3

原创 5、C语言——前言(基础知识)

计算机只能识别二进制也就是数值型数据,但是在编程中往往会出现一些非数值的数据,比如人名、性别等等,所以我们需要让计算机识别这些,所以就发明出来专门识别非数值型数据的东西,称之为ASCII码。然后点击当前窗口的左上角的“选项”,然后点击“共享文件夹”,在右边“文件夹共享”里面选择“总是启用”,然后在下方点击“添加”,然后选择共享文件夹的路径,点击确定即可。有符号数:由于有符号数有正有负,所以最高位为符号位,1表示负数,0表示正数。原码是人类识别的,补码是计算机识别的,反码用于原码和补码的转换。

2023-02-23 22:42:02 727 1

原创 4、文件系统介绍

文件系统简单介绍

2023-02-23 21:07:51 124

原创 3、vim编辑器和GCC编译器的使用

vim基本使用及介绍

2023-02-23 21:02:09 1263

原创 2、Linux命令合集

超详细命令合计

2023-02-10 23:18:56 388 1

taglist40,ctags插件

详细配置步骤请移步我的博客

2024-08-17

八位bmp图像解析,矩阵转bmp

八位bmp图像解析生成图片信息及图像数据,兼容图像数据矩阵txt文件转换为bmp,详见内部readme

2024-08-17

ST官方交叉工具链,en.SOURCES-stm32mp1-openstlinux-5-4-dunfell-mp1-20-06

ST官方交叉工具链

2024-08-17

devicetree-specification-readthedocs-io-en-latest

设备树使用文档devicetree-specification-readthedocs-io-en-latest.pdf

2024-08-17

空空如也

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

TA关注的人

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