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. Linux笔记03: Linux常用命令_3.2目录操作命令

    3.2 目录操作命令 3.2.1 ls命令 ●命令名称:ls. ●英文原意:list directory contents. ●所在路径:/usr/bin/ls. ●执行权限:所有用户. ●功能描述: ...

  2. 目标检测工具安装使用--labelImg

    如果想要在深度学习中训练我们自己的模型,就得对图片进行标注.labelImg是一个超级方便的目标检测图片标注工具,打开图片后,只需用鼠标框出图片中的目标,并选择该目标的类别,便可以自动生成voc格式的 ...

  3. JOISC2020题解

    \(\text{By DaiRuiChen007}\) Contest Link A. Building 4 Problem Link 题目大意 给 \(2n\) 个数对 \((a_i,b_i)\), ...

  4. MySQL运维12-Mycat分库分表之按天分片

    一.按天分片 指定一个时间周期,将数据写入一个数据节点中,例如:第1-10天的数据,写入到第一个数据节点中,第2-20天的数据写入到第二个节点中,第3-30天的数据节点写入到第三个数据节点中. 说明1 ...

  5. pinia持久化存储插件-pinia-plugin-persistedstate

    pinia-plugin-persistedstate 丰富的功能可以使 Pinia Store 的持久化更易配置: 与 vuex-persistedstate 相似的 API 所有 Store 均可 ...

  6. java之switch用法

    多条件判断,判断条件是等值判断时,可以用switch 比如: 变量level=0时,输出"非会员" 变量level=1时,输出"打9折" 变量level=2时, ...

  7. NC65主键含义

    最简单的办法,调用用友的类 import nc.jdbc.framework.generator.SequenceGenerator; IdGenerator idGenerator = new Se ...

  8. 【开源项目推荐】Great Expectations—开源的数据质量工具

    大家好,我是独孤风. 又到了本周的开源项目推荐.数据质量是企业进行数据治理非常重要的一个环节,高质量的数据对管理决策,业务支撑都有非常重要的作用. 只有持续的数据质量改进才能推动数据治理体系的完善,差 ...

  9. Ubuntu 终端如何分割多个窗口

    sudo apt-get install terminator 查看 ~/.config(隐藏文件夹 ctrl + h 即可看见) 下是否有 terminator 文件夹 如果没有手动创建一个 然后在 ...

  10. 中文语音识别转文字的王者,阿里达摩院FunAsr足可与Whisper相颉顽

    君不言语音识别技术则已,言则必称Whisper,没错,OpenAi开源的Whisper确实是世界主流语音识别技术的魁首,但在中文领域,有一个足以和Whisper相颉顽的项目,那就是阿里达摩院自研的Fu ...