Linux芯片驱动之SPI Controller
针对一款新的芯片,芯片厂商如何基于Linux编写对应的 SPI controller 驱动?
我们先看看 Linux SPI 的整体框架:

可以看到,最底层是硬件层,对应芯片内部 SPI controller 和 挂在 SPI 总线上的外部设备;中间层是内核层,对应 SPI 驱动;最顶层是用户空间的应用程序。
位于内核层的 SPI 驱动,Linux kernel 抽象出了 spi core,屏蔽掉各厂商 spi controller 的差异,对上为 spi device driver 提供统一接口,对下为各芯片厂商实现 spi controller driver 接入spi core 提供统一接口。
为了用户空间应用程序能直接操作 spi,kernel 除了抽象出 spi core,还实现了 spidev 程序。spidev 主要有两部分构成:虚拟的 spi 设备驱动 + 字符设备,前者利用 spi core 提供的接口操作 spi,后者提供 read/write/ioctl 接口给用户空间。
与 spidev 同一层的 specific spi device driver,指的是各个 spi 外设在内核空间实现的驱动程序,也是利用 spi core 提供的接口操作 spi。也就是说,如果要在用户空间驱动 spi 外设,那可以使用 spidev 提供的接口;如果是在内核空间驱动 spi 外设,那就无需用到 spidev,直接在内核空间编写驱动即可。
作为芯片厂商,如果芯片内置了 spi controller,那么就需要实现 spi contorller driver。结合某芯片平台示例,编写 spi controller driver 的主要步骤如下:
1、定义 platform device 和 platform driver,并注册到 platform。


2、定义 spi_controller(又称 spi_master) 并注册到 spi core。下图代码经过精简。如红色箭头所示,1是分配一个 spi_controller(spi_master) 实例,2是定义 controller 的一些属性和函数操作,3是注册到 spi core 中。

3、实现 spi_controller 的 ops (operations)。
最关键的 operations 有两个,如上图中红色箭头2所示,set_cs 函数和 transfer_one 函数。set_cs 是操作 spi cs 脚;transfer_one 是操作 spi controller 完成一次 spi transfer。什么是 spi transfer?spi transfer 和 spi message 是 spi core 定义的概念,spi transfer 简单地说就是一次spi读或者写的操作,而一个 spi message 可由一个或者多个 spi transfer 组成。spi transfer 不控制 spi cs脚,而 spi message 控制 spi cs 脚。
下图是set_cs的实现,可以看到有操作芯片 spi controller 的 IO_CONTROL 寄存器的 CS 位。

下图是transfer_one的实现。红色箭头处,就是调用实际 spi 传输的函数,而且区分了DMA和非DMA两种情况。这两个函数的具体实现,与该芯片平台 spi controller 的设计紧密相关,相关操作逻辑和寄存器定义需要查阅芯片Spec。

作者:bigfish99
博客:https://www.cnblogs.com/bigfish0506/
公众号:大鱼嵌入式

Linux芯片驱动之SPI Controller的更多相关文章
- [转]Linux芯片级移植与底层驱动(基于3.7.4内核)
1. SoC Linux底层驱动的组成和现状 为了让Linux在一个全新的ARM SoC上运行,需要提供大量的底层支撑,如定时器节拍.中断控制器.SMP启动.CPU hotplug以及底层的G ...
- Linux驱动:SPI驱动编写要点
题外话:面对成功和失败,一个人有没有“冠军之心”,直接影响他的表现. 几周前剖析了Linux SPI 驱动框架,算是明白个所以然,对于这么一个庞大的框架,并不是每一行代码都要自己去敲,因为前人已经把这 ...
- 基于335X平台Linux交换芯片驱动开发
基于335X平台Linux交换芯片驱动开发 一.软硬件平台资料 1.开发板:创龙AM3359核心板,网口采用RMII形式. 2.Kernel版本:4.4.12,采用FDT 3.交换芯片MARVEL ...
- 《linux设备驱动开发详解》笔记——15 linux i2c驱动
结合实际代码和书中描述,可能跟书上有一定出入.本文后续芯片相关代码参考ZYNQ. 15.1 总体结构 如下图,i2c驱动分为如下几个重要模块 核心层core,完成i2c总线.设备.驱动模型,对用户提供 ...
- Linux设备驱动模型之I2C总线
一.I2C子系统总体架构 1.三大组成部分 (1)I2C核心(i2c-core):I2C核心提供了I2C总线驱动(适配器)和设备驱动的注册.注销方法,提供了与具体硬件无关的I2C读写函数. (2)I2 ...
- linux设备驱动归纳总结(六):2.分享中断号【转】
本文转载自:http://blog.chinaunix.net/uid-25014876-id-90837.html xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...
- linux nandflash驱动之MTD层
MTD,Memory Technology Device即内存技术设备,在Linux内核中,引入MTD层为NOR FLASH和NAND FLASH设备提供统一接口.MTD将文件系统与底层FLASH存储 ...
- 《Linux设备驱动开发具体解释(第3版)》进展同步更新
本博实时更新<Linux设备驱动开发具体解释(第3版)>的最新进展. 2015.2.26 差点儿完毕初稿. 本书已经rebase到开发中的Linux 4.0内核,案例多数基于多核CORTE ...
- linux 设备驱动概述
linux 设备驱动概述 目前,Linux软件工程师大致可分为两个层次: (1)Linux应用软件工程师(Application Software Engineer): 主要利用C库函数和 ...
随机推荐
- 逆向 string.h 函数库 strlen、memchr、strcat 函数
strlen 函数 主要功能:返回字符串的长度 C/C++ 实现: #include <iostream> #include <stdio.h> #include <st ...
- 安装全局消息钩子实现dll窗体程序注入
说明{ 通过设置全局消息钩子来实现dll注入,然后窗体有相关消息请求的时候就会自动加载注入dll, 然后在入口处做处理就可以了.注入方式简单很多,比代码注入和lsp等注入都简单,就不解释了. ...
- Listview滑动时不加载数据,停下来时加载数据,让App更优
http://blog.csdn.net/yy1300326388/article/details/45153813
- web技术培训(一)-云服务器、域名相关
云服务器 什么是云服务器(这部分可以跳过) 云服务器(Elastic Compute Service, ECS)是一种简单高效.安全可靠.处理能力可弹性伸缩的计算服务.其管理方式比物理服务器更简单高效 ...
- 【点分治】2019 首尔 icpc Gene Tree
题目 链接:https://ac.nowcoder.com/acm/contest/15644/B来源:牛客网 A gene tree is a tree showing the evolution ...
- idea中修改代码大小设置
修改代码大小 控制台字体大小
- [MySQL数据库之事务、读现象、数据库锁机制、多版本控制MVCC、事务隔离机制]
[MySQL数据库之事务.读现象.数据库锁机制.多版本控制MVCC.事务隔离机制] 事务 1.什么是事务: 事务(Transaction),顾名思义就是要做的或所做的事情,数据库事务指的则是作为单个逻 ...
- spring-第三章-jdbc
一,回顾 aop:面向切面编程,就是将一些和主业务流程没有关系的公共代码,提取封装到切面类,通过切入点规则,可以对目标方法进行功能增强;也就是可以再目标方法执行的前后添加一段额外逻辑代码; 二,Jdb ...
- istioctl命令整理
显示配置文件中的差异 istioctl profile diff default demo 显示对应配置的profile istioctl profile dump demo 显示可用的配置 isti ...
- [刷题] 75 Sort Colors
要求 给只有0 1 2三个元素的数组排序 思路 方法1:遍历数组,利用辅助数组保存三个元素的个数,再写入(遍历两遍) 辅助数组有三个元素,对应0 1 2的个数 方法2:模拟三路快排,遍历一遍完成排序 ...