0、说明

介绍spi基本协议,以及在linux内核中spi驱动程序框架。

SPI驱动基于标准了总线设备驱动模型,因此本文仅示意分析SPI框架,驱动实现细节按照总线设备驱动模型来实现,不做过多分析。

1、SPI基础

硬件连接

在一些flash中经常使用SPI协议,如下,SPI一般有四个线:

  • 片选CS
  • 时钟SCK
  • 主输出从输入:SIMO
  • 主输入从输出:SOMI

根据引脚推断,有片选引脚,所以说一条SPI总线上可以挂多个设备,哪个CS被选中,则哪个设备活跃。同时有数据输入和输出引脚,因此是全双工。

四种模式

根据SCK没数据时候的状态,以及上升下降沿采样,可以分为四种模式,SPI0-3。使用SPI进行通信的时候,需要根据具体的从设备手册,确定是支持哪些模式。

2、内核中的spi驱动

架构

内核中SPI遵循总线设备驱动模型。因此驱动包含几个部分,总线的注册,控制器的注册及设备创建,驱动的注册。即总线设备驱动模型。

通过config增加SPI支持后,SPI总线被注册进内核,spi_init调用bus_register。

每个CPU有自己的SPI控制器,在设备树中描述,同时在设备树SPI控制器节点下存在该控制器下连接的设备。由控制器驱动直接创建出spi_device,spi_new_device。

那么最后只差一个spi_driver。spidev.c是一个通用的驱动,调用spi_register_driver注册驱动。

围绕以下结构体:

        spi_bus_type(总线)、spi_master(控制器)、spi_device(设备)、spi_driver(驱动)

在总线设备驱动模型框架下,追踪以上结构体分配、设置过程就是SPI的框架实现。

设备树控制器描述


ecspi1: ecspi@02008000 {                                         #address-cells = <1>;                                        #size-cells = <0>;                                           compatible = "fsl,imx6ul-ecspi", "fsl,imx51-ecspi";          reg = <0x02008000 0x4000>;                                   interrupts = <GIC_SPI 31 IRQ_TYPE_LEVEL_HIGH>;               clocks = <&clks IMX6UL_CLK_ECSPI1>,                          <&clks IMX6UL_CLK_ECSPI1>;                              clock-names = "ipg", "per";                                  dmas = <&sdma 3 7 1>, <&sdma 4 7 2>;                         dma-names = "rx", "tx";                                      status = "disabled";
}; &ecspi1 {fsl,spi-num-chipselects = <1>;cs-gpios = <&gpio4 26 0>;pinctrl-names = "default";pinctrl-0 = <&pinctrl_ecspi1_1 &pinctrl_ecspi1_cs_1>;status = "okay";flash: n25q032@0 {#address-cells = <1>;#size-cells = <1>;compatible = "st,n25q032";spi-max-frequency = <20000000>;reg = <0>;};
};

总线驱动

控制器驱动

设备驱动

linux内核中的SPI相关推荐

  1. Linux内核中的GPIO系统之(3):pin controller driver代码分析

    一.前言 对于一个嵌入式软件工程师,我们的软件模块经常和硬件打交道,pin control subsystem也不例外,被它驱动的硬件叫做pin controller(一般ARM soc的datash ...

  2. Linux内核自带SPI设备驱动测试程序分析:spidev_test.c

        在Linux系统中,SPI 的用户模式设备接口的驱动源码位于 drivers/spi/spidev.c,在应用层生成 /dev/spidev* 的节点,可以通过 read. write 达到与 ...

  3. Ubuntu\linux,加载mcp2515的驱动,链接mcp2515,mcp2515的这个驱动默认在linux内核中。jetson nao、香橙派、树莓派

    加载mcp2515的驱动,这个驱动默认在linux内核中. linux内核源码 1.树莓派+MCP2515+总线工具完成can报文收发 sudo modprobe mcp251x 2.树莓派CAN通讯 ...

  4. linux内核添加spi驱动,Linux内核驱动之spi子系统spi协议.docx

    Linux内核驱动之spi子系统spi协议 概况 SPI接口是摩托罗拉首先提出的全双工三线同步串行外围接口SCK,MOSI,MISO,采用主从模式(Master Slave)架构:支持多slave模式 ...

  5. i.MX 6ULL 驱动开发 二十九:向 Linux 内核中添加自己编写驱动

    一.概述 Linux 内核编译流程如下: 1.配置 Linux 内核. 2.编译 Linux 内核. 说明:进入 Linux 内核源码,使用 make help 参看相关配置. 二.make menu ...

  6. linux 内核flush,armv8(aarch64)linux内核中flush_dcache_all函数详细分析

    /* *  __flush_dcache_all() *  Flush the wholeD-cache. * Corrupted registers: x0-x7, x9-x11 */ ENTRY( ...

  7. Linux内核中锁机制之完成量、互斥量

    在上一篇博文中笔者分析了关于信号量.读写信号量的使用及源码实现,接下来本篇博文将讨论有关完成量和互斥量的使用和一些经典问题. 八.完成量 下面讨论完成量的内容,首先需明确完成量表示为一个执行单元需要等 ...

  8. 简单谈一点linux内核中套接字的bind机制--数据结构以及端口确定

    众所周知,创建一个套接字可以bind到一个特定的ip地址和端口,实际上套接字这一概念代表了TCP/IP协议栈的应用层标识,协议栈中的应用层就是通过一个ip地址和一个端口号标识的,当然这仅仅是对于TCP ...

  9. Linux 内核中的 Device Mapper 机制

    本文结合具体代码对 Linux 内核中的 device mapper 映射机制进行了介绍.Device mapper 是 Linux 2.6 内核中提供的一种从逻辑设备到物理设备的映射框架机制,在该机 ...

最新文章

  1. centos 5.x 安装 zendOptimizer 5.x
  2. python控制语句第一章_【原创】Python第一章
  3. 企业网站之html,httpd概述
  4. 关于STM32 SPI NSS的讨论
  5. docker下载安装,命令大全
  6. 2020 . NET大会日程公布!行程亮点全曝光
  7. win7系统任务管理器如何强制关闭程序
  8. 面试题系列-mysql连环13问
  9. 学习写DSHOW框架下的FILTER之四
  10. fetch.php是什么意思,fetch什么意思
  11. 音乐外链生成 html,音乐外链生成工具V2.1 支持14个音乐网站外链提取转换
  12. 自己写的PDF转JPG的程序
  13. Python学习周期一般多长?需要多久?
  14. PDPS软件:机器人示教编程与工作站仿真运行
  15. 顺序表——有序顺序表的插入
  16. 银监会出贷后管理新规 防资金空转
  17. 青甘大环线,蓝紫魔仙同游西北
  18. Python 爬取 百度地图搜索结果
  19. Java中的escape,unescape方法
  20. 移动端上下滑动事件之--坑爹的touch.js

热门文章

  1. 免费的jpg转pdf转换器
  2. Spring AOP IOC 实现原理,面试问到如何回答
  3. linux ls lh每个列,Linux ls命令用法
  4. 【Neo4j】第 7 章:社区检测和相似性措施
  5. 学好计算机的重要性,计算机技术对学好机械的重要性
  6. 全国产!瑞芯微RK3568J/RK3568B2工业核心板规格书
  7. 手机相册图片如何免费转换成PDF文件?
  8. select2 的使用教程(简)
  9. sonic音频变速不变调的原理分析
  10. 怎样下载微信公众号封面图片、视频、音频资源?