一、驱动基础知识速览(迅为RK3568)

news/2025/9/29 22:14:18/文章来源:https://www.cnblogs.com/gramming/p/19099673

一、基础知识

  1. 编译代码的三个环境变量,ARCHCROSS_COMPILEPATH分别表示架构、工具链、路径
  2. 驱动模块传参,module_parammodule_param_arraymodule_param_string传递基本数据类型、数组和字符串
  3. 内核模块导出EXPORT_SYMBOL可以导出变量、函数
  4. 驱动模块编译进内核,当前驱动源码下的Makefile和Kconfig,前者使用obj-x += x.o指定编译方法,后者编写config选项在menu中添加配置选项,上级目录的Kconfig通过source包含子目录的Kconfig
  5. 字符设备注册流程
alloc_chrdev_region(*dev, baseminor, count, *name);        // 动态分配设备号,分配的第一个设备号为dev,分配count个设备号,主设备号相同,次设备号从baseminor开始,name表示名称
cdev_init(*cdev, *fops);                                   // 绑定cdev和fops
cdev_add(*cdev, devt, count);                              // 注册一个cdev结构体,对应设备号devt,关联数量count,一般每个设备分配一个cdev即count=1
class_create(THIS_MODULE, *name);                          // 创建一个名称为name的类
device_create(*class, NULL, devt, NULL, *name);            // 在class类下创建一个device,没有父设备,设备号是devt,节点名称name,udev机制会自动识别并创建设备节点 
  1. fops如何传递数据?file结构体中有成员private_data,可以通过它传递
  2. MISC设备,主设备号10,注册方法misc_register,miscdevice结构体中有成员fops,在驱动入口中注册MISC设备,并在fops中实现IO操作
  3. 错误处理,IS_ERR判断函数返回的指针是不是错误指针,如果是错误指针通过PTR_ERR返回错误码,goto语法实现了不同阶段的不同错误处理

二、高级字符设备

  1. IO模型的分类:阻塞IO、非阻塞IO、IO多路复用、信号驱动IO、异步IO
  2. 阻塞IO
wait_queue_head_t head;
init_waitqueue_head(&head);              // 初始化等待队列头
wait_event_interrupt(head, cond);        // 条件不满足进入可中断的阻塞等待
wait_up_interrupt(&head);                // 唤醒等待队列上等待的休眠进程
  1. 非阻塞IO:读写时如果资源无效则直接返回-EAGAIN,并且非阻塞访问时需要带有flag,O_NONBLOCK
  2. IO多路复用,实现驱动中的poll函数,驱动poll函数中对可能引起状态变化的等待队列调用poll_wait,之后返回是否能对设备进行无阻塞读写访问的掩码
  3. 信号驱动IO,实现驱动中的fasync函数,直接调用fasync_helper函数,当资源准备好的时候使用kill_fasync发送指定的信号
  4. 异步IO,实现aio函数,略
  5. 定时器的使用
struct timer_list my_timer;
void my_timer_callback(struct timer_list *t);
timer_setup(&my_timer, my_timer_callback, 0);
mod_timer(&my_timer, jifiies+msecs_to_jiffies(1000));
del_timer(&my_timer);
  1. Linux内核打印
dmesg | grep "something"
cat /proc/kmsg              // 开一个终端长时间读信息
echo 7 4 1 7 > /proc/sys/kernel/printk
  1. lseek,实现对三个参数的处理,SEEK_SETSEEK_CURSEEK_END
  2. ioctl
_IO(type, nr);                // type为一个ASCII码、nr表示一个cmd的索引
_IOR(type, nr, size);          //size为一个结构体/变量
_IOW(type, nr, size);
_IOWR(type, nr, size);
_IOC_TYPE(cmd);            // 根据cmd返回type
_IOC_NR(cmd);              // 根据cmd返回nr
_IOC_DIR(cmd);             // 根据CMD返回方向,与_IOC_READ/_IOC_WRITE相与
access_ok(addr, size);      // 检测用户空间的内存块是否可用 
  1. 分支预测优化,likely表示表达式为真的可能性更大、unlikely表示表达式为真的可能性更小
  2. 驱动的其他调试方式
dump_stack();        // 打印内核调用堆栈、打印函数调用关系
WARN_ON(cond);        // cond为真时,打印内核调用堆栈,打印函数调用关系
BUGON(cond);         // cond为真时,抛出oops,打印函数调用堆栈和错误信息
panic(fmt);          // 系统死机,打印韩式调用堆栈和寄存器值

三、中断

  1. 中断子系统
用户层:用户驱动,使用通用的中断API注册中断和中断服务函数
核心层:向上提供通用API
硬件相关层:包含特定处理器相关的代码、以及中断控制器的驱动代码
硬件层:包含中断控制器和CPU
  1. 函数使用
request_irq(irq, handler, flags, *name, *dev);    // 请求一个中断号并关联对应的中断处理函数
gpio_to_irq(gpio);    // 将GPIO的引脚编号转化为中断请求号
free_irq(irq, *dev_id);  // 释放中断号、中断处理程序和设备标识
irq_handler的返回值,IRQ_NONE中断函数未处理该中断、IRQ_HANDLED中断函数处理了该中断、IRQ_WAKE_THREAD中断函数处理了该中断并请求唤醒一个内核线程进行后续处理
  1. 中断关键结构体
struct irq_desc{        // 描述中断handle_irq;        // 中断处理函数*action;           // 中断action*kstat_irqs;       // 中断统计信息irq_data;          // 中断相关数据irq_common_data;   // 中断通用数据
};
struct irqaction{handler;          // 中断处理函数*dev_id;          // 传递的设备相关信息*next;            // irq行为的链表下一项flags;            // 中断标志、触发方式、共享标志
};
  1. tasklet软中断(中断下半部分的一种实现,运行在软中断的上下文中)
struct tasklet_struct my_tasklet;
void my_tasklet_func(unsigned long data);
tasklet_init(&my_tasklet, my_tasklet_func, 0);
tasklet_enable(&my_tasklet);
tasklet_disable(&my_tasklet);
tasklet_schedule(&my_taslket);      // 放在中断处理函数返回前执行,当内核准备返回用户空间时,检测到有调度的tasklet,执行对应的tasklet_func
  1. 软中断(不建议直接使用软中断、因为已经被内核用了、网络数据收发、块设备、定时器等)
在TASKLET_SOFTIRQ对应的枚举中加入自定义的软中断或直接使用现成软中断
open_softirq(int nr, void (*action)(struct softirq_action *));        // 注册软中断和对应的处理函数
void raise_softirq(unsigned int nr);            // 触发软中断
  1. Tasklet如何使用软中断,在softirq初始化的时候,注册软中断和对应的处理函数,该处理函数遍历一个tasklet的链表指向对应的中断处理后半部分,当调用tasklet_schedule时,将tasklet加入链表并触发软中断,严格来说是挂起,真实执行需要等到中断处理函数完成,程序即将从内核返回用户空间。
  2. 工作队列,工作队列运行在内核进程上下文,可以休眠,由工作队列线程管理执行工作队列的工作队列项
// 使用共享工作队列
struct work_struct workqueue_work;
void work(struct work_struct *work);
INIT_WORK(&workqueue_work, work);
schedule_work(&workqueue_work);      // 提交工作项到内核共享工作队列中
// 使用自定义工作队列
struct workqueue_struct* workqueue = create_workqueue("test");    // 创建自定义工作队列
void work(struct work_struct *work);
struct work_struct workqueue_work;
INIT_WORK(&workqueue_work, work);
queue_work(workqueue, &workqueue_work);
// 延时执行的工作队列项
INIT_DELAYED_WORK(&workqueue_work, work);      // 初始化延时的工作项
queue_delayed_work(workqueue, &workqueue_work, 3*HZ);  // 提交延时工作项到自定义工作队列
// 如何使用工作队列传参
// 工作队列work_struct结构体放在一个结构体中,使用container_of函数根据work_struct结构体寻找到传参结构体
// 并发管理的工作队列
struct workqueue_struct* workqueue = alloc_workqueue("test", WQ_UNBOUND, 0);
  1. 中断线程化,将中断下半部分交给一个内核线程执行,通过函数request_threded_irq(irq, handler, thread_fn, irqflags, *devname, *dev_id);请求并注册一个线程化的中断处理函数,中断上半部分返回IRQ_WAKE_THREAD将中断处理推迟到下半部分

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/922292.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网站建设人员要与客户谈什么北京工地网站建设

说到天龙八部的附体宝宝,相信许多爱美的玩家基本上都人手一只。附体后的增益多不多无所谓,首先附体后身上有龙、凤凰、蝴蝶等之类的特效,让许多玩家觉得游戏中角色颜值增添不少,当然一只属性不错的附体珍兽,也能够给游…

基于KingbaseES集群管理实战:从部署运维到高可用架构深度解析 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

小型企业网站建站wordpress 底部模板

富格林认为,由于现货黄金具有独特的交易模式,因此让操作起来相当灵活,并且还可以拥有更强的盈利能力。实现盈利出金是投资者的投资目标,但是现货黄金市场复杂其中隐含着不少虚假暗箱陷阱,因此投资者要增强防范意识。下…

嘉定西安网站建设wordpress2

1.初始化npm包 npm init 输入npm init后,一路默认即可初始化成功,如下: 初始化成功后会生成一个package.json文件 n(以我的文件夹demo-npm-dir为例) package.json配置如下: {"name": "n…

java代码审计-Shiro认证授权

java代码审计 Shiro认证授权部分 前言: 这两天发现自己读shiro权限这块有点忘了,于是再好好学一遍shiro,然后结合实战代码审计记录练下1.Shiro 核心组件 shiro中的权限定义:用户,角色,权限 ,如图所示1、Usernam…

天津网站设计网站编辑器哪个好用

模板是一个让C支持范型编程的重要功能,它本质上是一个万能变量适配器;vector,pair等都是使用模板实现的 模板是C的一个强大特性,它允许您编写通用的代码来处理不同的数据类型。您可以有函数模板和类模板。 函数模板: 函数模板允许您创建一…

wordpress二次元主体seo推广方式

在有些时候我们的网友不清楚电脑显示器如何设置成满屏,那么下面就由学习啦小编来给你们说说电脑显示器设置成满屏的方法吧,希望可以帮到你们哦!电脑显示器设置成满屏的方法:右击桌面,选择弹出对话框中的【屏幕分辨率】如下图。弹出…

公司建网站多少钱没有网站怎么做百度竞价

在网页中,辛辛苦苦写的文章,被别人复制粘贴给盗用去另很多站长感到非常无奈,通常大家复制都会使用选取右键复制,或CTRLC等方式,下面介绍几种禁止鼠标右键代码,可减少网页上文章被抄袭的几率,当然…

建设官方网站的费用账务处理机构网站源码

1.下面是这款AP的全裸图,AP的无线网卡采用了AR9223,PHY采用了博通的BCM5461,主控CPU位octeon 500,射频功放采用的是RF5602方案。由于这款CPU并不常见,我至今未在网上找到它的datasheet,导致我们在玩这款AP的…

CF868F题解

先考虑朴素的暴力,设 \(f_{k,i}\) 表示前 \(i\) 个数划分为 \(k\) 段的最小代价,有 \(f_{k,i}=\min_j\{f_{k-1,j-1}+w(j,i)\}\) ,其中, \(w(x,y)\) 表示 \([x,y]\) 中相同元素的对数。 可以先在外层枚举 \(k\) ,考…

ThinkPHP反序列化分析

ThinkPHPv5.0.x反序列化利用链 前言 漏洞测试环境: php 7.3 + Windows + ThinkPHPv5.0.23 漏洞测试代码: index/controller/Index.php <?php namespace app\index\controller;class Index {public function index(…

建设京东物流网站的目标是什么广州网站排名专业乐云seo

VScode 国内下载源 进入官网 https://code.visualstudio.com/ 点击下载 复制下载链接到新的浏览器标签 将地址中的/stable前的az764295.vo.msecnd.net换成vscode.cdn.azure.cn&#xff0c;再回车就会直接在下载列表啦。 参考大神博客 2.使用nvm 对 node 和npm进行版本控制…

AT_iroha2019_day4_l 题解

题意:有一个数轴, \(Q\) 次操作,三种操作类型:1.在位置为 \(x\) 处插入权值为 \(w\) 的数,不会在有数的位置重复插入。 2.删除位置 \(x\) 处的数,保证删前 \(x\) 处有数。 3.给定位置 \(x\) ,对于一个数轴上有数…

怎么在工商网站做实名认证推广效果好的有哪些

想要在前端项目中压缩图片&#xff0c;然后再上传到后端保存&#xff0c;就需要一个压缩工具的帮助&#xff0c;暂时有两个依赖库可以选择&#xff1a;image-conversion和yireen/squoosh-browser&#xff0c;看了官方仓库地址和更新时间等详情&#xff0c;发现还是yireen/squoo…

兰州建设局网站公告wordpress Cute

1.你先作个自我介绍吧 面试官您好&#xff0c;我叫张睿超&#xff0c;来自湖南长沙&#xff0c;大学毕业于湖南农业大学&#xff0c;是一名智能科学与技术专业的统招一本本科生。今天主要过来面试贵公司的Java后端开发工程师岗位。 大学里面主修的课程是Java、Python、数字图…

做前端网站要注意哪些网站建设模板怎么设计

注解的存在主要是为了简化XML的配置。Spring6倡导全注解开发。 注解开发的优点:提高开发效率 注解开发的缺点:在一定程度上违背了OCP原则&#xff0c;使用注解的开发的前提是需求比较固定&#xff0c;变动较小。 1 注解的注解称为元注解 自定义一个注解: package com.sunspl…

企业报刊网站建设情况总结阿里网站seo

第一部分&#xff1a;跨界电商的兴起与网络安全挑战 1.1 跨界电商的崭露头角 跨界电商已经成为全球贸易的新引擎&#xff0c;企业纷纷踏上了拓展国际市场的征程。 1.2 网络安全的不容忽视 跨界电商的增长也伴随着网络安全威胁的增加。黑客攻击、数据泄露和欺诈行为等风险呈…

不符合网站外链建设原则的是个人备案网站能用公司

文章目录 前言音频服务audioserver音频数据链路hal 提供什么样的作用 前言 Android 的音频是一个相当复杂的部分。从应用到框架、hal、kernel、最后到硬件&#xff0c;每个部分的知识点都相当的多。而android 这部分代码在版本之间改动很大、其中充斥着各种workaround的处理&a…

摄影学习网站连云港市建设局网站安全员考试

文章目录 前言一、安装与运行命令行运行 python 文件 二、变量和简单数据类型2.1 变量命名规则2.2 字符串2.2.1 字符串的简单运算title()upper()、lower() 2.2.2 合并&#xff08;拼接&#xff09;字符串2.2.3 使用制表符或换行符来添加空白2.2.4 删除空白2.2.5 Python 2 中的 …

北京seo网站内部优化电子商务网站建设的定义

随着科技的不断进步和创新&#xff0c;无人机技术在各个领域中都发挥着越来越重要的作用。其中&#xff0c;光伏电站对于无人机的应用也成为了行业内的高效运维方式之一&#xff0c;凭借无人机卓越的性能和可靠性&#xff0c;有效的减少了人力运维的危险性和延迟性&#xff0c;…