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_readspi_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设备的信息
  • 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),用于选择与之通信的具体设备。从设备通常由设备驱动程序来管理,它们可以是各种外设,如传感器、存储器、显示器等。

小结

  1. 在一个SoC上可能有多条SPI总线,一条总线对应一个SPI总线驱动,每一条总线上又可以接多个SPI设备。

  2. SPI-Core管理SOC上的所有 platform_deviceplatform_driverspi_devicespi_driver

【驱动】SPI驱动分析(二)-SPI驱动框架的更多相关文章

  1. Linux spi驱动分析(二)----SPI核心(bus、device_driver和device)

    一.spi总线注册 这里所说的SPI核心,就是指/drivers/spi/目录下spi.c文件中提供给其他文件的函数,首先看下spi核心的初始化函数spi_init(void).程序如下: 点击(此处 ...

  2. uboot驱动模型(DM)分析(二) (转)

    上篇分析了两个关键宏U_BOOT_DRIVER及U_BOOT_DEVICES的作用,有了上篇的基础,本文将分析: 1.上篇中的uboot_list段中的信息如何被用起来? 2.uclass,uclas ...

  3. 基于S3C2440的嵌入式Linux驱动——看门狗(watchdog)驱动解读

    本文将介绍看门狗驱动的实现. 目标平台:TQ2440 CPU:s3c2440 内核版本:2.6.30 1. 看门狗概述 看门狗其实就是一个定时器,当该定时器溢出前必须对看门狗进行"喂狗“,如 ...

  4. linux驱动基础系列--Linux下Spi接口Wifi驱动分析

    前言 本文纯粹的纸上谈兵,我并未在实际开发过程中遇到需要编写或调试这类驱动的时候,本文仅仅是根据源码分析后的记录!基于内核版本:2.6.35.6 .主要是想对spi接口的wifi驱动框架有一个整体的把 ...

  5. 框架-SPI四种模式+通用设备驱动实现

    目录 前言 笔录草稿 SPI介绍 SPI四种模式 ** SPI 驱动框架 ** 框架 前言 SPI 介绍为搜集百度资料+个人理解 其余为原创(有误请指正) 集四种模式于一身 笔录草稿 SPI介绍 SP ...

  6. 【框架】SPI四种模式+通用设备驱动实现-源码

    目录 前言 bsp_spi.c bsp_spi.h bsp_flash.c bsp_flash.h 前言 SPI 介绍为搜集百度资料+个人理解 其余为原创(有误请指正) 集四种模式于一身 demo 采 ...

  7. 【Linux SPI】RFID RC522 设备驱动

    一.概述 MFRC522 支持 SPI.I2C.UART 接口,我在某宝上购买了一个 SPI 接口的 RC522 模块.此笔记主要要是通过 RC522 模块学习 linux 中的 SPI 驱动,方便今 ...

  8. LCD驱动分析(二)帧缓冲设备作为平台设备

    参考:S3C2440 LCD驱动(FrameBuffer)实例开发<一>   S3C2440 LCD驱动(FrameBuffer)实例开发<二> 1.平台设备注册 1.1在li ...

  9. SPI子系统分析之一:框架

    内核版本:3.9.5 SPI子系统概述: 一个SPI主控制器对应一条SPI总线,当然在系统中有唯一的总线编号. SPI总线上有两类设备: 其一是主控端,通常作为SOC系统的一个子模块出现,很多嵌入式M ...

  10. linux驱动学习(八) i2c驱动架构(史上最全) davinc dm368 i2c驱动分析【转】

    转自:http://blog.csdn.net/ghostyu/article/details/8094049 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 预备知识 lin ...

随机推荐

  1. WPF 纯XAML实现NumericUpDown 控件

    本文由 飞羽流星(Flithor/毛茸茸松鼠先生/Squirrel.Downy)原创,欢迎分享转载,但禁止以原创二次发布原文地址:https://www.cnblogs.com/Flithor/arc ...

  2. Tensorflow2.0实战之Auto-Encoder

    autoencoder可以用于数据压缩.降维,预训练神经网络,生成数据等等 Auto-Encoder架构 需要完成的工作 需要完成Encoder和Decoder的训练 例如,Mnist的一张图片大小为 ...

  3. C++ Qt开发:QSqlDatabase数据库组件

    Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍QSqlDat ...

  4. python异步编程之asyncio初识

    async await介绍 用asyncio提供的@asyncio.coroutine可以把一个生成器标记为协程类型,然后在协程内部用yield from 等待IO操作,让出cpu执行权. 然而异步的 ...

  5. MySQL运维实战(1.3)安装部署:源码编译安装

    作者:俊达 引言 在大多数情况下,我们不需要自己编译MySQL源码,因为编译的MySQL和二进制包的内容基本一致.然而,有些特殊情况可能需要我们采用源码编译的方式安装MySQL: 安装非标准版本的My ...

  6. ChatGPT 沦为了我的打工仔

    大家好,我是老章 最近在折腾之前搞的R-bookdown网站.Jekyll博客,还有刚上了Astro做的周刊.Astro Starlight做的文档站 R2ML:https://r2ml.zhangl ...

  7. P6357 题解

    Luogu 题面 题目描述 给定一串长度为 \(n\) 的数字,数字为 \(0 \sim 9\) 之间的任意一个,下标从 \(1\) 记起. 然后进行 \(m\) 次区间查询,每次查找区间 \([l, ...

  8. P4928 [MtOI2018]衣服?身外之物! 题解

    题意 gcd 共有 \(n\) 件衣服,编号为 \(A_1,A_2,\cdots A_n\). 每一件衣服分别拥有颜色值和清洗时间,他在每一件衣服穿完以后都会将其送去清洗,而这件衣服当天所拥有的舒适感 ...

  9. Jenkins简介及安装配置详解:开启持续集成之旅

    Jenkins简介及安装配置详解:开启持续集成之旅 一.Jenkins介绍 Jenkins是一个开源的.用Java编写的持续集成和持续交付(CI/CD)工具.它提供了一种简单易用的方式来自动化构建.测 ...

  10. 斯坦福 UE4 C++ ActionRoguelike游戏实例教程 07.在C++中使用UMG

    斯坦福 UE4 C++ ActionRoguelike游戏实例教程 07.在C++中使用UMG 斯坦福课程 UE4 C++ ActionRoguelike游戏实例教程 0.绪论 概述 本篇文章的目标是 ...