SPI驱动(二) -- SPI驱动程序模型

文章目录

  • 参考资料:
  • 一、SPI驱动重要数据结构
    • 1.1 SPI控制器数据结构
    • 1.2 SPI设备数据结构
    • 1.3 SPI驱动数据结构
  • 二、SPI 驱动框架
    • 2.1 SPI控制器驱动程序
    • 2.2 SPI设备驱动程序
  • 三、总结


参考资料:

  • 内核头文件:include\linux\spi\spi.h

一、SPI驱动重要数据结构

如下图,SPI 子系统中包含有 SPI控制器SPI设备两类硬件。内核对此抽象出了三个数据结构:

  • spi_master:用来表示一个SPI控制器;
  • spi_device:用来表示一个SPI设备;
  • spi_driver:与SPI设备对应的SPI驱动。
    在这里插入图片描述

1.1 SPI控制器数据结构

spi_master结构中最重要的成员是transfer函数指针,由它实现SPI控制器的数据传输功能。

struct spi_master {struct device	dev;struct list_head list;u32 slave;s16			bus_num;  //第几条总线u16			num_chipselect; //支持的片选引脚个数u16			dma_alignment;u16			mode_bits;   //SPI控制器支持的工作模式u32			bits_per_word_mask; //一次传输几位
#define SPI_BPW_MASK(bits) BIT((bits) - 1)
#define SPI_BIT_MASK(bits) (((bits) == 32) ? ~0U : (BIT(bits) - 1))
#define SPI_BPW_RANGE_MASK(min, max) (SPI_BIT_MASK(max) - SPI_BIT_MASK(min - 1))/* 最大/最小传输速率 */u32			min_speed_hz;u32			max_speed_hz;/* other constraints relevant to this driver */u16			flags;
#define SPI_MASTER_HALF_DUPLEX	BIT(0)		/* can't do full duplex */
#define SPI_MASTER_NO_RX	BIT(1)		/* can't do buffer read */
#define SPI_MASTER_NO_TX	BIT(2)		/* can't do buffer write */
#define SPI_MASTER_MUST_RX      BIT(3)		/* requires rx */
#define SPI_MASTER_MUST_TX      BIT(4)		/* requires tx *//* lock and mutex for SPI bus locking */spinlock_t		bus_lock_spinlock;struct mutex		bus_lock_mutex;/* flag indicating that the SPI bus is locked for exclusive use */bool			bus_lock_flag;/*设置spi总线工作模式,频率等*/int			(*setup)(struct spi_device *spi);/*spi 传输方法*/int			(*transfer)(struct spi_device *spi,struct spi_message *mesg);void			(*cleanup)(struct spi_device *spi);bool			(*can_dma)(struct spi_master *master,struct spi_device *spi,struct spi_transfer *xfer);bool				queued;struct kthread_worker		kworker;struct task_struct		*kworker_task;struct kthread_work		pump_messages;spinlock_t			queue_lock;struct list_head		queue;struct spi_message		*cur_msg;  bool				idling;  //空闲bool				busy;    //忙bool				running; //运行中bool				rt;bool				auto_runtime_pm;bool                            cur_msg_prepared;bool				cur_msg_mapped;struct completion               xfer_completion;size_t				max_dma_len;int (*prepare_transfer_hardware)(struct spi_master *master);int (*transfer_one_message)(struct spi_master *master,struct spi_message *mesg);int (*unprepare_transfer_hardware)(struct spi_master *master);int (*prepare_message)(struct spi_master *master,struct spi_message *message);int (*unprepare_message)(struct spi_master *master,struct spi_message *message);void (*set_cs)(struct spi_device *spi, bool enable);int (*transfer_one)(struct spi_master *master, struct spi_device *spi,struct spi_transfer *transfer);void (*handle_err)(struct spi_master *master,struct spi_message *message);/* gpio chip select */int			*cs_gpios;/* statistics */struct spi_statistics	statistics;/* DMA channels for use with core dmaengine helpers */struct dma_chan		*dma_tx;struct dma_chan		*dma_rx;/* dummy data for full duplex devices */void			*dummy_rx;void			*dummy_tx;
};

1.2 SPI设备数据结构

spi_device结构体里面记录有设备的片选引脚、频率、挂在哪个SPI控制器下面等信息。

struct spi_device {struct device		dev;struct spi_master	*master; //设备挂在的对应控制器u32			max_speed_hz;   //该设备能支持的SPI时钟最大值u8			chip_select;    //是这个spi_master下的第几个设备u8			bits_per_word; //每次传输的位数,bits_per_word是可以大于32的,也就是每次SPI传输可能会发送多于32位的数据,这适用于DMA突发传输u16			mode;  //工作模式
#define	SPI_CPHA	0x01			/* 在第1个周期采样,在第2个周期采样? */
#define	SPI_CPOL	0x02			/* 平时时钟极性 */
#define	SPI_MODE_0	(0|0)			/* (original MicroWire) */
#define	SPI_MODE_1	(0|SPI_CPHA)
#define	SPI_MODE_2	(SPI_CPOL|0)
#define	SPI_MODE_3	(SPI_CPOL|SPI_CPHA)
#define	SPI_CS_HIGH	0x04			/* 一般来说片选引脚时低电平有效,SPI_CS_HIGH表示高电平有效 */
#define	SPI_LSB_FIRST	0x08	    /* 一般来说先传输MSB(最高位),SPI_LSB_FIRST表示先传LSB(最低位),很多SPI控制器并不支持SPI_LSB_FIRST */
#define	SPI_3WIRE	0x10			/* SO、SI共用一条线 */
#define	SPI_LOOP	0x20			/* 回环模式,就是SO、SI连接在一起 */
#define	SPI_NO_CS	0x40			/* 只有一个SPI设备,没有片选信号,也不需要片选信号 */
#define	SPI_READY	0x80			/* SPI从设备可以拉低信号,表示暂停、表示未就绪 */
#define	SPI_TX_DUAL	0x100			/* 发送数据时有2条信号线 */
#define	SPI_TX_QUAD	0x200			/* 发送数据时有4条信号线 */
#define	SPI_RX_DUAL	0x400			/* 接收数据时有2条信号线 */
#define	SPI_RX_QUAD	0x800			/* 接收数据时有4条信号线 */
#define SPI_SLAVE_MODE 0x1000       /* enabled spi slave mode */int			irq;void			*controller_state;void			*controller_data;char			modalias[SPI_NAME_SIZE];int			cs_gpio;	//这是可选项,也可以把spi_device的片选引脚记录在这里/* the statistics */struct spi_statistics	statistics;
};

1.3 SPI驱动数据结构

spi_driver 结构体是”SPI总线设备驱动模型”中的一部分。

struct spi_driver {const struct spi_device_id *id_table;int			(*probe)(struct spi_device *spi);int			(*remove)(struct spi_device *spi);void			(*shutdown)(struct spi_device *spi);struct device_driver	driver;
};

二、SPI 驱动框架

SPI 子系统中包含有 SPI控制器SPI设备两类硬件。对应就有SPI控制器驱动和SPI设备驱动,SPI控制器驱动提供SPI的传输能力SPI设备驱动提供对SPI设备的访问能力,它知道怎么访问这个设备,知道这个设备的数据含义是什么, 它会调用SPI控制器的函数来收发数据。

2.1 SPI控制器驱动程序

SPI控制器的驱动程序可以基于"平台总线设备驱动"模型来实现:

  • 在设备树里描述SPI控制器的硬件信息,在设备树子节点里描述挂在下面的SPI设备的信息
  • platform_driver中提供一个probe函数
    • 它会注册一个spi_master
    • 还会解析设备树子节点,创建spi_device结构体

2.2 SPI设备驱动程序

跟"平台总线设备驱动模型"类似,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驱动程序模型。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Gpt翻译完整版

上一篇文章收到了很多小伙伴的反馈,总结了一下主要以下几点: 1. 说不知道怎么调api 2. 目前只是把所有的中文变成了英文,如果想要做多语言还需要把这些关键字提炼出来成放到message_zh.properties和message_en.properties文件中&#xff0c…

图解MOE大模型的7个核心问题并探讨DeepSeekMoE的专家机制创新

原文地址:https://newsletter.maartengrootendorst.com/p/a-visual-guide-to-mixture-of-experts #mermaid-svg-FU7YUSIfuXO6EVHa {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-FU7YUSIfuXO6EVHa .error-icon{fill…

windows电脑上安装llama-factory实现大模型微调

一、安装环境准备 这是官方给的llama-factory安装教程,安装 - LLaMA Factory,上面介绍了linux系统上以及windows系统上如何正确安装。大家依照安装步骤基本能够完成安装,但是可能由于缺少经验或者相关的知识导致启动webUi界面运行相应内容时…

vscode+vue前端开发环境配置

目录 一、安装Vue二、使用vue新建项目 一、安装Vue 在node.js安装好之后, npm config set registry https://registry.npmmirror.com# 安装vue相关工具,webpack用来项目构建、打包、资源整合等。 npm install webpack -g# 安装vue-cli脚手架 npm insta…

基于javaweb的SpringBoot田径运动会管理系统设计和实现(源码+文档+部署讲解)

技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论…

【Python编程】高性能Python Web服务部署架构解析

一、FastAPI 与 Uvicorn/Gunicorn 的协同 1. 开发环境:Uvicorn 直接驱动 作用:Uvicorn 作为 ASGI 服务器,原生支持 FastAPI 的异步特性,提供热重载(--reload)和高效异步请求处理。 启动命令: u…

Libgdx游戏开发系列教程(5)——碰撞反弹的简单实践

目录 水平滚动 水平滚动并反弹 四面滚动反弹 加个板子进行弹球 本篇简单以一个小球运动,一步步实现碰撞反弹的效果 本文代码示例以kotlin为主,且需要有一定的Libgdx入门基础 注:下面动态图片看着有些卡顿,是录制的问题,实际上运行时很流畅的 水平滚动 简单起见,我们通过S…

kan pinn

本文介绍了两种主要的 PINNs 结构,分别用于解决数据驱动的偏微分方程求解和数据驱动的偏微分方程发现问题。两种结构都采用了深度前馈神经网络,并使用了双曲正切激活函数。 1. 连续时间模型: 用于数据驱动求解: 包含两个神经网络…

【C++】vector(上):vector的常用接口介绍

文章目录 前言一、vector的介绍二、vector的常用接口介绍1.vector类对象的常见构造2.vector iterator 的使用3.vector类对象的容量操作3.1 size、capacity 和 empty的使用3.2 reserve的使用3.3 resize的使用 4.vector类对象的访问(包含data:返回底层数组…

【大模型】Llama 3.2 大语言模型初探:模型权重下载

文章目录 一、简介二、权重下载2.1 方法一:Meta 官网申请下载2.2 方法二:使用 hugging face 下载 一、简介 Llama(Large Language Model Meta AI)是 Meta(原 Facebook)开发的一系列开源大型语言模型。它的目…

python量化交易——金融数据管理最佳实践——使用qteasy大批量自动拉取金融数据

文章目录 使用数据获取渠道自动填充数据QTEASY数据拉取功能数据拉取接口refill_data_source()数据拉取API的功能特性多渠道拉取数据实现下载流量控制实现错误重试日志记录其他功能 qteasy是一个功能全面且易用的量化交易策略框架, Github地址在这里。使用它&#x…

基于SpringBoot的在线骑行网站的设计与实现(源码+SQL脚本+LW+部署讲解等)

专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…

AORO P9000 PRO三防平板携手RTK高精度定位,电力巡检效率倍增

电网系统覆盖幅员辽阔,每年因设备故障导致的巡检耗时超过百万工日。传统巡检模式受限于定位误差、设备防护不足和作业效率低下三大核心痛点,亟需智能化工具的突破性革新。为了满足这一需求,遨游通讯推出AORO P9000 PRO三防平板,以…

Harbor端口更改||Harbor端口映射

Harbor端口更改|Harbor端口映射 目标:将端口更改为8930 前言 [rootk8s-node1 harbor]# ls common common.sh docker-compose.yml harbor.v2.5.0.tar.gz harbor.yml harbor.yml.tmpl install.sh LICENSE prepare如上是Harbor的文件目录 更改harbor.yml文件…

飞算JavaAI编程工具集成到idea中

AI插件介绍 飞算AI的插件下载地址,里边也有安装步骤: JavaAI 以上图是不是看着很牛的样子,一下成为高手确实说的太夸张了点, 一键生成后端JavaWeb项目还是挺方便的。 飞算JavaAI插件安装 Idea->>file->>setting-&…

51c自动驾驶~合集53

我自己的原文哦~ https://blog.51cto.com/whaosoft/13431196 #DriveTransformer 上交提出:以Decoder为核心的大一统架构写在前面 & 笔者的个人理解 当前端到端自动驾驶架构的串行设计导致训练稳定性问题,而且高度依赖于BEV,严重限…

Pytorch系列教程:模型训练的基本要点

PyTorch是一个开源的机器学习库,由于其灵活性和动态计算图而迅速流行起来。在PyTorch中训练模型是任何数据科学家或机器学习工程师的基本技能。本文将指导您完成使用PyTorch训练模型所需的基本步骤。 总体说明 模型训练流程主要包括数据准备、网络构建、优化配置及…

NVIDIA(英伟达) GPU 芯片架构发展史

GPU 性能的关键参数 CUDA 核心数量(个):决定了 GPU 并行处理能力,在 AI 等并行计算类业务下,CUDA 核心越多性能越好。 显存容量(GB):决定了 GPU 加载数据量的大小,在 AI…

汽车免拆诊断案例 | 2023款丰田雷凌汽油版车行驶中偶尔出现通信故障

故障现象  一辆2023款丰田雷凌汽油版车,搭载1.5 L发动机,累计行驶里程约为4700 km。车主反映,行驶中偶尔组合仪表上的发动机转速信号丢失,转向变重,且有“闯车”感,同时车辆故障警报蜂鸣器鸣响。 故障诊断…

鸿蒙与DeepSeek深度整合:构建下一代智能操作系统生态

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 https://www.captainbed.cn/north 目录 技术融合背景与价值鸿蒙分布式架构解析DeepSeek技术体系剖析核心整合架构设计智能调度系统实现…