嵌入式 Linux Platform 驱动模型测试
文章目录
一、为什么要用 Platform 驱动模型?
二、Platform 驱动模型的三大核心组件
1.Platform 总线(虚拟总线)
2.Platform 设备(platform_device)
3.Platform 驱动(platform_driver)
三、Platform 驱动的工作流程
四、测试
总结
一、为什么要用 Platform 驱动模型?
想象一下,你正在开发一个嵌入式系统(比如智能家居控制器)。系统里有很多外设(比如 LED 灯、温度传感器),它们直接集成在芯片上(SoC),不像 USB 或网卡那样可以热插拔。这些设备的特点是:
1. 固定不变:寄存器地址、中断号等资源不会改变。
2.需要初始化:必须明确配置(比如设置寄存器值)才能工作。
3.不能自动检测:不像 USB 设备那样插拔即用。
传统方法的痛点:
早期的驱动开发方式是将硬件信息(比如寄存器地址)直接写死在驱动代码中。比如:
#define LED_REGISTER_ADDR 0x80000000
这样做的问题:
1.驱动和硬件强耦合:换一块板子(比如寄存器地址变了),驱动就要重写。
2.维护困难:同一驱动需要为不同平台维护多个版本。
3.编译复杂:不同硬件需要不同的编译配置。
Platform 模型的好处
Platform 驱动模型通过 “分离设备描述和驱动实现” 解决了这些问题。简单来说就是:
1.硬件信息(设备):通过设备树(Device Tree)或代码单独描述。
2.驱动逻辑:只关注如何操作硬件,不关心硬件的具体地址。
3.动态匹配:内核自动将驱动和设备关联,无需硬编码。
二、Platform 驱动模型的三大核心组件
1.Platform 总线(虚拟总线)
1.作用:像“红娘”一样,把设备和驱动匹配起来。
2.匹配规则:
通过设备名称(name
)。
通过设备树中的 compatible
字段。
通过 id_table
表(支持多个设备变体)。
2.Platform 设备(platform_device
)
1.作用:描述硬件资源(寄存器地址、中断号等)。
2.定义方式:现在主流使用设备树,即在 .dts
文件中定义设备节点,如
gpioled {//添加设备节点#address-cells = <1>;#size-cells = <1>;compatible = "atkalpha-gpioled";pinctrl-names = "default";pinctrl-0 = <&pinctrl_led>;led-gpio = <&gpio1 3 GPIO_ACTIVE_LOW>;status = "okay";};
3.Platform 驱动(platform_driver
)
作用:实现设备的操作逻辑(初始化、读写等)。
核心函数:
probe()
:设备匹配成功后调用,用于初始化硬件。
remove()
:驱动卸载时释放资源。如下:
static int led_probe(struct platform_device *dev)//相当于初始化函数
{ printk("led driver and device was matched!\r\n");/* 1、设置设备号 */if (leddev.major) {leddev.devid = MKDEV(leddev.major, 0);register_chrdev_region(leddev.devid, LEDDEV_CNT, LEDDEV_NAME);} else {alloc_chrdev_region(&leddev.devid, 0, LEDDEV_CNT, LEDDEV_NAME);leddev.major = MAJOR(leddev.devid);}/* 2、注册设备 */cdev_init(&leddev.cdev, &led_fops);cdev_add(&leddev.cdev, leddev.devid, LEDDEV_CNT);/* 3、创建类 */leddev.class = class_create(THIS_MODULE, LEDDEV_NAME);if (IS_ERR(leddev.class)) {return PTR_ERR(leddev.class);}/* 4、创建设备 */leddev.device = device_create(leddev.class, NULL, leddev.devid, NULL, LEDDEV_NAME);if (IS_ERR(leddev.device)) {return PTR_ERR(leddev.device);}/* 5、初始化IO */ leddev.node = of_find_node_by_path("/gpioled");if (leddev.node == NULL){printk("gpioled node nost find!\r\n");return -EINVAL;} leddev.led0 = of_get_named_gpio(leddev.node, "led-gpio", 0);if (leddev.led0 < 0) {printk("can't get led-gpio\r\n");return -EINVAL;}gpio_request(leddev.led0, "led0");gpio_direction_output(leddev.led0, 1); /* led0 IO设置为输出,默认高电平 */return 0;
}
static int led_remove(struct platform_device *dev)
{gpio_set_value(leddev.led0, 1); /* 卸载驱动的时候关闭LED */gpio_free(leddev.led0); /* 释放IO */cdev_del(&leddev.cdev); /* 删除cdev */unregister_chrdev_region(leddev.devid, LEDDEV_CNT); /* 注销设备号 */device_destroy(leddev.class, leddev.devid);class_destroy(leddev.class);return 0;
}
三、Platform 驱动的工作流程
1. 设备描述,即在设备树中定义设备:
2.驱动注册,驱动代码中定义 platform_driver
,并注册到内核:
3.驱动与设备匹配,即内核启动时,会扫描设备树中的设备节点,如果发现某个设备的 compatible
字段与某个驱动的 of_match_table
匹配,就会调用驱动的 probe()
函数,完成初始化。如下为定义的匹配项:
四、测试
1.将驱动文件挂载到imx6ull设备中,
2. 加载驱动后查看对应的platfoam驱动,
3.点灯测试,
总结
概念 | 作用 |
Platform 总线 | 负责匹配设备和驱动,像“红娘”一样连接两者。 |
Platform 设备 | 描述硬件资源(寄存器、中断等),通常通过设备树定义。 |
Platform 驱动 | 实现设备操作逻辑,通过 probe() 初始化设备,通过 remove() 释放资源。 |
相关文章:
嵌入式 Linux Platform 驱动模型测试
文章目录 一、为什么要用 Platform 驱动模型? 二、Platform 驱动模型的三大核心组件 1.Platform 总线(虚拟总线) 2.Platform 设备(platform_device) 3.Platform 驱动(platform_driver) 三、Plat…...
Linux:web服务nginx
一.Nginx简介 Nginx (engine x) 是一个高性能的Web和反向代理服务器,同时也是一个 IMAP/POP3/SMTP 代理服器。Nginx处理高并发能力是十分强大的,能经受高负载的考验。而且支持热部署,几乎可以做到 7 * 24 小时不间断运行,即使运行…...
【“星睿O6”评测】Armv9.2a、KLEIDIAI及vulkan加速llamacpp部署本地AI
llamacpp 简介 llama.cpp 的主要目标是通过最小的设置,实现 LLM 推理,在各种硬件上(无论是本地还是云端)提供最先进的性能。 纯 C/C实现,无任何依赖苹果 M1/M2 芯片(Apple silicon)优化&#…...
Advanced Installer 22.5打包windows 安装包
Advanced Installer 22.5打包windows 安装包 1、打开Advanced Installer 22.5打包工具,绿色免安装下载链接:https://download.csdn.net/download/LongtengGensSupreme/90778405 2、选择需要打包的文件 3、设置安装文件夹权限 4、安装参数设置 5、构建设…...
Qt界面设计时窗口中各控件布局及自适应方法
在进行Qt界面设计时,往往会因为控件的布局以及伴随窗口拉伸时控件没有做好自适应部署而导致界面效果大打折扣。 这里简单介绍一下QtDesigner实现界面自适应布局,包括水平布局、垂直布局、栅格布局应用,确保界面元素随窗口变化自动调整。 图1 如图所示,这是我们的设计目标…...
添加地形与自定义地形
在先前我们设置的地图中,放大后不难发现这是2d平面 此时我们可以使用cesium自带的方法对图层进行修改 terrainProvider:Cesium.createWorldTerrainAsync(_) 修改后重新打开地图明显有了3d效果 还可以自定义添加水纹效果 requestWaterMask: true, // 可选:请求水面掩…...
livedata使用,完整的livedata的Demo
完整 LiveData Demo(Java 实现) 下面是一个可直接运行的完整 LiveData 示例,包含 ViewModel、LiveData 的基本使用以及与 UI 的交互。 项目结构 app/ ├── java/ │ ├── com.example.livedatademo/ │ │ ├── MainActivity.java │ …...
SpringBoot+Vue全栈的一个简单入门案例
目录 开发环境 Github开源项目 入门一:跑起别人的开源项目 跑起前端Vue 跑起后端SpringBoot 运行效果 入门二:将HTML模板转成Vue组件 下载一个免费的HTML模板 通过Trae将HTML转成Vue组件 将生成Vue组件增加为Vue的一个路由节点 运行Vue看看效…...
Nginx 性能调优与深度监测全攻略
目录 Nginx 性能调优与深度监测全攻略 一、引言 二、Nginx 核心性能调优策略 2.1 基础参数优化 2.1.1 worker 进程配置 2.1.2 事件驱动模型优化 2.2 缓存与资源优化 2.2.1 静态资源缓存 2.2.2 反向代理缓存 2.3 网络与连接优化 2.3.1 TCP 参数调整 2.3.2 Keep-Aliv…...
bad interpreter: No such file or directory
shell脚本加sqlite插入语句,内容如下: #!/bin/bash # 数据库文件路径 DB_FILE"/opt/ecu/db/Test.db" # 检查数据库文件所在目录是否存在,若不存在则创建 DB_DIR$(dirname "$DB_FILE") if [ ! -d "$DB_FILE" ]…...
python安装pyqt5失败
记录 PyQt5不支持3.10及以上版本,pip install PyQt5时报错raise PyProjectOptionException(qmake 详细错误信息如下: $ pip install PyQt5 Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple Collecting pyqt5Using cached https://pypi…...
【风控】模型监控和异常处理
在风控模型的全生命周期中,模型监控与异常处理是保障模型持续、稳定、可靠运行的关键环节。本指南旨在提供系统化、可落地的监控指标、预警策略及异常处置流程,帮助团队快速定位、响应并修复线上模型问题,最大限度降低风险。 1.模型监控与预…...
高并发内存池(一):项目简介+定长内存池的实现
目录 一,项目介绍 二,什么是内存池 1,池化技术 2,内存池 3,内存池主要解决的问题 4,malloc 三,实现一个定长内存池 定长内存池的设计 大致结构 核心功能实现 申请一块大小为T的内存 释…...
STM32--TIM--函数
void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState) 用于使能或禁用指定的定时器中断。...
文生图(Text-to-Image)的发展
文章目录 1. 早期探索(2010-2015):传统方法与初步尝试2. 文本条件GAN时代(2016-2019)3. 自回归与VQ-VAE时代(2019-2021)4. 扩散模型革命(2021-2022)(1) 扩散模型基础突破…...
vscode预览模式(点击文件时默认覆盖当前标签,标签名称显示为斜体,可通过双击该标签取消)覆盖标签、新窗打开
文章目录 VS Code 预览模式如何取消预览模式(即“固定”标签页)?预览模式有什么用? VS Code 预览模式 在 VS Code 中,当你单击文件浏览器(例如,资源管理器侧边栏)中的某个文件时&am…...
热部署相关
手动热部署 启动热部署后代码进行修改可以不用重启整个项目Carl F9修改的代码就可以直接生效了 热部署只进行重启的操作而不用进行重载的操作 自动热部署 自定义重启排除项 关闭热部署 ture为开启热部署false为关闭 如果直接在application.yml里写可能会被其他优先级更高的配…...
高防ip是怎么做到分布式防御的
高防IP的分布式防御体系通过多维度技术协同实现攻击流量的分散处理与智能拦截,其核心机制可从以下五个层面解析: 一、全球节点网络布局 多区域节点覆盖 在全球关键互联网枢纽(如北美、欧洲、亚太)部署清洗中心&am…...
结构可视化:利用数据编辑器剖析数据内在架构
结构可视化聚焦于展示数据的内部结构和各部分之间的关系,使企业能够深入理解数据的组织方式和层次体系,从而更好地进行数据管理和分析。通过结构可视化,企业可以清晰地看到数据的层次结构、关联关系以及数据流动路径,为数据驱动的…...
QT编程练习20250507
#include <stdio.h> // 包含标准输入输出库 #include <stdlib.h> // 包含通用工具库(如malloc, free等) #include <string> // 包含C string类定义 #include <iostream> // 包含C输入输出流库using namespace std; // 使用st…...
【软件设计师:算法】3.排序算法
一、排序 将一组杂乱无章的数据按一定的规律次序排列起来。 排序的目的是什么? 便于查找!排序算法的好坏如何衡量? 时间效率——排序速度(即排序所花费的全部比较次数)空间效率——占内存辅助空间的大小稳定性——若两个记录A和B的关键字值相等,但排序后A、B的先后次序保…...
Linux 内核学习(7) --- 字符设备驱动
字符设备驱动程序 Linux 中主要有三类设备的驱动程序,分别是字符设备驱动程序,块设备驱动程序和网络设备驱动程序 字符设备是指在 I/O 传输过程中以字符为单位进行传输的设备,例如键盘,打印机等,字符设备的驱动程序结…...
vue3+vite项目引入tailwindcss
从2025年1月tailwindcss4.0发布开始使用tailwindcss比之前简化很多 1,安装 yarn add tailwindcss tailwindcss/vite2,配置vite.config.js import tailwindcss from tailwindcss/vite;...plugins: [tailwindcss(),...] ...3,在主css文件顶部添加 注意一定是css文件,不能是sc…...
IIS配置SSL
打开iis 如果搜不到iis,要先开 再搜就打得开了 cmd中找到本机ip 用http访问本机ip 把原本的http绑定删了 再用http访问本机ip就不行了 只能用https访问了...
LeetCode:对称二叉树
1、题目描述 给你一个二叉树的根节点 root , 检查它是否轴对称。 示例 1: 输入:root [1,2,2,3,4,4,3] 输出:true 示例 2: 输入:root [1,2,2,null,3,null,3] 输出:false 提示: 树中…...
6天从0到精通:MySQL基础快速入门指南
放在前头 6天从0到精通:MySQL基础快速入门指南 6天从0到精通:MySQL基础快速入门指南 在数据驱动的时代浪潮下,MySQL作为全球最受欢迎的开源关系型数据库管理系统之一,广泛应用于Web开发、数据分析、云计算等多个领域。无论是刚…...
信息论12:从信息增益到信息增益比——决策树中的惩罚机制与应用
从信息增益到信息增益比:决策树中的惩罚机制与应用 引言:当"信息量"遇到"公平性" 在2018年某银行的信用卡风控系统中,数据分析师发现一个诡异现象:客户ID号在决策树模型中竟成为最重要的特征。这个案例揭示…...
C++ -- 哈希扩展
目录 位图 位图概念 位图的实现 位图应用 布隆过滤器 布隆过滤器的提出 布隆过滤器概念 布隆过滤器的插入 布隆过滤器的查找 布隆过滤器的删除 位图 给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数…...
AI大模型分类以及Prompt优化技巧
目录 一、AI大模型分类 1、按模态分类 2、按开源性分类 3、按规模分类 4、按用途分类 如何对比和选择大模型 二、Token 如何计算 Token 如何估算Token成本 三、Prompt工程 Prompt优化技巧 基础提示技巧 1、明确指定任何和角色 2、提供详细说明和具体示例 3、使用…...
将本地项目提交到新建的git仓库
方式一: # 登录git,新建git仓库和指定的分支,如master、dev# 下载代码,默认下载master分支 git clone http://10.*.*.67/performance_library/pfme-*.git # 切换到想要提交代码的dev分支 git checkout dev# 添加想要提交的文件 git add .#…...
【wpf】10 C#树形控件高效实现:递归构建与路径查找优化详解
在WPF应用程序开发中,树形控件的实现是常见且具有挑战性的需求。本文将深入解析一套高效树形结构的实现方案,包含递归构建、路径查找优化、动态交互等多个关键技术点。 一、递归构建树形结构 private TreeItem CreateTreeViewItem(TreeNode node) {var…...
低空科技护航珞樱春色,技术引领助推广阔应用
春风拂珞珈,樱海绽放时。赏樱季已接近尾声,作为武汉大学测绘遥感信息工程全国重点实验室的成果转化科技型企业,大势智慧积极参与校园的智能化建设,助力武汉大学的樱花季巡航管理,打造更为安全、有序的赏樱体验。 低空…...
Tiny Machine Learning在人类行为分析中的全面综述
论文标题: 中文:《Tiny Machine Learning在人类行为分析中的全面综述》 英文:A Comprehensive Survey on Tiny Machine Learning for Human Behavior Analysis 作者信息: Ismail Lamaakal, Student Member, IEEE, Siham Essahr…...
8.12 GitHub Sentinel企业级进化:容器化优化×AI监控,效率提升300%实战
GitHub Sentinel 扩展优化与商业化演进路径 关键词:企业级 Agent 扩展性设计、容器化部署优化、多格式报告生成、第三方服务集成、SaaS 服务架构 1. 功能扩展方向 1.1 多格式报告生成技术实现 采用模板引擎与文件流处理技术实现动态报告生成: #mermaid-svg-2BhQlvVsDp5NdL…...
算法-时间复杂度和空间复杂度
刷算法必备时间和空间复杂度,记录下方便查询。 时间复杂度 概念 时间复杂度衡量的是算法 执行所需的时间 随输入规模 n 增长的变化趋势,用大O 表示法描述(通常是看这个循环)。 分类 常数时间O(1) 无论输入多大,执行…...
springboot国家化多语言实现
前言 公司在做国际化项目时需要匹配多语言环境,通过spring实现i18n国际化方便快捷 项目结构 src/ ├── main/ │ ├── java/ │ │ └── com/example/i18ndemo/ │ │ ├── config/ # 配置类 │ │ ├── controller/ # …...
第2章 算法分析基础
2-1 算法的时间复杂度分析 2.1.1 输入规模与基本语句 输入规模:算法处理数据的规模,通常用 n 表示。 基本语句:执行次数与输入规模直接相关的关键操作。 例2.1 顺序查找 int SeqSearch(int A[], int n, int k) { for (int i 0; i < n…...
vue2 计算属性 computed
计算属性他是一个属性,他不是一个函数,使用的时候不要加括号 reduce reduce 是 JavaScript 数组的一个高阶函数,用于对数组中的每个元素执行一个累积计算,最终返回一个单一的值。...
Milvus 向量数据库详解与实践指南
一、Milvus 核心介绍 1. 什么是 Milvus? Milvus 是一款开源、高性能、可扩展的向量数据库,专门为海量向量数据的存储、索引和检索而设计。它支持近似最近邻搜索(ANN),适用于图像检索、自然语言处理(NLP&am…...
记录一次 python 文件环境变量配置-sqlmap.py
第一步:环境变量配置 C:\Users\14913\Downloads\application\3.secure\sqlmap-2025.5.6 或者 C:\Users\14913\Downloads\application\3.secure\sqlmap-2025.5.6 都可以! 第二步 使用 第一步:不再进目录 第二步:不再python … s…...
使用大语言模型进行机器人规划(Robot planning with LLMs)
李升伟 编译 长期规划在机器人学领域可以从经典控制方法与大型语言模型在现实世界知识能力的结合中获益。 在20世纪80年代,机器人学和人工智能(AI)领域的专家提出了莫雷奇悖论,观察到人类看似简单的涉及移动和感知的任务&#x…...
STM32 CAN总线
目录 定时传输CAN简介和硬件电路 CAN简介 主流通信协议对比 编辑 CAN硬件电路 编辑 CAN电平标准 CAN收发器 – TJA1050(高速CAN) CAN物理层特性 帧格式 数据帧 遥控帧 错误帧 过载帧 编辑 帧间隔 编辑 位填充 波形实例 位…...
使用JMeter 编写的测试计划的多个线程组如何生成独立的线程组报告
我有一个测试计划,里面有两个线程组,如下: 添加了一个HTTP请求默认值: 然后我使用如下命令生成的可视化报告是两个线程组合并后的聚合报告。 jmeter -n -t 百度测试计划.jmx -l baidu.txt -e -o ./baidu但是我想要的效果是每…...
RabbitMQ如何保证消息不丢失?
在RabbitMQ中,消息丢失可能发生在三个阶段:生产者发送消息时、消息在RabbitMQ服务器内部传递时、消费者接收消息时。为了保证消息不丢失,需要从这三个方面分别采取措施: 1. 生产者确保消息发送成功 开启确认模式(Conf…...
RAG 的介绍及评价方法
RAG的作用 大模型虽然具备处理复杂语言任务的强大能力,但在知识更新和依赖外部信息的及时性方面存在局限。大模型在训练时捕获的知识通常是静态的,一旦训练完成,模型便不再更新,无法掌握训练数据集之外的最新信息或事件。RAG可以…...
Linux网络新手注意事项与配置指南
Linux系统在网络管理方面提供了丰富的工具和灵活的配置方式,但对于新手来说,掌握正确的操作方法和注意事项至关重要。本文将从网络基础概念、配置工具、安全设置、故障排查以及常见错误等多个方面,结合具体代码示例,详细讲解Linux网络管理的核心内容,帮助新手快速入门并避…...
CI/CD与DevOps流程流程简述(提供思路)
一 CI/CD流程详解:代码集成、测试与发布部署 引言 在软件开发的世界里,CI/CD(持续集成/持续交付)就像是一套精密的流水线,确保代码从开发到上线的整个过程高效、稳定。我作为一名资深的软件工程师,接下来…...
【AWS+Wordpress-准备阶段】AWS注册+创建EC2实例
前言 自学笔记,解决问题为主,亲测有效,欢迎补充。 本地WP文件部署到AWS整体步骤如下:(本文重点:AWS准备完成) 0. [AWS 准备] 注册 AWS 并创建 EC2 实例 ↓ 1. [生成安装包:用 Du…...
FPGA----基于ZYNQ 7020实现定制化的EPICS通信系统
引言:前文我们降到了,使用alinx提供的sd卡,直接在上面编译即可。那么,如果我们的在FPGA侧有一些个性化的开发,那么生成的image.ub和boot.bin将于原sd卡中的不一致,我们应该如何坐呢? 补充知识点…...
读《暗时间》有感
读《暗时间》有感 反思与笔记 这本书还是我无意中使用 ima 给我写职业规划的时候给出的,由于有收藏的习惯,我就去找了这本书。当读到第一章暗时间的时候给了我很大的冲击,我本身就是一个想快速读完一本书的人,看到东西没有深入思…...