- 博客(169)
- 资源 (30)
- 收藏
- 关注
原创 博客目录导读
如何创建设备文件如何编写字符设备驱动如何编写杂项设备驱动字符设备驱动接口最方便的字符设备驱动的写法软中断内核源码分析进程相关函数归纳驱动GPIO操作归纳驱动中定时器,taskle,工作队列编程驱动中断编程驱动中的资源共享和临界代码保护驱动等待队列,poll和select编程读操作系统导论记录linux下锁的历史发展tasklet内核源代码分析linux内存管理(一)-内存管理架构linux内存管理(二)-内存数据结构分析linux内存管理(三)-mmap的系统调用linux内
2022-11-19 17:35:33
1481
3
原创 驱动调试工具整理
zz驱动工具备注i2cI2c-toolsi2cdetect:检测挂在系统上的设备总线。i2cI2c-toolsi2cdump:查看寄存器的值i2cI2c-toolsi2cget:读取寄存器值i2cI2c-toolsi2cset:设置寄存器值spispi-tools网口驱动ethtool网口驱动Mii......
2020-12-23 11:16:21
4649
2
原创 驱动编写伪代码
摘要:本文总结了常见Linux设备驱动的开发框架,包括MTD、eMMC、DMA、pinctrl、GPIO、I2C、SPI、V4L2、UART和ALSA等模块。每个驱动类型都遵循相似的开发模式:首先填充特定的结构体(如mtd_info、gpio_chip等),定义必要的操作函数,然后调用对应的注册函数(如mtd_device_register、gpiochip_add_data等)。文章特别强调了DMA使用中的常见问题,如缓存一致性、地址范围限制和内存对齐要求。在复杂驱动(如V4L2和ALSA)部分,详细说明
2025-07-19 10:02:31
627
原创 硬件接口测试
本文摘要介绍了嵌入式系统中常见外设的测试方法: CAN总线测试:通过初始化、配置波特率后使用candump接收和cansend发送标准/扩展帧数据 RTC测试:使用hwclock命令读取实时时钟 声卡测试:通过arecord录制和aplay播放音频文件 串口测试:配置波特率后通过echo发送和cat接收数据 PWM测试:导出节点后设置周期、占空比和极性参数 I2C测试:使用i2c-tools工具进行设备检测和寄存器读写 SPI测试:通过spidev_test工具实现自发自收验证 WiFi测试:使用nmcli
2025-07-19 09:59:56
453
原创 drm驱动学习(八)双缓冲显示的IOCTL代码分析
本文介绍了DRM_IOCTL_MODE_PAGE_FLIP在Linux内核5.15中的应用,该功能主要用于垂直同步时切换显示缓冲区以避免屏幕撕裂。文章详细分析了drm_mode_page_flip_ioctl函数的实现逻辑,包括参数校验、帧缓冲查找、状态检查等关键流程,并说明了不同翻转目标模式(绝对/相对)的处理方式,以及错误处理机制。该功能支持异步页面翻转和翻转事件通知,适用于全志T527平台下的buildroot文件系统。
2025-07-18 15:05:00
985
1
原创 drm驱动学习(七)设置plane的IOCTL代码分析2
本文介绍了DRM_IOCTL_MODE_SETPLANE的功能及其实现过程。该IOCTL用于设置平面的显示配置,包括更新显示内容和位置。文章详细分析了drm_mode_setplane函数的执行流程:首先通过ID查找对应的plane、framebuffer和CRTC对象,然后调用setplane_internal函数进行设置。根据驱动是否支持原子模式设置,会分别调用__setplane_atomic或__setplane_internal函数完成最终配置。文中还解释了drm_mode_set_plane结构
2025-07-18 15:04:26
1089
原创 drm驱动学习(七)设置plane的IOCTL代码分析
本文分析了DRM驱动中的DRM_IOCTL_MODE_SETPLANE操作实现。该ioctl用于设置显示平面的配置,包括更新显示内容和位置。文章详细剖析了drm_mode_setplane函数的执行流程:首先通过ID查找对应的plane、fb和crtc对象,然后调用setplane_internal进行实际设置。在原子模式下,会进一步调用__setplane_atomic完成平面配置。文中还列出了drm_mode_set_plane结构体各参数的含义,包括平面ID、CRTC绑定、帧缓冲区ID以及显示位置等信
2025-07-18 15:00:53
523
原创 drm驱动学习(六)设置crtc的IOCTL代码分析
DRM_IOCTL_MODE_SETCRTC系统调用分析:该调用用于配置CRTC显示控制器,绑定帧缓冲(fb)到CRTC,设置显示位置和模式,并更新CRTC、fb和连接器(connector)状态。内核处理流程包括:1)通过ID查找CRTC实例;2)检查像素格式和视口有效性;3)分配显示模式内存并转换用户参数;4)处理多个显示器的连接器配置;5)最终通过drm_atomic_helper_set_config原子更新配置,包括状态分配、冲突检测和提交。整个过程确保显示配置的原子性更新。
2025-07-18 15:00:26
1217
原创 drm驱动学习(五)创建缓冲区对象fb的IOCTL代码分析
实际上大多数都是一整块,没有分开。drm_gem_fb_init首先调用函数drm_gem_fb_init根据传入参数的信息填充fb数据,包括format、width、pitches、offsets,然后把objs也记录到fb中,这样子fb就有了显示的数据、宽度、高度、显示格式,数据存放方式等等。除了fb_id,,而fb_id就是struct drm_framebuffer里面的obj的ID,也就是struct drm_mode_object base的ID,是创建obj的时候从idr中找到一个空闲的。
2025-07-18 14:59:33
741
原创 drm驱动学习(四)分配显存的IOCTL代码分析
drm_mode_create_dumb_ioctl直接调用drm_mode_create_dumb函数,在drm_mode_create_dumb函数中首先对传入参数进行有效性的判断,然后清空传入参数,最后调用sunxi_drm_drv驱动的dumb_create成员,也就是drm_gem_cma_dumb_create函数。其中,sunxi_gem_create_object、drm_gem_object_init、drm_gem_create_mmap_offset这3个函数需要进一步分析。
2025-07-18 14:58:54
781
原创 drm驱动学习(三)硬件无关的IOCTL代码分析
本文分析了全志T527平台基于Linux 5.15内核和Buildroot文件系统的DRM驱动中几个关键ioctl系统调用的实现原理。主要考察了DRM_IOCTL_VERSION、DRM_IOCTL_GET_UNIQUE、DRM_IOCTL_SET_CLIENT_CAP和DRM_IOCTL_MODE_GETRESOURCES等硬件无关的ioctl调用,详细解读了它们在内核中的对应回调函数及其功能实现。这些调用主要用于获取驱动版本信息、设备唯一标识符、设置客户端能力以及获取显示资源等基础操作,为上层应用程序提
2025-07-18 14:58:10
769
原创 drm驱动学习(二)系统调用代码分析
本文基于全志T527平台(Linux 5.15内核)分析了modetest工具通过DRM驱动实现显示功能的过程。通过strace追踪发现,modetest主要调用open和ioctl系统接口操作/dev/dri/card0设备。open操作会经过drm_stub_open函数,将文件操作的fops替换为sunxi-drm驱动的fops,并最终调用drm_open_helper完成初始化。ioctl调用则用于查询显示资源、设置显示模式等核心操作。分析揭示了DRM驱动从用户空间到内核空间的调用路径,为理解Lin
2025-07-18 14:57:11
1182
原创 drm驱动学习(一)sunxi_drm初始化
本文介绍了基于全志T527开发板的DRM显示驱动加载过程,采用Linux内核Component框架管理设备模块加载顺序。主要内容包括:1) 从设备驱动(sunxi_tcon_top、de、lvds、tcon等)通过component_add注册,各自实现bind/unbind操作;2) 主设备驱动sunxi_drm_platform_driver通过component_master_add_with_match注册,负责协调各组件初始化。该架构通过主从设备机制确保显示控制器、编码器等组件按正确顺序加载,为全
2025-07-18 14:56:13
989
原创 Ubuntu20.04运DS-5
DS-5调试ARM64 Linux内核简明流程: 环境准备: 完成DS-5安装 构建Linux内核(make ARCH=arm64) 编译boot-wrapper-aarch64引导程序 调试配置步骤: 创建DS-5调试配置 选择ARM调试目标平台 设置连接参数 调试操作: 加载内核符号文件(vmlinux) 设置关键断点(如start_kernel) 使用单步调试功能 注意事项: 需正确配置设备树文件 确保调试器与目标板连接正常 调试过程中可查看寄存器状态 该流程涵盖从环境搭建到实际调试的关键步骤,适用于
2025-07-02 22:34:51
740
原创 内核参数优化记录
在某些情况下,严格的反向路径过滤可能会误杀一些合法的流量,比如通过NAT转换的流量。net.ipv4.tcp_keepalive_intvl 是 Linux 内核中的一个网络配置参数,它定义了在 TCP 连接的 keepalive 探测过程中,内核发送连续的 keepalive 探测包之间的时间间隔。net.ipv4.tcp_max_syn_backlog 是Linux内核中的一个网络配置参数,用于设置TCP协议在三次握手过程中,对于尚未完成握手的连接请求(即处于SYN接收状态的连接)的最大队列长度。
2024-10-22 09:10:24
1445
原创 arm架构Linux5.0内核连接脚本文件vmlinux.lds.S分析
vmlinux.lds.S 是 Linux 内核中用于链接的脚本文件,用于定义内核对象文件的内存布局,即它告诉链接器如何将不同的内核代码段和数据段组合成一个最终的内核映像 vmlinux。编译内核源码生成内核文件的过程分两步,一个是“编译”,另一个是“链接”的过程,vmlinux.lds.S要做的就是告诉编译器如何链接编译好的各个内核.o文件,从而生成vmlinux文件。
2024-04-23 17:23:51
1723
原创 linux内存管理(十七)创建页表流程分析
固定映射是初始化在start_kernel()-> setup_arch()->early_fixmap_init()中,会初始化FIXMAP的起始地址,并建立一个映射框架,但不填充页表条目(PTE)。当然,还有很多函数也是通过__create_pgd_mapping来创建页表的,比如:create_mapping_noalloc、create_pgd_mapping、update_mapping_prot、map_entry_trampoline和arch_add_memory。
2024-04-19 11:14:40
1701
原创 笨叔使用eclipse和gdb调试步骤记录
5.选择C/C++ Attach下面的选项,第三步修改名字为lab,第四步选择刚刚创建的工程lab,第五步选择带调试信息的应用程序elf,第六步选择Disable auto build。6.第一步点击Dubger,第二步选择gdbserver,第三步骤写上gdb-multiarch。3.填写工程名字为lab,然后选择代码路径,最后点击finish。1.创建工程,打开file的New,选择peoject。2.选择c项目下的Makefile,然后点击next。8.在控制台带-s -S参数运行qemu程序。
2024-04-12 10:29:04
863
原创 看linux内核启动流程需要的arm汇编指令学习笔记(二)
0x30ldr x0, =my_label /*把宏的值加载到x0寄存器*/ldr x1, my_label /* PC值 + 宏的值,然后加载这个地址的值到x1寄存器*/
2024-04-09 15:13:07
1100
原创 openssl加解密和签名验签步骤操作记录
这里,aes_key.bin 是你的 AES 密钥文件,encrypted_message.bin 是加密后的数据文件。这里,aes_key.bin 是你的 AES 密钥文件,encrypted_message.bin 是加密后的数据文件。此外,确保你的密钥安全存储,并且只在需要时才使用,以防止密钥泄露。这里,signature.bin 是签名文件,message.txt 是你想要签名的文件。-sha256 指定了使用的哈希算法,你可以根据需要选择其他哈希算法,如 -sha1 或 -sha512。
2024-01-23 23:15:36
3248
1
原创 linux进程调度(四)-进程调度分析
不同的是,SCHED_RR会为每个进程分配固定的时间片,一旦时间片耗尽,当前进程便被置于队列的尾部,等待下一轮调度。task_tick_fair函数主要是遍历当前进程到当前进程到根任务组的每级公平调度实体,正常我们没有使用调度分组的话,只有一个调度实体,如果我们使用cgroup控制cpu的使用率,才会有多个调度实体,这些调度实体随着cgroup形成树状,我们只会往上遍历parent节点,针对每一个调度实体,我们会找到对应的cfs_rq后调用函数entity_tick更新进程的调度实体的状态;
2023-11-24 10:41:29
686
原创 linux进程调度(三)-进程终止
当进程退出的时候,根据父进程是否关注子进程退出事件,存在两种可能:第一种,父进程关注子进程的推出事件,那么进程退出时释放各种资源,只留下一个空的进程描述符,变成僵尸进程,发送信号 SIGCHLD通知父进程,父进程在查询进程终止的原因以后回收子进程的进程描述符。第二种,如果父进程不关注子进程退出事件,那么进程退出时释放各种资源,释放进程描述符,自动消失。进程的退出分两种情况:进程主动退出和被动退出。主动退出是指进程已经执行完毕,主动调用exit退出或者main函数执行完毕,编译器会总添加exit函数。
2023-11-24 10:41:10
675
原创 linux进程调度(二)-进程创建
我们可以直观看到kthread_run → kthread_create → kthread_create_on_node → __kthread_create_on_node的调用流程。到目前为止,我们无论是用户态的系统调用还是内核提供的函数,他们都是通过设置struct kernel_clone_args结构体为传入参数,然后调用kernel_clone函数来创建进程的。到这里我们又看到很熟悉的画面了,就是kernel_clone_args和kernel_clone函数。
2023-11-24 10:40:51
289
原创 linux进程调度(一)-进程概述
进程控制的主要功能是对系统中的所有进程实施有效的管理,它具有创建新进程、撤销已有进程、实现进程状态之间的转换等功能。现代操作系统支持多核处理器、多线程和分布式系统等技术,允许进程在不同的计算机上运行,进一步增强了进程的灵活性和可扩展性。在分时系统中,操作系统可以运行多个进程并为它们提供时间片,每个进程只有在它的时间片内获得CPU的控制权。目前,只有CPU的资源管理器能主动发起调度,而其他资源像内存,网络,显卡等资源管理器都是提供申请服务调度的,所以要必须理解我们常说的进程调度都是指调度CPU。
2023-11-24 10:40:37
205
原创 qemu调试linux内核rust驱动程序
把CONFIG_SAMPLE_RUST_PRINT和CONFIG_SAMPLE_RUST_MINIMAL选上。我们使用Rust-for-Linux的rust-dev分支进行学习。上下载 Images for arm64-virt 版本的压缩包。然后修改配置文件,把CONFIG_RUST设置为y。首先生成配置文件.config。
2023-11-09 20:36:21
1290
原创 GIC寄存器详解
GIC(Generic Interrupt Controller)是由ARM公司推出的一种通用中断控制器,用于处理系统中的各种硬件中断。GIC是一种灵活、可扩展的、可编程的中断控制器,可以处理多种类型和来源的中断,并提供了一套完整的中断管理机制。CPU Interface control(CPU接口控制器):CPU接口负责处理CPU核心与中断控制器之间的交互,包括中断请求、中断确认、中断掩码、中断优先级等。CPU接口还支持可编程的中断延迟和预处理功能,以优化中断的响应时间和系统性能。
2023-09-25 15:06:22
3226
原创 使用内核API函数找到I2C和串口控制器发送数据
我们一般操作I2C或者串口都是编写应用程序调用内核硬件提供的设备节点操作这些硬件的,但是在某个项目中,需要在shutdown的时候往i2c和tty发送数据,发送数据给外置的mcu,mcu几秒内就会给cpu断电,所以,这个动作无法在应用层中完成,需要在内核的reboot这个系统调用中实现了,但是在这个时候根文件系统已经umount了,无法使用call_usermodehelpere调用应用层的可执行程序了,会报找不到设备的错误。下面是4个例子:分别是I2C和串口的应用程序和内核程序。
2023-09-07 10:00:03
373
原创 arm64架构的linux中断分析(零)
前面的调用路径都好理解,就是start_kernel一直调用到 of_irq_init这个函数,我们的宏申明了__irqchip_of_table这个段,所以在 of_irq_init这个函数里面会遍历整个设备树,找到所有compatible匹配的节点,并且判断是否为interrupt-controller,是否有data成员,如果都有,则把date成员赋值给desc->irq_init_cb,最后调用desc->irq_init_cb。当异常发生的时候,处理器需要执行异常的处理程序。
2023-09-04 21:24:31
999
原创 warning: ignoring unsupported character ‘问题修复
细看报错内容,一致为解析Kconfig文件异常。查阅资料后发现,在Windows和Linux系统中,存在换行符的差异。windows下换行符为”0x0a0x0d”。Linux(Unix)系统下换行符为”0x0d”。
2023-09-04 21:23:06
2316
原创 Ubuntu22.04使用qemu运行armv8的TFA、optee和linux全过程
【代码】Ubuntu22.04使用qemu运行armv8的TFA、optee和linux全过程。
2023-07-06 20:53:32
864
原创 arm64架构的linux中断分析(四)
在Linux内核中,使用了类似中断控制器的模型,在每个中断控制器中管理多个中断,其中每个中断对应不同的中断处理程序,比如IOAPIC和APIC都是中断控制器的实现。当然,我们还要重点关注irq_generic_chip_ops结构体、irq_chip里面的方法和rockchip_irq_demux这个中断处理函数。中断控制器分为链式中断和层级中断,他们都是多个中断处理程序组成的中断处理链,链式中断适用于任务相对较简单、执行时间短的场景,而层级中断适用于需要更细粒度的控制和响应的场景。
2023-06-20 10:22:33
894
原创 arm64架构的linux中断分析(三)
irq_create_of_mapping函数首先根据irq_data的信息填充irq_fwspec结构体,然后调用函数irq_create_fwspec_mapping创建从fwspec到IRQ号的映射关系。of_irq_to_resource_table函数主要是遍历全部irq,然后调用of_irq_to_resource解析节点中的中断信息,和构造中断资源。translate和xlate都是中断控制器驱动注册的时候写好的,后面会详细说。
2023-06-20 10:22:17
987
原创 arm64架构的linux中断分析(二)
前面的调用路径都好理解,就是start_kernel一直调用到 of_irq_init这个函数,我们的宏申明了__irqchip_of_table这个段,所以在 of_irq_init这个函数里面会遍历整个设备树,找到所有compatible匹配的节点,并且判断是否为interrupt-controller,是否有data成员,如果都有,则把date成员赋值给desc->irq_init_cb,最后调用desc->irq_init_cb。它们是非可屏蔽中断(NMI),具有固定的优先级和中断号。
2023-06-20 10:22:02
2078
原创 arm64架构的linux中断分析(一)
第二组表示异常发生在ELn(n可以为1,2,3),处理异常的特权等级也是ELn(n可以为1,2,3),但是这里是linux内核,所以我们的特权为EL1,我们可以理解为异常发生在EL1,处理异常的特权等级也是EL1。软件中断号,有时候也叫虚拟中断号,是由内核定义的中断号,用于执行内核函数或服务。当触发流程走到cpu后,cpu会跳转到中断异常向量表,执行后面的操作:读取GIC信息,了解到是GPIO触发的中断,再读取GPIO控制器的信息,了解到是某一个GPIO的外设导致的,执行这个外设的中断处理函数。
2023-06-20 10:20:43
2434
原创 linux驱动-gpio
设备驱动层:定义了与硬件无关的GPIO API,包括GPIO的注册、卸载和控制等功能,而实现了某个模块的具体实现,比如led灯、按键等等。gpiolib抽象层:GPIO框架中的核心抽象层,它的作用是为设备驱动层和控制器层提供一致的接口,该层提供了包括上层设备驱动和下层控制器驱动的API接口。控制器层:GPIO控制器的实现和管理,在该层中实现特定GPIO控制器的底层硬件操作和功能实现包括GPIO控制器的初始化、操作和管理等。负责GPIO寄存器的读写操作和GPIO中断的处理等。
2023-05-10 19:54:45
2768
如何学习Linux下的GPIO
2024-03-05
Linux时间子系统.docx
2024-01-27
eMMC-驱动架构分析
2024-01-23
DIM-SUM操作系统内核开发的一系列问题及其解答
2024-01-11
EPCM3568B-LI系统的系统基本操作手册
2024-01-11
银河麒麟嵌⼊式操作系统安装教程
2023-11-01
RISC-V的特权规范
2023-11-01
RISCV-伪指令列表
2023-11-01
Linux内核设备树介绍
2023-11-01
swap的分析及其使用
2023-11-01
linux使用gdb调试方法详解
2022-04-27
### Trusted Firmware-A (TF-A) 技术文档总结
2025-07-31
RegBit.exe.zip
2024-05-29
glxgears x11perf测试工具.docx
2024-05-07
IOZone硬盘性能测试工具培训.doc
2024-05-07
硬盘测试工具FIO测试方法培训.docx
2024-05-07
LTP测试工具使用.docx
2024-05-07
mymymyprintf.c
2024-04-17
load-monitor.zip
2024-04-17
tcr-reader.zip
2024-04-17
WakeMeOnLan(远程唤醒开机)
2024-03-26
14. 预处理器.docx
2024-03-14
各头部企业嵌入式面经手册
2024-03-07
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅