spi总线 上层调用_spi总线驱动详解
spi总线驱动详解
spi总线驱动详解
Spi总线在实际应用得比较多,所以这篇为文章讲解以实际应用为主,bus总线类型细节不做讲解,感兴趣的读者可以分析源码,研究内核源码我觉得是一件非常有趣的事情,同时也是一门艺术。Spi总线上可以挂flash、wifi网卡等常见设备。本文讲解以挂在flash作为实例。
Spi总线硬件电路如下图所示。一般有四根线– MOSI, MISO, SCK, SS;spi下可以挂在多个设备,SS作为CS片选信号选择那个设备进行通讯。
Spi驱动分为三个层次:Core核心层、SPI控制器驱动、SPI设备驱动。
Core核心层:这个是spi驱动的框架,是通用的spi驱动程序,是剥离出来的代码,与硬件设备没有关系,同时也是SPI控制器与SPI设备之间通讯的桥梁。这一块东西比较复杂,作为开发者来说需要明确怎么使用,spi core代码是不需要修改的,是由linux内核开发人员自行维护。
SPI控制器:实现SPI控制器的操作,必须使能这个spi控制器,如何处理中断、如何发送数据、配置寄存等操作;驱动代码中主要是构造spi_master这个结构,然后注册到spi驱动就行。
SPI设备:这个驱动程序是根据具体的设备而定的,比如flash,就应该按照Mtd块设备方式去放编写驱动程序。
Spi驱动设备树编写如下,这里读者可能看不太明白,我会做一些简单介绍,后期专门拿一篇文章讲解设备树文件。看到图中标红部分的compatible变量名,这个是用来做匹配的;在platform中已经提到过。其它参数是一些在probe函数中获取得到;还可以看到flash是挂在spi控制器的cs 1上的。
首先我们分析spi 控制器驱动,该驱动采用的是platform总线模型,dev部分是通过设备树表现出来的,在上图中可以看到spi节点和一些参数信息。对于platform来说最关心compatible = "xlnx,zynq-qspi-1.0";
Platform drv驱动注册如下:
在图中能够清楚看到与设备树文件匹配的compatible = "xlnx,zynq-qspi-1.0",这个只是众多匹配规则的一种。匹配成功后会调用probe函数,下面分析probe函数。
图中定义了我们需要构造的spi_master结构,zynq_qspi数据结构是中途需要使用的,属于自定义变量;我们分析680~685这个两个函数到底做了什么。
Spi_alloc实际是分配了一个spi_master+ zynq_qspi大小的空间,初始化mater中最大片选为1,不是从设备;这里的slave在函数调用过程中传入的是false,为了节省篇幅,作者只列举出重点函数接口。读者请这个spi_controller_set_devdata函数,该函数其实是吧&ctlr[1](该指针指向了多分配的zynq_qspi空间首地址),这里将master中的dev->driver_data=zynq_qspi大小空间。这里再platform总线中讲解数据结构时已经说过这个指针,属于内核使用的指针。spi_master_get_devdata函数其实是把master中的dev->driver_data取出赋值给zynq_qspi指针,分析源码一目了然。
687:又用到了那个内核使用的指针,用来存放master指针,很多读者在想为什么内核需要这样设计,是不是多此一举;这里我肯定回答读者不是,这样内核的好处在于代码内部的耦合性,代码更加紧凑,数据传递仅仅是指针的传递;内核经常使用这个数据结构思想,同时读者需要查看container_of函数。
689:获取platform dev的内存资源信息,级设备树中描述的reg
690:请求io作为内存访问区域,并且映射该地址空间
剩下的是获取参数信息,时钟信息,并且使能等相关操作。这些操作只需要调用内核接口函数。
731:从设备树获取中断管脚信息(怕引起读者误会,设备树在写代码阶段编写的,在内核启动后会将设备树文件解析成platfrom dev文件,有的可能解析成其他类型文件)。
737:注册中断
745:得到片选管脚
752~761:设置spi 控制器硬件相关函数
764:注册master。
2162:创建spi发送数据队列
2176:把该spi控制器添加到spi_controller_list全局链表中
2177~2178:匹配该spi总线下挂了那些设备,如果匹配成功就创建设备;board_list是设备树解析时候赋值的,就这样spi控制器与spi设备驱动之间建立了链接,在spi 设备驱动只需要使用spi_driver结构去编写驱动程序,那么匹配成功后的probe函数会传入spi_device指针,该指针已经和spi控制器做了关联,当spi 设备驱动需要发送数据时,可以通过该spi_device指针去发送数据,也不需要我们手动去选择片选信号,因为在注册spi控制器驱动时已经为每一个设备指定了片选信号。
spi总线驱动详解相关教程
spi总线 上层调用_spi总线驱动详解相关推荐
- spi总线 上层调用_spi总线的mmc卡驱动调试总结 | 学步园
这周调试挂载在spi总线sd卡驱动,总结一下 因为这个涉及到2个驱动,spi总线驱动和sd卡驱动,sd卡设备挂载在spi总线上并不像设备挂载在i2c总线上, i2c总线提供设备挂载需要的借口函数att ...
- spi总线 上层调用_spi总线设备驱动分析
今天折腾了一天的SPI设备的驱动加载,甚至动用了逻辑分析仪来查看spi总线的波形,主要包括两个SPI设备,at45db321d和mcp2515,一个是串行的dataflash,一个是can总线设备芯片 ...
- 18. SPI协议,spi转can,MCP2515裸机驱动详解
更多信息请关注公众号:一口Linux 十八.SPI.MCP2515 一.SPI概述 Serial Peripheral interface 通用串行外围设备接口 是Motorola首先在其MC68HC ...
- Linux字符设备驱动详解四(使用自属的xbus驱动总线)
文章目录 系列文章目录 前言 驱动目录 正文 驱动总线 总线管理 总线注册 设备注册 驱动注册 代码示例 总结 系列文章目录 Linux字符设备驱动详解 Linux字符设备驱动详解二(使用设备驱动模型 ...
- Linux字符设备驱动详解七(“插件“设备树实现RGB灯驱动)
文章目录 系列文章目录 前言 正文 Device Tree Overlays:"插件"设备树 传统设备树 "插件"设备树 使用前提 案例说明 设备树:foo.d ...
- SPI总线以及驱动详解
SPI总线以及驱动详解 SPI总线有四根线,一根是MISO主机输入从机输出,一根是MOSI主机输出从机输入,一根是CLK时钟线,一根是CS片选线 片选线用来选择和哪个从机进行通信 SPI总线在进行数据 ...
- php调用linux摄像头,Linux_Linux中开发USB摄像头驱动详解,USB摄像头以其良好的性能和低 - phpStudy...
Linux中开发USB摄像头驱动详解 USB摄像头以其良好的性能和低廉的价格得到广泛应用.同时因其灵活.方便的特性,易于集成到嵌入式系统中.但是如果使用现有的符合Video for Linux标准的驱 ...
- CAN总线显性电平和隐性电平详解
相关文章 CAN总线简易入门教程 CAN总线显性电平和隐性电平详解 STM32的CAN总线调试经验分享 CAN 信号线 CAN 传输的两条信号线被称为 CAN_H 和CAN_L. 通电状态:CAN_H ...
- MTK 驱动(64)---Mtk touch panel驱动/TP驱动详解
Mtk touch panel驱动/TP驱动详解 TP还算是比LCM好理解的多. 在启动过程中,先注册/mediatek/custom/command/kernel/touchpanel目录下的具体驱 ...
最新文章
- eclipse调试详解
- 来自mooon的最简单的日志类CSimpleLogger
- 调查:台湾上班族讨厌5种年会状况 最怕老板致词长
- java 过滤文件名_Java FileNameFilter过滤文件名
- nodejs之日志管理
- 牛客 - 乘法(二分套二分)
- oracle簇表 数据抽取,Oracle聚簇表
- 1500Vdc的光伏系统距离大规模应用还有多远?
- java实现网页保存_详解Java两种方式简单实现:爬取网页并且保存
- leetcode71. 简化路径 Unix 风格
- 生成step文件_利用opencv给彦女王生成一副蒙太奇画像
- 《三体》动画版官宣!B站出品 刘慈欣“倒吸一口凉气”
- circle loss代码实现_CenterNet之loss计算代码解析
- Silverlight网络寻奇 at 090428
- java单例设计模式懒汉_java单例设计模式之懒汉模式
- Unity游戏开发 头发飘动效果
- oracle expdp parallel,关于EXPDP中的PARALLEL参数
- android subscriber 自定义,自定义Subscriber
- 三菱FX5U系列程序 伺服轴自动运行计数回原点程序,工位单步运行程序,轴JOG,回原点,绝对定位,相对定位,力矩控制
- 记录:Flink checkpoint 过期导致失败(线上问题)
热门文章
- 学计算机去部队是什么部门,我在大学学的是计算机,去部队专业能够对口吗 – 手机爱问...
- VS2015编译VLC2.2.1(under WIN7-64)
- centos7镜像加速_centos7配置Docker镜像加速器
- windows 中怎么做共享
- Aiseesoft Total Media Converter(全能视频转换器)v9.2.22版本更新
- maven报错Non-resolvable parent POM for “项目名称“:1.0-SNAPSHOT: Could not find artifact pom:1.0-SNAPSHOT
- 大企业都在用的协同办公软件,中小企业跟着选一定没错?
- opencv,opengl,osg,vulkan,webgL,opencL,cuda
- TP6 腾讯COS上传(超详细)
- 三星继续悲剧?可能无缘苹果A11芯片订单