Linux下SPI设备驱动实验:SPI设备驱动框架编写

一.  简介

Linux下的SPI 驱动框架和 I2C 很类似,都分为主机控制器驱动和设备驱动,SPI主机控制器是半导体厂商编写的,我们只需要编写 SPI设备驱动代码。

本实验的最终目的就是驱动 I.MX6ULL-ALPHA 开发板上的 ICM-20608 这个 SPI 接口的六轴传感器,应用程序读取 ICM-20608 的原始传感器数据。

前一篇文章创建了SPI节点及SPI设备节点,文章如下:

Linux下SPI设备驱动实验:验证SPI节点及ICM20608设备子节点-CSDN博客

SPI设备驱动实现思路:实现SPI设备驱动框架,加入字符设备驱动框架,再实现SPI数据读 / 写函数。

本文开始编写SPI设备驱动框架。

二.  Linux下SPI设备驱动实验:SPI设备驱动框架编写

1.  创建工程

(1)创建 18_spi 工程目录,将 17_i2c工程下的 .vscode 拷贝到 18_spi 工程:

wangtian@wangtian-virtual-machine:~/zhengdian_Linux/Linux_Drivers$ mkdir 18_spi
wangtian@wangtian-virtual-machine:~/zhengdian_Linux/Linux_Drivers$ cp ./17_i2c/.vscode/ ./18_spi/ -rf

注意:这里拷贝 .vscode目录及其下的文件,因为 .vscode目录下的文件设置了所调用的内核源码的路径。因为驱动代码会调用到内核源码中一些头文件或函数。

(2)  将 17_i2c工程下的 Makefile 拷贝到 18_spi工程:

wangtian@wangtian-virtual-machine:~/zhengdian_Linux/Linux_Drivers/18_spi$ cp ../17_i2c/Makefile ./

(3) 进入 18_spi工程下,创建 icm20608.h文件与spi_icm20608.c文件。

更改 Makefile文件中目标文件名,更改后如下:

obj-m := spi_icm20608.o

2.  SPI设备驱动框架编写

vscode打开 17_i2c工程目录,接下来开始编写 I2C设备驱动框架。

注意:构造 spi_driver结构体,注册 spi_driver与删除 spi_driver,SPI设备驱动框架代码的实现都可以参考内核源码中一些设备,因为内核源码中也有很多 spi设备驱动实现。找一个支持设备树匹配的结构体。

在 spi_icm20608.c文件中实现  SPI设备驱动框架,spi_icm20608.c文件如下:

#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/uaccess.h>
#include <linux/io.h>
#include <linux/cdev.h>
#include <linux/device.h>
#include <linux/module.h>
#include <linux/types.h>
#include <linux/of.h>
#include <linux/spi/spi.h>
#include <linux/delay.h>static int icm20608_probe(struct spi_device* spi_dev)
{int ret = 0;printk("icm20608_probe!\n");return ret;
}static int icm20608_remove(struct spi_device* spi_dev)
{printk("icm20608_remove!\n");return 0;
}//传统驱动与设备匹配方法
static struct spi_device_id spi_device_id_table[] = {{"icm20608", 0},{ }
};//设备树匹配方法
static struct of_device_id of_device_table[] = {{.compatible = "alientek,icm20608"},  //必须与设备树中设备节点compatible值一致{ }
};/*SPI驱动结构体*/
struct spi_driver icm20608_driver = {.driver = {.name = "icm20608",.owner = THIS_MODULE,.of_match_table = of_match_ptr(of_device_table),},.id_table = spi_device_id_table,.probe = icm20608_probe,.remove = icm20608_remove,
};/*模块加载 */
static int __init icm20608_init(void)
{return spi_register_driver(&icm20608_driver);
}/*模块卸载 */
static void __exit icm20608_exit(void)
{spi_unregister_driver(&icm20608_driver);
}/*驱动加载与卸载 */
module_init(icm20608_init);
module_exit(icm20608_exit);
MODULE_LICENSE("GPL"); //模块 Licence
MODULE_AUTHOR("WeiWuXian"); //作者

三. 编译驱动

对以上的驱动代码进行模块编译:

wangtian@wangtian-virtual-machine:~/zhengdian_Linux/Linux_Drivers/18_spi$ make
make -C /home/wangtian/zhengdian_Linux/linux/kernel/linux-imx-rel_imx_4.1.15_2.1.0_ga M=/home/wangtian/zhengdian_Linux/Linux_Drivers/18_spi modules
make[1]: 进入目录“/home/wangtian/zhengdian_Linux/linux/kernel/linux-imx-rel_imx_4.1.15_2.1.0_ga”CC [M]  /home/wangtian/zhengdian_Linux/Linux_Drivers/18_spi/spi_icm20608.oBuilding modules, stage 2.MODPOST 1 modulesLD [M]  /home/wangtian/zhengdian_Linux/Linux_Drivers/18_spi/spi_icm20608.ko
make[1]: 离开目录“/home/wangtian/zhengdian_Linux/linux/kernel/linux-imx-rel_imx_4.1.15_2.1.0_ga”

可以看出,驱动模块编译好。

接下来对驱动模块进行测试加载,确定SPI驱动是否与设备匹配成功。测试方法前面已经说过,验证驱动与设备是否匹配,其实与 I2C通信一样的,可以参考如下文章:

I2C驱动实验:测试I2C驱动是否与设备匹配-CSDN博客

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

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

相关文章

B端:导航条长得不都一样吗?错了,这里看过来就懂了。

B端导航条看似都一样&#xff0c;大差不差&#xff0c;仔细看一下&#xff0c;其实各有各的不同&#xff0c;这里方向了十多个&#xff0c;大家仔细看细节。

avicat连接异常,错误编号2059-authentication plugin…

错误原因为密码方式不对&#xff0c;具体可自行百度 首先管理员执行cmd进入 mysql安装目录 bin下边 我的是C:\Program Files\MySQL\MySQL Server 8.2\bin> 执行 mysql -u -root -p 然后输入密码 123456 进入mysql数据库 use mysql 执行 ALTER USER rootlocalhost IDE…

关于沃进科技无线模块demo软件移植问题

文章目录 一、无线模块开发测试准备二、开发板硬件三、开发板默认功能上电默认界面功能选择界面数据包发送界面数据包接收显示界面射频性能测试界面参数设置界面固件信息显示界面 四、软件开发软件SDK框图1、射频硬件驱动&#xff08;详见./radio/myRadio_gpio.c&#xff09;2、…

51单片机实验04 -数码管的动态显示实验

目录 一、实验目的 二、实验内容 三、实验原理 四、实验方法 五&#xff0c;实验效果及代码 1&#xff0c;效果 2&#xff0c;代码 六&#xff0c;课后习题 1&#xff0c;使用定时器T0的中断函数1 从999999~0计时 1&#xff09;效果 2&#xff09;代码 2&#xff0c…

配置linux的oracle 21c启停服务

一、配置启停 1、使用root用户登陆 su - root 2、修改oratab文件 修改oratab文件&#xff0c;将红框里面的N改为“Y”&#xff0c;使启停脚本能够生效 vi /etc/oratab 3、验证 配置好后就能够使用 dbshut 停止服务 和 dbstart 启动服务 了 2.1启动服务 su - oracle dbstart…

什么是线程?线程和进程谁更弔?

第一个参数是所创建进程的pid。 第二个是线程的属性。 第三个参数是返回值为void*&#xff0c;参数也为void*的函数指针。 第四个参数是给第三个参数的参数&#xff0c;也就是给给函数传参。 #include<iostream> #include<pthread.h> #include<unistd.h>…

折叠面板组件(vue)

代码 <template><div class"collapse-info"><div class"collapse-title"><div class"title-left">{{ title }}</div><div click"changeHide"> <Button size"small" v-if"sho…

生产计划和排单管理怎么做

阅读本文&#xff0c;你将了解到&#xff1a;1、企业是如何制定生产计划和进行排单管理&#xff1f; 2.企业在执行生产计划和进行排单管理过程中会遇到那些问题&#xff1f; 3.企业如何高效利用工具去解决问题&#xff1f; 一、生产计划和排单管理是什么 1.生产计划和排单管理…

【uniapp】【uview2.0】【u-sticky】Sticky 吸顶

把pages.json文件中的 “navigationStyle"设置为"custom”, 出现的问题是&#xff0c;莫名奇妙多了个 一个高度 解决方法 /* 使用CSS的sticky定位 */ .sticky {/* #ifdef H5 */ position: -webkit-sticky;position: sticky;top: 0; /* 设置距顶部的距离 */z-ind…

[Python开发问题] Selenium ERROR: Unable to find a matching set of capabilities

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

在Spring Boot实战中碰到的拦截器与过滤器是什么?

在Spring Boot实战中&#xff0c;拦截器&#xff08;Interceptors&#xff09;和过滤器&#xff08;Filters&#xff09;是两个常用的概念&#xff0c;它们用于在应用程序中实现一些通用的逻辑&#xff0c;如日志记录、权限验证、请求参数处理等。虽然它们都可以用于对请求进行…

最大子树和(遇到的题)

题目是给出一个树&#xff0c;求其中最大的权值块 题解&#xff1a; #include <bits/stdc.h> using namespace std; const int N1e59; int dp[N]; //dp[i]表示第i结点为根最大权值 int w[N]; //记录每个结点的权值 int n; //点的数量 int t; //样例个数 …

Ubuntu安装VMVare Workstation pro 17.5.1

由于需要装Kali&#xff0c;我电脑是Ubuntu单系统&#xff0c;所以只能使用linux版本的虚拟机&#xff0c;通过这种方式来安装虚拟机和Kali镜像。 参考CSDN博客资料&#xff1a;https://blog.csdn.net/xiaochong0302/article/details/127420124 github代码资料&#xff1a;vm…

力扣:383题. 赎金信

题目&#xff1a; 给定一个赎金信 (ransom) 字符串和一个杂志(magazine)字符串&#xff0c;判断第一个字符串 ransom 能不能由第二个字符串 magazines 里面的字符构成。如果可以构成&#xff0c;返回 true &#xff1b;否则返回 false。 (题目说明&#xff1a;为了不暴露赎金…

程序运行在 STM32H750 的外扩 FLASH 上两小时后死机

1. 问题现象 客户使用 STM32H750VBT6&#xff0c;通过 QSPI 外扩了一个 4M 的 NOR FLASH&#xff0c;采用memory map 模式。当程序跳转运行到外设 FLASH 后&#xff0c;大约两个小时后程序死机。 客户使用的 IDE 是 KEIL&#xff0c;此问题可以固定重现。 在 KEIL 调试模式下…

triton入门实战

这篇文章主要讲的是基于官方镜像及&#xff0c; pytorch script 格式模型&#xff0c;构建tritonserver 服务 1、环境准备&#xff1a; 1.1. 下载 tritonserver镜像&#xff1a; Triton Inference Server | NVIDIA NGC a. 注意&#xff1a;tritonserver 镜像中的invdia驱动版本…

JWFD全面升级为WIN7系统

由于JWFD主控制器的核心模块已经完全支持WIN7系统&#xff0c;JWFD系统已经全面升级为WIN7平台 请各个用户升级自己的核心系统到WIN7&#xff0c;WIN7版本的JWFD和XP版本的JWFD保持完全的兼容 原来在XP及其以下的操作系统中开发的JWFD的各个模块和代码包均可以在WIN7版本中正…

Java基础知识总结(56)

/** Map集合常用Api */ public class MapDemo1 { public static void main(String[] args) { //创建Map集合对象 Map<Integer,String> map new HashMap<>(); //向Map集合中添加键值对 map.put(1,"田福军"); //在这里进行了自动装箱 map.put(2,"孙…

Java面试必问题39:SpringBoot自动配置原理(必问) SpringBoot(优点)

SpringBoot自动配置原理 Spring Boot的自动配置原理基于条件化配置和约定优于配置的机制。它通过扫描类路径下的依赖、配置文件和注解等信息&#xff0c;结合Spring Boot提供的自动配置类和条件注解&#xff0c;根据条件判断自动配置哪些组件&#xff0c;然后将它们注入到Spri…

mojo人工智能语言终于开源了,比Python 快了9万倍

让你久等的人 最后也不会选择你 没有什么人是你必须要交往的 原则上不可以 只是说明打破选择的利益 还不够大 女人喜欢追随 而不是领导 追求趋势,权利 而不是忠诚 前不久,Modular 公司宣布开源 Mojo 的核心组件。 Mojo 是一种专为编写人工智能软件设计的编程语言,去年…