linux系统中SPI驱动框架的基本原理与实现

news2024/11/14 1:17:30

        大家好,今天主要和大家聊一聊,如何使用linux系统中SPI驱动ICM-20608六轴传感器的操作。

 

目录

第一:linux系统下SPI驱动框架简介

第二:SPI设备驱动编写

第三:SPI设备和驱动匹配过程


第一:linux系统下SPI驱动框架简介

       SPI驱动框架分为主机控制器驱动和设备驱动,主机控制器就是SOC的SPI控制器接口。不管是什么SPI设备,SPI控制器部分的驱动都是一样的,重点就落在种类繁多的SPI设备驱动上了。

//SPI主机驱动就是SOC的SPI控制器驱动,linux系统中采用spi_master

struct spi_master{
     
      struct device dev;
      
      struct list_head list;
    
      int (*transfer)(struct spi_device *spi, struct spi_message *mesg);

      int (*transfer_one_message)(struct spi_master *master,struct spi_message *mesg);
      .....

};

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

      

第二:SPI设备驱动编写

       linux内核使用spi_driver结构体来表示spi设备驱动,我们在编写SPI设备驱动的时候需要实现spi_driver。

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初始化完成以后需要向linux内核注册,spi_driver注册函数为spi_register_driver函数原型如下:  

int  spi_register_driver(struct spi_driver  *sdrv)

sdrv:要注册的spi_driver

第三:SPI设备和驱动匹配过程

      SPI设备和驱动的匹配过程是由SPI总线来完成的。

struct bus_type  spi_bus_type = {
     
     .name = "spi",
          
     .dev_groups = spi_dev_groups,

     .match = spi_match_device,
  
     .uevent = spi_ueent,
};

       采用设备树的情况下,SPI设备信息描述就通过创建喜迎的设备子节点来完成,可以打开设备树头文件,在此文件中找到对应的内容:

      

&ecspil{
    fsl,spi-num-chipselects = <1>;
    cs-gpios = <&gpio4 9 0>;
    pinctrl-names = "default";
    pinctrl-0 = <&pinctrl_ecspi1>;
    status = "okay";
   
    flash: m25p80@0 {
    #address-cells = <1>;
    #size-cells = <1>;
    compatible = "st,m25p32";
    spi-max-frequency = <20000000>;
    reg = <0>;
    };  
};

       SPI数据传输步骤如下:

      1、申请并初始化 spi_transfer,设置 spi_transfer 的 tx_buf 成员变量,tx_buf 为要发送的数 据。然后设置 rx_buf 成员变量,rx_buf 保存着接收到的数据。最后设置 len 成员变量,也就是 要进行数据通信的长度。

      2、使用 spi_message_init 函数初始化 spi_message。

      3、使用spi_message_add_tail函数将前面设置好的spi_transfer添加到spi_message 队列中。

      4、使用 spi_sync 函数完成 SPI 数据同步传输。

      对于SPI设备驱动,首先就是要初始化并向系统注册spi_driver初始化,注册与注销代码如下:

 /* 传统匹配方式 ID 列表 */
  static const struct spi_device_id icm20608_id[] = {
  {"alientek,icm20608", 0}, 
  {}
  };
  
  /* 设备树匹配列表 */
  static const struct of_device_id icm20608_of_match[] = {
  { .compatible = "alientek,icm20608" },
   { /* Sentinel */ }
   };
 
   /* SPI 驱动结构体 */
    static struct spi_driver icm20608_driver = {
    .probe = icm20608_probe,
    .remove = icm20608_remove,
    .driver = {
    .owner = THIS_MODULE,
    .name = "icm20608",
    .of_match_table = icm20608_of_match,
 },
    .id_table = icm20608_id,
};

       总结:linux系统中安装SPI驱动框架,可以编写出利用SPI通信协议的总线的通信过程,值得反复推敲。

       

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

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

相关文章

MySQL数据库高级面试题(1)

✅作者简介&#xff1a;热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏&#xff1a;Java面试题…

CSDN年度征文 | 你好,2023

祝大家新年快乐~&#x1f9e7;&#x1f9e7;&#x1f9e7;⭐过去的2022⭐2022已成过去&#xff0c;2023慢步向我们走来。回首2022&#xff0c;这一年不是平凡的一年。这一年&#xff0c;有苦也有乐。冬奥会的成功举办、香港回归25周年、二十大胜利召开、航天任务圆满成功等等都…

设计 | 分享5个好用的PPT模板网站

第一PPT 这个老牌的模板网站了&#xff0c;全站都是免费下载&#xff0c;还是不错的 但是素材质量嘛&#xff0c;免费所以不太高。 第一PPT下载https://www.1ppt.com/ 模板狗 这个是最近发现的一个网站&#xff0c;其中内容比较精美。 而且不用开会员也能单独购买&#x…

【Android】APT

引言&#xff1a; 安卓中APT又叫Annotation Processing Tool&#xff0c;即注解处理器。Java中注解分为编译时注解和运行时注解&#xff0c;编译时注解无法通过反射的方式进行获取和处理&#xff0c;所以我们可以利用APT处理编译时注解。比如常见的三方库ButterKnife、ARouter…

mysql删除重复记录并且只保留一条

准备的测试表结构及数据 插入的数据中A,B,E存在重复数据,C没有重复记录 CREATE TABLE tab ( id int(11) NOT NULL AUTO_INCREMENT, name varchar(20) DEFAULT NULL, PRIMARY KEY (id) ) ENGINEInnoDB AUTO_INCREMENT13 DEFAULT CHARSETutf8; -- --------------------…

使用root用户和普通用户完成分配任务案例 ansible(1)

目录 案例一&#xff1a; 控制主机和受控主机通过root用户通过免密验证方式远程控制受控主机实施对应任务。 案例二&#xff1a; 控制主机连接受控主机通过普通用户以免密验证远程控制受控主机实施特权指定操作。 案例一&#xff1a; 控制主机和受控主机通过root用户通过免…

<网络概述>——《计算机网络》

目录 1.网络基础 1.1 计算机网络背景 1.2 网络发展 1.3 软件分层 1.4 网络和操作系统的关系 1.5 局域网通信的原理 2. 网络协议 2.1 网络协议初识 2.1.1 协议分层 2.2 OSI七层模型 2.3 TCP/IP五层(或四层)模型 3. 网络传输基本流程 3.1 网络传输流程图 3.2 数据包…

密码技术扫盲,Part 3:认证

个人博客 密码技术扫盲&#xff0c;Part 1&#xff1a;对称加密密码技术扫盲&#xff0c;Part 2&#xff1a;非对称加密&#x1f3af; 密码技术扫盲&#xff0c;Part 3&#xff1a;认证 除了加密&#xff0c;还有一类用法是对信息的认证&#xff0c;主要包括 4 个技术 单向散…

PostgreSQL JIT 实现query性能加速的一些补充

文章目录背景Executor 本身做的一些优化LLVM JIT 的优化本地以及全局优化执行 query 时的优化JIT调度优化 过程背景 之前介绍过一次 PostgreSQL JIT with LLVM 实现&#xff0c;因为有一些细节没有介绍得很清楚&#xff0c;需要额外做一些补充。 关于LLVM 的IR 以及 如何 用LL…

11.HTML颜色、HTML脚本、字符实体、URL

1.HTML颜色 1&#xff09;HTML 颜色由红色、绿色、蓝色混合而成。 2&#xff09;HTML 颜色由一个十六进制符号来定义&#xff0c;这个符号由红色、绿色和蓝色的值组成&#xff08;RGB&#xff09;。 3&#xff09;每种颜色的最小值是0&#xff08;十六进制&#xff1a;#00&…

性能优化系列之怎么让图片加载得更快?

文章の目录一、压缩png1、优势2、说明文档3、安装4、使用4.1、环境4.2、示例4.3、API4.4、还有一个第三库是对当前库的封装&#xff0c;叫jdf-png-native【版本1.1.0&#xff0c;环境同node-pngquant-native】&#xff0c;使用方法和node-pngquant-native差不多二、压缩jpg1、优…

分享68个PHP源码,总有一款适合您

链接&#xff1a;https://pan.baidu.com/s/1QB61EsIl70vXx1yrJkiesA?pwdbup1 提取码&#xff1a;bup1 PHP源码 分享68个PHP源码&#xff0c;总有一款适合您 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&#xff0c;大家下载…

【树莓派不吃灰】IO篇① GPIO 开发环境

目录1. 前言1.1 4B GPIO引脚排列2. Python GPIO安装3. 基于C语言的wiringPi安装❤️ 博客主页 单片机菜鸟哥&#xff0c;一个野生非专业硬件IOT爱好者 ❤️❤️ 本篇创建记录 2023-01-01 ❤️❤️ 本篇更新记录 2023-01-01 ❤️&#x1f389; 欢迎关注 &#x1f50e;点赞 &…

vivo 服务端监控体系建设实践

作者&#xff1a;vivo 互联网服务器团队- Chen Ningning 本文根据“2022 vivo开发者大会"现场演讲内容整理而成。 经过几年的平台建设&#xff0c;vivo监控平台产品矩阵日趋完善&#xff0c;在vivo终端庞大的用户群体下&#xff0c;承载业务运行的服务数量众多&#xff0c…

Modbus-RTU通讯协议中CRC校验

MODBUS协议中的CRC校验_RobotWoods的博客-CSDN博客_modbus crc 以下面这段收发数据为例&#xff1a; 发送的数据是工控机发送给plc的&#xff0c;他们的通信是modbus通信&#xff0c;前面的01。。。。。0f是实际使用的数据&#xff0c;具体意义可以查&#xff0c;后面的4位数87…

对模板类型推演的一个小Bug

在写vector的代码时遇到了这样一个错误 以下是代码书写内容以及我的测试代码 测试代码的目的就是想测试一下我写的vector构造方法 vector(size_t n, const T& val T())&#xff1b; 可是却发生了上述的报错 vector(size_t n, const T& val T()){// 法一&#xff1a…

【云原生】springcloud13——Config分布式配置中心

前 言 &#x1f349; 作者简介&#xff1a;半旧518&#xff0c;长跑型选手&#xff0c;立志坚持写10年博客&#xff0c;专注于java后端 ☕专栏简介&#xff1a;深入、全面、系统的介绍springcloud与springcloud Alibaba微服务常用技术栈 &#x1f330; 文章简介&#xff1a;本文…

JUC并发编程学习笔记(三)集合线程安全及多线程锁

4 集合的线程安全 4.1 集合操作 Demo 创建集合使用string的泛型 for (int i 0; i <30; i) {new Thread(()->{//向集合添加内容list.add(UUID.randomUUID().toString().substring(0,8));//从集合获取内容System.out.println(list);},String.valueOf(i)).start(); }查看…

Odoo 16 企业版手册 - 库存管理之产品变体与属性

产品变体和属性 向客户提供多种产品变体是提高销售的有效策略。Odoo允许您在库存模块中配置产品的不同变体&#xff0c;就像我们在销售和购买模块中所做的那样。首先&#xff0c;确保从库存模块的「设置」菜单中激活「变体」功能&#xff0c;如下所示。 「产品变体」选项可以从…

【MySQL基础教程】事务详细介绍

前言 本文为 【MySQL基础教程】事务 相关知识&#xff0c;下边将对事务简介&#xff0c;事务操作&#xff08;包括&#xff1a;未控制事务&#xff0c;控制事务&#xff09;&#xff0c;事务四大特性&#xff0c;并发事务问题&#xff0c;事务隔离级别等进行详尽介绍~ &#x…