Linux内核SPI支持概述
=====================
2007年5月21日
什么是SPI?
----------------
“串行外设接口”(SPI)是一种同步四线串行连接(a synchronous four wire serial link),用于把微控制器同传感器、存储器等外设连接在一起。这是一个简单的“事实”标准,不够复杂到需要一个标准化机构。SPI使用主/从配置。
三根信号线包含时钟信号线(SCK,often on the order of 10 MHz),和并行数据线,“主机输出,从机输入”(MOSI)或者“主机输入,从机输出”(MISO)。(其它名字也在使用。)数据交换用的时钟有四种模式:模式0和模式3最为常用。每个时钟周期移出数据并移入数据;时钟信号不变换除非有一个数据位移动。并非所有数据位会被使用,并非每每一种协议具有全双工能力。
SPI主机使用第四根信号线“片选”来激活一个给定的从设备,因此这三根信号线可能并行地被连接到许多芯片。所有的SPI从设备支持片选,它们通常低电平有效,标以nCSx表示从设备‘x'(例如nCS0)。一些设备还会有其它信号,通常是一个对主机的中断信号。
SPI总线不像USB或SMBus等串行总线,甚至是对于从设备的底层协议,不同厂商之间也不能相互操作(除了像内存芯片等)。
- SPI可能会被用于请求/响应类型的设备协议,例如触摸屏传感器和内存芯片。
- 它可能被用于流数据,任意一个方向(半双工)或这是同时两个方向(全双工)。
- 一些设备可能用8比特字。其它可能有不同的字长,比如12比特或20比特的数据流采样。
- 字通常以最高位最先发送,但有时以最低位发送。
- 有时SPI用于链设备,比如移位寄存器。
同样的,SPI从设备几乎很少有支持任何自动识别/查询的协议。一个可以被给定的主设备访问的从设备树,会用配置表的形似手动的被建立。
SPI只是四线协议的一个名字之一,大部分控制器可以处理“MicroWire”(对于请求/响应协议,认为它是一种半双工SPI),SSP(“同步串行协议”),PSP(“可编程串行协议”),和其它相关协议。
一些芯片通过组合使用MOSI和MISO来减少一根信号线,并限制为在硬件层上的半双工。事实上,一些SPI芯片具有这种信号模式作为附加选项。它们可以被相同的SPI编程接口访问,但很显然它们不能处理全双工传输。你可能会发现,这类芯片会被描述成使用“三线”信号:SCK,data,nCSx.(那根数据线有时被称为MOMI或SISO。)
谁使用它?在哪类系统上?
---------------------------------------
Linux开发者使用SPI很可能是为嵌入式系统板写设备驱动。SPI用于控制外部芯片,并且它也是一种协议,被每一种MMC或SD存储卡所支持。(老式的“DataFlash”卡,早于MMC卡,但是使用相同的连接头和卡的形状,仅支持SPI)一些PC上的硬件使用SPI闪存存储BIOS代码。
SPI从机芯片,范围从用于模拟传感器和编解码芯片的数字/模拟转换器,到存储芯片,像USB控制器和以太网适配器的外设,等等。
大部分使用SPI的系统会集成一些设备到主板上。有些在扩展接口上提供SPI连接;在没有专用SPI控制器存在的场合,GPIO管脚可用于创建一种低速“bitbanging”适配器。很少有系统会热插拔一个SPI控制器;理由是使用SPI重点在低成本和操作简单,如果动态重配很重要,USB通常是一总更加合适的低引脚数的外设总线。
很多可以跑Linux的微控制器集成了一个或更多的具有SPI模式的I/O接口。给予SPI支持,它们可以在不需要专用的MMC/SD/SDIO控制器的情况下使用MMC或SD卡。
我混淆了。SPI四种“时钟模式”是什么?
----------------------------------------------------------
在这点上很容易混淆,你会找到的生产厂商的文档,并非一定有帮助。这四种模式组合两种模式位:
- CPOL表示初始时钟极性。CPOL=0表示时钟以低电平开始,因此第一个边缘(前边缘)是上升沿,第二个边缘(后边缘)是下降沿。CPOL=1表示时钟以高电平开始,因此第一个边缘(前边缘)是下降沿。
- CPHA表示用于采样数据的时钟相位;CPHA=0说明前边缘采样,CPHA=1表示后边缘采样。
因为信号在采样之前必须建立起来,CPHA=0意味着在第一个时钟边沿之前的半个时钟,数据已被写入。片选已经让它变得可用。
芯片规格中并不总是会讲明“使用SPI模式X”,但是它们的时序图会让CPOL和CPHA的模式很清楚。
在SPI模式编号中,CPOL是高比特位,CPHA是第比特位。因此,当一个芯片的时序图显示时钟开始为低电平(CPOL=0)并且采样用数据在后边沿建立(CPHA=1),那是SPI模式1。
记住时钟模式在片选信号有效时相应的变得有效。因此,主机在选中从机之前,必须设置时钟为无效,从机通过在片选信号线有效时采样时钟电平,可以知道所选择的极性。这就是为什么很多设备支持例如模式0和3:它们不必关心极性,总是在时钟上升沿有数据输入输出。
这些驱动程序接口是如何工作的?
-------------------------------------------------
头文件包括内核文档,和主要源代码,并且你应该读那个章节的内核API文档。这仅仅只是一种概观,你在进入细节之前得到了大致图像。
SPI请求总是进入I/O队列。对于一个给定的SPI设备,请求总是以FIFO的顺序被执行,并且通过完成回调函数异步地完成。也有一些同步封装,针对包括像写一个命令然后读取响应的常见的传输类型的回调函数。
有两种类型的SPI驱动,这里称作:
控制器驱动 ... 控制器可能会被内建到片上系统处理器,通常支持主机和从机两种模式。这些驱动接触硬件寄存器,并可能使用DMA。或者他们可能是PIO bitbangers,仅仅需要GPIO。
协议驱动 ... 它们通过控制器驱动传输消息,以使得与在另一边SPI连接的主机或从机设备通信。
因此,作为例子,一个协议驱动可能与MTD层交流,以输出数据到存储在像DataFlash上 SPI闪存的文件系统上;其它可能是控制音频接口,表述触摸屏传感器作为输入接口,或者检测工业处理过程中的温度和电压值。这些都有可能分享相同的控制器驱动。
“struct spi_device”封装了这两种类型驱动之间的主机端接口。在编写这个文档时,Linux还没有从机端的编程接口。
有一个SPI编程接口的最小核心,重点关注使用驱动模型连接控制器和协议驱动,使用板级专用初始化代码提供的设备列表。SPI在sysfs中出现在好几个位置:
/sys/devices/.../CTLR ... 给定SPI控制器的物理节点
/sys/devices/.../CTLR/spiB.C ... 总线为"B",片选"C",通过CTLR访问的spi_device
/sys/bus/spi/devices/spiB.C ... 下面物理设备的符号链接
.../CTLR/spiB.C device
/sys/devices/.../CTLR/spiB.C/modalias ... 标示使用这个驱动的设备(为热插拔/冷插拔)
/sys/bus/spi/drivers/D ... 为一个或多个的spi*.*设备的驱动
/sys/class/spi_master/spiB ... 符号连接(或实际设备节点)到逻辑节点,逻辑节点可以为控制器保持class相关状态,以管理总线"B"。所有spiB.x共享一个物理SPI总线段,同SCLK, MOSI, 和MISO。
记住控制器class状态的实际位置取决于你是否使能了CONFIG_SYSFS_DEPRECATED没有。此时,唯一的class-specific状态是总线号(在"spiB"中的"B"),因此,/sys/class入口只是对快速识别总线有用。
目标板初始化代码如何声明SPI设备?
------------------------------------------------------
Linux需要好几种信息来合适的配置SPI设备。这类信息通常由板级专用代码提供,甚至对于那些支持自动发现和枚举的芯片。
<控制器的申明>
第一种信息是所存在的SPI控制器列表。对于基于板子的片上系统,它们通常是平台设备(platform devices),为了运行正常,控制器可能需要一些平台数据(platform_data)。数据结构“struct platform_device”会包含像控制器第一个寄存器的物理地址和它的中断等诸如此类的资源。
平台经常抽象“注册SPI控制器”的操作,可能伴随着初始化管脚配置的代码,如此,对于许多板子的arch/.../mach-*/board-*.c文件都可以共享相同的基本的控制器建立代码。这是因为,绝大多数SOC具有许多SPI能力的控制器,并且只有在给定板子上实际被使用的那些应该被建立和在注册。
例如,arch/.../mach-*/board-*.c文件可能有这样的代码:
-
#include <mach/spi.h>/* for mysoc_spi_data */
-
-
/* if your mach-* infrastructure doesn't support kernels that can
-
* run on multiple boards, pdata wouldn't benefit from "__init".
-
*/
-
static struct mysoc_spi_data __initdata pdata = { ... };
-
-
static __init board_init(void)
-
{
-
...
-
/* this board only uses SPI controller #2 */
-
mysoc_register_spi(2, &pdata);
-
...
-
}
特定SOC的实用代码可能看上去像这样:
-
#include <mach/spi.h>
-
-
static struct platform_device spi2 = { ... };
-
-
void mysoc_register_spi(unsigned n, struct mysoc_spi_data *pdata)
-
{
-
struct mysoc_spi_data *pdata2;
-
-
pdata2 = kmalloc(sizeof *pdata2, GFP_KERNEL);
-
*pdata2 = pdata;
-
...
-
if (n == 2) {
-
spi2->dev.platform_data = pdata2;
-
register_platform_device(&spi2);
-
-
/* also: set up pin modes so the spi2 signals are
-
* visible on the relevant pins ... bootloaders on
-
* production boards may already have done this, but
-
* developer boards will often need Linux to do it.
-
*/
-
}
-
...
-
}
注意板子的平台数据(platform_data)可能是不同的,甚至在相同的SOC控制器使用的时候。例如,在一个板子上SPI可能使用外部时钟,然而另一个从当前主控制器时钟设置派生出。
<从设备的声明>
第二种信息是存在于目标板上的SPI从设备列表,通常,带有一些驱动需要的板级特定数据,以使得正常工作。
通常,你的arch/.../mach-*/board-*.c文件会提供一个小表列举在每个板子上的SPI设备。(这通常是极少数。)那会像这样:
-
static struct ads7846_platform_data ads_info = {
-
.vref_delay_usecs= 100,
-
.x_plate_ohms= 580,
-
.y_plate_ohms= 410,
-
};
-
-
static struct spi_board_info spi_board_info[] __initdata = {
-
{
-
.modalias= "ads7846",
-
.platform_data= &ads_info,
-
.mode= SPI_MODE_0,
-
.irq= GPIO_IRQ(31),
-
.max_speed_hz= 120000 /* max sample rate at 3V */ * 16,
-
.bus_num= 1,
-
.chip_select= 0,
-
},
-
};
再次,注意板级专用信息是如何提供的;每一种芯片可能需要多种类型。这个例子显示了通用约束,像最快允许的SPI时钟(在这里是板上电压的功能),或者是IRQ管脚如何被连接,增加芯片专用约束,像由管脚上电容改变的一个重要的延迟。
(也有“控制器件数据(controller_data)”,对控制器驱动可能有用的信息。一个例子是外设专用DMA调整数据或片选回调函数。这后面被存储在spi_device中。)
board_info应该提供足够的信息以让系统在芯片驱动未被加载时就可以工作。这里最麻烦的方面可能是在spi_device.mode域中的SPI_CS_HIGH位,因为在架构知道如何描述片选之前,与一个解释片选“backwords”的设备共享一个总线是不可能的。
接下来,你的板级初始化代码会向SPI架构注册那个表,从而使在后面的SPI主机控制器驱动注册时可以得到它:
spi_register_board_info(spi_board_info, ARRAY_SIZE(spi_board_info));
与其它静态板级建立(static board-specific setup)一样,你不必注销它们。
广泛使用的“卡”风格计算机捆绑内存、CPU和其它少量到一个卡上,这个卡可能只有三十平方厘米。在这类系统中,你的arch/.../mach-.../board-*.c文件可能主要提供关于主板上的设备所在的卡所插入的位置。那当然包括通过卡连接头关联起来的SPI设备。
<非静态配置>
开发板通常扮演一个不同的角色,相比产品板子,一个例子是热插拔SPI设备和/或控制器的潜在需求。
对于这些场合,你可能需要使用spi_busnum_to_master()查找SPI总线主机,将也可能需要need spi_new_device()提供基于热插拔板子的板级信息。当然,你后面在移除板子时至少还需要spi_unregister_device()。
当Linux包含支持通过SPI接口的MMC/SD/SDIO/DataFlash卡时,这些配置也会是动态的。幸运的是,这些设备全都支持基本的设备识别probes,因而他们可以正常热插拔。
我如何写一个“SPI协议驱动”?
--------------------------------------------
目前,绝大多数SPI驱动是内核驱动,但也支持用户空间驱动。这里我们仅讨论内核驱动。
SPI协议驱动有点像平台设备驱动:
-
static struct spi_driver CHIP_driver = {
-
.driver = {
-
.name= "CHIP",
-
.owner= THIS_MODULE,
-
},
-
.probe= CHIP_probe,
-
.remove= __devexit_p(CHIP_remove),
-
.suspend= CHIP_suspend,
-
.resume= CHIP_resume,
-
};
驱动核心会自动的尝试绑定这个驱动到任何board_info给出了一个modalias为“CHIP”的SPI设备。你的probe()函数代码可能看上去像这样,除非你创建了一个管理总线的设备(在/sys/class/spi_master下出现)。
-
static int __devinit CHIP_probe(struct spi_device *spi)
-
{
-
struct CHIP*chip;
-
struct CHIP_platform_data*pdata;
-
-
/* assuming the driver requires board-specific data: */
-
pdata = &spi->dev.platform_data;
-
if (!pdata)
-
return -ENODEV;
-
-
/* get memory for driver's per-chip state */
-
chip = kzalloc(sizeof *chip, GFP_KERNEL);
-
if (!chip)
-
return -ENOMEM;
-
spi_set_drvdata(spi, chip);
-
-
... etc
-
return 0;
-
}
一旦进入probe()函数,驱动可能会使用"struct spi_message"处理对于SPI设备的I/O请求。当removes()返回时,或在probe()失败后,驱动保证不再发送这样的信息。
-- 一个spi_message是一系列协议操作,以原子序列执行。SPI驱动控制包括:
+ 当双向读写开始 ... spi_transfer序列是如何安排的;
+ 使用了哪个I/O缓冲 ... 每个spi_transfer对每个传输方向包含一个缓冲,支持全双工(两个指针,可能是同一个在这两种情况下)和半双工(一个指针是NULL)传输;
+ 传输后选择性定义短延迟 ... 使用spi_transfer.delay_usecs设置(这个延迟可以仅是协议有效,如果缓冲长度为零的话);
+ 在一次传输后和任何延迟后,片选是否变为无效 ... 通过使用spi_transfer.cs_change标志;
+ 指示下一个消息是否有可能进入相同的设备 ... 使用在原子组中最后一个传输上的spi_transfer.cs_change,潜在性地为片选和选择操作节省功耗。
-- 根据标准内核规则,在你的消息中提供DMA安全的缓冲。这种方式下,控制器驱动使用DMA时,不必强制做额外拷贝,除非硬件要求这么做(例如,围绕硬件校验的工作强制使用bounce buffering)。
如果标准的dma_map_single()函数处理这些缓冲不合适,你可以使用spi_message.is_dma_mapped告诉控制器驱动你已经提供了确切的DMA地址。
-- 基本的I/O原始函数是spi_async()。异步请求可能在任何上下文中(中断处理函数,任务,等),完成报告通过一个提供消息的回调函数。在检测到任何错误之后,芯片取消选中,spi_message的处理终止。
-- 也有同步封装,像spi_sync(),spi_read(), spi_write(), 和 spi_write_then_read()。这些可能用于可以睡眠的上下文,他们都是spi_async()之上的clean layers(小的,并且是“可选择的”)。
-- spi_write_then_read()调用,和围绕它的简便封装函数,在使用时应使用少量数据,额外的拷贝可能会被忽略。这杯设计成支持常用的RPC类型的请求,比如写一个8比特命令,和读一个16比特的响应---spi_w8r16()是它的一个封装,执行这个过程。
一些驱动可能需要修改spi_device的属性,像传输模式、字长或者时钟速率。这由spi_setup()函数完成,这通常在对设备的第一次I/O操作之前在probe()函数中被调用。然而,只要没有对那个设备待发送的消息,它在任何时间都可以被调用。
然而,“spi_device”会是驱动的底层,上层可能包括sysfs(特别是对于读传感器),输入层,ALSA,网络,MTD,字符设备框架,或者其它Linux子系统。
记住,作为与SPI设备交互的一部分,有两种类型的内存在你的驱动力必须管理。
-- I / O缓冲器使用通常的Linux规则,并且必须是DMA安全的。你通常在堆(heap)或释放的页面池中分配它们。不能使用栈(stack),或者其它任何声明了“静态”的。
-- spi_message和spi_transfer元数据用于将这些I/O缓冲胶合进协议传输组。这些可以在方便的时候在任何地方被分配,包括作为其他单次分配的驱动数据结构的一部分。初始化为零。
如果你喜欢,可以利用spi_message_alloc()和spi_message_free()便利程序来分配和零初始化一个对多个传输的spi_message。
我如何写一个“SPI主控制器驱动”
-----------------------------------------------
SPI控制器和可能被注册到平台总线(platform_bus)上;编写一个驱动程序绑定设备,任何总线参与。
这一类型的驱动的主要任务是提供一个“spi_master”。使用spi_alloc_master()分配master,spi_master_get_devdata()获取为设备所分配的驱动私有数据。
-
struct spi_master *master;
-
struct CONTROLLER *c;
-
-
master = spi_alloc_master(dev, sizeof *c);
-
if (!master)
-
return -ENODEV;
-
-
c = spi_master_get_devdata(master);
驱动会初始化spi_master的域,包括总线号(可能与平台设备的ID相同)和用于同SPI核心与SPI协议驱动交互的三个方法。它也会初始化自己的内部状态。(看下面的总线编号和它们的方法。)
在你初始化spi_master之后,使用spi_register_master()将其发布到系统的其余部分。那时,控制器和任何已声明的SPI设备的设备节点可以使用了,并且驱动模型核心会小心的把他们绑定到驱动。
如果你需要移除你的SPI控制器驱动,spi_unregister_master()会有spi_register_master()的相反效果。
总线编号
总线编号是重要的,因为那是Linux如何识别一个给定的SPI总线(共享SCK,MOSI,MISO)。有效的总线号从零开始。在SOC系统中,总线号必须与芯片厂商定义的数字匹配。例如,硬件控制器SPI2会是总线数字2,并且为设备连接到总线的spi_board_info使用那个数字。
如果你没有这样的硬件分配的总线号,因为一些原因,你不能仅仅分配它们,然后提供一个负数的总线号码。那会被动态分配的数字所替代。然后你得把这看成是非静态配置(看下面)。
SPI主机方法
master->setup(struct spi_device *spi)
这设置设备时钟速率,SPI模式,和字长。驱动可能根据提供的board_info修改默认值,然后调用spi_setup(spi)。它可能会睡眠。除非每个SPI从设备有它自己的配置寄存器,不要立刻修改他们 ... 否则驱动可能破坏正为其它SPI设备处理的I/O。
master->transfer(struct spi_device *spi, struct spi_message *message)
这不能睡眠。它的责任是安排传输开始和它的complete()回调函数发布。这两个正常情况下在后面发生,在其它传输完成后,并且如果控制器闲置,它需要启动它。
master->cleanup(struct spi_device *spi)
你的控制器驱动可能使用spi_device.controller_state来保持与那个设备动态关联的状态。如果你做了那,确保提供cleanup方法来释放那个状态。
SPI消息队列
驱动的大块内容会管理由transfer()传送内容的I/O队列。
那个队列可以纯粹是概念上的。例如,一个仅用于低速率传感器访问的驱动可能很好地使用同步PIO。
但是队列很有可能是非常真实的,使用message->queue, PIO,常使用DMA(特别是根文件系统在SPI闪存中),并且像中断处理句柄、tasklet或工作队列(例如kevent)那样执行上下文。你的驱动可以是有花样的,或简单的,如你所需。这样的一个transfer()方法通常只是添加消息到队列,然后开启一些异步传输的引擎(除非它已经跑起来了)。
致谢
----
对Linux SPI讨论的贡献者(以姓氏排序)
David Brownell
Russell King
Dmitry Pervushin
Stephen Street
Mark Underwood
Andrew Victor
Vitaly Wool
spi-summary原文
-
Overview of Linux kernel SPI support
-
====================================
-
-
21-May-2007
-
-
What is SPI?
-
------------
-
The "Serial Peripheral Interface" (SPI) is a synchronous four wire serial
-
link used to connect microcontrollers to sensors, memory, and peripherals.
-
It's a simple "de facto" standard, not complicated enough to acquire a
-
standardization body. SPI uses a master/slave configuration.
-
-
The three signal wires hold a clock (SCK, often on the order of 10 MHz),
-
and parallel data lines with "Master Out, Slave In" (MOSI) or "Master In,
-
Slave Out" (MISO) signals. (Other names are also used.) There are four
-
clocking modes through which data is exchanged; mode-0 and mode-3 are most
-
commonly used. Each clock cycle shifts data out and data in; the clock
-
doesn't cycle except when there is a data bit to shift. Not all data bits
-
are used though; not every protocol uses those full duplex capabilities.
-
-
SPI masters use a fourth "chip select" line to activate a given SPI slave
-
device, so those three signal wires may be connected to several chips
-
in parallel. All SPI slaves support chipselects; they are usually active
-
low signals, labeled nCSx for slave 'x' (e.g. nCS0). Some devices have
-
other signals, often including an interrupt to the master.
-
-
Unlike serial busses like USB or SMBus, even low level protocols for
-
SPI slave functions are usually not interoperable between vendors
-
(except for commodities like SPI memory chips).
-
-
- SPI may be used for request/response style device protocols, as with
-
touchscreen sensors and memory chips.
-
-
- It may also be used to stream data in either direction (half duplex),
-
or both of them at the same time (full duplex).
-
-
- Some devices may use eight bit words. Others may different word
-
lengths, such as streams of 12-bit or 20-bit digital samples.
-
-
- Words are usually sent with their most significant bit (MSB) first,
-
but sometimes the least significant bit (LSB) goes first instead.
-
-
- Sometimes SPI is used to daisy-chain devices, like shift registers.
-
-
In the same way, SPI slaves will only rarely support any kind of automatic
-
discovery/enumeration protocol. The tree of slave devices accessible from
-
a given SPI master will normally be set up manually, with configuration
-
tables.
-
-
SPI is only one of the names used by such four-wire protocols, and
-
most controllers have no problem handling "MicroWire" (think of it as
-
half-duplex SPI, for request/response protocols), SSP ("Synchronous
-
Serial Protocol"), PSP ("Programmable Serial Protocol"), and other
-
related protocols.
-
-
Some chips eliminate a signal line by combining MOSI and MISO, and
-
limiting themselves to half-duplex at the hardware level. In fact
-
some SPI chips have this signal mode as a strapping option. These
-
can be accessed using the same programming interface as SPI, but of
-
course they won't handle full duplex transfers. You may find such
-
chips described as using "three wire" signaling: SCK, data, nCSx.
-
(That data line is sometimes called MOMI or SISO.)
-
-
Microcontrollers often support both master and slave sides of the SPI
-
protocol. This document (and Linux) currently only supports the master
-
side of SPI interactions.
-
-
-
Who uses it? On what kinds of systems?
-
---------------------------------------
-
Linux developers using SPI are probably writing device drivers for embedded
-
systems boards. SPI is used to control external chips, and it is also a
-
protocol supported by every MMC or SD memory card. (The older "DataFlash"
-
cards, predating MMC cards but using the same connectors and card shape,
-
support only SPI.) Some PC hardware uses SPI flash for BIOS code.
-
-
SPI slave chips range from digital/analog converters used for analog
-
sensors and codecs, to memory, to peripherals like USB controllers
-
or Ethernet adapters; and more.
-
-
Most systems using SPI will integrate a few devices on a mainboard.
-
Some provide SPI links on expansion connectors; in cases where no
-
dedicated SPI controller exists, GPIO pins can be used to create a
-
low speed "bitbanging" adapter. Very few systems will "hotplug" an SPI
-
controller; the reasons to use SPI focus on low cost and simple operation,
-
and if dynamic reconfiguration is important, USB will often be a more
-
appropriate low-pincount peripheral bus.
-
-
Many microcontrollers that can run Linux integrate one or more I/O
-
interfaces with SPI modes. Given SPI support, they could use MMC or SD
-
cards without needing a special purpose MMC/SD/SDIO controller.
-
-
-
I'm confused. What are these four SPI "clock modes"?
-
-----------------------------------------------------
-
It's easy to be confused here, and the vendor documentation you'll
-
find isn't necessarily helpful. The four modes combine two mode bits:
-
-
- CPOL indicates the initial clock polarity. CPOL=0 means the
-
clock starts low, so the first (leading) edge is rising, and
-
the second (trailing) edge is falling. CPOL=1 means the clock
-
starts high, so the first (leading) edge is falling.
-
-
- CPHA indicates the clock phase used to sample data; CPHA=0 says
-
sample on the leading edge, CPHA=1 means the trailing edge.
-
-
Since the signal needs to stablize before it's sampled, CPHA=0
-
implies that its data is written half a clock before the first
-
clock edge. The chipselect may have made it become available.
-
-
Chip specs won't always say "uses SPI mode X" in as many words,
-
but their timing diagrams will make the CPOL and CPHA modes clear.
-
-
In the SPI mode number, CPOL is the high order bit and CPHA is the
-
low order bit. So when a chip's timing diagram shows the clock
-
starting low (CPOL=0) and data stabilized for sampling during the
-
trailing clock edge (CPHA=1), that's SPI mode 1.
-
-
Note that the clock mode is relevant as soon as the chipselect goes
-
active. So the master must set the clock to inactive before selecting
-
a slave, and the slave can tell the chosen polarity by sampling the
-
clock level when its select line goes active. That's why many devices
-
support for example both modes 0 and 3: they don't care about polarity,
-
and alway clock data in/out on rising clock edges.
-
-
-
How do these driver programming interfaces work?
-
------------------------------------------------
-
The <linux/spi/spi.h> header file includes kerneldoc, as does the
-
main source code, and you should certainly read that chapter of the
-
kernel API document. This is just an overview, so you get the big
-
picture before those details.
-
-
SPI requests always go into I/O queues. Requests for a given SPI device
-
are always executed in FIFO order, and complete asynchronously through
-
completion callbacks. There are also some simple synchronous wrappers
-
for those calls, including ones for common transaction types like writing
-
a command and then reading its response.
-
-
There are two types of SPI driver, here called:
-
-
Controller drivers ... controllers may be built in to System-On-Chip
-
processors, and often support both Master and Slave roles.
-
These drivers touch hardware registers and may use DMA.
-
Or they can be PIO bitbangers, needing just GPIO pins.
-
-
Protocol drivers ... these pass messages through the controller
-
driver to communicate with a Slave or Master device on the
-
other side of an SPI link.
-
-
So for example one protocol driver might talk to the MTD layer to export
-
data to filesystems stored on SPI flash like DataFlash; and others might
-
control audio interfaces, present touchscreen sensors as input interfaces,
-
or monitor temperature and voltage levels during industrial processing.
-
And those might all be sharing the same controller driver.
-
-
A "struct spi_device" encapsulates the master-side interface between
-
those two types of driver. At this writing, Linux has no slave side
-
programming interface.
-
-
There is a minimal core of SPI programming interfaces, focussing on
-
using the driver model to connect controller and protocol drivers using
-
device tables provided by board specific initialization code. SPI
-
shows up in sysfs in several locations:
-
-
/sys/devices/.../CTLR ... physical node for a given SPI controller
-
-
/sys/devices/.../CTLR/spiB.C ... spi_device on bus "B",
-
chipselect C, accessed through CTLR.
-
-
/sys/bus/spi/devices/spiB.C ... symlink to that physical
-
.../CTLR/spiB.C device
-
-
/sys/devices/.../CTLR/spiB.C/modalias ... identifies the driver
-
that should be used with this device (for hotplug/coldplug)
-
-
/sys/bus/spi/drivers/D ... driver for one or more spi*.* devices
-
-
/sys/class/spi_master/spiB ... symlink (or actual device node) to
-
a logical node which could hold class related state for the
-
controller managing bus "B". All spiB.* devices share one
-
physical SPI bus segment, with SCLK, MOSI, and MISO.
-
-
Note that the actual location of the controller's class state depends
-
on whether you enabled CONFIG_SYSFS_DEPRECATED or not. At this time,
-
the only class-specific state is the bus number ("B" in "spiB"), so
-
those /sys/class entries are only useful to quickly identify busses.
-
-
-
How does board-specific init code declare SPI devices?
-
------------------------------------------------------
-
Linux needs several kinds of information to properly configure SPI devices.
-
That information is normally provided by board-specific code, even for
-
chips that do support some of automated discovery/enumeration.
-
-
DECLARE CONTROLLERS
-
-
The first kind of information is a list of what SPI controllers exist.
-
For System-on-Chip (SOC) based boards, these will usually be platform
-
devices, and the controller may need some platform_data in order to
-
operate properly. The "struct platform_device" will include resources
-
like the physical address of the controller's first register and its IRQ.
-
-
Platforms will often abstract the "register SPI controller" operation,
-
maybe coupling it with code to initialize pin configurations, so that
-
the arch/.../mach-*/board-*.c files for several boards can all share the
-
same basic controller setup code. This is because most SOCs have several
-
SPI-capable controllers, and only the ones actually usable on a given
-
board should normally be set up and registered.
-
-
So for example arch/.../mach-*/board-*.c files might have code like:
-
-
#include <mach/spi.h> /* for mysoc_spi_data */
-
-
/* if your mach-* infrastructure doesn't support kernels that can
-
* run on multiple boards, pdata wouldn't benefit from "__init".
-
*/
-
static struct mysoc_spi_data __initdata pdata = { ... };
-
-
static __init board_init(void)
-
{
-
...
-
/* this board only uses SPI controller #2 */
-
mysoc_register_spi(2, &pdata);
-
...
-
}
-
-
And SOC-specific utility code might look something like:
-
-
#include <mach/spi.h>
-
-
static struct platform_device spi2 = { ... };
-
-
void mysoc_register_spi(unsigned n, struct mysoc_spi_data *pdata)
-
{
-
struct mysoc_spi_data *pdata2;
-
-
pdata2 = kmalloc(sizeof *pdata2, GFP_KERNEL);
-
*pdata2 = pdata;
-
...
-
if (n == 2) {
-
spi2->dev.platform_data = pdata2;
-
register_platform_device(&spi2);
-
-
/* also: set up pin modes so the spi2 signals are
-
* visible on the relevant pins ... bootloaders on
-
* production boards may already have done this, but
-
* developer boards will often need Linux to do it.
-
*/
-
}
-
...
-
}
-
-
Notice how the platform_data for boards may be different, even if the
-
same SOC controller is used. For example, on one board SPI might use
-
an external clock, where another derives the SPI clock from current
-
settings of some master clock.
-
-
-
DECLARE SLAVE DEVICES
-
-
The second kind of information is a list of what SPI slave devices exist
-
on the target board, often with some board-specific data needed for the
-
driver to work correctly.
-
-
Normally your arch/.../mach-*/board-*.c files would provide a small table
-
listing the SPI devices on each board. (This would typically be only a
-
small handful.) That might look like:
-
-
static struct ads7846_platform_data ads_info = {
-
.vref_delay_usecs = 100,
-
.x_plate_ohms = 580,
-
.y_plate_ohms = 410,
-
};
-
-
static struct spi_board_info spi_board_info[] __initdata = {
-
{
-
.modalias = "ads7846",
-
.platform_data = &ads_info,
-
.mode = SPI_MODE_0,
-
.irq = GPIO_IRQ(31),
-
.max_speed_hz = 120000 /* max sample rate at 3V */ * 16,
-
.bus_num = 1,
-
.chip_select = 0,
-
},
-
};
-
-
Again, notice how board-specific information is provided; each chip may need
-
several types. This example shows generic constraints like the fastest SPI
-
clock to allow (a function of board voltage in this case) or how an IRQ pin
-
is wired, plus chip-specific constraints like an important delay that's
-
changed by the capacitance at one pin.
-
-
(There's also "controller_data", information that may be useful to the
-
controller driver. An example would be peripheral-specific DMA tuning
-
data or chipselect callbacks. This is stored in spi_device later.)
-
-
The board_info should provide enough information to let the system work
-
without the chip's driver being loaded. The most troublesome aspect of
-
that is likely the SPI_CS_HIGH bit in the spi_device.mode field, since
-
sharing a bus with a device that interprets chipselect "backwards" is
-
not possible until the infrastructure knows how to deselect it.
-
-
Then your board initialization code would register that table with the SPI
-
infrastructure, so that it's available later when the SPI master controller
-
driver is registered:
-
-
spi_register_board_info(spi_board_info, ARRAY_SIZE(spi_board_info));
-
-
Like with other static board-specific setup, you won't unregister those.
-
-
The widely used "card" style computers bundle memory, cpu, and little else
-
onto a card that's maybe just thirty square centimeters. On such systems,
-
your arch/.../mach-.../board-*.c file would primarily provide information
-
about the devices on the mainboard into which such a card is plugged. That
-
certainly includes SPI devices hooked up through the card
-
-
-
NON-STATIC CONFIGURATIONS
-
-
Developer boards often play by different rules than product boards, and one
-
example is the potential need to hotplug SPI devices and/or controllers.
-
-
For those cases you might need to use spi_busnum_to_master() to look
-
up the spi bus master, and will likely need spi_new_device() to provide the
-
board info based on the board that was hotplugged. Of course, you'd later
-
call at least spi_unregister_device() when that board is removed.
-
-
When Linux includes support for MMC/SD/SDIO/DataFlash cards through SPI, those
-
configurations will also be dynamic. Fortunately, such devices all support
-
basic device identification probes, so they should hotplug normally.
-
-
-
How do I write an "SPI Protocol Driver"?
-
----------------------------------------
-
Most SPI drivers are currently kernel drivers, but there's also support
-
for userspace drivers. Here we talk only about kernel drivers.
-
-
SPI protocol drivers somewhat resemble platform device drivers:
-
-
static struct spi_driver CHIP_driver = {
-
.driver = {
-
.name = "CHIP",
-
.owner = THIS_MODULE,
-
},
-
-
.probe = CHIP_probe,
-
.remove = __devexit_p(CHIP_remove),
-
.suspend = CHIP_suspend,
-
.resume = CHIP_resume,
-
};
-
-
The driver core will autmatically attempt to bind this driver to any SPI
-
device whose board_info gave a modalias of "CHIP". Your probe() code
-
might look like this unless you're creating a device which is managing
-
a bus (appearing under /sys/class/spi_master).
-
-
static int __devinit CHIP_probe(struct spi_device *spi)
-
{
-
struct CHIP *chip;
-
struct CHIP_platform_data *pdata;
-
-
/* assuming the driver requires board-specific data: */
-
pdata = &spi->dev.platform_data;
-
if (!pdata)
-
return -ENODEV;
-
-
/* get memory for driver's per-chip state */
-
chip = kzalloc(sizeof *chip, GFP_KERNEL);
-
if (!chip)
-
return -ENOMEM;
-
spi_set_drvdata(spi, chip);
-
-
... etc
-
return 0;
-
}
-
-
As soon as it enters probe(), the driver may issue I/O requests to
-
the SPI device using "struct spi_message". When remove() returns,
-
or after probe() fails, the driver guarantees that it won't submit
-
any more such messages.
-
-
- An spi_message is a sequence of protocol operations, executed
-
as one atomic sequence. SPI driver controls include:
-
-
+ when bidirectional reads and writes start ... by how its
-
sequence of spi_transfer requests is arranged;
-
-
+ which I/O buffers are used ... each spi_transfer wraps a
-
buffer for each transfer direction, supporting full duplex
-
(two pointers, maybe the same one in both cases) and half
-
duplex (one pointer is NULL) transfers;
-
-
+ optionally defining short delays after transfers ... using
-
the spi_transfer.delay_usecs setting (this delay can be the
-
only protocol effect, if the buffer length is zero);
-
-
+ whether the chipselect becomes inactive after a transfer and
-
any delay ... by using the spi_transfer.cs_change flag;
-
-
+ hinting whether the next message is likely to go to this same
-
device ... using the spi_transfer.cs_change flag on the last
-
transfer in that atomic group, and potentially saving costs
-
for chip deselect and select operations.
-
-
- Follow standard kernel rules, and provide DMA-safe buffers in
-
your messages. That way controller drivers using DMA aren't forced
-
to make extra copies unless the hardware requires it (e.g. working
-
around hardware errata that force the use of bounce buffering).
-
-
If standard dma_map_single() handling of these buffers is inappropriate,
-
you can use spi_message.is_dma_mapped to tell the controller driver
-
that you've already provided the relevant DMA addresses.
-
-
- The basic I/O primitive is spi_async(). Async requests may be
-
issued in any context (irq handler, task, etc) and completion
-
is reported using a callback provided with the message.
-
After any detected error, the chip is deselected and processing
-
of that spi_message is aborted.
-
-
- There are also synchronous wrappers like spi_sync(), and wrappers
-
like spi_read(), spi_write(), and spi_write_then_read(). These
-
may be issued only in contexts that may sleep, and they're all
-
clean (and small, and "optional") layers over spi_async().
-
-
- The spi_write_then_read() call, and convenience wrappers around
-
it, should only be used with small amounts of data where the
-
cost of an extra copy may be ignored. It's designed to support
-
common RPC-style requests, such as writing an eight bit command
-
and reading a sixteen bit response -- spi_w8r16() being one its
-
wrappers, doing exactly that.
-
-
Some drivers may need to modify spi_device characteristics like the
-
transfer mode, wordsize, or clock rate. This is done with spi_setup(),
-
which would normally be called from probe() before the first I/O is
-
done to the device. However, that can also be called at any time
-
that no message is pending for that device.
-
-
While "spi_device" would be the bottom boundary of the driver, the
-
upper boundaries might include sysfs (especially for sensor readings),
-
the input layer, ALSA, networking, MTD, the character device framework,
-
or other Linux subsystems.
-
-
Note that there are two types of memory your driver must manage as part
-
of interacting with SPI devices.
-
-
- I/O buffers use the usual Linux rules, and must be DMA-safe.
-
You'd normally allocate them from the heap or free page pool.
-
Don't use the stack, or anything that's declared "static".
-
-
- The spi_message and spi_transfer metadata used to glue those
-
I/O buffers into a group of protocol transactions. These can
-
be allocated anywhere it's convenient, including as part of
-
other allocate-once driver data structures. Zero-init these.
-
-
If you like, spi_message_alloc() and spi_message_free() convenience
-
routines are available to allocate and zero-initialize an spi_message
-
with several transfers.
-
-
-
How do I write an "SPI Master Controller Driver"?
-
-------------------------------------------------
-
An SPI controller will probably be registered on the platform_bus; write
-
a driver to bind to the device, whichever bus is involved.
-
-
The main task of this type of driver is to provide an "spi_master".
-
Use spi_alloc_master() to allocate the master, and spi_master_get_devdata()
-
to get the driver-private data allocated for that device.
-
-
struct spi_master *master;
-
struct CONTROLLER *c;
-
-
master = spi_alloc_master(dev, sizeof *c);
-
if (!master)
-
return -ENODEV;
-
-
c = spi_master_get_devdata(master);
-
-
The driver will initialize the fields of that spi_master, including the
-
bus number (maybe the same as the platform device ID) and three methods
-
used to interact with the SPI core and SPI protocol drivers. It will
-
also initialize its own internal state. (See below about bus numbering
-
and those methods.)
-
-
After you initialize the spi_master, then use spi_register_master() to
-
publish it to the rest of the system. At that time, device nodes for
-
the controller and any predeclared spi devices will be made available,
-
and the driver model core will take care of binding them to drivers.
-
-
If you need to remove your SPI controller driver, spi_unregister_master()
-
will reverse the effect of spi_register_master().
-
-
-
BUS NUMBERING
-
-
Bus numbering is important, since that's how Linux identifies a given
-
SPI bus (shared SCK, MOSI, MISO). Valid bus numbers start at zero. On
-
SOC systems, the bus numbers should match the numbers defined by the chip
-
manufacturer. For example, hardware controller SPI2 would be bus number 2,
-
and spi_board_info for devices connected to it would use that number.
-
-
If you don't have such hardware-assigned bus number, and for some reason
-
you can't just assign them, then provide a negative bus number. That will
-
then be replaced by a dynamically assigned number. You'd then need to treat
-
this as a non-static configuration (see above).
-
-
-
SPI MASTER METHODS
-
-
master->setup(struct spi_device *spi)
-
This sets up the device clock rate, SPI mode, and word sizes.
-
Drivers may change the defaults provided by board_info, and then
-
call spi_setup(spi) to invoke this routine. It may sleep.
-
Unless each SPI slave has its own configuration registers, don't
-
change them right away ... otherwise drivers could corrupt I/O
-
that's in progress for other SPI devices.
-
-
master->transfer(struct spi_device *spi, struct spi_message *message)
-
This must not sleep. Its responsibility is arrange that the
-
transfer happens and its complete() callback is issued. The two
-
will normally happen later, after other transfers complete, and
-
if the controller is idle it will need to be kickstarted.
-
-
master->cleanup(struct spi_device *spi)
-
Your controller driver may use spi_device.controller_state to hold
-
state it dynamically associates with that device. If you do that,
-
be sure to provide the cleanup() method to free that state.
-
-
-
SPI MESSAGE QUEUE
-
-
The bulk of the driver will be managing the I/O queue fed by transfer().
-
-
That queue could be purely conceptual. For example, a driver used only
-
for low-frequency sensor acess might be fine using synchronous PIO.
-
-
But the queue will probably be very real, using message->queue, PIO,
-
often DMA (especially if the root filesystem is in SPI flash), and
-
execution contexts like IRQ handlers, tasklets, or workqueues (such
-
as keventd). Your driver can be as fancy, or as simple, as you need.
-
Such a transfer() method would normally just add the message to a
-
queue, and then start some asynchronous transfer engine (unless it's
-
already running).
-
-
-
THANKS TO
-
---------
-
Contributors to Linux-SPI discussions include (in alphabetical order,
-
by last name):
-
-
David Brownell
-
Russell King
-
Dmitry Pervushin
-
Stephen Street
-
Mark Underwood
-
Andrew Victor
-
Vitaly Wool