- 博客(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
原创 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
原创 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
devicetree-specification-readthedocs-io-en-latest
2024-08-17
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人