当前位置: 首页 > news >正文

Linux下SPI驱动:SPI设备驱动简介

一. 简介

Linux下的SPI 驱动框架和 I2C 很类似,都分为主机控制器驱动和设备驱动,主机控制器也就是 SOC的 SPI 控制器接口,SPI设备驱动也就是所操作的SPI设备的驱动。

本文来学习一下Linux下SPI设备驱动。

二. Linux下SPI驱动:SPI设备驱动简介

1. spi_driver 结构体

spi 设备驱动也和 i2c 设备驱动也很类似, Linux 内核使用 spi_driver 结构体来表示 spi 设备 驱动,我们在编写 SPI 设备驱动的时候需要实现 spi_driver spi_driver 结构体定义在 include/linux/spi/spi.h 文件中,结构体内容如下:
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_driver i2c_driverplatform_driver 基本一样,当 SPI 设备和驱动匹配成功以后 probe 函数就会执行。

2. SPI设备驱动注册与注销

同样的, spi_driver 初始化完成以后需要向 Linux 内核注册, spi_driver 注册函数为spi_register_driver函数 ,函数原型如下:
int spi_register_driver(struct spi_driver *sdrv)
函数参数和返回值含义如下:
sdrv 要注册的 spi_driver
返回值: 0 ,注册成功;赋值,注册失败。

注销 SPI 设备驱动以后也需要注销掉前面注册的 spi_driver ,使用 spi_unregister_driver 函数完成 spi_driver 的注销,函数原型如下:
void spi_unregister_driver(struct spi_driver *sdrv)
函数参数和返回值含义如下:
sdrv 要注销的 spi_driver。
返回值: 无。

三.  spi_driver 注册示例代码

SPI设备驱动的注册示例代码,即spi_driver 注册示例程序如下:
/*SPI设备驱动的注册示例代码*/
/* probe 函数 */
static int probe(struct spi_device* dev)
{//具体的函数内容return 0;
}/* remove 函数 */
static int remove(struct spi_device* dev)
{   //具体的函数内容return 0;
} /* 传统匹配方式 ID 列表 */
static struct spi_device_id xxx_id_table[] = {{"xxx", 0},{}
};/* 设备树匹配列表 */
static struct of_device_id xxx_of_match_table[] = {{.compatible = "xxx"},{}
};/* SPI 驱动结构体 */
static struct spi_driver xxx_spi_driver = {.driver = {.name = "xxx_spi",.owner = THIS_MODULE,.of_match_table = xxx_of_match_table,},.id_table = xxx_id_table,.probe = xxx_probe,.remove = xxx_remove,
};/* 驱动入口函数 */
static int __init xxx_init(void)
{spi_register_driver(&xxx_spi_driver); //SPI设备驱动的注册
}
/* 驱动出口函数 */
static void __exit xxx_exit(void)
{spi_unregister_driver(&xxx_spi_driver); //SPI设备驱动的注销
}module_init(xx_init);
module_exit();

1~38 行, spi_driver 结构体,需要 SPI 设备驱动人员编写,包括匹配表、 probe 函数等。
i2c_driver platform_driver 一样,就不详细讲解了。
41~44 行,在驱动入口函数中,调用 spi_register_driver 来注册 spi_driver
46~49 行,在驱动出口函数中,调用 spi_unregister_driver 来注销 spi_driver

相关文章:

Linux下SPI驱动:SPI设备驱动简介

一. 简介 Linux下的SPI 驱动框架和 I2C 很类似,都分为主机控制器驱动和设备驱动,主机控制器也就是 SOC的 SPI 控制器接口,SPI设备驱动也就是所操作的SPI设备的驱动。 本文来学习一下Linux下SPI设备驱动。 二. Linux下SPI驱动:SP…...

【简明图文教程】Node.js的下载、安装、环境配置及测试

文章目录 前言下载Node.js安装Node.js配置Node.js配置环境变量测试后言 前言 本教程适用于小白第一次从零开始进行Node.js的下载、安装、环境配置及测试。 如果你之前已经安装过了Node.js或删除掉了Node.js想重新安装,需要先参考以下博客进行处理后,再根…...

共模电感饱和与哪些参数有关?这些参数是如何影响共模电感的?

在做一个变频器项目,遇到一个问题,在30Hz重载超过一定1小时,CE测试结果超出限制,查找原因最终发现EMI filter内的共模电感加热,fail现象可以复现。最终增大Y电容把问题解决了。由此问题引申出一个问题,到底…...

儿童护眼台灯怎么选?五款必选的高口碑护眼台灯推荐

儿童台灯,想必大家都不会陌生了,是一种学生频繁使用的小灯具,一般指放在桌面用的有底座的电灯。随着近年来儿童青少年的视力急速下滑,很多家长都会选择给孩子选择一款合适的护眼台灯,以便孩子夜晚学习能有个好的照明环…...

前端小技巧之轮播图

文章目录 功能htmlcssjavaScript图片 设置了一点小难度,不理解的话,是不能套用的哦!!! (下方的圆圈与图片数量不统一,而且宽度是固定的) 下次写一些直接套用的,不整这些麻…...

手动实现简易版RPC(上)

手动实现简易版RPC(上) 前言 什么是RPC?它的原理是什么?它有什么特点?如果让你实现一个RPC框架,你会如何是实现?带着这些问题,开始今天的学习。 本文主要介绍RPC概述以及一些关于RPC的知识,为…...

大语言模型总结整理(不定期更新)

《【快捷部署】016_Ollama(CPU only版)》 介绍了如何一键快捷部署Ollama,今天就来看一下受欢迎的模型。 模型简介gemmaGemma是由谷歌及其DeepMind团队开发的一个新的开放模型。参数:2B(1.6GB)、7B&#xff…...

关于npm和yarn的使用(自己的问题记录)

目录 一 npm 和 yarn 的区别 二 npm 和 yarn 常用命令对比 1. 初始化项目 2. 安装所有依赖包 3. 安装某个依赖包 4.安装某个版本的依赖包 5. 更新依赖包 5. 移除依赖包 三 package.json中 devDependencies 和 dependencies 的区别。 四 npm安装包时,…...

Web端Excel的导入导出Demo

📚目录 📚简介:✨代码的构建:💭Web端接口Excel操作🚀下载接口🚀导入读取数据接口 🏡本地Excel文件操作⚡导出数据🌈导入读取数据 📚简介: 使用阿里巴巴开源组件Easy Exce…...

Java日期正则表达式(附Demo)

目录 前言1. 基本知识2. Demo 前言 对于正则匹配,在项目实战中运用比较广泛 原先写过一版Python相关的:ip和端口号的正则表达式 1. 基本知识 对于日期的正则相对比较简单 以下是一些常见的日期格式及其对应的正则表达式示例: 年-月-日&a…...

基于LabVIEW的CAN通信系统开发案例

基于LabVIEW的CAN通信系统开发案例 介绍了基于LabVIEW开发的CAN通信系统,该系统主要用于汽车行业的数据监控与分析。通过对CAN通信协议的有效应用,实现了车辆控制系统的高效信息交换与实时数据处理,从而提升了车辆性能的检测与优化能力。 项…...

SAP SD学习笔记07 - 紧急发注(急单),现金贩卖,贩卖传票Type/ 明细Category 及其Customize

上面讲SAP中主干流程的时候,还有后面讲一括处理的时候,都用的是 OR 标准受注。 SAP SD学习笔记01 - 简单走一遍SD的流程:受注,出荷,请求_怎么学好sd模块-CSDN博客 下面开始讲一些稀奇古怪的非标准流程。 当然&#x…...

(六)C++自制植物大战僵尸游戏关卡数据讲解

植物大战僵尸游戏开发教程专栏地址http://t.csdnimg.cn/xjvbb 游戏关卡数据文件定义了游戏中每一个关卡的数据,包括游戏类型、关卡通关奖励的金币数量、僵尸出现的波数、每一波出现僵尸数量、每一波僵尸出现的类型等。根据不同的游戏类型,定义了不同的通…...

Java基于微信小程序的校园外卖平台设计与实现,附源码

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…...

渗透工具及其知识库(个人笔记)

1.IP搜寻 查看kali网段&#xff1a; ip addr 、 ifconfig namp&#xff1a;nmap -sP xxx.xxx.xxx.0/24 netdiscover&#xff1a;netdiscover xxx.xxx.xxx.0/24 arp&#xff1a;arp-scan -l 2.端口扫描 粗略扫描&#xff1a;nmap <IP> 深度扫描&#xff1a; …...

MongoDB的使用

一、Spring Boot集成MongoDB 1 引用依赖包 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId></dependency> 2 配置文件配置mongodb资料 # MongoDB连接信息 spring.…...

labview中FP.isFrontmost不生效?

主GUI界面中调用子GUI程序FP.isFrontmost不生效&#xff1f; 如果主GUI程序使用“floating”,子GUI程序使用default动作&#xff0c;则子GUI无法打开到最前。子GUI程序只能使用“模态”才能置顶。 主GUI程序&#xff1a; 子GUI程序&#xff1a; 改正的方法很简单&#xff0c…...

Vela-OS: 记录一个class层,处理MSC协议的bug

一、关于USC-MSC类设备驱动层,处理SCSI指令的代码逻辑问题 1. 源文件 \nuttx\drivers\usbdev\usbmsc_scsi.c 2. 问题描述 对于INQUIRY指令,长度一般是6个字节,cdblen字段嵌入在CBW数据包中,如下: 命令阶段的CBW数据包: 55 53 42 43 60 2a c0 8b 24 00 00 00 0x80 0x…...

跨框架探索:React Redux 和 Vuex 对比分析快速掌握React Redux

React Redux 和 Vuex 都是前端状态管理库&#xff0c;分别用于 React 和 Vue.js 框架。 它们都提供了一套规范的状态管理机制&#xff0c;帮助开发者更好地组织和管理应用状态。下面是它们的一些异同点&#xff1a; 相同点&#xff1a; 中心化状态管理&#xff1a;两者都提…...

第十五届蓝桥杯省赛C/C++大学B组真题及赛后总结

目录 个人总结 C/C 组真题 握手问题 小球反弹 好数 R 格式 宝石组合 数字接龙 爬山 拔河 ​编辑 再总结及后续规划 个人总结 第一次参加蓝桥杯&#xff0c;大二&#xff0c;以前都在在学技术&#xff0c;没有系统的学过算法。所以&#xff0c;还是花了挺多时间去备…...

基于双层规划模型的微网新能源经济消纳共享储能优化配置:MATLAB代码复现及详细解读

(文章复现)考虑微网新能源经济消纳的共享储能优化配置matlab代码 参考资料《考虑微网新能源经济消纳的共享储能优化配置》 提出了考虑新能源消纳的共享储能电站容量功率配置方法&#xff0c;针对储能电站投运成本最低与微能源网运行经济性最优的多目标&#xff0c;建立了双层规…...

别再只盯着Midjourney了!2025年,这5款文生图模型更适合你的具体业务场景

2025年五大文生图模型实战指南&#xff1a;如何为你的业务精准匹配AI工具 当Midjourney成为文生图领域的"网红"时&#xff0c;真正懂行的从业者已经在根据具体业务需求选择更合适的工具了。就像专业摄影师不会只用一款镜头拍所有题材&#xff0c;明智的AI应用者需要建…...

为什么你的Python多解释器程序总在崩溃?进程隔离、对象序列化与引用计数泄漏全链路诊断,立即修复

第一章&#xff1a;Python多解释器通信的底层本质与崩溃根源Python 多解释器&#xff08;Multi-Interpreter&#xff0c;PEP 684&#xff09;是 CPython 3.12 引入的核心机制&#xff0c;旨在实现真正的并行解释器隔离——每个解释器拥有独立的全局状态&#xff08;如 sys.modu…...

零基础图解VLN视觉语言导航:从输入到决策的完整模型拆解

1. 视觉语言导航&#xff08;VLN&#xff09;是什么&#xff1f; 想象你第一次去朋友家做客&#xff0c;对方在电话里说&#xff1a;“进门左转&#xff0c;看到红色沙发后直走&#xff0c;右手边第二个房间就是。”这时候你的大脑会做三件事&#xff1a;用眼睛观察环境&#x…...

2026 年智慧工地排名榜单第一|山东建安物联科技有限公司

2026 年度智慧工地综合实力榜单正式揭晓&#xff0c;山东建安物联科技有限公司&#xff08;大建安&#xff09;凭借标准引领、技术实力与标杆项目&#xff0c;登顶全国榜首&#xff0c;成为行业公认的智慧工地领军企业。公司打造的中建八局烟台崆峒胜境项目&#xff0c;获评国家…...

从游戏报错到完美运行 DirectX修复工具实际应用案例展示

评价一款工具软件的优劣&#xff0c;最具有说服力的方式莫过于通过真实的实际案例来直观展示其效果和价值。 对于系统修复类工具来说&#xff0c;更是如此&#xff0c;因为用户最关心的就是它能否真正解决自己的问题。 DirectX相关问题一直是Windows游戏玩家最常遇到的技术难题…...

3步终结告警疲劳:Keep平台的智能告警管理实践

3步终结告警疲劳&#xff1a;Keep平台的智能告警管理实践 【免费下载链接】keep The open-source alerts management and automation platform 项目地址: https://gitcode.com/GitHub_Trending/kee/keep 智能告警管理已成为现代运维体系的核心能力。根据Gartner最新报告…...

别再纠结了!Android音视频开发选软解(FFmpeg)还是硬解(MediaCodec)?一个实战Demo帮你做决定

Android音视频开发实战&#xff1a;软解与硬解的性能对决 在移动端音视频开发领域&#xff0c;选择软解还是硬解一直是个令人头疼的问题。每次技术选型会议上&#xff0c;总能看到两派开发者争得面红耳赤——软解支持者强调其灵活性和兼容性&#xff0c;硬解拥趸则推崇其性能和…...

Grok-1大模型实战指南:如何用5大核心模块构建企业级AI应用

Grok-1大模型实战指南&#xff1a;如何用5大核心模块构建企业级AI应用 【免费下载链接】grok-1 马斯克旗下xAI组织开源的Grok AI项目的代码仓库镜像&#xff0c;此次开源的Grok-1是一个3140亿参数的混合专家模型 项目地址: https://gitcode.com/GitHub_Trending/gr/grok-1 …...

3步打造个人离线音频库:喜马拉雅VIP内容永久保存全攻略

3步打造个人离线音频库&#xff1a;喜马拉雅VIP内容永久保存全攻略 【免费下载链接】xmly-downloader-qt5 喜马拉雅FM专辑下载器. 支持VIP与付费专辑. 使用GoQt5编写(Not Qt Binding). 项目地址: https://gitcode.com/gh_mirrors/xm/xmly-downloader-qt5 你是否曾因网络…...