SPI驱动模型框架及spidev.c分析---学习记录

news2025/1/19 23:01:03

目录

SPI设备如何使用

SPI驱动模型框架

SPI 控制器/SPI Master分析

SPI 设备端/SPI Slave分析

SPI 控制器/SPI Master与SPI 设备端/SPI Slave驱动模型

Linux内核自带的SPI 设备端/SPI Slave代码spidev.c

小结


SPI设备如何使用

        一般我们使用spi设备驱动是类似文件操作,使用open/read/write/ioctl这些去控制/dev/spix.x,而/dev/spix.x是spi设备驱动实现的。而spi 控制器驱动实现的则是从设备树解析出spi 控制器与设备端的映射关系,并且实现传输接口。

SPI驱动模型框架

SPI驱动分成两部分:SPI控制器或者叫SPI Master,SPI 设备端或者SPI Slave。

先看设备树节点:

&ecspi3 { 
    pinctrl-names = "default";
    pinctrl-0 = <&pinctrl_ecspi3>;
    cs-gpios = <&gpio1 20 GPIO_ACTIVE_LOW>;
    status = "okay";
    
    
    spidev: icm20608@0{
        compatible = "invensense,icm20608";
        interrupt-parent = <&gpio1>;
        interrupts = <1 1>;
        spi-max-frequency = <8000000>; 
        reg = <0>; 
    };
};

ecspi3是控制器节点,在这之下有一个spi设备节点(spidev: icm20608@0)。

那么我们要写驱动应该怎么写呢?猜想应该是要分别实现SPI 控制器以及SPI 设备端。

SPI 控制器/SPI Master分析

如上设备树节点,在设备树的结构里spi控制器为大节点,然后在其内部创建spi设备节点,如下图设备树节点事例。

使用platform总线驱动用来与设备树中的SPI 控制器节点进行匹配,在下图中platform device自然是从设备树中获取,platform driver我们用module_platform_driver或者platform_driver_register来注册。并通过设备树中的compatible属性匹配。最后进入到probe函数中做下一步处理(如下图中的spi_gpio_probe)

这里以spi-imx.c(实现的是SPI 控制器的驱动代码)代码分析:

用一句话概括就是做了三件事:

1.创建spi_master,这个结构体里包含有传输数据的实现。

2.解析出SPI 控制器节点下的所有设备节点,创建spi_device与每一个设备节点对应.

3.映射spi_master与spi_device关系,并初始化硬件信息,实现传输数据。

具体如下:

在spi_imx_probe函数中用spi_alloc_master创建一个spi_master结构体,然后spi_bitbang_start-->spi_register_master---->of_register_spi_devices函数中把设备树中的每一个spi控制器节点下的设备节点(如上图gpio_spi)创建spi_device结构体,这样spi_device与spi_master(如上图的spi3)就有了映射关系,以后操作设备节点的时候,就可以通过spi_device设备节点找到与之对应的spi_master,然后调用spi_master里的传输接口来传输数据。具体传输数据是如何实现的可以在spi-imx.c查看下面设置的3个接口实现

1.spi_imx_probe-->(spi_imx->bitbang.txrx_bufs = spi_imx_transfer;)

2.spi_imx_probe-->spi_bitbang_start-->(master->transfer_one = spi_bitbang_transfer_one;)

3.spi_imx_probe-->spi_bitbang_start-->spi_register_master--> spi_master_initialize_queue-->(master->transfer_one_message = spi_transfer_one_message;)

SPI 设备端/SPI Slave分析

设备端这块就相对简单,因为在SPI 控制器的驱动里已经实现了获取设备端的节点,也就是实现了下图中spi总线下的spi_device,所以我们使用spi_register_driver注册spi_driver结构体,然后实现file_operations结构体的open/read/write/ioctl,这块linux自带的spidev.c已经实现了。

SPI 控制器/SPI Master与SPI 设备端/SPI Slave驱动模型

如下图,类似在SPI 控制器驱动代码下的probe分枝下挂载SPI 设备端驱动代码

Linux内核自带的SPI 设备端/SPI Slave代码spidev.c

spidev.c实现的就是常规的字符设备驱动,调用spi_register_driver注册spi_driver结构体。

只要你在设备树文件里SPI控制器节点下的设备节点里的compatible = "rohm,dh2228fv";如下图

那么就能与SPI 控制器驱动代码里spi_device匹配到,这样就会进入spidev_probe里创建/dev/spix.x。以后当你open的时候,就会获取到SPI 控制器驱动代码里的spi_device,然后用spi_master进行数据传输。

小结

可以看出spidev.c的作用相当于创建一个字符设备然后与设备树里SPI控制器下的设备节点匹配。

这块之所以能够与任何SPI设备通用,就是因为分离出了SPI 控制器的驱动,我们只需要实现SPI 控制器需要做的事情就好。

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

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

相关文章

WordPress XStore Elementor 前端与编辑器内容不同步的问题

最近在新站更换成XStore的Elementor模板后&#xff0c;在编辑器修改完的内容前端网页部分没有同步&#xff0c;一开始清除了缓存没有解决。后面尝试重新安装也还是存在这个问题。 后续又在服务器上删除了Elementor插件缓存文件&#xff0c;问题依然存在。 最后通过在Elemento…

第四届全国过程模拟与仿真大会召开,积鼎科技相伴大会6年成长

第四届全国过程模拟与仿真学术会议于2024年11月29日-12月2日在广州圆满召开。积鼎科技&#xff0c;作为自主流体仿真软件研发的领航企业&#xff0c;与大会相伴四年&#xff0c;自首届以来一直积极参与其中&#xff0c;见证了大会从初创到逐渐壮大的全过程。每一次参会&#xf…

SAP导出表结构并保存到Excel 源码程序

SAP导出表结构并保存到Excel,方便写代码时复制粘贴 经常做接口,需要copy表结构,找到了这样一个程程,特别有用。 01. 先看结果

Hadoop生态圈框架部署 伪集群版(四)- Zookeeper单机部署

文章目录 前言一、Zookeeper单机部署&#xff08;手动部署&#xff09;1. 下载Zookeeper安装包到Linux2. 解压zookeeper安装包3. 配置zookeeper配置文件4. 配置Zookeeper系统环境变量5. 启动Zookeeper6. 停止Zookeeper在这里插入图片描述 注意 前言 本文将详细介绍Zookeeper的…

文件IO——01

1. 认识文件 1&#xff09;文件概念 “文件”是一个广义的概念&#xff0c;可以代表很多东西 操作系统里&#xff0c;会把很多的硬件设备和软件资源抽象成“文件”&#xff0c;统一管理 但是大部分情况下的文件&#xff0c;都是指硬盘的文件&#xff08;文件相当于是对“硬…

Spring完整知识点二

Spring注解开发 Spring是轻代码而重配置的框架&#xff0c;配置比较繁重&#xff0c;影响开发效率&#xff0c;所以注解开发是一种趋势&#xff0c;它能够代替xml配置文件&#xff0c;可以简化配置&#xff0c;提高开发效率Spring注解根据出现时间分类 Spring原始注解&#xf…

阻塞队列详解

阻塞队列介绍 队列 是限定在一端进行插入&#xff0c;另一端进行删除的特殊线性表。先进先出(FIFO)线性表。允许出队的一端称为队头&#xff0c;允许入队的一端称为队尾。 数据结构演示网站&#xff1a; https://www.cs.usfca.edu/~galles/visualization/Algorithms.html Q…

使用Java将PDF文件解析成Excel文件

安装pom依赖 <!-- 解析pdf--><dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.27</version> <!-- 请检查并使用最新版本 --></dependency>测试读取pdf文件…

web前端设计1

熟悉流行框架、熟练掌握CSS的写法&#xff0c;以及JAVASCRIPT库的应用&#xff0c;最主要的是能按要求改出相应的界面&#xff0c;因为我们基本没有自己手写代码的&#xff0c;所以得会拿别的界面改成想要的界面。 前端比较吃能力的就是CSS的写法&#xff0c;如何用已写好的框…

贪心算法part05

文章参考来源代码随想录 (programmercarl.com) 56. 合并区间 本题和前几题类似&#xff0c;都是判断上一个元素的右边界与当前元素的左边界大小关系 但是需要注意是&#xff1a;本题需要更新结果数组元素的右边界&#xff0c;因此比较的是数组最后一个元素右边界与当前元素左…

EasyAnimateV5 视频生成大模型原理详解与模型使用

在数字内容创作中&#xff0c;视频扮演的角色日益重要。然而&#xff0c;创作高质量视频通常耗时且昂贵。EasyAnimate 系列旨在利用人工智能技术简化这一过程。EasyAnimateV5 建立在其前代版本的基础之上&#xff0c;不仅在质量上有所提升&#xff0c;还在多模态数据处理和跨语…

【大语言模型】LangChain LCEL 表达式语言

【大语言模型】LangChain LCEL 表达式语言 一、简介二、LCEL的优势三、LCEL 的基本使用1、Runnable 对象 四、实战实例 一、简介 LangChain LCEL 的全称为 LangChain Expression Language 即可直译为 LangChain 表达式。 为了构造更复杂的 LLM 应用并且更为简便快捷的构造 LLM…

java中的递归

大家好&#xff0c;今天我们来学习一下java中的递归&#xff0c;相信大家应该也对递归有一点了解吧&#xff0c;如果没有也没有关系&#xff0c;我们现在就来了解一下。 五、递归 自身中包含了自己,遇到的问题直接并不好解决,但是发现将原问题拆分成其子问题之后,子问题与原问…

【pyspark学习从入门到精通23】机器学习库_6

目录 分割连续变量 标准化连续变量 分类 分割连续变量 我们经常处理高度非线性的连续特征&#xff0c;而且只用一个系数很难拟合到我们的模型中。 在这种情况下&#xff0c;可能很难只通过一个系数来解释这样一个特征与目标之间的关系。有时&#xff0c;将值划分到离散的桶中…

STM32 自学笔记

摘抄于大学期间记录在QQ空间的一篇自学笔记&#xff0c;当前清理空间&#xff0c;本来想直接删除掉的&#xff0c;但是感觉有些舍不得&#xff0c;因此先搬移过来。 RAM vs ROM vs FLASH 2013-09-05记录&#xff0c;ROM和RAM指的都是半导体存储器&#xff0c;ROM是Read Only …

距离与AoA辅助的三维测距算法(适用于四个基站的情况的单点定位),MATLAB代码

本MATLAB 代码实现了一个基于LOS/NLOS混合环境的单点定位系统&#xff0c;主要用于估计目标物体的单点位 文章目录 代码运行结果源代码代码功能概述主要步骤分析初始化部分 绘图与输出 代码运行结果 定位结果如下&#xff1a; 命令行的坐标和误差输出&#xff1a; 部分代码…

2024年华中杯数学建模B题使用行车轨迹估计交通信号灯周期问题解题全过程文档及程序

2024年华中杯数学建模 B题 使用行车轨迹估计交通信号灯周期问题 原题再现 某电子地图服务商希望获取城市路网中所有交通信号灯的红绿周期&#xff0c;以便为司机提供更好的导航服务。由于许多信号灯未接入网络&#xff0c;无法直接从交通管理部门获取所有信号灯的数据&#x…

Cesium-地球材质-坡度

1. 创建viewer 创建viewer并添加地形 const viewer new Cesium.Viewer("cesiumContainer", {terrainProvider: await Cesium.CesiumTerrainProvider.fromIonAssetId(3956, {requestVertexNormals: true}) }); 2. 创建canvas色条 添加getColorRamp方法&#xff0…

OpenAI 12连更第一弹:o1完全体,200刀一个月的ChatGPT Pro

来源 | 机器之心 一天前&#xff0c;OpenAI 官方 X 账户的一条推文将 AI 社区的期待值拉满了。这家世界头部 AI 公司宣布将在未来的 12 天进行 12 场直播&#xff0c;发布一些「大大小小的新东西」。 这是 OpenAI 准备的圣诞礼物。 至于这些「大大小小的新东西」究竟是什么&am…

使用C#基于ADO.NET编写MySQL的程序

MySQL 是一个领先的开源数据库管理系统。它是一个多用户、多线程的数据库管理系统。MySQL 在网络上特别流行。MySQL 数据库可在大多数重要的操作系统平台上使用。它可在 BSD Unix、Linux、Windows 或 Mac OS 上运行。MySQL 有两个版本&#xff1a;MySQL 服务器系统和 MySQL 嵌入…