Linux下SPI驱动:SPI主机驱动简介

一.  简介

SPI 驱动框架和 I2C 很类似,都分为主机控制器驱动和设备驱动,主机控制器也就是 SOC的 SPI 控制器接口。
例如,在裸机篇中的《第二十七章 SPI 实验》,我们编写了 bsp_spi.c bsp_spi.h 这两个文件,这两个文件是 I.MX6U SPI 控制器驱动。
我们编写好 SPI 控制器驱动以后就可 以直接使用了不管是什么 SPI 设备, SPI 控制器部分的驱动都是一样,我们的重点就落在了 种类繁多的 SPI 设备驱动。

二.  Linux下SPI驱动:SPI主机驱动简介

接下来简单分析一下SPI主机驱动,也就是SPI控制器驱动。一般SPI主机驱动是半导体厂商编写的。

1.  spi_master结构体

SPI 主机驱动就是 SOC SPI 控制器驱动,类似 I2C 驱动里面的适配器驱动。 Linux 内核 使用 spi_master 表示 SPI 主机驱动, spi_master 是个结构体,定义在 include/linux/spi/spi.h 文件
中,内容如下 ( 有缩减 )
struct spi_master {struct device	dev;struct list_head list;
..................s16			bus_num;
/* chipselects will be integral to many controllers; some others
* might use board-specific GPIOs.
*/u16			num_chipselect;/* some SPI controllers pose alignment requirements on DMAable
* buffers; let protocol drivers know about these requirements.
*/u16			dma_alignment;/* spi_device.mode flags understood by this controller driver */u16			mode_bits;/* bitmask of supported bits_per_word for transfers */u32			bits_per_word_mask;
...................
/* limits on transfer speed */u32			min_speed_hz;u32			max_speed_hz;/* other constraints relevant to this driver */u16			flags;
.................../* 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;
...................int			(*setup)(struct spi_device *spi);
...................
int			(*transfer)(struct spi_device *spi,struct spi_message *mesg);
...................		int (*transfer_one_message)(struct spi_master *master,struct spi_message *mesg);
...................		
};

39 行, transfer 函数,和 i2c_algorithm 中的 master_xfer 函数一样,控制器数据传输函 数。
42 行, transfer_one_message 函数,也用于 SPI 数据发送,用于发送一个 spi_message ,SPI 的数据会打包成 spi_message ,然后以队列方式发送出去。
也就是 SPI 主机端最终会通过 transfer 函数与 SPI 设备进行通信。因此,对于 SPI 主机控制器的驱 动编写者而言, transfer 函数是需要实现的,因为不同的 SOC SPI 控制器不同,寄存器都不一 样。
I2C 适配器驱动一样, SPI 主机驱动一般都是 SOC 厂商去编写的,所以,我们作为 SOC 使用者,这一部分的驱动就不用操心了,除非你是在 SOC 原厂工作,内容就是写 SPI 主机驱 动。

2. spi_master 申请与释放

SPI 主机驱动的核心就是申请 spi_master,然后初始化 spi_master,最后向 Linux 内核注册spi_master

spi_alloc_master 函数用于申请 spi_master ,函数原型如下:
struct spi_master *spi_alloc_master(struct device *dev, unsigned size)
函数参数和返回值含义如下:
dev :设备,一般是 platform_device 中的 dev 成员变量。
size 私有数据大小,可以通过 spi_master_get_devdata 函数获取到这些私有数据。
返回值: 申请到的 spi_master

spi_master 的释放通过 spi_master_put 函数来完成,当我们删除一个 SPI 主机驱动的时候就 需要释放掉前面申请的 spi_master spi_master_put 函数原型如下:
void spi_master_put(struct spi_master *master)
函数参数和返回值含义如下:
master :要释放的 spi_master
返回值: 无。

3. spi_master 的注册与注销

spi_master 初始化完成以后就需要将其注册到 Linux 内核, spi_master 注册函数为
spi_register_master函数 ,函数原型如下:
int spi_register_master(struct spi_master *master)
函数参数和返回值含义如下:
master :要注册的 spi_master
返回值: 0 ,成功;负值,失败。

I.MX6U 的 SPI 主机驱动会采用 spi_bitbang_start 这个 API 函数来完成 spi_master 的注册,
spi_bitbang_start 函数内部其实也是通过调用 spi_register_master 函数来完成 spi_master 的注册。

如果要注销 spi_master 的话可以使用 spi_unregister_master 函数,此函数原型为:

void spi_unregister_master(struct spi_master *master)

函数参数和返回值含义如下:
master :要注销的 spi_master
返回值: 无。
注意:如果使用 spi_bitbang_start 注册 spi_master 的话,就要使用 spi_bitbang_stop 来注销掉 spi_master。

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

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

相关文章

Java类与对象:面向对象编程的基石

Java类与对象:面向对象编程的基石 1. 类与对象的概念2. 类的创建与使用3. 对象的创建与使用4. 类与对象的关系5. 封装与继承6. 示例代码解析7. 总结 在Java编程中,类与对象是面向对象编程的基础,它们为我们提供了一种抽象和封装的方法来描述现…

【JavaScript】ECMAScript/DOM/BOM

JavaScript介绍 Web早期,客户端校验网页表单会频繁地与服务端进行通信而消耗大量的网络资源,在网速本就很慢的时代,这十分影响用户交互体验。为了解决这一问题,网景作为当时引领技术革新的公司,计划为客户端开发一个脚…

vulhub靶场shiro系列漏洞复现CVE-2010-3863、CVE-2016-4437(shiro550)、CVE-2020-1957、shiro721

目录 shiro简介 shiro漏洞成因 shiro550 shiro721 利用过程 CVE-2010-3863(未授权访问) 简介 CVE-2016-4437(shiro550) 简介 CVE-2020-1957(未授权访问) 漏洞影响 简介 url处理过程 shiro721 影响版本 简介 利用 …

ON1 NoNoise AI 2024 for Mac/Win:智能降噪,重塑影像之美

在数字摄影领域,图片质量往往受到多种因素的影响,其中噪点问题尤为突出。ON1 NoNoise AI 2024作为一款专为Mac和Windows平台打造的AI图片降噪工具,凭借其卓越的降噪性能和智能化的操作体验,成为了摄影师和图像处理专家们的首选工具…

bugku-web-decrypt

这里的提示解密后没有什么意义 这里下载文件包 得到一个index.php文件 得到代码 <?php function encrypt($data,$key) {$key md5(ISCC);$x 0;$len strlen($data);$klen strlen($key);for ($i0; $i < $len; $i) { if ($x $klen){$x 0;}$char . $key[$x];$x1;}for…

2023androidstudio

终于下定决心将studio升级到新版本使用了&#xff0c;在这总结下和之前的差别 问题一&#xff1a; 创建java类型的项目 在新版本studio中&#xff0c;创建android项目时&#xff0c;语言选择中没有java选项了&#xff0c;这让一直使用java开发的我摸索了好久&#xff0c;终于…

Elasticsearch 支持的插件 —— 筑梦之路

Analysis 插件&#xff1a; 1、IK Analyzer&#xff1a;适用于中文分词的插件&#xff0c;提供了针对中文文本的分析器。 2、Smart Chinese Analysis&#xff1a;另一个中文分词插件&#xff0c;支持中文智能分词。 集群管理插件&#xff1a; 1、Kibana&#xff1a;Elasticsear…

Qt QProcess详解

1.简介 QProcess提供了在 Qt 应用程序中启动外部程序的方法。通过QProcess&#xff0c;你可以启动一个进程&#xff0c;与它通信&#xff08;发送输入和读取输出&#xff09;&#xff0c;检查它的状态&#xff0c;以及等待它完成。这个类在执行系统命令、运行其他程序或脚本时…

AI大模型探索之路-应用篇11:AI大模型应用智能评估(Ragas)

目录 前言 一、为什么要做智能评估&#xff1f; 二、Ragas是什么&#xff1f; 三、Ragas使用场景 四、Ragas评估指标 五、Ragas代码实践 总结 前言 随着人工智能技术的飞速发展&#xff0c;AI大模型&#xff08;LLM&#xff09;已经成为了推动技术创新和应用的关键因素。…

深入理解信号上升沿与带宽的关系

信号的上升时间&#xff0c;对于理解信号完整性问题至关重要&#xff0c;高速pcb设计中的绝大多数问题都和它有关&#xff0c;很多信号完整性问题都是由信号上升时间短引起的&#xff0c;你必须对他足够重视。 信号上升时间并不是信号从低电平上升到高电平所经历的时间&#xf…

连接两部VR头显的type-c DP分配器方案,可以给主机设备PD反向供电与两部VR同时供电。

随着type-c的发展&#xff0c;目前越来越多的设备都在使用type-c作为连接的接口&#xff0c; 不仅是笔记本与手机在使用现在的游戏主机如&#xff08;任天堂&#xff0c;steam&#xff0c;&#xff09;或者是VR的一体机或者是VR头显也都在使用type-c作为连接接口。 type-c接口…

传统图机器学习的特征工程-全图

将整张图表示成为一个低维向量&#xff0c;反映全图的特征 key idea&#xff1a;Bag-of-Words&#xff08;BOW&#xff09;把图看作文章&#xff0c;把节点看作单词 Kernel mothods

VirtualBox - 与 Win10 虚拟机 与 宿主机 共享文件

原文链接 https://www.cnblogs.com/xy14/p/10427353.html 1. 概述 需要在 宿主机 和 虚拟机 之间交换文件复制粘贴 貌似不太好使 2. 问题 设置了共享文件夹之后, 找不到目录 3. 环境 宿主机 OS Win10开启了 网络发现 略虚拟机 OS Win10开启了 网络发现 略Virtualbox 6 4…

FL Studio808鼓音在哪 FL Studio怎么让音乐鼓点更有力 FL Studio教程

FL Studio808鼓音在哪&#xff1f;808是一款电鼓机的名称&#xff0c;它发出的声音也被称之为808鼓&#xff0c;通常我们可以安装鼓机插件来使用&#xff0c;但FL Studio中自带的也有808鼓的采样音频。FL Studio怎么让音乐鼓点更有力&#xff1f;让鼓点更有力要从EQ均衡器、压缩…

ELK日志分析系统(上)

目录 引言 一、ELK日志分析系统简介 1.1 日志服务器 1.2 ELK日志分析系统的组成 1.3 日志处理步骤 二、Elasticsearch介绍 2.1 概述 2.2 核心概念 三、Logstash介绍 3.1 概述 3.2 主要组件 四、Kibana介绍 4.1 概述 4.2 主要功能 五、ELK的工作原理 六、部署ELK…

物联网工程专业实验室建设方案研究

物联网工程专业实验室建设方案研究 一、引言 随着物联网技术的迅速发展&#xff0c;物联网工程专业成为了高等教育体系中的热门专业。为了更好地培养物联网工程专业人才&#xff0c;提升其实践能力和创新意识&#xff0c;本研究旨在深入探讨物联网工程专业实验室的建设方案。…

从零实现诗词GPT大模型:pytorch框架介绍

专栏规划: https://qibin.blog.csdn.net/article/details/137728228 因为咱们本系列文章主要基于深度学习框架pytorch进行,所以在正式开始之前,现对pytorch框架进行一个简单的介绍,主要面对深度学习或者pytorch还不熟悉的朋友。 一、安装pytorch 这一步很简单,主要通过p…

LINUX系统编程:缓冲区

1.为什么要有缓冲区 缓冲区分成语言层面的缓冲区和操作系统层面的缓冲区 先说结论&#xff0c;语言的缓冲区可以减少系统调用的次数进而提高向文件写入和读取的效率。 2.举例子 向屏幕打印&#xff0c;无非就是向屏幕这个文件的缓冲区写入&#xff0c;然后在由操作系统刷新…

js学习总结

这里写目录标题 前情提要JavaScript书写位置1. 内部javaScript (不常用)2. 外部javaScript (常用)3.内联javaScript (常用) js中的输入和输出输出语法1. document.write()2. alert()3. console.log() 输入语法prompt() 前情提要 1. 在javaScript中的 分号 是可以省略的JavaScr…

车机系统与 Android 的关系概述

前言&#xff1a;搞懂 Android 系统和汽车到底有什么关系。 文章目录 一、基本概念1、Android Auto1&#xff09;是什么2&#xff09;功能 2、Google Assistant3、Android Automotive1、Android Auto 和 Android Automotive 的区别 4、App1&#xff09;App 的开发2&#xff09;…