【驱动】SPI驱动分析(二)-SPI驱动框架
SPI驱动框架
SPI驱动属于总线-设备-驱动模型的,与I2C总线设备驱动模型相比,大体框架是一样,他们都是实际的总线。总体框架如下图所示:

从上到下,分为三层,用户空间,内核空间,和硬件层。
用户空间
在用户空间,/dev/spi0和/dev/spi1是SPI总线的设备节点,它们在用户空间提供了对SPI总线设备的访问接口。
/dev/spi0和/dev/spi1分别对应于SPI总线上的两个片选信号(Chip Select)。SPI总线上的每个设备都需要通过一个唯一的片选信号来选择与之通信的设备。因此,对于每个片选信号,都会创建一个对应的设备节点。
通过打开这些设备节点,用户可以使用标准的读写操作来与SPI设备进行数据传输。例如,可以通过向设备节点写入数据来发送数据到SPI设备,或者通过从设备节点读取数据来接收SPI设备发送的数据。
内核空间
SPI设备驱动
SPI设备驱动用于支持连接到总线上的具体设备。对于SPI总线来说,SPI设备驱动就是设备驱动的一种实现,负责与SPI外设进行通信。
SPI设备驱动相比于I2C设备驱动,需要提供更多的硬件信息,设备名称、片选信号、最大传输速率、模式、中断号等,在driver里则使用spi_read、spi_writer 等函数,最终也会调用到 master->transfer 函数进行发送接收。
跟"平台总线设备驱动模型"类似,Linux中也有一个"SPI总线设备驱动模型":
spi_driver使用C文件实现,里面有id_table表示能支持哪些SPI设备,有probe函数spi_device用来描述SPI设备,比如它的片选引脚、频率- 可以来自设备树:比如由SPI控制器驱动程序解析设备树后创建、注册
spi_device - 可以来自C文件:比如使用
spi_register_board_info创建、注册spi_device
- 可以来自设备树:比如由SPI控制器驱动程序解析设备树后创建、注册
SPI控制器驱动
SPI控制器驱动是总线设备驱动模型中的一种具体实现,控制器驱动负责与硬件控制器进行通信,并提供控制器的初始化、配置和控制等操作。
- 在设备树里描述SPI控制器的硬件信息,在设备树子节点里描述挂在下面的SPI设备的信息
- 在
platform_driver中提供一个probe函数- 它会注册一个
spi_master - 还会解析设备树子节点,创建
spi_device结构体
- 它会注册一个
SPI控制器驱动程序叫做spi_master(spi_controller),主要提供transfer函数,进行SPI协议的数据传输。spi_master驱动也是基于platform模型的,注册spi_master时也会扫描一个链表进行SPI从设备的注册,这和I2C适配器驱动基本一致。
SPI Core
SPI核心是Linux内核中的核心模块,提供了SPI子系统的基本功能和接口。它包含了SPI总线设备的注册、注销、传输管理以及与SPI控制器和设备驱动的交互。SPI核心还提供了一组API供设备驱动程序使用,如spi_register_driver()和spi_setup()等。
硬件层
SPI Host Controller
SPI Host Controller驱动是用于支持特定硬件平台上SPI控制器的驱动程序。
通过SPI Host Controller驱动,用户空间程序可以通过标准的SPI设备节点(如/dev/spi0、/dev/spi1)来与SPI总线进行交互。 SPI Host Controller驱动提供了对SPI总线的底层硬件控制和传输操作的支持,使得用户空间程序能够方便地与连接到SPI总线上的外设进行通信和控制。
SPI从设备
SPI从设备是连接到SPI总线上的外设。每个SPI从设备都有一个唯一的片选信号(Chip Select),用于选择与之通信的具体设备。从设备通常由设备驱动程序来管理,它们可以是各种外设,如传感器、存储器、显示器等。

小结
在一个SoC上可能有多条SPI总线,一条总线对应一个SPI总线驱动,每一条总线上又可以接多个SPI设备。
SPI-Core管理SOC上的所有
platform_device和platform_driver,spi_device,spi_driver。
【驱动】SPI驱动分析(二)-SPI驱动框架的更多相关文章
- Linux spi驱动分析(二)----SPI核心(bus、device_driver和device)
一.spi总线注册 这里所说的SPI核心,就是指/drivers/spi/目录下spi.c文件中提供给其他文件的函数,首先看下spi核心的初始化函数spi_init(void).程序如下: 点击(此处 ...
- uboot驱动模型(DM)分析(二) (转)
上篇分析了两个关键宏U_BOOT_DRIVER及U_BOOT_DEVICES的作用,有了上篇的基础,本文将分析: 1.上篇中的uboot_list段中的信息如何被用起来? 2.uclass,uclas ...
- 基于S3C2440的嵌入式Linux驱动——看门狗(watchdog)驱动解读
本文将介绍看门狗驱动的实现. 目标平台:TQ2440 CPU:s3c2440 内核版本:2.6.30 1. 看门狗概述 看门狗其实就是一个定时器,当该定时器溢出前必须对看门狗进行"喂狗“,如 ...
- linux驱动基础系列--Linux下Spi接口Wifi驱动分析
前言 本文纯粹的纸上谈兵,我并未在实际开发过程中遇到需要编写或调试这类驱动的时候,本文仅仅是根据源码分析后的记录!基于内核版本:2.6.35.6 .主要是想对spi接口的wifi驱动框架有一个整体的把 ...
- 框架-SPI四种模式+通用设备驱动实现
目录 前言 笔录草稿 SPI介绍 SPI四种模式 ** SPI 驱动框架 ** 框架 前言 SPI 介绍为搜集百度资料+个人理解 其余为原创(有误请指正) 集四种模式于一身 笔录草稿 SPI介绍 SP ...
- 【框架】SPI四种模式+通用设备驱动实现-源码
目录 前言 bsp_spi.c bsp_spi.h bsp_flash.c bsp_flash.h 前言 SPI 介绍为搜集百度资料+个人理解 其余为原创(有误请指正) 集四种模式于一身 demo 采 ...
- 【Linux SPI】RFID RC522 设备驱动
一.概述 MFRC522 支持 SPI.I2C.UART 接口,我在某宝上购买了一个 SPI 接口的 RC522 模块.此笔记主要要是通过 RC522 模块学习 linux 中的 SPI 驱动,方便今 ...
- LCD驱动分析(二)帧缓冲设备作为平台设备
参考:S3C2440 LCD驱动(FrameBuffer)实例开发<一> S3C2440 LCD驱动(FrameBuffer)实例开发<二> 1.平台设备注册 1.1在li ...
- SPI子系统分析之一:框架
内核版本:3.9.5 SPI子系统概述: 一个SPI主控制器对应一条SPI总线,当然在系统中有唯一的总线编号. SPI总线上有两类设备: 其一是主控端,通常作为SOC系统的一个子模块出现,很多嵌入式M ...
- linux驱动学习(八) i2c驱动架构(史上最全) davinc dm368 i2c驱动分析【转】
转自:http://blog.csdn.net/ghostyu/article/details/8094049 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 预备知识 lin ...
随机推荐
- Django学习(三) 之 模板中标签的使用
写在前面 最近看到稀土掘金在搞2023年终总结征文活动,一直想尝试投稿试试,周末我就花了近一下午时间写完初稿,然后周一.周二完成精读再改稿,感觉OK,昨晚凌晨第一时间在稀土掘金投稿. 结果,又发生了同 ...
- 实践篇:1 虚拟机使用rmp方式安装部署GitLab-ce
01 环境准备 电脑:MAC Air 虚拟机:VMware Fusion 12.2.3 Linux环境:CentOS 7 02 rpm方式安装部署GitLab服务 步骤1:centos 7 安装wge ...
- python操作mongodb副本集(mongodb高可用)
https://pymongo.readthedocs.io/en/stable/examples/high_availability.html# pymongo比较"智能",只要 ...
- 前端异步编程 —— Promise对象
在前端编程中,处理一些简短.快速的操作,在主线程中就可以完成. 但是,在处理一些耗时比较长以至于比较明显的事情,比如读取一个大文件或者发出一个网络请求,就需要异步编程来实现,以避免只用主线程时造成页面 ...
- 若依集成knife4j实现swagger文档增强
若依集成knife4j实现swagger文档增强 本期全是干货,这里我就当你用的非常熟练了,在ruoyi-admin模块中pom文件里加入以下依赖 注:引用knife4j-spring-boot-st ...
- 文心一言 VS 讯飞星火 VS chatgpt (168)-- 算法导论13.2 1题
一.用go语言,写出 RIGHT-ROTATE 的伪代码. 文心一言: 在计算机科学中,右旋转(RIGHT-ROTATE)是一种常见的操作,通常用于数组或链表.以下是一个使用Go语言实现右旋转的伪代码 ...
- C++ 动态库热加载
C++ 动态库热加载 本文参考自 project-based-learning 中的 Build a Live Code-reloader Library for C++,主要内容都来自于其中,但是对 ...
- STM32CubeMX教程8 TIM 通用定时器 - 输出比较
1.准备材料 开发板(STM32F407G-DISC1) ST-LINK/V2驱动 STM32CubeMX软件(Version 6.10.0) keil µVision5 IDE(MDK-Arm) 逻 ...
- JavaFx Maven配置推荐(七)
JavaFx Maven配置推荐(七) JavaFX 从入门到入土系列 开发Java Fx,推荐使用Maven管理项目,下面是常用到的配置基于jdk11+ <!-- 打成 jar 包 --> ...
- 文心一言 VS 讯飞星火 VS chatgpt (126)-- 算法导论11.1 1题
一.用go语言,假设一动态集合 S用一个长度为 m 的直接寻址表T来表示.请给出一个查找 S 中最大元素的过程.你所给的过程在最坏情况下的运行时间是多少? 文心一言,代码正常运行: 在这个问题中,我们 ...